services: db: image: postgres:16-alpine restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER:-desk} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-desk} POSTGRES_DB: ${POSTGRES_DB:-thinking_desk} ports: - "5432:5432" volumes: - db-data:/var/lib/postgresql/data - ./src/lib/db/schema.sql:/docker-entrypoint-initdb.d/00-schema.sql:ro healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-desk} -d ${POSTGRES_DB:-thinking_desk}"] interval: 5s timeout: 5s retries: 10 app: build: . restart: unless-stopped depends_on: db: condition: service_healthy environment: DATABASE_URL: postgres://${POSTGRES_USER:-desk}:${POSTGRES_PASSWORD:-desk}@db:5432/${POSTGRES_DB:-thinking_desk} ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY} OPENAI_API_KEY: ${OPENAI_API_KEY} OPENAI_BASE_URL: ${OPENAI_BASE_URL:-https://api.openai.com/v1} ANTHROPIC_BASE_URL: ${ANTHROPIC_BASE_URL:-https://api.anthropic.com} GEMINI_API_KEY: ${GEMINI_API_KEY} GEMINI_BASE_URL: ${GEMINI_BASE_URL:-https://generativelanguage.googleapis.com} ZHIPU_API_KEY: ${ZHIPU_API_KEY} ZHIPU_BASE_URL: ${ZHIPU_BASE_URL:-https://open.bigmodel.cn/api/paas/v4} AI_MODEL_DEFAULT: ${AI_MODEL_DEFAULT:-claude:claude-sonnet-5-5} AI_MODEL_BRIEF_EXTRACT: ${AI_MODEL_BRIEF_EXTRACT:-claude:claude-sonnet-5-5} AI_MODEL_ALT_SCAN: ${AI_MODEL_ALT_SCAN:-gemini:gemini-3.8-flash} AI_MODEL_BRIEF_CLARIFY: ${AI_MODEL_BRIEF_CLARIFY:-} AI_MODEL_BRIEF_PROBE: ${AI_MODEL_BRIEF_PROBE:-} AI_MODEL_USERS_JTBD: ${AI_MODEL_USERS_JTBD:-} AI_MODEL_STAKE_MATRIX: ${AI_MODEL_STAKE_MATRIX:-} AI_MODEL_SCEN_FEED: ${AI_MODEL_SCEN_FEED:-} AI_MODEL_SCEN_PAIN: ${AI_MODEL_SCEN_PAIN:-} AI_MODEL_FEAT_DRAFT: ${AI_MODEL_FEAT_DRAFT:-} AI_MODEL_LEAP_FIRST_PRINCIPLES: ${AI_MODEL_LEAP_FIRST_PRINCIPLES:-} AI_MODEL_LEAP_ANALOGY: ${AI_MODEL_LEAP_ANALOGY:-} AI_MODEL_LEAP_CONSTRAINT_FLIP: ${AI_MODEL_LEAP_CONSTRAINT_FLIP:-} AI_MODEL_DESIGN_PROPOSAL: ${AI_MODEL_DESIGN_PROPOSAL:-} AI_MODEL_SPLIT_SUBFEATURES: ${AI_MODEL_SPLIT_SUBFEATURES:-} AI_MODEL_CONSISTENCY_CHECK: ${AI_MODEL_CONSISTENCY_CHECK:-} AI_MODEL_FREE_ASK: ${AI_MODEL_FREE_ASK:-} AI_MODEL_FOLLOW_UPS: ${AI_MODEL_FOLLOW_UPS:-} REQUIRE_AUTH: ${REQUIRE_AUTH:-false} REQUIRE_AUTH_TOKEN: ${REQUIRE_AUTH_TOKEN:-} RATE_LIMIT_MAX: ${RATE_LIMIT_MAX:-20} RATE_LIMIT_WINDOW_MS: ${RATE_LIMIT_WINDOW_MS:-60000} ALLOW_CUSTOM_AI_BASE_URL: ${ALLOW_CUSTOM_AI_BASE_URL:-false} ports: - "3000:3000" volumes: db-data: