Skip to main content
The Launchpad uses a modular Docker Compose architecture that lets you include or exclude services based on your needs. All services run on a shared bridge network for seamless communication.

Compose File Structure

The Docker setup is split into four compose files:

Main Compose File

The docker-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

The docker-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

The docker-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

The docker-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

The docker/ 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.