Complete VPS deployment guide for Roost using docker-compose.yml.
This Docker path now includes Traefik + Let’s Encrypt SSL by default. Installer also applies Docker Engine 29+ API compatibility for Traefik automatically.
What This Covers
- Frontend + backend deployment on a VPS
- Built-in Traefik reverse proxy
- Automatic Let’s Encrypt SSL certificates
- Supabase Cloud or Supabase Self-hosted
- Optional Redis container profile
- Optional self-hosted MinIO profile for S3-compatible storage
Prerequisites
- Ubuntu/Debian VPS recommended (2 vCPU, 4GB RAM minimum)
- Domain pointed to your VPS public IP
- Ports
80and443open in firewall/security group - Git access to your Roost repository
Step 1: Clone and Run Installer
git clone https://github.com/msrbuilds/roost.git
cd roost
bash install.sh
When prompted:
- Choose
Docker (Self-hosted VPS)target. - Enter a real domain (not
localhost). - Enter Let’s Encrypt email (required).
- Choose database provider and optional services.
- For
S3-Compatiblestorage, choose:Self-host MinIO on this VPS(auto profile), or- external provider (R2 / remote MinIO)
Installer generates:
.env.localserver/.env.env(Docker runtime env, including Traefik/SSL settings)- Post-install validation output (domain, SSL email, compose config, Traefik API compatibility)
Step 2: Database Provider Paths
Supabase Cloud
- Choose
Supabase Cloudin installer. - Provide project URL, anon key, service role key.
- Run
schema.sqlin Supabase SQL Editor (or Supabase CLI).
Supabase Self-hosted
- Choose
Supabase Self-hostedin installer. - Provide your self-hosted Supabase URL.
- Choose
Auto-generate JWT/anon/service keys(recommended) or enter existing keys manually. - Use Supabase Self-Hosted Guide for Supabase stack setup.
MinIO (S3-Compatible, Self-hosted on this VPS)
If selected in installer:
.envincludes MinIO root credentials, bucket, andS3_ENDPOINT=https://your-domain.COMPOSE_PROFILES=miniois enabled.- MinIO remains internal; the authenticated backend proxies authorized downloads.
- A
minio-initjob auto-creates private upload and backup buckets.
Step 3: Deploy
docker compose up -d --build
Check status:
docker compose ps
docker compose logs -f traefik
docker compose logs -f backend
docker compose logs -f frontend
Step 4: Verify SSL + Routing
curl https://your-domain.com/api/health
curl -I https://your-domain.com
Expected:
- Frontend served over HTTPS at root path
- Backend reachable at
/api/*over same domain
Traffic Model
- Traefik listens on host ports
80and443. - Frontend/backend are internal-only containers (not directly published to host).
- HTTP is redirected to HTTPS.
Updates
git pull
docker compose up -d --build
Troubleshooting
SSL certificate not issued
- Confirm DNS A record points to VPS public IP.
- Confirm ports 80/443 are open.
- Check logs:
docker compose logs -f traefik
Traefik log: client version 1.24 is too old
This means Traefik cannot query your Docker socket API.
- Re-run installer once (latest installer auto-applies Docker API compatibility override):
bash install.sh
- Or pull latest repo changes and recreate:
git pulldocker compose up -d --force-recreate traefik
- Verify:
docker compose logs --tail=80 traefik
Containers fail due missing env values
- Re-run
bash install.shand choose Docker target again. - Confirm
.envexists in project root.
Redis connection errors
- Confirm
.envhasREDIS_URL=redis://redis:6379. - Confirm
.envhasCOMPOSE_PROFILES=redis.
MinIO upload or download fails
- Confirm
.envhasS3_ENDPOINT=https://your-domain. - Confirm
.envhasCOMPOSE_PROFILESincludingminio. - Confirm the backend has matching MinIO credentials and
PUBLIC_API_URL. - Check MinIO init logs:
docker compose logs -f minio-init.
CORS errors
- Ensure
ALLOWED_ORIGINSandFRONTEND_URLin.envmatch your production domain.