Files
pig/docker-compose.yml
2026-08-13 01:39:01 -07:00

90 lines
3.3 KiB
YAML

# 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