-
Notifications
You must be signed in to change notification settings - Fork 0
Deployment
Zachary edited this page Apr 12, 2026
·
1 revision
Get FieldOpt running in production.
- AWS account with EC2 access
- Ubuntu 24.04 LTS instance (t3.small minimum, t3.medium recommended)
- Security group with ports 22 (SSH), 80 (HTTP), 443 (HTTPS) open
- Domain name (e.g., demo.fieldopt.dev)
- ~20GB storage for logs and database
ssh -i your-key.pem ubuntu@your-instance-ip
# Update packages
sudo apt update && sudo apt upgrade -y
# Install essential tools
sudo apt install -y git curl wget# Install Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# Add ubuntu user to docker group
sudo usermod -aG docker ubuntu
# Verify
docker --versionLog out and back in for docker group to take effect.
git clone https://github.com/zblauser/fieldopt.git
cd fieldopt# Install Node
curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
# Build
npm install --prefix frontend
npm run build --prefix frontend# Build and start
docker compose up -d
# Check status
docker compose ps
# Seed database
docker compose exec backend python -m backend.database.reset_dbServices running:
- PostgreSQL — Port 5432
- FastAPI Backend — Port 8000
- Nginx — Ports 80, 443
Point your domain to the EC2 instance:
- Go to your DNS provider (IONOS, Route53, etc.)
- Create A record:
demo.fieldopt.dev→your-instance-ip - Wait 5-10 minutes for DNS to propagate
Test:
nslookup demo.fieldopt.devShould return your EC2 IP.
# Stop nginx temporarily
docker compose stop nginx
# Get certificate from Let's Encrypt
sudo certbot certonly --standalone \
-d demo.fieldopt.dev \
-d www.demo.fieldopt.dev \
--email your-email@example.com \
--agree-tos --no-eff-email
# Verify
sudo ls /etc/letsencrypt/live/demo.fieldopt.dev/
# Restart nginx
docker compose start nginxNginx automatically redirects HTTP to HTTPS.
# Test HTTP → HTTPS redirect
curl -I http://demo.fieldopt.dev
# Should return 301 redirect to HTTPS
# Test HTTPS
curl -I https://demo.fieldopt.dev
# Should return 200 OK
# Test API
curl https://demo.fieldopt.dev/api/v1/technicians/The docker-compose.yml includes:
- PostgreSQL — Database (port 5432)
- FastAPI Backend — API server (port 8000)
- Nginx — Reverse proxy (ports 80, 443)
- PGAdmin — Database admin (port 5050, dev only)
docker compose up# Use production config
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
# View logs
docker compose logs -f backend
docker compose logs -f nginxCreate .env in project root:
DATABASE_URL=postgresql+asyncpg://fieldopt:fieldopt@postgres:5432/fieldopt
API_HOST=0.0.0.0
API_PORT=8000
API_RELOAD=false
CORS_ORIGINS=["https://demo.fieldopt.dev","https://www.demo.fieldopt.dev"]
LOG_LEVEL=INFO
DEBUG=falseSet in docker-compose.yml:
environment:
POSTGRES_USER: fieldopt
POSTGRES_PASSWORD: <secure-password>
POSTGRES_DB: fieldopt# Backend
docker compose logs -f backend
# Nginx
docker compose logs -f nginx
# All
docker compose logs -f# Backup
docker compose exec postgres pg_dump -U fieldopt fieldopt > backup.sql
# Restore
docker compose exec -T postgres psql -U fieldopt fieldopt < backup.sql# Single service
docker compose restart backend
# All services
docker compose restart
# Full restart
docker compose down
docker compose up -d# Pull latest
git pull origin main
# Rebuild
docker compose build
# Restart
docker compose up -d# Careful! This deletes all data
docker compose exec backend python -m backend.database.reset_db --empty
# Then reseed
docker compose exec backend python -m backend.database.reset_dbAll services have health checks configured:
# Check service health
docker compose ps
# All should show "healthy" after 30-60 seconds# Check disk usage
df -h
# Check database size
docker compose exec postgres du -sh /var/lib/postgresql/data# Real-time monitoring
docker statsNginx should use <100MB, backend <500MB, postgres <1GB (varies by data)
- Single EC2 instance handles 100-200 techs, 500+ jobs/day
- PostgreSQL single instance (backup recommended)
- t3.small → t3.medium (more RAM/CPU)
- Add Redis for caching (v0.0.8)
- Database read replicas for analytics
- Multiple backend instances with load balancer
- Change PostgreSQL password
- Enable automatic backups
- Set up log rotation
- Configure firewall rules
- Use strong SSL certificates
- Monitor disk space
- Enable authentication (v0.0.9)
- Set up monitoring alerts
# Check if postgres is running
docker compose ps postgres
# Check logs
docker compose logs postgres
# Restart
docker compose restart postgres# Check what's using memory
docker stats
# Clean up unused images/containers
docker system prune# Check certificate validity
sudo certbot certificates
# Renew if needed
sudo certbot renew
# Check nginx config
sudo nginx -t# Check backend is running
docker compose ps backend
# Check backend logs
docker compose logs backend
# Check nginx config
docker compose logs nginxFieldOpt Wiki
Resources