231 lines
6.5 KiB
Markdown
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)
|