Files
politics-tracking/docker-compose.yml
T
simonandClaude Opus 5.5 256906e9fe Prepare for going public: legal pages, corrections contact, portrait proxy
/impressum and /datenschutz read the operator's details from the environment
so they stay out of this repository, and show a visible notice until set.
Portraits go through an allowlisted /api/img so visitors' IPs stay with us.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 01:22:02 +01:00

108 lines
3.5 KiB
YAML

# Politrack stack. On Unraid use the "Docker Compose Manager" plugin and set
# DATA_DIR in .env to e.g. /mnt/user/appdata/politrack (see docs/deployment-unraid.md).
x-backend: &backend
image: ${POLITRACK_IMAGE:-politrack-backend:latest}
build: ./backend
restart: unless-stopped
env_file: .env
environment:
POLITRACK_DATABASE_URL: postgresql://politrack:${POSTGRES_PASSWORD}@db:5432/politrack
POLITRACK_RAW_DIR: /data/raw
volumes:
# Raw-response archive: lets `politrack reparse` rebuild data after parser fixes without refetching.
- ${DATA_DIR:-./data}/raw:/data/raw
depends_on:
db:
condition: service_healthy
x-worker: &worker
<<: *backend
depends_on:
migrate:
condition: service_completed_successfully
services:
db:
image: pgvector/pgvector:pg16
restart: unless-stopped
environment:
POSTGRES_DB: politrack
POSTGRES_USER: politrack
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- ${DATA_DIR:-./data}/postgres:/var/lib/postgresql/data
# Exposed so agents/BI tools can connect with the read-only role `politrack_reader`.
ports:
- "${DB_PORT:-5433}:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U politrack -d politrack"]
interval: 10s
timeout: 5s
retries: 10
shm_size: 256mb
# Room for the shutdown checkpoint; Docker's default 10 s kills Postgres mid-checkpoint on slow disks,
# forcing crash recovery on the next start.
stop_grace_period: 2m
# Applies SQL migrations, syncs the source registry from code and installs the job-queue schema.
migrate:
<<: *backend
restart: "no"
command: ["politrack", "migrate"]
api:
<<: *worker
command: ["politrack", "api"]
ports:
- "${API_PORT:-8000}:8000"
# Workers, one per queue class so slow bulk downloads never delay the frequent jobs.
# Scale with `docker compose up -d --scale worker-scrape=2`, or run the same image on
# another machine pointed at this database.
worker-scrape:
<<: *worker
command: ["procrastinate", "--app=politrack.worker.app", "worker", "--queues=scrape,social", "--concurrency=2"]
worker-bulk:
<<: *worker
command: ["procrastinate", "--app=politrack.worker.app", "worker", "--queues=bulk", "--concurrency=1"]
worker-enrich:
<<: *worker
command: ["procrastinate", "--app=politrack.worker.app", "worker", "--queues=enrich", "--concurrency=1"]
mcp:
<<: *worker
command: ["politrack", "mcp"]
ports:
- "${MCP_PORT:-8001}:8001"
web:
image: ${POLITRACK_WEB_IMAGE:-politrack-web:latest}
build: ./web
restart: unless-stopped
environment:
API_INTERNAL_URL: http://api:8000
POLITRACK_USER_AGENT: ${POLITRACK_USER_AGENT:-}
POLITRACK_LEGAL_NAME: ${POLITRACK_LEGAL_NAME:-}
POLITRACK_LEGAL_ADDRESS: ${POLITRACK_LEGAL_ADDRESS:-}
POLITRACK_LEGAL_EMAIL: ${POLITRACK_LEGAL_EMAIL:-}
POLITRACK_CORRECTIONS_EMAIL: ${POLITRACK_CORRECTIONS_EMAIL:-}
ports:
- "${WEB_PORT:-3000}:3000"
depends_on:
- api
# Optional local embedding model for semantic search / RAG:
# docker compose --profile ai up -d
# docker compose exec ollama ollama pull bge-m3
# then set POLITRACK_OLLAMA_URL=http://ollama:11434 in .env.
# If you already run Ollama on Unraid, point POLITRACK_OLLAMA_URL at it instead.
ollama:
image: ollama/ollama:latest
profiles: ["ai"]
restart: unless-stopped
volumes:
- ${DATA_DIR:-./data}/ollama:/root/.ollama