Compose File Structure
The Docker setup is split into four compose files:Main Compose File
Thedocker-compose.yml file controls which services to include. By default only the core Launchpad stack is on; Supabase and Caddy are commented out. Uncomment Supabase when you need Studio/Auth/Realtime/Storage, and uncomment Caddy when you need HTTPS in front of the API (typical for VPS deployments):
Core Application Services
Thedocker-compose.launchpad.yml file contains the essential application services:
The API and Celery services mount the host
app/ into /workspace/app for live code reloading during development. The package is installed editable inside the image, so edits in the host app/launchpad/ tree take effect without a rebuild.
Supabase Services
Thedocker-compose.supabase.yml file is opt-in and provides the full Supabase stack:
When Supabase is enabled, access the Studio dashboard at
http://localhost:8000 with credentials from docker/.env.Caddy Reverse Proxy
Thedocker-compose.caddy.yml file provides:
- Automatic HTTPS certificate management
- Reverse proxy to application services
- HTTP/2 support
- Ports: 80 (HTTP), 443 (HTTPS), 2019 (admin API)
Including and Excluding Services
Option 1: Edit docker-compose.yml
Uncomment the services you need:Option 2: Use CLI flags
Specify which compose files to use:Management Scripts
Thedocker/ directory includes helper scripts:
start.sh
Creates the network if needed and starts all services:stop.sh
Stops all running containers:logs.sh
Interactive log viewer with service selection:Architecture Overview
Environment Variables
The Launchpad has two.env files because local Python runs and Docker Compose read configuration in different ways.
docker/.env is intentionally much larger than the root .env because self-hosted Supabase requires many variables for Auth, Realtime, Storage, Studio, Kong, analytics, and related services. Those values stay in docker/.env even when Supabase is commented out by default, so opting in later is a compose-file change rather than a config migration.
For local Python runs that connect to the Docker database through localhost, the root .env database user depends on whether Supabase is enabled. Use DATABASE_USER=postgres with the default Launchpad-only stack. When docker-compose.supabase.yml is included, port 5432 is served by Supavisor, so use DATABASE_USER=postgres.<POOLER_TENANT_ID>, for example postgres.launchpad.
Key environment variables in docker/.env:
Copy
docker/.env.example to docker/.env and configure your values before starting.