docker-compose.yml
2,140 bytes
| 1 | # Production compose for a single VPS: Postgres + the app + Caddy (HTTPS). |
|---|---|
| 2 | # |
| 3 | # cp .env.example .env # set ENCRYPTION_KEY (required), auth vars, SITE_ADDRESS |
| 4 | # docker compose up -d # first boot applies the schema automatically |
| 5 | # docker compose exec app node node_modules/prisma/build/index.js db seed # (optional) demo data |
| 6 | # |
| 7 | # APP_IMAGE lets the CI deploy workflow pin a pushed ghcr.io image instead of |
| 8 | # building on the box; leave unset to build locally. |
| 9 | |
| 10 | services: |
| 11 | db: |
| 12 | image: postgres:16-alpine |
| 13 | restart: unless-stopped |
| 14 | environment: |
| 15 | POSTGRES_USER: roundtable |
| 16 | POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-roundtable} |
| 17 | POSTGRES_DB: roundtable |
| 18 | volumes: |
| 19 | - pgdata:/var/lib/postgresql/data |
| 20 | healthcheck: |
| 21 | test: ['CMD-SHELL', 'pg_isready -U roundtable -d roundtable'] |
| 22 | interval: 5s |
| 23 | timeout: 5s |
| 24 | retries: 12 |
| 25 | |
| 26 | app: |
| 27 | image: ${APP_IMAGE:-roundtable:local} |
| 28 | build: |
| 29 | context: . |
| 30 | restart: unless-stopped |
| 31 | depends_on: |
| 32 | db: |
| 33 | condition: service_healthy |
| 34 | environment: |
| 35 | DATABASE_URL: postgresql://roundtable:${POSTGRES_PASSWORD:-roundtable}@db:5432/roundtable?schema=public |
| 36 | ENCRYPTION_KEY: ${ENCRYPTION_KEY:?set ENCRYPTION_KEY in .env} |
| 37 | AUTH_SECRET: ${AUTH_SECRET:-} |
| 38 | AUTH_URL: ${AUTH_URL:-} |
| 39 | AUTH_TRUST_HOST: 'true' |
| 40 | AUTH_GITHUB_ID: ${AUTH_GITHUB_ID:-} |
| 41 | AUTH_GITHUB_SECRET: ${AUTH_GITHUB_SECRET:-} |
| 42 | OPENROUTER_APP_URL: ${OPENROUTER_APP_URL:-http://localhost:3000} |
| 43 | OPENROUTER_APP_TITLE: ${OPENROUTER_APP_TITLE:-Roundtable} |
| 44 | MOCK_LLM: ${MOCK_LLM:-0} |
| 45 | RATE_LIMIT_DEBATES_PER_HOUR: ${RATE_LIMIT_DEBATES_PER_HOUR:-20} |
| 46 | PORT: '3000' |
| 47 | expose: |
| 48 | - '3000' |
| 49 | |
| 50 | caddy: |
| 51 | image: caddy:2-alpine |
| 52 | restart: unless-stopped |
| 53 | depends_on: |
| 54 | - app |
| 55 | ports: |
| 56 | - '80:80' |
| 57 | - '443:443' |
| 58 | environment: |
| 59 | # e.g. "roundtable.example.com" for auto-HTTPS, or ":80" for local. |
| 60 | SITE_ADDRESS: ${SITE_ADDRESS:-:80} |
| 61 | volumes: |
| 62 | - ./Caddyfile:/etc/caddy/Caddyfile:ro |
| 63 | - caddy_data:/data |
| 64 | - caddy_config:/config |
| 65 | |
| 66 | volumes: |
| 67 | pgdata: |
| 68 | caddy_data: |
| 69 | caddy_config: |
| 70 | |