services: postgres: image: postgres:17-alpine environment: POSTGRES_DB: ${POSTGRES_DB:-open_ai_canvas} POSTGRES_USER: ${POSTGRES_USER:-open_ai_canvas} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?请先运行一键部署脚本生成数据库密码} volumes: - ${CANVAS_POSTGRES_DATA_PATH:-postgres-data}:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] interval: 10s timeout: 5s retries: 10 restart: unless-stopped 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: 10s timeout: 5s retries: 10 restart: unless-stopped migrate: image: ghcr.io/ddcat-ai/open-ai-canvas-backend:${CANVAS_IMAGE_TAG:-latest} command: ["migrate-schema", "up"] environment: CANVAS_BACKEND_DATA_DIR: /data CANVAS_DATABASE_DRIVER: postgres DATABASE_URL: ${DATABASE_URL:?请先运行一键部署脚本生成数据库连接} depends_on: postgres: condition: service_healthy backend: image: ghcr.io/ddcat-ai/open-ai-canvas-backend:${CANVAS_IMAGE_TAG:-latest} environment: CANVAS_BACKEND_ADDR: ":8080" CANVAS_BACKEND_DATA_DIR: /data CANVAS_AUTO_MIGRATE: "false" CANVAS_SHUTDOWN_TIMEOUT: ${CANVAS_SHUTDOWN_TIMEOUT:-10m} CANVAS_DATABASE_DRIVER: postgres DATABASE_URL: ${DATABASE_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:-} CANVAS_PUBLIC_BASE_URL: ${CANVAS_PUBLIC_BASE_URL:-} CANVAS_UPDATER_SOCKET: /run/open-ai-canvas-updater/updater.sock CANVAS_UPDATER_TOKEN: ${CANVAS_UPDATER_TOKEN:-} GIN_MODE: release volumes: - ${CANVAS_DATA_PATH:-backend-data}:/data - ${CANVAS_UPDATER_SOCKET_DIR:-/run/open-ai-canvas-updater}:/run/open-ai-canvas-updater depends_on: postgres: condition: service_healthy redis: condition: service_healthy migrate: condition: service_completed_successfully restart: unless-stopped stop_grace_period: ${CANVAS_SHUTDOWN_TIMEOUT:-10m} web: image: ghcr.io/ddcat-ai/open-ai-canvas-web:${CANVAS_IMAGE_TAG:-latest} ports: - "${CANVAS_HTTP_PORT:-3000}:3000" volumes: # Keep hashed chunks from the current and previous web releases for old tabs. - ${CANVAS_WEB_DATA_PATH:-web-data}:/usr/share/nginx/html depends_on: backend: condition: service_healthy restart: unless-stopped volumes: backend-data: postgres-data: redis-data: web-data: