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:
FilePurpose
docker-compose.ymlMain orchestrator that includes other files
docker-compose.launchpad.ymlCore application services
docker-compose.supabase.ymlSupabase backend services
docker-compose.caddy.ymlReverse proxy with automatic HTTPS

Main Compose File

The docker-compose.yml file controls which services to include:
include:
  - path: ./docker-compose.launchpad.yml
  - path: ./docker-compose.supabase.yml   # Comment to exclude
  - path: ./docker-compose.caddy.yml      # Comment to exclude

networks:
  default:
    driver: bridge
    external: true
    name: "${PROJECT_NAME}-network"

Core Application Services

The docker-compose.launchpad.yml file contains the essential application services:
ServiceImagePortPurpose
apiCustom (Dockerfile.api)8080FastAPI application server
celery_workerCustom (Dockerfile.celery)-Async task processing
redisredis:latest6379Message broker & cache
dbsupabase/postgres:15.8.1.0855432PostgreSQL database
The API and Celery services mount the app/ directory for live code reloading during development.

Supabase Services

The docker-compose.supabase.yml file provides the full Supabase stack:
ServiceImagePurpose
studiosupabase/studioDashboard UI
kongkong:2.8.1API gateway (ports 8000, 8443)
authsupabase/gotrueAuthentication service
restpostgrest/postgrestAuto-generated REST API
realtimesupabase/realtimeWebSocket subscriptions
storagesupabase/storage-apiFile storage
imgproxydarthsim/imgproxyImage transformations
metasupabase/postgres-metaSchema introspection
functionssupabase/edge-runtimeDeno edge functions
analyticssupabase/logflareLog aggregation
vectortimberio/vectorLog collection
supavisorsupabase/supavisorConnection pooling
When Supabase is enabled, access the Studio dashboard at http://localhost:8000 with credentials from your .env file.

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

Comment out the services you don’t need:
include:
  - path: ./docker-compose.launchpad.yml      # Always include
  # - path: ./docker-compose.supabase.yml     # Exclude Supabase
  # - path: ./docker-compose.caddy.yml        # Exclude Caddy

Option 2: Use CLI flags

Specify which compose files to use:
# Without Supabase (use external database)
docker compose -f docker-compose.launchpad.yml up

# Without Caddy (access Kong directly)
docker compose -f docker-compose.launchpad.yml \
               -f docker-compose.supabase.yml up

# Full stack
docker compose up

Management Scripts

The docker/ directory includes helper scripts:

start.sh

Creates the network if needed and starts all services:
cd docker && ./start.sh

stop.sh

Stops all running containers:
cd docker && ./stop.sh

logs.sh

Interactive log viewer with service selection:
cd docker && ./logs.sh

Architecture Overview

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    Caddy (optional)                     β”‚
β”‚                   :80, :443, :2019                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                 Kong API Gateway                        β”‚
β”‚                  :8000, :8443                           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚             β”‚             β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Auth/GoTrue  β”‚ β”‚ PostgREST β”‚ β”‚ Storage / Realtime /  β”‚
β”‚    :9999      β”‚ β”‚   :3000   β”‚ β”‚ Functions / etc.      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚               β”‚                   β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              PostgreSQL Database                        β”‚
β”‚              supabase/postgres:15.8.1.085              β”‚
β”‚              :5432 (direct) / :6543 (pooled)           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚               Application Services                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚ FastAPI (:8080) β”‚  β”‚ Celery Workerβ”‚  β”‚   Redis   β”‚  β”‚
β”‚  β”‚    /app mount   β”‚  β”‚  async tasks β”‚  β”‚   :6379   β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

All services connected via: ${PROJECT_NAME}-network

Environment Variables

Key environment variables in docker/.env:
CategoryVariables
ProjectPROJECT_NAME
DatabasePOSTGRES_PASSWORD, POSTGRES_DB, POSTGRES_PORT
JWTJWT_SECRET, JWT_EXPIRY, ANON_KEY, SERVICE_ROLE_KEY
LLM ProvidersOPENAI_API_KEY, ANTHROPIC_API_KEY, MISTRAL_API_KEY, etc.
LangfuseLANGFUSE_PUBLIC_KEY, LANGFUSE_SECRET_KEY, LANGFUSE_BASE_URL
Copy docker/.env.example to docker/.env and configure your values before starting.