services: postgres: image: postgres:18 restart: unless-stopped ports: - "${POSTGRES_PORT:-5432}:5432" environment: POSTGRES_USER: ${DB_USER:-postgres} POSTGRES_PASSWORD: ${DB_PASSWORD:-postgres} POSTGRES_DB: ${DB_NAME:-claude_code_hub} PGDATA: /data/pgdata TZ: Asia/Shanghai PGTZ: Asia/Shanghai volumes: - ../data/postgres-dev:/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-postgres} -d ${DB_NAME:-claude_code_hub}"] interval: 5s timeout: 5s retries: 10 start_period: 10s redis: image: redis:7-alpine restart: unless-stopped ports: - "${REDIS_PORT:-6379}:6379" volumes: - ../data/redis-dev:/data command: redis-server --appendonly yes healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 5 start_period: 5s app: profiles: - app build: context: .. dockerfile: deploy/Dockerfile args: APP_VERSION: ${APP_VERSION:-dev} image: claude-code-hub-local:${APP_VERSION:-dev} restart: unless-stopped depends_on: postgres: condition: service_healthy redis: condition: service_healthy environment: NODE_ENV: production DSN: postgresql://${DB_USER:-postgres}:${DB_PASSWORD:-postgres}@postgres:5432/${DB_NAME:-claude_code_hub} REDIS_URL: redis://redis:6379 AUTO_MIGRATE: ${AUTO_MIGRATE:-true} ENABLE_RATE_LIMIT: ${ENABLE_RATE_LIMIT:-true} SESSION_TTL: ${SESSION_TTL:-300} ADMIN_TOKEN: ${ADMIN_TOKEN:-cch-dev-admin} TZ: Asia/Shanghai ports: - "${APP_PORT:-23000}:3000" healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:3000/api/actions/health || exit 1"] interval: 15s timeout: 5s retries: 20 start_period: 30s