# ── Adiuva Microservices ───────────────────────────────────────────── # docker compose up --build # docker compose up --build auth ws-gateway chat # subset services: # ═══════════════════════════════════════════════════════════════════ # Infrastructure # ═══════════════════════════════════════════════════════════════════ traefik: image: traefik:v3.1 ports: - "80:80" - "443:443" - "8080:8080" # dashboard (dev only) environment: CF_DNS_API_TOKEN: ${CF_DNS_API_TOKEN:-} volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - ./traefik/traefik.yml:/etc/traefik/traefik.yml:ro - ./traefik/dynamic:/etc/traefik/dynamic:ro - traefik_acme:/etc/traefik/acme restart: unless-stopped db: image: pgvector/pgvector:pg16 environment: POSTGRES_USER: ${POSTGRES_USER:-postgres} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} POSTGRES_DB: ${POSTGRES_DB:-adiuva} volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 5 restart: unless-stopped redis: image: redis:7-alpine command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 5 restart: unless-stopped # ── Optional infrastructure (uncomment as needed) ──────────────── # minio: # image: minio/minio:latest # command: server /data --console-address ":9001" # ports: # - "9000:9000" # - "9001:9001" # environment: # MINIO_ROOT_USER: minioadmin # MINIO_ROOT_PASSWORD: minioadmin # volumes: # - minio_data:/data # healthcheck: # test: ["CMD", "mc", "ready", "local"] # interval: 5s # timeout: 5s # retries: 5 # restart: unless-stopped # qdrant: # image: qdrant/qdrant:latest # ports: # - "6333:6333" # - "6334:6334" # volumes: # - qdrant_data:/qdrant/storage # restart: unless-stopped # ═══════════════════════════════════════════════════════════════════ # Migrations (run once, then exit) # ═══════════════════════════════════════════════════════════════════ migrate: build: context: . dockerfile: Dockerfile command: ["python", "-m", "alembic", "upgrade", "head"] env_file: - path: .env required: false environment: DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@db:5432/${POSTGRES_DB:-adiuva} depends_on: db: condition: service_healthy restart: "no" # ═══════════════════════════════════════════════════════════════════ # Application Services # ═══════════════════════════════════════════════════════════════════ auth: build: context: . dockerfile: services/auth/Dockerfile env_file: - path: .env required: false environment: DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@db:5432/${POSTGRES_DB:-adiuva} REDIS_URL: redis://redis:6379/0 depends_on: db: condition: service_healthy migrate: condition: service_completed_successfully restart: unless-stopped ws-gateway: build: context: . dockerfile: services/ws-gateway/Dockerfile env_file: - path: .env required: false environment: DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@db:5432/${POSTGRES_DB:-adiuva} REDIS_URL: redis://redis:6379/0 depends_on: redis: condition: service_healthy auth: condition: service_started restart: unless-stopped chat: build: context: . dockerfile: services/chat/Dockerfile env_file: - path: .env required: false environment: DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@db:5432/${POSTGRES_DB:-adiuva} REDIS_URL: redis://redis:6379/0 depends_on: db: condition: service_healthy redis: condition: service_healthy migrate: condition: service_completed_successfully restart: unless-stopped batch-agent: build: context: . dockerfile: services/batch-agent/Dockerfile env_file: - path: .env required: false environment: DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@db:5432/${POSTGRES_DB:-adiuva} REDIS_URL: redis://redis:6379/0 depends_on: db: condition: service_healthy redis: condition: service_healthy migrate: condition: service_completed_successfully restart: unless-stopped billing: build: context: . dockerfile: services/billing/Dockerfile env_file: - path: .env required: false environment: DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@db:5432/${POSTGRES_DB:-adiuva} depends_on: db: condition: service_healthy migrate: condition: service_completed_successfully restart: unless-stopped volumes: postgres_data: redis_data: traefik_acme: # minio_data: # qdrant_data: