version: '3.8' services: # MySQL 数据库服务 mysql: image: mysql:8.0 container_name: luckysheet-mysql restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123456} MYSQL_DATABASE: ${MYSQL_DATABASE:-luckysheet_crdt} MYSQL_USER: ${MYSQL_USER:-luckysheet} MYSQL_PASSWORD: ${MYSQL_PASSWORD:-luckysheet123} TZ: Asia/Shanghai ports: - "${MYSQL_PORT:-3306}:3306" volumes: - mysql_data:/var/lib/mysql - ./mysql/initdb:/docker-entrypoint-initdb.d command: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci - --default-authentication-plugin=mysql_native_password networks: - luckysheet-network healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD:-root123456}"] interval: 10s timeout: 5s retries: 5 # Luckysheet CRDT 应用服务 app: build: context: . dockerfile: Dockerfile container_name: luckysheet-app restart: unless-stopped environment: NODE_ENV: production # 数据库配置(对应 server/src/Config/index.ts) DB_HOST: ${DB_HOST:-mysql} DB_PORT: ${DB_PORT:-3306} DB_NAME: ${MYSQL_DATABASE:-luckysheet_crdt} DB_USER: ${MYSQL_USER:-luckysheet} DB_PASSWORD: ${MYSQL_PASSWORD:-luckysheet123} # 服务端口 SERVER_PORT: ${SERVER_PORT:-9000} TZ: Asia/Shanghai ports: - "${SERVER_PORT:-9000}:9000" volumes: - uploads_data:/app/public/uploads - logs_data:/app/logs depends_on: mysql: condition: service_healthy networks: - luckysheet-network healthcheck: test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:9000"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: luckysheet-network: driver: bridge volumes: mysql_data: driver: local uploads_data: driver: local logs_data: driver: local