DigitalOcean Deployment
Deploy BFFless to a DigitalOcean Droplet.
Cost: $6-12/month
Prerequisites
- DigitalOcean account
- Domain name
- SSH key pair
Step 1: Create Droplet
- Go to DigitalOcean → Create → Droplets
- Image: Ubuntu 24.04 LTS x64
- Size:
- Minimum: $6/mo (1GB RAM)
- Recommended: $12/mo (2GB RAM) — can enable MinIO and Redis for enhanced performance
- Authentication: SSH keys
- Hostname:
bffless-prod - Note the IP address after creation
Step 2: Configure DNS
Add these DNS records pointing to your Droplet IP:
| Type | Name | Value |
|---|---|---|
| A | @ | YOUR_DROPLET_IP |
| A | www | YOUR_DROPLET_IP |
| A | admin | YOUR_DROPLET_IP |
| A | minio | YOUR_DROPLET_IP |
Wait 5-30 minutes for propagation.
Step 3: Install BFFless
SSH into your droplet and run the install script:
ssh root@YOUR_DROPLET_IP
sh -c "$(curl -fsSL https://raw.githubusercontent.com/bffless/ce/main/install.sh)"
The installer will:
- Install Docker if needed
- Configure the firewall
- Prompt for your domain name and email
- Generate SSL certificates
- Create secure passwords and keys
- Start all services
Step 4: Complete Setup
Visit https://admin.yourdomain.com and complete the setup wizard.
Access Points
| URL | Purpose |
|---|---|
https://admin.yourdomain.com | Admin panel |
https://www.yourdomain.com | Welcome page |
https://minio.yourdomain.com | MinIO console |
Updating
cd /opt/bffless
# Pull latest images and restart
./stop.sh
docker compose pull
./start.sh --fresh
Maintenance
View Logs
docker compose logs -f
docker compose logs -f backend
Backup Database
mkdir -p /opt/backups/postgres
docker compose exec postgres pg_dump -U postgres bffless > \
/opt/backups/postgres/backup_$(date +%Y%m%d_%H%M%S).sql
Reset Application
# Reset setup state only
cd /opt/bffless/apps/backend
./scripts/reset-setup.sh
docker compose restart backend
# Full reset (deletes all data)
docker compose down -v
docker compose up -d
Troubleshooting
SSL Issues
# Check certificate
openssl x509 -in ssl/fullchain.pem -text -noout | grep -A 1 "Subject Alternative Name"
# Force renewal
certbot renew --force-renewal
cp /etc/letsencrypt/live/*/fullchain.pem ssl/
cp /etc/letsencrypt/live/*/privkey.pem ssl/
docker compose restart nginx
Can't Connect
ufw status
docker compose ps
curl http://localhost:3000/api/health
Next Steps
- GitHub Actions - Set up automated deployments
- Environment Variables - All configuration options