services: mysql: image: mysql:8.4 restart: unless-stopped environment: MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} TZ: ${TZ:-Asia/Shanghai} command: ["--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"] volumes: - mysql_data:/var/lib/mysql healthcheck: test: ["CMD-SHELL", "MYSQL_PWD=$${MYSQL_PASSWORD} mysqladmin ping -h 127.0.0.1 -u$${MYSQL_USER} --silent"] interval: 10s timeout: 5s retries: 20 networks: [internal] migrate: image: mysql:8.4 restart: "no" depends_on: mysql: condition: service_healthy environment: MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} volumes: - ../backend/migrations:/migrations:ro - ./migrate.sh:/migrate.sh:ro entrypoint: ["sh", "/migrate.sh"] networks: [internal] api: build: context: .. dockerfile: deploy/Dockerfile.backend restart: unless-stopped depends_on: mysql: condition: service_healthy migrate: condition: service_completed_successfully environment: IM_ENV: production IM_HOST: 0.0.0.0 IM_PORT: 8888 IM_DB_DSN: ${MYSQL_USER}:${MYSQL_PASSWORD}@tcp(mysql:3306)/${MYSQL_DATABASE}?charset=utf8mb4&parseTime=True&loc=Local IM_JWT_SECRET: ${IM_JWT_SECRET} IM_CONFIG_ENCRYPTION_KEY: ${IM_CONFIG_ENCRYPTION_KEY} IM_ALLOWED_ORIGINS: https://${APP_DOMAIN},https://${ADMIN_DOMAIN} IM_SEED_DEMO: "false" IM_MEDIA_DIR: /data/uploads IM_BOOTSTRAP_ADMIN_USERNAME: ${IM_BOOTSTRAP_ADMIN_USERNAME} IM_BOOTSTRAP_ADMIN_PASSWORD: ${IM_BOOTSTRAP_ADMIN_PASSWORD} IM_BOOTSTRAP_ADMIN_REAL_NAME: ${IM_BOOTSTRAP_ADMIN_REAL_NAME} TZ: ${TZ:-Asia/Shanghai} volumes: - uploads:/data/uploads healthcheck: test: ["CMD", "wget", "-q", "-O", "-", "http://127.0.0.1:8888/healthz"] interval: 15s timeout: 5s retries: 10 networks: [internal] edge: build: context: .. dockerfile: deploy/Dockerfile.edge args: VITE_API_ORIGIN: https://${API_DOMAIN} VITE_WS_ORIGIN: wss://${API_DOMAIN} VITE_ADMIN_API_URL: ${ADMIN_API_URL:-/admin/v1} restart: unless-stopped depends_on: api: condition: service_healthy environment: APP_DOMAIN: ${APP_DOMAIN} ADMIN_DOMAIN: ${ADMIN_DOMAIN} API_DOMAIN: ${API_DOMAIN} ports: - "80:80" - "443:443" volumes: - ./certs:/etc/nginx/certs:ro networks: [internal] networks: internal: driver: bridge volumes: mysql_data: uploads: