monacousa-portal/DEPLOYMENT.md

231 lines
6.5 KiB
Markdown

# 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
```bash
# 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
```bash
# 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 password
- `JWT_SECRET` - 32+ character random string
- `ANON_KEY` / `SERVICE_ROLE_KEY` - Generate at supabase.com/docs/guides/self-hosting#api-keys
- `SMTP_*` - Email server settings
### 3. Install and Configure Nginx
```bash
# 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
```bash
# Deploy all services
./deploy.sh deploy
# Wait for services to be healthy (check status)
./deploy.sh status
```
### 5. Get SSL Certificate
```bash
# 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
```bash
# 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
```bash
# 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
```bash
# Check database health
docker exec monacousa-db pg_isready -U postgres
# View database logs
docker logs monacousa-db --tail=50
```
### Nginx issues
```bash
# 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
```bash
# Renew certificates manually
sudo certbot renew
# Check certificate status
sudo certbot certificates
```
## Backup Strategy
### Automated Daily Backups
Add to crontab (`crontab -e`):
```bash
# 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:
```bash
# 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)