Files
forge/docker-compose.yml
T

63 lines
1.8 KiB
YAML

# Compose v2 — `version:` key intentionally omitted (deprecated).
#
# Topology: a bundled Postgres (`db`, database `forge`) + the FORGE app. The
# schema self-bootstraps in initDB() on app boot (no ORM, no migrations) and
# seeds the bundled ticket archives on first run. App host port is 3099 (FORGE's
# lane); behind the Synology reverse proxy this is what forge.mycloud.dp.ua maps to.
name: forge
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_DB: forge
POSTGRES_USER: forge
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-forge}
volumes:
- forge-db:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U forge -d forge']
interval: 10s
timeout: 5s
retries: 5
app:
build:
context: .
target: runtime
image: forge-app:latest
restart: unless-stopped
depends_on:
db:
condition: service_healthy
ports:
# Host 3089 -> container 3000. 3089 is FORGE's lane.
- '3089:3000'
environment:
DATABASE_URL: postgresql://forge:${POSTGRES_PASSWORD:-forge}@db:5432/forge
NODE_ENV: production
PORT: 3000
# Read-API auth (see .env / .env.example).
SESSION_SECRET: ${SESSION_SECRET:?set SESSION_SECRET in .env}
AUTH_USER: ${AUTH_USER:-admin}
AUTH_PASS: ${AUTH_PASS:?set AUTH_PASS in .env}
# Guards POST /api/tokens. Prefer minting via the CLI instead (see SETUP.md).
ADMIN_KEY: ${ADMIN_KEY:-}
healthcheck:
test: ['CMD', 'wget', '-qO-', 'http://localhost:3000/healthz']
interval: 30s
timeout: 5s
start_period: 20s
retries: 3
mem_limit: 1g
logging:
driver: json-file
options:
max-size: '10m'
max-file: '3'
volumes:
forge-db: