# 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} PIGGY_INTERNAL_URL: http://piggy:8931 PIGGY_INTERNAL_TOKEN: ${PIGGY_INTERNAL_TOKEN:-} SLACK_BOT_TOKEN: ${SLACK_BOT_TOKEN:-} SLACK_SIGNING_SECRET: ${SLACK_SIGNING_SECRET:-} BUZZ_RELAY_URL: ${BUZZ_RELAY_URL:-} NOTION_CLIENT_ID: ${NOTION_CLIENT_ID:-} NOTION_CLIENT_SECRET: ${NOTION_CLIENT_SECRET:-} NOTION_REDIRECT_URI: ${NOTION_REDIRECT_URI:-} BUZZ_PRIVATE_KEY: ${BUZZ_PRIVATE_KEY:-} BUZZ_AUTH_TAG: ${BUZZ_AUTH_TAG:-} # 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' piggy: profiles: ['piggy'] build: . restart: unless-stopped depends_on: db: condition: service_healthy command: ['npx', 'tsx', 'apps/piggy/src/main.ts'] environment: DATABASE_URL: postgres://${POSTGRES_USER:-pig}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB:-pig} PIGGY_INFERENCE_API_KEY: ${PIGGY_INFERENCE_API_KEY:-} PIGGY_INFERENCE_BASE: ${PIGGY_INFERENCE_BASE:-https://api.pinference.ai/api/v1} PIGGY_MODEL: ${PIGGY_MODEL:-nvidia/nemotron-3-nano-30b-a3b} PIGGY_LEASE_SECONDS: ${PIGGY_LEASE_SECONDS:-300} PIGGY_INTERNAL_TOKEN: ${PIGGY_INTERNAL_TOKEN:-} PIGGY_CHAT_HOST: 0.0.0.0 PIGGY_CHAT_PORT: 8931 PIGGY_CHAT_ALLOW_NON_LOOPBACK: 'true' # Private to the Compose network. There is deliberately no `ports` entry. expose: - '8931' 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