# dd0c Local Development Stack # # Usage: docker compose up -d # All services share one Postgres and one Redis instance. # Caddy handles TLS and routing for *.dd0c.localhost services: # --- Shared Infrastructure --- postgres: image: postgres:16-alpine environment: POSTGRES_USER: dd0c POSTGRES_PASSWORD: dd0c-dev ports: - "5433:5432" volumes: - pg_data:/var/lib/postgresql/data - ./docker-init-db.sh:/docker-entrypoint-initdb.d/01-init-db.sh:ro - ./01-llm-cost-router/migrations:/migrations/01-route:ro - ./02-iac-drift-detection/saas/migrations:/migrations/02-drift:ro - ./03-alert-intelligence/migrations:/migrations/03-alert:ro - ./04-lightweight-idp/migrations:/migrations/04-portal:ro - ./05-aws-cost-anomaly/migrations:/migrations/05-cost:ro - ./06-runbook-automation/saas/migrations:/migrations/06-run:ro healthcheck: test: ["CMD-SHELL", "pg_isready -U dd0c"] interval: 5s timeout: 3s retries: 5 redis: image: redis:7-alpine ports: - "6379:6379" healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 5 meilisearch: image: getmeili/meilisearch:v1.8 environment: MEILI_ENV: development ports: - "7700:7700" volumes: - meili_data:/meili_data # --- dd0c Products --- # P1: LLM Cost Router (Rust — API server) # NOTE: Rust services are behind the "rust" profile because they take 10+ min to compile. # Start without Rust: docker compose up -d # Start with Rust: docker compose --profile rust up -d route-api: profiles: ["rust"] build: context: ./01-llm-cost-router dockerfile: Dockerfile args: CACHE_BUST: "2026-03-01-2300" command: ["dd0c-api"] ports: - "3001:3000" environment: NODE_ENV: production PORT: "3000" DATABASE_URL: postgresql://dd0c:dd0c-dev@postgres:5432/dd0c_route REDIS_URL: redis://redis:6379 JWT_SECRET: dev-secret-change-me-in-production!! LOG_LEVEL: info depends_on: postgres: { condition: service_healthy } redis: { condition: service_healthy } # P1: LLM Cost Router (Rust — proxy) route-proxy: profiles: ["rust"] build: context: ./01-llm-cost-router dockerfile: Dockerfile command: ["dd0c-proxy"] ports: - "8080:8080" environment: DATABASE_URL: postgresql://dd0c:dd0c-dev@postgres:5432/dd0c_route REDIS_URL: redis://redis:6379 LOG_LEVEL: info depends_on: postgres: { condition: service_healthy } redis: { condition: service_healthy } # P1: LLM Cost Router (Rust — worker) route-worker: profiles: ["rust"] build: context: ./01-llm-cost-router dockerfile: Dockerfile command: ["dd0c-worker"] environment: DATABASE_URL: postgresql://dd0c:dd0c-dev@postgres:5432/dd0c_route REDIS_URL: redis://redis:6379 LOG_LEVEL: info depends_on: postgres: { condition: service_healthy } redis: { condition: service_healthy } # P2: IaC Drift Detection (SaaS) drift: build: context: ./02-iac-drift-detection/saas dockerfile: Dockerfile.v2 args: CACHE_BUST: "2026-03-01-2300" ports: - "3002:3000" environment: NODE_ENV: production PORT: "3000" DATABASE_URL: postgresql://dd0c:dd0c-dev@postgres:5432/dd0c_drift REDIS_URL: redis://redis:6379 JWT_SECRET: dev-secret-change-me-in-production!! LOG_LEVEL: info depends_on: postgres: { condition: service_healthy } redis: { condition: service_healthy } # P3: Alert Intelligence alert: build: context: ./03-alert-intelligence dockerfile: Dockerfile ports: - "3003:3000" environment: NODE_ENV: production PORT: "3000" DATABASE_URL: postgresql://dd0c:dd0c-dev@postgres:5432/dd0c_alert REDIS_URL: redis://redis:6379 JWT_SECRET: dev-secret-change-me-in-production!! LOG_LEVEL: info depends_on: postgres: { condition: service_healthy } redis: { condition: service_healthy } # P4: Lightweight IDP / Service Catalog portal: build: context: ./04-lightweight-idp dockerfile: Dockerfile ports: - "3004:3000" environment: NODE_ENV: production PORT: "3000" DATABASE_URL: postgresql://dd0c:dd0c-dev@postgres:5432/dd0c_portal REDIS_URL: redis://redis:6379 MEILI_URL: http://meilisearch:7700 JWT_SECRET: dev-secret-change-me-in-production!! LOG_LEVEL: info depends_on: postgres: { condition: service_healthy } redis: { condition: service_healthy } meilisearch: { condition: service_started } # P5: AWS Cost Anomaly Detection cost: build: context: ./05-aws-cost-anomaly dockerfile: Dockerfile ports: - "3007:3000" environment: NODE_ENV: production PORT: "3000" DATABASE_URL: postgresql://dd0c:dd0c-dev@postgres:5432/dd0c_cost REDIS_URL: redis://redis:6379 JWT_SECRET: dev-secret-change-me-in-production!! ANOMALY_THRESHOLD: "50" LOG_LEVEL: info depends_on: postgres: { condition: service_healthy } redis: { condition: service_healthy } # P6: Runbook Automation (SaaS) run: build: context: ./06-runbook-automation/saas dockerfile: Dockerfile ports: - "3006:3000" environment: NODE_ENV: production PORT: "3000" DATABASE_URL: postgresql://dd0c:dd0c-dev@postgres:5432/dd0c_run REDIS_URL: redis://redis:6379 JWT_SECRET: dev-secret-change-me-in-production!! LOG_LEVEL: info depends_on: postgres: { condition: service_healthy } redis: { condition: service_healthy } volumes: pg_data: meili_data: