diff --git a/deployment/DEPLOYMENT.md b/deployment/DEPLOYMENT.md new file mode 100644 index 0000000..bc90f26 --- /dev/null +++ b/deployment/DEPLOYMENT.md @@ -0,0 +1,223 @@ +# Deployment Guide + +This document describes how to deploy the Randebu Trading Bot application to a production server. + +## Prerequisites + +- Debian server with 8GB RAM, 4 cores +- Python 3.10+ +- Node.js 18+ +- Nginx +- SSL certificate (Let's Encrypt) +- SSH access to server + +## Server Structure + +``` +/var/www/ + └── bot/ + ├── backend/ # Backend application (FastAPI) + ├── frontend/ # Frontend static files (SvelteKit build) + └── data/ # SQLite database and app data +``` + +## Step-by-Step Deployment + +### 1. Clone Repository + +```bash +ssh user@your-server +sudo mkdir -p /var/www/bot +sudo chown -R $USER:$USER /var/www/bot +cd /var/www/bot +git clone https://git.fbrns.co/shoko/randebu.git . +``` + +### 2. Setup Backend + +```bash +cd /var/www/bot/src/backend + +python3 -m venv venv +source venv/bin/activate +pip install -r requirements.txt + +mkdir -p /var/www/bot/data +``` + +### 3. Configure Environment + +Copy and configure the environment file: + +```bash +cp src/backend/.env.example /var/www/bot/data/.env +nano /var/www/bot/data/.env +``` + +Update these values: +- `SECRET_KEY` - Generate a secure key +- `DATABASE_URL` - Update path to `/var/www/bot/data/app.db` +- `MINIMAX_API_KEY` - Your API key +- `AVE_API_KEY` - Your API key + +### 4. Build Frontend + +```bash +cd /var/www/bot/src/frontend +npm install +npm run build + +# Move build to expected location +mkdir -p /var/www/bot/frontend +cp -r build/* /var/www/bot/frontend/ +``` + +### 5. Configure Nginx + +Copy the nginx template and modify as needed: + +```bash +sudo cp /var/www/bot/deployment/scripts/nginx-template.conf /etc/nginx/sites-available/bot.yourdomain.com +sudo nano /etc/nginx/sites-available/bot.yourdomain.com +``` + +Update `bot.yourdomain.com` with your actual domain. + +Enable the site: + +```bash +sudo ln -s /etc/nginx/sites-available/bot.yourdomain.com /etc/nginx/sites-enabled/ +sudo nginx -t +sudo systemctl reload nginx +``` + +### 6. Setup SSL Certificate + +```bash +sudo apt install certbot python3-certbot-nginx +sudo certbot --nginx -d bot.yourdomain.com +``` + +### 7. Configure Systemd Service + +Copy and configure the systemd service: + +```bash +sudo cp /var/www/bot/deployment/scripts/systemd-template.service /etc/systemd/system/ave-backend.service +sudo nano /etc/systemd/system/ave-backend.service +``` + +Update `your-user` and `/var/www/bot` paths as needed. + +### 8. Start Backend Service + +```bash +sudo systemctl daemon-reload +sudo systemctl enable ave-backend +sudo systemctl start ave-backend +sudo systemctl status ave-backend +``` + +### 9. Configure Firewall + +```bash +sudo ufw allow 22/tcp +sudo ufw allow 80/tcp +sudo ufw allow 443/tcp +sudo ufw enable +``` + +### 10. Verify Deployment + +1. Visit `https://bot.yourdomain.com` - should show frontend +2. Visit `https://bot.yourdomain.com/api/...` - should hit backend API +3. Check backend logs: `sudo journalctl -u ave-backend -f` + +## Project Structure + +``` +/var/www/bot/ +├── deployment/ # Deployment scripts and templates +│ ├── DEPLOYMENT.md # This file +│ └── scripts/ +│ ├── nginx-template.conf +│ ├── systemd-template.service +│ └── deploy.sh # Automated deployment script +├── src/ +│ ├── backend/ # FastAPI application +│ │ ├── app/ +│ │ │ ├── api/ # API routes +│ │ │ ├── core/ # Core functionality +│ │ │ ├── db/ # Database models +│ │ │ └── services/ # Business logic +│ │ ├── run.py +│ │ └── requirements.txt +│ └── frontend/ # SvelteKit application +│ ├── src/ +│ └── package.json +├── data/ # Runtime data (gitignored) +│ ├── app.db # SQLite database +│ └── .env # Environment variables +└── frontend/ # Built frontend static files +``` + +## Troubleshooting + +### Backend won't start + +Check logs: +```bash +sudo journalctl -u ave-backend -n 100 +``` + +Common issues: +- Missing environment variables - check `.env` file +- Port 8000 already in use - check configuration +- Database path incorrect - verify paths + +### Nginx errors + +Test configuration: +```bash +sudo nginx -t +``` + +Check error logs: +```bash +sudo tail -f /var/log/nginx/error.log +``` + +### SSL certificate issues + +Renew certificate: +```bash +sudo certbot renew +``` + +Check certificate status: +```bash +sudo certbot certificates +``` + +## Useful Commands + +| Action | Command | +|--------|---------| +| Restart backend | `sudo systemctl restart ave-backend` | +| View backend logs | `sudo journalctl -u ave-backend -f` | +| Check nginx status | `sudo systemctl status nginx` | +| Reload nginx | `sudo systemctl reload nginx` | +| Check port 8000 | `curl http://localhost:8000/health` | + +## Rolling Updates + +To update the application: + +```bash +cd /var/www/bot +git pull +cd src/backend && source venv/bin/activate && pip install -r requirements.txt +sudo systemctl restart ave-backend +``` + +For frontend updates, rebuild and copy static files to `/var/www/bot/frontend`. \ No newline at end of file diff --git a/deployment/scripts/deploy.sh b/deployment/scripts/deploy.sh new file mode 100755 index 0000000..53034db --- /dev/null +++ b/deployment/scripts/deploy.sh @@ -0,0 +1,47 @@ +#!/bin/bash +set -e + +DEPLOY_DIR="/var/www/bot" +DOMAIN="bot.yourdomain.com" +GIT_REPO="https://git.fbrns.co/shoko/randebu.git" +BRANCH="main" + +echo "=== Randebu Deployment Script ===" +echo "Deploy directory: $DEPLOY_DIR" +echo "Domain: $DOMAIN" +echo "" + +cd "$DEPLOY_DIR" + +echo "[1/6] Pulling latest code..." +git pull origin "$BRANCH" + +echo "[2/6] Updating backend dependencies..." +cd "$DEPLOY_DIR/src/backend" +source venv/bin/activate +pip install -r requirements.txt + +echo "[3/6] Rebuilding frontend..." +cd "$DEPLOY_DIR/src/frontend" +npm install +npm run build +mkdir -p "$DEPLOY_DIR/frontend" +cp -r build/* "$DEPLOY_DIR/frontend/" + +echo "[4/6] Restarting backend service..." +sudo systemctl restart ave-backend +sleep 2 +sudo systemctl status ave-backend --no-pager + +echo "[5/6] Testing endpoints..." +curl -s "http://localhost:8000/health" && echo "" +curl -s -o /dev/null -w "Frontend: %{http_code}\n" "https://$DOMAIN/" || true + +echo "[6/6] Verifying SSL..." +sudo certbot certificates 2>/dev/null | grep -A2 "$DOMAIN" || echo "No certificate found for $DOMAIN" + +echo "" +echo "=== Deployment Complete ===" +echo "Backend: https://$DOMAIN/api/" +echo "Frontend: https://$DOMAIN/" +echo "Backend logs: sudo journalctl -u ave-backend -f" \ No newline at end of file diff --git a/deployment/scripts/nginx-template.conf b/deployment/scripts/nginx-template.conf new file mode 100644 index 0000000..9658b5e --- /dev/null +++ b/deployment/scripts/nginx-template.conf @@ -0,0 +1,59 @@ +server { + listen 80; + server_name bot.yourdomain.com; + + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name bot.yourdomain.com; + + ssl_certificate /etc/letsencrypt/live/bot.yourdomain.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/bot.yourdomain.com/privkey.pem; + ssl_protocols TLSv1.2 TLSv1.3; + ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; + ssl_prefer_server_ciphers off; + ssl_session_cache shared:SSL:10m; + ssl_session_timeout 1d; + + root /var/www/bot/frontend; + index index.html; + + location / { + try_files $uri $uri/ /index.html; + } + + location /api/ { + proxy_pass http://127.0.0.1:8000/api/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_cache_bypass $http_upgrade; + } + + location /ws/ { + proxy_pass http://127.0.0.1:8000/ws/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + } + + gzip on; + gzip_vary on; + gzip_min_length 1024; + gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json; +} \ No newline at end of file diff --git a/deployment/scripts/systemd-template.service b/deployment/scripts/systemd-template.service new file mode 100644 index 0000000..9eaa786 --- /dev/null +++ b/deployment/scripts/systemd-template.service @@ -0,0 +1,21 @@ +[Unit] +Description=Randebu Trading Bot Backend +After=network.target + +[Service] +Type=simple +User=your-user +WorkingDirectory=/var/www/bot/src/backend +Environment="PATH=/var/www/bot/src/backend/venv/bin" +ExecStart=/var/www/bot/src/backend/venv/bin/python /var/www/bot/src/backend/run.py +Restart=always +RestartSec=10 + +EnvironmentFile=/var/www/bot/data/.env + +StandardOutput=journal +StandardError=journal +SyslogIdentifier=ave-backend + +[Install] +WantedBy=multi-user.target \ No newline at end of file