version: '3.8' services: mysql: image: mysql:8.0 container_name: gongxue_mysql restart: always environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-gongxue_2024} MYSQL_DATABASE: dorm_billing_v2 MYSQL_CHARSET: utf8mb4 MYSQL_COLLATION: utf8mb4_unicode_ci ports: - "127.0.0.1:3306:3306" volumes: - mysql_data:/var/lib/mysql - ./docker/mysql/init.sql:/docker-entrypoint-initdb.d/01-init.sql:ro command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 5s retries: 10 backend: build: context: . dockerfile: apps/server/Dockerfile container_name: gongxue_backend restart: always environment: DB_TYPE: mysql DB_HOST: mysql DB_PORT: 3306 DB_USERNAME: root DB_PASSWORD: ${MYSQL_ROOT_PASSWORD:-gongxue_2024} DB_DATABASE: dorm_billing_v2 DB_SYNCHRONIZE: "false" JWT_SECRET: ${JWT_SECRET:-gongxue-jwt-prod-2026-k3y} JWT_EXPIRES_IN: 24h PORT: 3000 depends_on: mysql: condition: service_healthy frontend: build: context: . dockerfile: apps/admin/Dockerfile container_name: gongxue_frontend restart: always ports: - "9527:80" depends_on: - backend volumes: mysql_data: