services: postgres: container_name: open-ai-canvas-postgres image: postgres:17-alpine environment: POSTGRES_DB: ${POSTGRES_DB:-open_ai_canvas} POSTGRES_USER: ${POSTGRES_USER:-open_ai_canvas} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?必须配置 PostgreSQL 密码} volumes: - ${CANVAS_POSTGRES_DATA_PATH:-./postgres-data}:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] interval: 5s timeout: 5s retries: 20 restart: unless-stopped redis: container_name: open-ai-canvas-redis image: redis:7.4-alpine command: ["redis-server", "--appendonly", "yes", "--appendfsync", "everysec"] volumes: - ${CANVAS_REDIS_DATA_PATH:-./redis-data}:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 5s retries: 20 restart: unless-stopped backend: container_name: open-ai-canvas-backend image: open-ai-canvas-backend:server build: context: . dockerfile: backend/Dockerfile args: GOPROXY: ${GOPROXY:-https://goproxy.cn,direct} environment: CANVAS_BACKEND_ADDR: ":8080" CANVAS_BACKEND_DATA_DIR: /data CANVAS_DATABASE_DRIVER: ${CANVAS_DATABASE_DRIVER:-postgres} DATABASE_URL: ${DATABASE_URL:-} REDIS_URL: ${REDIS_URL:-redis://redis:6379/0} CANVAS_WORKER_CONCURRENCY: ${CANVAS_WORKER_CONCURRENCY:-3} CANVAS_CHANNEL_CONCURRENCY: ${CANVAS_CHANNEL_CONCURRENCY:-3} CANVAS_REGISTRATION_ENABLED: ${CANVAS_REGISTRATION_ENABLED:-false} CANVAS_ALLOW_PRIVATE_UPSTREAMS: ${CANVAS_ALLOW_PRIVATE_UPSTREAMS:-false} CANVAS_ALLOWED_PRIVATE_UPSTREAM_HOSTS: ${CANVAS_ALLOWED_PRIVATE_UPSTREAM_HOSTS:-} CANVAS_CORS_ORIGINS: ${CANVAS_CORS_ORIGINS:-*} GIN_MODE: release volumes: - ${CANVAS_DATA_PATH:-./data}:/data depends_on: postgres: condition: service_healthy redis: condition: service_healthy restart: unless-stopped web: container_name: open-ai-canvas-web image: open-ai-canvas-web:server build: context: . dockerfile: Dockerfile ports: - "127.0.0.1:5173:3000" depends_on: backend: condition: service_healthy restart: unless-stopped