docs: Add comprehensive deployment guide
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
Some checks failed
CI / Frontend Lint & Type Check (push) Has been cancelled
CI / Frontend Build (push) Has been cancelled
CI / Backend Lint (push) Has been cancelled
CI / Backend Tests (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
Deploy / Build & Push Images (push) Has been cancelled
Deploy / Deploy to Server (push) Has been cancelled
Deploy / Notify (push) Has been cancelled
This commit is contained in:
414
DEPLOY.md
Normal file
414
DEPLOY.md
Normal file
@ -0,0 +1,414 @@
|
|||||||
|
# Pounce Deployment Guide
|
||||||
|
|
||||||
|
## Server Information
|
||||||
|
- **Server IP**: `10.42.0.73`
|
||||||
|
- **User**: `user`
|
||||||
|
- **Git Remote**: `git.6bit.ch` (10.13.12.81)
|
||||||
|
- **Frontend Port**: 3000
|
||||||
|
- **Backend Port**: 8000
|
||||||
|
- **Public URL**: https://pounce.ch
|
||||||
|
|
||||||
|
## Automated Deployment (Recommended)
|
||||||
|
|
||||||
|
### Using the Deploy Script
|
||||||
|
|
||||||
|
The `deploy.sh` script handles zero-downtime deployments automatically:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Full deployment (commit + push + deploy)
|
||||||
|
./deploy.sh "Your commit message"
|
||||||
|
|
||||||
|
# Frontend only
|
||||||
|
./deploy.sh -f "Frontend changes"
|
||||||
|
|
||||||
|
# Backend only
|
||||||
|
./deploy.sh -b "Backend changes"
|
||||||
|
|
||||||
|
# Quick sync without git operations
|
||||||
|
./deploy.sh -q
|
||||||
|
|
||||||
|
# Force deploy (skips safety checks)
|
||||||
|
./deploy.sh --force "Force deploy"
|
||||||
|
```
|
||||||
|
|
||||||
|
### What the Script Does
|
||||||
|
|
||||||
|
1. **Git Operations** (unless `-q` flag):
|
||||||
|
- Commits all changes with your message
|
||||||
|
- Pushes to `git.6bit.ch`
|
||||||
|
|
||||||
|
2. **Syncing Files**:
|
||||||
|
- Uses `rsync` to transfer only changed files to server
|
||||||
|
- Preserves timestamps and permissions
|
||||||
|
- Frontend: syncs to `~/pounce/frontend/`
|
||||||
|
- Backend: syncs to `~/pounce/backend/`
|
||||||
|
|
||||||
|
3. **Building**:
|
||||||
|
- Frontend: `npm run build` (creates optimized production build)
|
||||||
|
- Backend: `pip install -r requirements.txt` (updates dependencies)
|
||||||
|
|
||||||
|
4. **Restarting Services**:
|
||||||
|
- Gracefully restarts Next.js and Uvicorn
|
||||||
|
- Zero downtime using `./start.sh`
|
||||||
|
|
||||||
|
## Manual Deployment
|
||||||
|
|
||||||
|
### Step 1: Commit & Push Local Changes
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /Users/yvesgugger/Documents/Projekte/pounce
|
||||||
|
|
||||||
|
# Check status
|
||||||
|
git status
|
||||||
|
|
||||||
|
# Add all changes
|
||||||
|
git add -A
|
||||||
|
|
||||||
|
# Commit
|
||||||
|
git commit -m "Your descriptive commit message"
|
||||||
|
|
||||||
|
# Push to git.6bit.ch
|
||||||
|
git push
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2: SSH into Server & Pull Changes
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Connect to server
|
||||||
|
sshpass -p "user" ssh user@10.42.0.73
|
||||||
|
|
||||||
|
# Navigate to project
|
||||||
|
cd ~/pounce
|
||||||
|
|
||||||
|
# Pull latest changes
|
||||||
|
git pull
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Frontend Deployment
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Navigate to frontend
|
||||||
|
cd ~/pounce/frontend
|
||||||
|
|
||||||
|
# Install dependencies (if package.json changed)
|
||||||
|
npm install
|
||||||
|
|
||||||
|
# Build production version
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
# The build creates a .next folder with optimized static files
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 4: Backend Deployment
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Navigate to backend
|
||||||
|
cd ~/pounce/backend
|
||||||
|
|
||||||
|
# Activate virtual environment
|
||||||
|
source venv/bin/activate
|
||||||
|
|
||||||
|
# Install/update dependencies (if requirements.txt changed)
|
||||||
|
pip install -r requirements.txt
|
||||||
|
|
||||||
|
# Deactivate venv
|
||||||
|
deactivate
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 5: Restart Services
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Navigate to project root
|
||||||
|
cd ~/pounce
|
||||||
|
|
||||||
|
# Stop running services
|
||||||
|
pkill -f 'uvicorn'
|
||||||
|
pkill -f 'next start'
|
||||||
|
|
||||||
|
# Start services using start script
|
||||||
|
./start.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Start Script (`start.sh`)
|
||||||
|
|
||||||
|
The `start.sh` script handles:
|
||||||
|
- Stopping existing processes on ports 8000 and 3000
|
||||||
|
- Starting the backend (Uvicorn) with proper settings
|
||||||
|
- Starting the frontend (Next.js) in production mode
|
||||||
|
- Health checks for both services
|
||||||
|
- Logging to `backend.log` and `frontend.log`
|
||||||
|
|
||||||
|
### Manual Service Management
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check running processes
|
||||||
|
ps aux | grep uvicorn
|
||||||
|
ps aux | grep next
|
||||||
|
|
||||||
|
# View logs
|
||||||
|
tail -f ~/pounce/backend/backend.log
|
||||||
|
tail -f ~/pounce/frontend/frontend.log
|
||||||
|
|
||||||
|
# Check ports
|
||||||
|
lsof -i :8000 # Backend
|
||||||
|
lsof -i :3000 # Frontend
|
||||||
|
```
|
||||||
|
|
||||||
|
## Environment Configuration
|
||||||
|
|
||||||
|
### Backend `.env` (~/pounce/backend/.env)
|
||||||
|
|
||||||
|
```env
|
||||||
|
DATABASE_URL=postgresql://user:password@localhost:5432/domainwatch
|
||||||
|
SECRET_KEY=your-secret-key-here
|
||||||
|
STRIPE_SECRET_KEY=sk_live_xxx
|
||||||
|
STRIPE_PUBLISHABLE_KEY=pk_live_xxx
|
||||||
|
STRIPE_WEBHOOK_SECRET=whsec_xxx
|
||||||
|
ZOHO_SMTP_USER=noreply@pounce.ch
|
||||||
|
ZOHO_SMTP_PASSWORD=xxx
|
||||||
|
GOOGLE_CLIENT_ID=xxx
|
||||||
|
GOOGLE_CLIENT_SECRET=xxx
|
||||||
|
GITHUB_CLIENT_ID=xxx
|
||||||
|
GITHUB_CLIENT_SECRET=xxx
|
||||||
|
site_url=https://pounce.ch
|
||||||
|
```
|
||||||
|
|
||||||
|
### Frontend `.env.local` (~/pounce/frontend/.env.local)
|
||||||
|
|
||||||
|
```env
|
||||||
|
NEXT_PUBLIC_API_URL=https://pounce.ch/api/v1
|
||||||
|
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_live_xxx
|
||||||
|
NEXT_PUBLIC_POSTHOG_KEY=phc_xxx
|
||||||
|
NEXT_PUBLIC_POSTHOG_HOST=https://eu.i.posthog.com
|
||||||
|
```
|
||||||
|
|
||||||
|
## Nginx Configuration
|
||||||
|
|
||||||
|
Nginx acts as reverse proxy on the server:
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
# Frontend (Next.js)
|
||||||
|
location / {
|
||||||
|
proxy_pass http://localhost:3000;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection 'upgrade';
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_cache_bypass $http_upgrade;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Backend (FastAPI)
|
||||||
|
location /api {
|
||||||
|
proxy_pass http://localhost:8000;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Frontend won't start
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check for port conflicts
|
||||||
|
lsof -i :3000
|
||||||
|
|
||||||
|
# Check build errors
|
||||||
|
cd ~/pounce/frontend
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
# Check logs
|
||||||
|
tail -f ~/pounce/frontend/frontend.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### Backend won't start
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check for port conflicts
|
||||||
|
lsof -i :8000
|
||||||
|
|
||||||
|
# Test backend manually
|
||||||
|
cd ~/pounce/backend
|
||||||
|
source venv/bin/activate
|
||||||
|
uvicorn app.main:app --host 0.0.0.0 --port 8000
|
||||||
|
|
||||||
|
# Check logs
|
||||||
|
tail -f ~/pounce/backend/backend.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### Database issues
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check PostgreSQL status
|
||||||
|
sudo systemctl status postgresql
|
||||||
|
|
||||||
|
# Connect to database
|
||||||
|
psql -U user -d domainwatch
|
||||||
|
|
||||||
|
# Check migrations
|
||||||
|
cd ~/pounce/backend
|
||||||
|
alembic current
|
||||||
|
alembic upgrade head
|
||||||
|
```
|
||||||
|
|
||||||
|
### SSL Certificate issues
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check certificate expiry
|
||||||
|
sudo certbot certificates
|
||||||
|
|
||||||
|
# Renew certificates
|
||||||
|
sudo certbot renew
|
||||||
|
|
||||||
|
# Restart Nginx
|
||||||
|
sudo systemctl restart nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
## Health Checks
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Backend health
|
||||||
|
curl http://localhost:8000/health
|
||||||
|
|
||||||
|
# Frontend health
|
||||||
|
curl -I http://localhost:3000
|
||||||
|
|
||||||
|
# Full stack check via public URL
|
||||||
|
curl https://pounce.ch
|
||||||
|
curl https://pounce.ch/api/health
|
||||||
|
```
|
||||||
|
|
||||||
|
## Rollback Procedure
|
||||||
|
|
||||||
|
If deployment fails:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# On server
|
||||||
|
cd ~/pounce
|
||||||
|
|
||||||
|
# See recent commits
|
||||||
|
git log --oneline -10
|
||||||
|
|
||||||
|
# Rollback to previous commit
|
||||||
|
git reset --hard <commit-hash>
|
||||||
|
|
||||||
|
# Rebuild
|
||||||
|
cd frontend && npm run build
|
||||||
|
cd ../backend && source venv/bin/activate && pip install -r requirements.txt
|
||||||
|
|
||||||
|
# Restart
|
||||||
|
cd .. && ./start.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Monitoring & Maintenance
|
||||||
|
|
||||||
|
### Log Rotation
|
||||||
|
|
||||||
|
Logs are in:
|
||||||
|
- `~/pounce/backend/backend.log`
|
||||||
|
- `~/pounce/frontend/frontend.log`
|
||||||
|
|
||||||
|
Set up log rotation to prevent disk space issues:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create logrotate config
|
||||||
|
sudo nano /etc/logrotate.d/pounce
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
/home/user/pounce/backend/backend.log {
|
||||||
|
daily
|
||||||
|
rotate 14
|
||||||
|
compress
|
||||||
|
delaycompress
|
||||||
|
notifempty
|
||||||
|
create 0640 user user
|
||||||
|
}
|
||||||
|
|
||||||
|
/home/user/pounce/frontend/frontend.log {
|
||||||
|
daily
|
||||||
|
rotate 14
|
||||||
|
compress
|
||||||
|
delaycompress
|
||||||
|
notifempty
|
||||||
|
create 0640 user user
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Cron Jobs
|
||||||
|
|
||||||
|
Check scheduled tasks:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
crontab -l
|
||||||
|
```
|
||||||
|
|
||||||
|
Common cron jobs for Pounce:
|
||||||
|
- Domain scraping
|
||||||
|
- Health checks
|
||||||
|
- Database cleanup
|
||||||
|
- Backup scripts
|
||||||
|
|
||||||
|
## Backup & Recovery
|
||||||
|
|
||||||
|
### Database Backup
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Manual backup
|
||||||
|
pg_dump -U user domainwatch > backup_$(date +%Y%m%d_%H%M%S).sql
|
||||||
|
|
||||||
|
# Restore from backup
|
||||||
|
psql -U user domainwatch < backup_20250101_120000.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
### Code Backup
|
||||||
|
|
||||||
|
All code is backed up on `git.6bit.ch`. To clone fresh:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone user@10.13.12.81:yvg/pounce.git
|
||||||
|
```
|
||||||
|
|
||||||
|
## Security Notes
|
||||||
|
|
||||||
|
- Server uses SSH key authentication (password: `user` for development)
|
||||||
|
- SSL certificates via Let's Encrypt (auto-renewal)
|
||||||
|
- Database credentials in `.env` files (not committed to git)
|
||||||
|
- Stripe webhooks require signing secret verification
|
||||||
|
- OAuth secrets must match registered redirect URIs
|
||||||
|
|
||||||
|
## Quick Reference
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Deploy everything
|
||||||
|
./deploy.sh "message"
|
||||||
|
|
||||||
|
# Frontend only
|
||||||
|
./deploy.sh -f "message"
|
||||||
|
|
||||||
|
# Backend only
|
||||||
|
./deploy.sh -b "message"
|
||||||
|
|
||||||
|
# Quick sync (no git)
|
||||||
|
./deploy.sh -q
|
||||||
|
|
||||||
|
# Check logs
|
||||||
|
ssh user@10.42.0.73 'tail -f ~/pounce/backend/backend.log'
|
||||||
|
|
||||||
|
# Restart services
|
||||||
|
ssh user@10.42.0.73 'cd ~/pounce && ./start.sh'
|
||||||
|
|
||||||
|
# Check health
|
||||||
|
curl https://pounce.ch/api/health
|
||||||
|
```
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
For issues or questions, check:
|
||||||
|
1. Application logs (`backend.log`, `frontend.log`)
|
||||||
|
2. Nginx logs (`/var/log/nginx/error.log`)
|
||||||
|
3. PostgreSQL logs (`/var/log/postgresql/`)
|
||||||
|
4. System logs (`journalctl -xe`)
|
||||||
|
|
||||||
Reference in New Issue
Block a user