services: postgres: image: mirror.gcr.io/pgvector/pgvector:pg16 environment: POSTGRES_DB: prehub POSTGRES_USER: prehub POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required} ports: - "127.0.0.1:55432:5432" volumes: - postgres-data:/var/lib/postgresql/data - ./packages/db/migrations:/docker-entrypoint-initdb.d:ro healthcheck: test: ["CMD-SHELL", "pg_isready -U prehub -d prehub"] interval: 10s timeout: 5s retries: 5 redis: image: mirror.gcr.io/library/redis:7-alpine ports: - "127.0.0.1:56379:6379" volumes: - redis-data:/data api: build: context: ./backend command: ["/app/api"] environment: PORT: 8080 DATABASE_URL: postgres://prehub:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}@postgres:5432/prehub?sslmode=disable REDIS_ADDR: redis:6379 INTERNAL_API_TOKEN: ${INTERNAL_API_TOKEN:?INTERNAL_API_TOKEN is required} GITHUB_TOKEN: ${GITHUB_TOKEN:-} GITHUB_API_VERSION: ${GITHUB_API_VERSION:-2026-03-10} OPENAI_API_KEY: ${OPENAI_API_KEY:-} PREHUB_TIMEZONE: ${PREHUB_TIMEZONE:-Asia/Shanghai} PREHUB_CLICKHOUSE_URL: ${PREHUB_CLICKHOUSE_URL:-https://sql-clickhouse.clickhouse.com/} PREHUB_CLICKHOUSE_USER: ${PREHUB_CLICKHOUSE_USER:-demo} PREHUB_CLICKHOUSE_PASSWORD: ${PREHUB_CLICKHOUSE_PASSWORD:-} ports: - "127.0.0.1:8080:8080" depends_on: postgres: condition: service_healthy redis: condition: service_started worker: build: context: ./backend command: ["/app/worker"] environment: DATABASE_URL: postgres://prehub:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}@postgres:5432/prehub?sslmode=disable REDIS_ADDR: redis:6379 INTERNAL_API_TOKEN: ${INTERNAL_API_TOKEN:?INTERNAL_API_TOKEN is required} GITHUB_TOKEN: ${GITHUB_TOKEN:-} GITHUB_API_VERSION: ${GITHUB_API_VERSION:-2026-03-10} OPENAI_API_KEY: ${OPENAI_API_KEY:-} PREHUB_TIMEZONE: ${PREHUB_TIMEZONE:-Asia/Shanghai} PREHUB_DISCOVERY_INTERVAL_MINUTES: ${PREHUB_DISCOVERY_INTERVAL_MINUTES:-360} PREHUB_DISCOVERY_CATEGORIES: ${PREHUB_DISCOVERY_CATEGORIES:-ai,ai-image,ai-prompts,ai-skills,devtools,web,data,backend} PREHUB_DISCOVERY_PER_PAGE: ${PREHUB_DISCOVERY_PER_PAGE:-30} PREHUB_DISCOVERY_PAGES: ${PREHUB_DISCOVERY_PAGES:-2} PREHUB_DISCOVERY_MAX_SEARCHES: ${PREHUB_DISCOVERY_MAX_SEARCHES:-8} PREHUB_DISCOVERY_README_LIMIT: ${PREHUB_DISCOVERY_README_LIMIT:-12} PREHUB_DISCOVERY_STARGAZER_REPOS: ${PREHUB_DISCOVERY_STARGAZER_REPOS:-2} PREHUB_DISCOVERY_TIMEOUT_SECONDS: ${PREHUB_DISCOVERY_TIMEOUT_SECONDS:-180} PREHUB_RADAR_SEED_CATEGORIES: ${PREHUB_RADAR_SEED_CATEGORIES:-ai} PREHUB_RADAR_SEED_LIMIT: ${PREHUB_RADAR_SEED_LIMIT:-50} depends_on: postgres: condition: service_healthy redis: condition: service_started web: build: context: ./apps/web environment: GO_API_URL: http://api:8080 INTERNAL_API_TOKEN: ${INTERNAL_API_TOKEN:?INTERNAL_API_TOKEN is required} ADMIN_PASSWORD: ${ADMIN_PASSWORD:?ADMIN_PASSWORD is required} CRON_SECRET: ${CRON_SECRET:?CRON_SECRET is required} SCHEDULER_SECRET: ${SCHEDULER_SECRET:?SCHEDULER_SECRET is required} ports: - "127.0.0.1:3100:3000" depends_on: - api volumes: postgres-data: redis-data: