# BMS 全栈 Docker Compose 编排(阿里云 ECS 4C8G) # 用法:docker compose up -d # 组件:mysql / redis / elasticsearch / backend / frontend services: # ---- MySQL(本机)---- mysql: image: mysql:8.0 container_name: bms-mysql restart: always environment: MYSQL_ROOT_PASSWORD: ${BMS_DB_PASSWORD:-ChangeMe123!} # 生产务必改 MYSQL_DATABASE: bms TZ: Asia/Shanghai command: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci - --max_connections=200 # 低内存优化 - --innodb-buffer-pool-size=256M - --performance-schema=OFF ports: - "127.0.0.1:3306:3306" # 仅本机,不开公网 volumes: - bms-mysql-data:/var/lib/mysql # 首次初始化自动导入建库脚本(可选,脚本按顺序放 init 目录) - ./init-sql:/docker-entrypoint-initdb.d:ro healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-p${BMS_DB_PASSWORD:-ChangeMe123!}"] interval: 10s timeout: 5s retries: 10 # ---- Redis ---- redis: image: redis:7-alpine container_name: bms-redis restart: always command: ["redis-server", "--appendonly", "yes"] ports: - "127.0.0.1:6379:6379" # 仅本机 volumes: - bms-redis-data:/data # ---- Elasticsearch(保留,限堆 1G)---- elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0 container_name: bms-es restart: always environment: - discovery.type=single-node - ES_JAVA_OPTS=-Xms1g -Xmx1g # 关键:限堆,否则吃一半内存 - xpack.security.enabled=false # 后端 HTTP 直连无鉴权 - bootstrap.memory_lock=true ulimits: memlock: soft: -1 hard: -1 ports: - "127.0.0.1:9200:9200" # 仅本机 volumes: - bms-es-data:/usr/share/elasticsearch/data healthcheck: test: ["CMD-SHELL", "curl -s http://localhost:9200 >/dev/null || exit 1"] interval: 20s timeout: 5s retries: 10 # ---- 后端 Spring Boot ---- backend: build: context: .. # 指到仓库根目录 dockerfile: deploy/Dockerfile.backend container_name: bms-backend restart: always environment: TZ: Asia/Shanghai JAVA_OPTS: "-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m" # 数据源环境变量(后端用 ${} 占位,由这里注入) BMS_DB_URL: "jdbc:mysql://mysql:3306/bms?useUnicode=true&characterEncoding=utf8&connectionCollation=utf8mb4_unicode_ci&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8" BMS_DB_USER: root BMS_DB_PASSWORD: ${BMS_DB_PASSWORD:-ChangeMe123!} # Oracle 从库(远端只读,保留原值) BMS_ORACLE_URL: "jdbc:oracle:thin:@//120.79.189.203:15281/WSDB" BMS_ORACLE_USER: readonly_report BMS_ORACLE_PASSWORD: ${BMS_ORACLE_PASSWORD:-k5x15WP1hE} # token 密钥 / Druid 密码 TOKEN_SECRET: ${TOKEN_SECRET:-please-change-me} DRUID_LOGIN_PASSWORD: ${DRUID_LOGIN_PASSWORD:-ChangeMe456!} ports: - "127.0.0.1:8080:8080" # 仅本机,由 frontend 反代 volumes: - bms-upload:/app/uploadPath - bms-logs:/app/logs depends_on: mysql: condition: service_healthy redis: condition: service_started elasticsearch: condition: service_healthy # ---- 前端 Nginx ---- frontend: build: context: .. # 指到仓库根目录 dockerfile: deploy/Dockerfile.frontend container_name: bms-frontend restart: always ports: - "80:80" # 对外(或改成 443 上 HTTPS) depends_on: - backend volumes: bms-mysql-data: bms-redis-data: bms-es-data: bms-upload: bms-logs: