name: provenance # One stack stands up the whole system. Configuration is entirely env-driven # (see .env.example). Run from this directory: `docker compose up -d`. services: postgres: # pgvector image = Postgres + pgvector; pg_trgm ships in contrib. image: pgvector/pgvector:pg17 environment: POSTGRES_USER: ${POSTGRES_USER:-provenance} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-provenance} POSTGRES_DB: ${POSTGRES_DB:-provenance} volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-provenance} -d ${POSTGRES_DB:-provenance}"] interval: 5s timeout: 5s retries: 10 restart: unless-stopped minio: image: minio/minio:latest command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: ${MINIO_ROOT_USER:-provenance} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-change-me-too} volumes: - miniodata:/data healthcheck: test: ["CMD-SHELL", "mc ready local || exit 1"] interval: 10s timeout: 5s retries: 10 restart: unless-stopped backend: build: context: ../backend dockerfile: Dockerfile environment: APP_ENV: ${APP_ENV:-development} DATABASE_URL: ${DATABASE_URL:-postgresql+asyncpg://provenance:provenance@postgres:5432/provenance} depends_on: postgres: condition: service_healthy healthcheck: test: - CMD-SHELL - >- python -c "import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://localhost:8000/health').status==200 else 1)" interval: 10s timeout: 5s retries: 5 start_period: 20s restart: unless-stopped caddy: image: caddy:2 ports: - "80:80" - "443:443" environment: # Local default ':80' -> http://localhost. Set to a domain in production # for automatic HTTPS (or run plain HTTP behind a Cloudflare Tunnel). PROVENANCE_SITE_ADDRESS: ${PROVENANCE_SITE_ADDRESS:-:80} volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - caddydata:/data - caddyconfig:/config depends_on: - backend restart: unless-stopped volumes: pgdata: miniodata: caddydata: caddyconfig: