100 lines
2.7 KiB
YAML
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:
|