feat: Add deployment documentation and templates (issue #12) #23
223
deployment/DEPLOYMENT.md
Normal file
223
deployment/DEPLOYMENT.md
Normal file
@@ -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`.
|
||||||
47
deployment/scripts/deploy.sh
Executable file
47
deployment/scripts/deploy.sh
Executable file
@@ -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"
|
||||||
|
han
commented
change this to git.example.com change this to git.example.com
|
|||||||
|
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"
|
||||||
59
deployment/scripts/nginx-template.conf
Normal file
59
deployment/scripts/nginx-template.conf
Normal file
@@ -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;
|
||||||
|
}
|
||||||
21
deployment/scripts/systemd-template.service
Normal file
21
deployment/scripts/systemd-template.service
Normal file
@@ -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
|
||||||
Reference in New Issue
Block a user
change this to git.example.com