Files
kefu/im/deploy/docker-compose.production.yml
T
2026-09-03 08:38:17 +08:00

100 lines
2.7 KiB
YAML

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: