# Chrysopedia — Docker Compose # XPLTD convention: xpltd_chrysopedia project, bind mounts, dedicated bridge name: xpltd_chrysopedia services: # ── PostgreSQL 16 ── chrysopedia-db: image: postgres:16-alpine container_name: chrysopedia-db restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER:-chrysopedia} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-changeme} POSTGRES_DB: ${POSTGRES_DB:-chrysopedia} volumes: - /vmPool/r/services/chrysopedia_db:/var/lib/postgresql/data ports: - "127.0.0.1:5433:5432" networks: - chrysopedia healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-chrysopedia}"] interval: 10s timeout: 5s retries: 5 # ── Redis (Celery broker) ── chrysopedia-redis: image: redis:7-alpine container_name: chrysopedia-redis restart: unless-stopped volumes: - /vmPool/r/services/chrysopedia_redis:/data networks: - chrysopedia healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 # ── FastAPI application ── chrysopedia-api: build: context: . dockerfile: docker/Dockerfile.api container_name: chrysopedia-api restart: unless-stopped env_file: - path: .env required: false environment: DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-chrysopedia}:${POSTGRES_PASSWORD}@chrysopedia-db:5432/${POSTGRES_DB:-chrysopedia} REDIS_URL: redis://chrysopedia-redis:6379/0 volumes: - ./backend:/app - /vmPool/r/services/chrysopedia_data:/data ports: - "127.0.0.1:8000:8000" depends_on: chrysopedia-db: condition: service_healthy chrysopedia-redis: condition: service_healthy networks: - chrysopedia # ── Celery worker (pipeline stages 2-5) ── chrysopedia-worker: build: context: . dockerfile: docker/Dockerfile.api container_name: chrysopedia-worker restart: unless-stopped env_file: - path: .env required: false environment: DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-chrysopedia}:${POSTGRES_PASSWORD}@chrysopedia-db:5432/${POSTGRES_DB:-chrysopedia} REDIS_URL: redis://chrysopedia-redis:6379/0 command: ["celery", "-A", "worker", "worker", "--loglevel=info"] volumes: - ./backend:/app - /vmPool/r/services/chrysopedia_data:/data - ./prompts:/prompts:ro depends_on: chrysopedia-db: condition: service_healthy chrysopedia-redis: condition: service_healthy networks: - chrysopedia # ── React web UI (nginx) ── chrysopedia-web: build: context: . dockerfile: docker/Dockerfile.web container_name: chrysopedia-web restart: unless-stopped ports: - "127.0.0.1:3000:80" depends_on: - chrysopedia-api networks: - chrysopedia networks: chrysopedia: driver: bridge ipam: config: - subnet: 172.24.0.0/24