6.5 KiB
6.5 KiB
Monaco USA Portal - Production Deployment Guide
Prerequisites
- Debian/Ubuntu server with root access
- Domain DNS configured (portal.monacousa.org, api.monacousa.org, studio.monacousa.org)
- Ports 80 and 443 open in firewall
Quick Start
1. First-Time Server Setup
# Clone the repository
git clone https://code.letsbe.solutions/matt/monacousa-portal.git
cd monacousa-portal
# Make deploy script executable
chmod +x deploy.sh
# Run first-time setup (installs Docker, configures firewall)
sudo ./deploy.sh setup
2. Configure Environment
# Copy environment template
cp .env.production.example .env
# Generate secrets
./deploy.sh generate-secrets
# Edit environment file with your values
nano .env
Important environment variables to configure:
DOMAIN- Your domain (e.g., portal.monacousa.org)POSTGRES_PASSWORD- Strong database passwordJWT_SECRET- 32+ character random stringANON_KEY/SERVICE_ROLE_KEY- Generate at supabase.com/docs/guides/self-hosting#api-keysSMTP_*- Email server settings
3. Install and Configure Nginx
# Install nginx
sudo apt install nginx certbot python3-certbot-nginx -y
# Copy nginx config
sudo cp nginx/portal.monacousa.org.initial.conf /etc/nginx/sites-available/portal.monacousa.org
# Enable the site
sudo ln -s /etc/nginx/sites-available/portal.monacousa.org /etc/nginx/sites-enabled/
# Remove default site if exists
sudo rm -f /etc/nginx/sites-enabled/default
# Test config
sudo nginx -t
# Reload nginx
sudo systemctl reload nginx
4. Deploy Docker Services
# Deploy all services
./deploy.sh deploy
# Wait for services to be healthy (check status)
./deploy.sh status
5. Get SSL Certificate
# Get SSL certificate (after Docker services are running)
sudo certbot --nginx -d portal.monacousa.org -d api.monacousa.org -d studio.monacousa.org
# Test auto-renewal
sudo certbot renew --dry-run
Common Commands
# View logs
./deploy.sh logs # All services
./deploy.sh logs portal # Portal only
./deploy.sh logs db # Database only
# Service management
./deploy.sh status # Check status
./deploy.sh restart # Restart all services
./deploy.sh stop # Stop all services
# Database
./deploy.sh backup # Backup database
./deploy.sh restore backup.sql.gz # Restore from backup
# Updates
./deploy.sh update # Pull latest code and rebuild portal
# Cleanup
./deploy.sh cleanup # Remove unused Docker resources
Architecture
┌─────────────────┐
│ Internet │
└────────┬────────┘
│
┌────────┴────────┐
│ Nginx (Host) │
│ :80 / :443 │
│ SSL Termination│
└────────┬────────┘
│
┌────────────────────┼────────────────────┐
│ │ │
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Portal │ │ API │ │ Studio │
│ :7453 │ │ :7455 │ │ :7454 │
└────┬────┘ └────┬────┘ └────┬────┘
│ │ │
│ ┌────┴────┐ │
│ │ Kong │ │
│ │ Gateway │ │
│ └────┬────┘ │
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────┐
│ Docker Network │
│ ┌──────┐ ┌──────┐ ┌─────────┐ ┌──────────┐ │
│ │ DB │ │ Auth │ │ Storage │ │ Realtime │ │
│ └──────┘ └──────┘ └─────────┘ └──────────┘ │
└─────────────────────────────────────────────────┘
Ports
| Service | Internal Port | External (localhost) |
|---|---|---|
| Portal | 3000 | 7453 |
| Studio | 3000 | 7454 |
| Kong | 8000 | 7455 |
Troubleshooting
Services not starting
# Check Docker logs
docker logs monacousa-portal
docker logs monacousa-db
docker logs monacousa-kong
# Check if ports are in use
sudo netstat -tlnp | grep -E '7453|7454|7455'
Database connection issues
# Check database health
docker exec monacousa-db pg_isready -U postgres
# View database logs
docker logs monacousa-db --tail=50
Nginx issues
# Test config
sudo nginx -t
# Check error log
sudo tail -f /var/log/nginx/error.log
# Check portal access log
sudo tail -f /var/log/nginx/portal.monacousa.org.error.log
SSL certificate issues
# Renew certificates manually
sudo certbot renew
# Check certificate status
sudo certbot certificates
Backup Strategy
Automated Daily Backups
Add to crontab (crontab -e):
# Daily database backup at 3 AM
0 3 * * * /path/to/monacousa-portal/deploy.sh backup 2>&1 | logger -t monacousa-backup
Backup Storage
Backups are saved to the project directory as backup_YYYYMMDD_HHMMSS.sql.gz.
Consider copying to remote storage:
# Copy to remote server
scp backup_*.sql.gz user@backup-server:/backups/monacousa/
Security Checklist
- Strong passwords in .env file
- Firewall enabled (only 80, 443, 22 open)
- SSL certificate installed
- Studio protected with basic auth
- Regular backups configured
- Log rotation configured
- Fail2ban installed (optional)