# PIG — self-hosted deployment. # # docker compose -p pig up -d --build # # The project name matters. Use something PIG-specific (`-p pig`) so this stack # never adopts another application's volumes — a compose project silently # inheriting a neighbouring database is a genuinely nasty way to lose data. services: db: image: postgres:16-alpine restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER:-pig} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD must be set} POSTGRES_DB: ${POSTGRES_DB:-pig} volumes: - pig-pgdata:/var/lib/postgresql/data # Not published to the host. The application reaches it over the compose # network; exposing Postgres publicly is never what you want. expose: - '5432' healthcheck: test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER:-pig} -d ${POSTGRES_DB:-pig}'] interval: 10s timeout: 5s retries: 5 app: build: . restart: unless-stopped depends_on: db: condition: service_healthy environment: DATABASE_URL: postgres://${POSTGRES_USER:-pig}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB:-pig} NODE_ENV: production PIG_PORT: 8920 PIG_PUBLIC_URL: ${PIG_PUBLIC_URL:?PIG_PUBLIC_URL must be set} SUPABASE_URL: ${SUPABASE_URL:?SUPABASE_URL must be set in production} SUPABASE_ANON_KEY: ${SUPABASE_ANON_KEY} SUPABASE_SERVICE_KEY: ${SUPABASE_SERVICE_KEY:-} PIG_ADMIN_EMAILS: ${PIG_ADMIN_EMAILS:-} PIG_INVITE_CODE: ${PIG_INVITE_CODE:-} PRIME_API_KEY: ${PRIME_API_KEY:-} PRIME_SYNC_ENABLED: ${PRIME_SYNC_ENABLED:-false} PIGGY_ENABLED: ${PIGGY_ENABLED:-false} ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-} SLACK_BOT_TOKEN: ${SLACK_BOT_TOKEN:-} SLACK_SIGNING_SECRET: ${SLACK_SIGNING_SECRET:-} BUZZ_RELAY_URL: ${BUZZ_RELAY_URL:-} # Bound to loopback: TLS termination belongs to the reverse proxy in front, # not to this container. ports: - '127.0.0.1:${PIG_HOST_PORT:-8920}:8920' volumes: pig-pgdata: # Named explicitly so it is obvious which volume holds the data, and so a # `docker compose down -v` mistake is at least a legible one. name: pig-pgdata