services: mysql: image: mysql:9.0 environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} ports: - "${MYSQL_PORT:-3306}:3306" volumes: - mysql_data:/var/lib/mysql healthcheck: test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -uroot -p$$MYSQL_ROOT_PASSWORD --silent"] interval: 5s timeout: 5s retries: 30 redis: image: redis:7 ports: - "${REDIS_PORT:-6379}:6379" healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 5s retries: 30 rustfs: image: rustfs/rustfs:latest command: ["/data"] environment: RUSTFS_ACCESS_KEY: ${RUSTFS_ACCESS_KEY} RUSTFS_SECRET_KEY: ${RUSTFS_SECRET_KEY} RUSTFS_CONSOLE_ENABLE: "true" ports: - "${RUSTFS_PORT:-9000}:9000" - "${RUSTFS_CONSOLE_PORT:-9001}:9001" volumes: - rustfs_data:/data backend-init-db: build: context: ../.. dockerfile: deploy/docker/backend.Dockerfile environment: DATABASE_URL: mysql+aiomysql://${MYSQL_USER}:${MYSQL_PASSWORD}@mysql:3306/${MYSQL_DATABASE} DEBUG: "false" # S3 / RustFS S3_ENDPOINT_URL: http://rustfs:9000 S3_REGION_NAME: us-east-1 S3_ACCESS_KEY_ID: ${RUSTFS_ACCESS_KEY} S3_SECRET_ACCESS_KEY: ${RUSTFS_SECRET_KEY} S3_BUCKET_NAME: ${S3_BUCKET_NAME} # CORS CORS_ORIGINS: http://localhost:7788,http://127.0.0.1:7788 # 可选 OPENAI_API_KEY: ${OPENAI_API_KEY-} depends_on: mysql: condition: service_healthy command: ["uv", "run", "python", "init_db.py"] restart: "no" mysql-init-sql: image: mysql:9.0 depends_on: mysql: condition: service_healthy backend-init-db: condition: service_completed_successfully environment: MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} volumes: - ../../backend/sql:/sql:ro command: [ "bash", "-lc", "set -e; for f in $$(find /sql -maxdepth 1 -type f -name '*.sql' | sort); do echo \"[mysql-init-sql] applying $$f\"; mysql --default-character-set=utf8mb4 -h mysql -u\"$$MYSQL_USER\" -p\"$$MYSQL_PASSWORD\" \"$$MYSQL_DATABASE\" < \"$$f\"; done", ] restart: "no" backend: build: context: ../.. dockerfile: deploy/docker/backend.Dockerfile environment: DATABASE_URL: mysql+aiomysql://${MYSQL_USER}:${MYSQL_PASSWORD}@mysql:3306/${MYSQL_DATABASE} REDIS_HOST: redis REDIS_PORT: 6379 REDIS_DB: ${REDIS_DB:-0} REDIS_PASSWORD: ${REDIS_PASSWORD:-} CELERY_BROKER_URL: ${CELERY_BROKER_URL:-} DEBUG: "false" API_V1_PREFIX: /api/v1 # S3 / RustFS S3_ENDPOINT_URL: http://rustfs:9000 S3_REGION_NAME: us-east-1 S3_ACCESS_KEY_ID: ${RUSTFS_ACCESS_KEY} S3_SECRET_ACCESS_KEY: ${RUSTFS_SECRET_KEY} S3_BUCKET_NAME: ${S3_BUCKET_NAME} # CORS CORS_ORIGINS: http://localhost:7788,http://127.0.0.1:7788 # 可选 OPENAI_API_KEY: ${OPENAI_API_KEY-} ports: - "8000:8000" depends_on: mysql: condition: service_healthy redis: condition: service_healthy backend-init-db: condition: service_completed_successfully mysql-init-sql: condition: service_completed_successfully celery-worker: build: context: ../.. dockerfile: deploy/docker/backend.Dockerfile environment: DATABASE_URL: mysql+aiomysql://${MYSQL_USER}:${MYSQL_PASSWORD}@mysql:3306/${MYSQL_DATABASE} REDIS_HOST: redis REDIS_PORT: 6379 REDIS_DB: ${REDIS_DB:-0} REDIS_PASSWORD: ${REDIS_PASSWORD:-} CELERY_BROKER_URL: ${CELERY_BROKER_URL:-} DEBUG: "false" API_V1_PREFIX: /api/v1 S3_ENDPOINT_URL: http://rustfs:9000 S3_REGION_NAME: us-east-1 S3_ACCESS_KEY_ID: ${RUSTFS_ACCESS_KEY} S3_SECRET_ACCESS_KEY: ${RUSTFS_SECRET_KEY} S3_BUCKET_NAME: ${S3_BUCKET_NAME} CORS_ORIGINS: http://localhost:7788,http://127.0.0.1:7788 OPENAI_API_KEY: ${OPENAI_API_KEY-} depends_on: mysql: condition: service_healthy redis: condition: service_healthy backend-init-db: condition: service_completed_successfully mysql-init-sql: condition: service_completed_successfully command: ["uv", "run", "celery", "-A", "app.core.celery_app:celery_app", "worker", "-l", "info"] front: build: context: ../.. dockerfile: deploy/docker/front.Dockerfile environment: BACKEND_URL: ${BACKEND_URL} ports: - "7788:80" depends_on: - backend volumes: mysql_data: rustfs_data: