# ============================================================ # Node-01 Docker Compose 配置 # 主节点: MySQL Master, Redis Master, Nacos, NameServer, MinIO, 微服务 # 使用方式: docker compose --env-file config/.env.node-01 up -d # ============================================================ services: # ==================== 基础设施 ==================== mysql: image: mysql:8.0 container_name: mysql restart: always ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123456} MYSQL_DATABASE: ${MYSQL_DATABASE:-video_platform} MYSQL_USER: ${MYSQL_USER:-video} MYSQL_PASSWORD: ${MYSQL_PASSWORD:-video123} volumes: - mysql_data:/var/lib/mysql - ./sql:/docker-entrypoint-initdb.d - ./config/mysql/my-master.cnf:/etc/mysql/conf.d/my.cnf:ro command: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci - --server-id=1 - --log-bin=mysql-bin - --binlog-format=ROW - --gtid-mode=ON - --enforce-gtid-consistency=ON healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-p${MYSQL_ROOT_PASSWORD:-root123456}"] interval: 10s timeout: 5s retries: 10 networks: - ha-network redis: image: redis:7.0-alpine container_name: redis restart: always ports: - "6379:6379" volumes: - redis_data:/data - ./config/redis/redis-master.conf:/usr/local/etc/redis/redis.conf:ro command: redis-server /usr/local/etc/redis/redis.conf healthcheck: test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD:-redis_HA_Cluster_2024}", "ping"] interval: 10s timeout: 5s retries: 5 networks: - ha-network redis-sentinel: image: redis:7.0-alpine container_name: redis-sentinel restart: always ports: - "26379:26379" volumes: - sentinel_data:/data - ./config/redis/sentinel.conf:/usr/local/etc/redis/sentinel.conf command: sh -c "cp /usr/local/etc/redis/sentinel.conf /data/sentinel.conf && redis-sentinel /data/sentinel.conf" depends_on: redis: condition: service_healthy networks: - ha-network nacos: image: nacos/nacos-server:v2.3.2 container_name: nacos restart: always ports: - "8848:8848" - "9848:9848" - "9849:9849" environment: - MODE=cluster - NACOS_SERVERS=${NACOS_SERVERS:-192.168.1.101:8848,192.168.1.102:8848,192.168.1.103:8848} - NACOS_SERVER_IP=${HOST_IP:-192.168.1.101} - NACOS_APPLICATION_PORT=8848 - SPRING_DATASOURCE_PLATFORM=mysql - MYSQL_SERVICE_HOST=mysql - MYSQL_SERVICE_PORT=3306 - MYSQL_SERVICE_DB_NAME=nacos_config - MYSQL_SERVICE_USER=root - MYSQL_SERVICE_PASSWORD=${MYSQL_ROOT_PASSWORD:-root123456} - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true - NACOS_AUTH_ENABLE=true - NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789 - NACOS_AUTH_IDENTITY_KEY=serverIdentity - NACOS_AUTH_IDENTITY_VALUE=security - JVM_XMS=512m - JVM_XMX=512m volumes: - nacos_logs:/home/nacos/logs healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8848/nacos/v1/console/health/liveness"] interval: 10s timeout: 5s retries: 10 depends_on: mysql: condition: service_healthy networks: - ha-network rmqnamesrv: image: apache/rocketmq:5.1.4 container_name: rmqnamesrv restart: always ports: - "9876:9876" environment: - JAVA_OPT_EXT=-server -Xms256m -Xmx256m command: sh mqnamesrv healthcheck: test: ["CMD-SHELL", "pgrep -f 'NamesrvStartup' || exit 1"] interval: 10s timeout: 5s retries: 10 start_period: 30s networks: - ha-network minio: image: quay.io/minio/minio container_name: minio restart: always ports: - "9100:9000" - "9101:9001" environment: - MINIO_ROOT_USER=minioadmin - MINIO_ROOT_PASSWORD=minioadmin123 volumes: - minio_data:/data command: server /data --console-address ":9001" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 10s timeout: 5s retries: 5 networks: - ha-network sentinel: image: sentinel-dashboard:1.8.6 container_name: sentinel restart: always ports: - "8880:8080" environment: - JAVA_OPTS=-Xms128m -Xmx256m - SERVER_PORT=8080 - DASHBOARD_SERVER=localhost:8080 - PROJECT_NAME=sentinel-dashboard networks: - ha-network prometheus: image: prom/prometheus:v2.54.1 container_name: prometheus restart: always ports: - "9090:9090" volumes: - ./monitoring/prometheus/prometheus.ha.yml:/etc/prometheus/prometheus.yml:ro - prometheus_data:/prometheus command: - --config.file=/etc/prometheus/prometheus.yml - --storage.tsdb.path=/prometheus - --storage.tsdb.retention.time=15d networks: - ha-network grafana: image: grafana/grafana:11.2.0 container_name: grafana restart: always ports: - "3000:3000" environment: - GF_SECURITY_ADMIN_USER=${GRAFANA_ADMIN_USER:-admin} - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD:-admin123} - GF_USERS_ALLOW_SIGN_UP=false volumes: - grafana_data:/var/lib/grafana - ./monitoring/grafana/provisioning:/etc/grafana/provisioning:ro - ./monitoring/grafana/dashboards:/var/lib/grafana/dashboards:ro depends_on: - prometheus networks: - ha-network mysqld-exporter: image: prom/mysqld-exporter:v0.16.0 container_name: mysqld-exporter restart: always ports: - "9104:9104" environment: - MYSQLD_EXPORTER_PASSWORD=${MYSQL_ROOT_PASSWORD:-root123456} command: - --mysqld.address=mysql:3306 - --mysqld.username=root depends_on: mysql: condition: service_healthy networks: - ha-network redis-exporter: image: oliver006/redis_exporter:v1.62.0 container_name: redis-exporter restart: always ports: - "9121:9121" environment: - REDIS_ADDR=redis://redis:6379 - REDIS_PASSWORD=${REDIS_PASSWORD:-redis_HA_Cluster_2024} depends_on: redis: condition: service_healthy networks: - ha-network node-exporter: image: prom/node-exporter:v1.8.2 container_name: node-exporter restart: always ports: - "19100:9100" command: - --path.procfs=/host/proc - --path.sysfs=/host/sys - --path.rootfs=/rootfs - --collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($|/) volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:ro networks: - ha-network # ==================== 微服务 ==================== video-gateway: build: context: ./video-gateway dockerfile: Dockerfile container_name: video-gateway restart: always ports: - "9000:9000" - "8719:8719" environment: - SPRING_PROFILES_ACTIVE=ha - NACOS_HOST=nacos - NACOS_PORT=8848 - NACOS_USERNAME=nacos - NACOS_PASSWORD=nacos - SPRING_CLOUD_NACOS_DISCOVERY_USERNAME=nacos - SPRING_CLOUD_NACOS_DISCOVERY_PASSWORD=nacos - SPRING_CLOUD_NACOS_CONFIG_USERNAME=nacos - SPRING_CLOUD_NACOS_CONFIG_PASSWORD=nacos - SPRING_CLOUD_NACOS_DISCOVERY_IP=${HOST_IP:-192.168.1.101} - NACOS_SERVERS=${NACOS_SERVERS:-192.168.1.101:8848,192.168.1.102:8848,192.168.1.103:8848} - REDIS_PASSWORD=${REDIS_PASSWORD:-redis_HA_Cluster_2024} - REDIS_SENTINEL_NODES=${REDIS_SENTINEL_NODES:-192.168.1.101:26379,192.168.1.102:26379,192.168.1.103:26379} - SERVICE_AUTH_TOKEN=${SERVICE_AUTH_TOKEN} - USER_JWT_SECRET=${USER_JWT_SECRET} - JWT_EXPIRATION=${JWT_EXPIRATION} - SENTINEL_DASHBOARD_HOST=${HOST_IP:-192.168.1.101} - SENTINEL_DASHBOARD_PORT=8880 - SPRING_CLOUD_SENTINEL_TRANSPORT_CLIENT_IP=${HOST_IP:-192.168.1.101} - SPRING_CLOUD_SENTINEL_TRANSPORT_PORT=8719 - GATEWAY_IP=${HOST_IP:-192.168.1.101} - JAVA_OPTS=-Xms256m -Xmx512m healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/actuator/health"] interval: 30s timeout: 10s retries: 3 depends_on: nacos: condition: service_healthy networks: - ha-network video-auth: build: context: ./video-auth dockerfile: Dockerfile container_name: video-auth restart: always ports: - "9001:9001" - "8720:8720" environment: - SPRING_PROFILES_ACTIVE=ha - NACOS_HOST=nacos - NACOS_PORT=8848 - NACOS_USERNAME=nacos - NACOS_PASSWORD=nacos - SPRING_CLOUD_NACOS_DISCOVERY_USERNAME=nacos - SPRING_CLOUD_NACOS_DISCOVERY_PASSWORD=nacos - SPRING_CLOUD_NACOS_CONFIG_USERNAME=nacos - SPRING_CLOUD_NACOS_CONFIG_PASSWORD=nacos - SPRING_CLOUD_NACOS_DISCOVERY_IP=${HOST_IP:-192.168.1.101} - NACOS_SERVERS=${NACOS_SERVERS:-192.168.1.101:8848,192.168.1.102:8848,192.168.1.103:8848} - MYSQL_HOST=mysql - MYSQL_PORT=3306 - MYSQL_USERNAME=root - MYSQL_PASSWORD=${MYSQL_ROOT_PASSWORD:-root123456} - REDIS_PASSWORD=${REDIS_PASSWORD:-redis_HA_Cluster_2024} - REDIS_SENTINEL_NODES=${REDIS_SENTINEL_NODES:-192.168.1.101:26379,192.168.1.102:26379,192.168.1.103:26379} - SERVICE_AUTH_TOKEN=${SERVICE_AUTH_TOKEN} - USER_JWT_SECRET=${USER_JWT_SECRET} - JWT_EXPIRATION=${JWT_EXPIRATION} - SENTINEL_DASHBOARD_HOST=${HOST_IP:-192.168.1.101} - SENTINEL_DASHBOARD_PORT=8880 - SPRING_CLOUD_SENTINEL_TRANSPORT_CLIENT_IP=${HOST_IP:-192.168.1.101} - SPRING_CLOUD_SENTINEL_TRANSPORT_PORT=8720 - AUTH_IP=${HOST_IP:-192.168.1.101} - JAVA_OPTS=-Xms256m -Xmx512m healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9001/actuator/health"] interval: 30s timeout: 10s retries: 3 depends_on: nacos: condition: service_healthy mysql: condition: service_healthy redis: condition: service_healthy networks: - ha-network video-user: build: context: ./video-user dockerfile: Dockerfile container_name: video-user restart: always ports: - "9002:9002" - "8721:8721" environment: - SPRING_PROFILES_ACTIVE=ha - NACOS_HOST=nacos - NACOS_PORT=8848 - NACOS_USERNAME=nacos - NACOS_PASSWORD=nacos - SPRING_CLOUD_NACOS_DISCOVERY_USERNAME=nacos - SPRING_CLOUD_NACOS_DISCOVERY_PASSWORD=nacos - SPRING_CLOUD_NACOS_CONFIG_USERNAME=nacos - SPRING_CLOUD_NACOS_CONFIG_PASSWORD=nacos - SPRING_CLOUD_NACOS_DISCOVERY_IP=${HOST_IP:-192.168.1.101} - NACOS_SERVERS=${NACOS_SERVERS:-192.168.1.101:8848,192.168.1.102:8848,192.168.1.103:8848} - MYSQL_HOST=mysql - MYSQL_PORT=3306 - MYSQL_USERNAME=root - MYSQL_PASSWORD=${MYSQL_ROOT_PASSWORD:-root123456} - REDIS_PASSWORD=${REDIS_PASSWORD:-redis_HA_Cluster_2024} - REDIS_SENTINEL_NODES=${REDIS_SENTINEL_NODES:-192.168.1.101:26379,192.168.1.102:26379,192.168.1.103:26379} - MINIO_HOST=192.168.1.101 - MINIO_PORT=9100 - MINIO_ACCESS_KEY=${MINIO_ACCESS_KEY} - MINIO_SECRET_KEY=${MINIO_SECRET_KEY} - MINIO_BUCKET=${MINIO_BUCKET} - SERVICE_AUTH_TOKEN=${SERVICE_AUTH_TOKEN} - USER_JWT_SECRET=${USER_JWT_SECRET} - JWT_EXPIRATION=${JWT_EXPIRATION} - SENTINEL_DASHBOARD_HOST=${HOST_IP:-192.168.1.101} - SENTINEL_DASHBOARD_PORT=8880 - SPRING_CLOUD_SENTINEL_TRANSPORT_CLIENT_IP=${HOST_IP:-192.168.1.101} - SPRING_CLOUD_SENTINEL_TRANSPORT_PORT=8721 - USER_IP=${HOST_IP:-192.168.1.101} - JAVA_OPTS=-Xms256m -Xmx512m depends_on: nacos: condition: service_healthy mysql: condition: service_healthy redis: condition: service_healthy networks: - ha-network video-content: build: context: ./video-content dockerfile: Dockerfile container_name: video-content restart: always ports: - "9003:9003" - "8722:8722" environment: - SPRING_PROFILES_ACTIVE=ha - NACOS_HOST=nacos - NACOS_PORT=8848 - NACOS_USERNAME=nacos - NACOS_PASSWORD=nacos - SPRING_CLOUD_NACOS_DISCOVERY_USERNAME=nacos - SPRING_CLOUD_NACOS_DISCOVERY_PASSWORD=nacos - SPRING_CLOUD_NACOS_CONFIG_USERNAME=nacos - SPRING_CLOUD_NACOS_CONFIG_PASSWORD=nacos - SPRING_CLOUD_NACOS_DISCOVERY_IP=${HOST_IP:-192.168.1.101} - NACOS_SERVERS=${NACOS_SERVERS:-192.168.1.101:8848,192.168.1.102:8848,192.168.1.103:8848} - MYSQL_HOST=mysql - MYSQL_PORT=3306 - MYSQL_USERNAME=root - MYSQL_PASSWORD=${MYSQL_ROOT_PASSWORD:-root123456} - REDIS_PASSWORD=${REDIS_PASSWORD:-redis_HA_Cluster_2024} - REDIS_SENTINEL_NODES=${REDIS_SENTINEL_NODES:-192.168.1.101:26379,192.168.1.102:26379,192.168.1.103:26379} - ROCKETMQ_HOST=rmqnamesrv - ROCKETMQ_PORT=9876 - MINIO_HOST=minio - MINIO_PORT=9000 - MINIO_ACCESS_KEY=minioadmin - MINIO_SECRET_KEY=minioadmin123 - MINIO_BUCKET=video-platform - SERVICE_AUTH_TOKEN=${SERVICE_AUTH_TOKEN} - USER_JWT_SECRET=${USER_JWT_SECRET} - JWT_EXPIRATION=${JWT_EXPIRATION} - SENTINEL_DASHBOARD_HOST=${HOST_IP:-192.168.1.101} - SENTINEL_DASHBOARD_PORT=8880 - SPRING_CLOUD_SENTINEL_TRANSPORT_CLIENT_IP=${HOST_IP:-192.168.1.101} - SPRING_CLOUD_SENTINEL_TRANSPORT_PORT=8722 - CONTENT_IP=${HOST_IP:-192.168.1.101} - JAVA_OPTS=-Xms256m -Xmx512m depends_on: nacos: condition: service_healthy mysql: condition: service_healthy redis: condition: service_healthy rmqnamesrv: condition: service_healthy minio: condition: service_healthy networks: - ha-network video-comment: build: context: ./video-comment dockerfile: Dockerfile container_name: video-comment restart: always ports: - "9004:9004" - "8723:8723" environment: - SPRING_PROFILES_ACTIVE=ha - NACOS_HOST=nacos - NACOS_PORT=8848 - NACOS_USERNAME=nacos - NACOS_PASSWORD=nacos - SPRING_CLOUD_NACOS_DISCOVERY_USERNAME=nacos - SPRING_CLOUD_NACOS_DISCOVERY_PASSWORD=nacos - SPRING_CLOUD_NACOS_CONFIG_USERNAME=nacos - SPRING_CLOUD_NACOS_CONFIG_PASSWORD=nacos - SPRING_CLOUD_NACOS_DISCOVERY_IP=${HOST_IP:-192.168.1.101} - NACOS_SERVERS=${NACOS_SERVERS:-192.168.1.101:8848,192.168.1.102:8848,192.168.1.103:8848} - MYSQL_HOST=mysql - MYSQL_PORT=3306 - MYSQL_USERNAME=root - MYSQL_PASSWORD=${MYSQL_ROOT_PASSWORD:-root123456} - REDIS_PASSWORD=${REDIS_PASSWORD:-redis_HA_Cluster_2024} - REDIS_SENTINEL_NODES=${REDIS_SENTINEL_NODES:-192.168.1.101:26379,192.168.1.102:26379,192.168.1.103:26379} - SERVICE_AUTH_TOKEN=${SERVICE_AUTH_TOKEN} - USER_JWT_SECRET=${USER_JWT_SECRET} - JWT_EXPIRATION=${JWT_EXPIRATION} - SENTINEL_DASHBOARD_HOST=${HOST_IP:-192.168.1.101} - SENTINEL_DASHBOARD_PORT=8880 - SPRING_CLOUD_SENTINEL_TRANSPORT_CLIENT_IP=${HOST_IP:-192.168.1.101} - SPRING_CLOUD_SENTINEL_TRANSPORT_PORT=8723 - COMMENT_IP=${HOST_IP:-192.168.1.101} - JAVA_OPTS=-Xms256m -Xmx512m depends_on: nacos: condition: service_healthy mysql: condition: service_healthy redis: condition: service_healthy networks: - ha-network video-recommend: build: context: ./video-recommend dockerfile: Dockerfile container_name: video-recommend restart: always ports: - "9005:9005" - "8724:8724" environment: - SPRING_PROFILES_ACTIVE=ha - NACOS_HOST=nacos - NACOS_PORT=8848 - NACOS_USERNAME=nacos - NACOS_PASSWORD=nacos - SPRING_CLOUD_NACOS_DISCOVERY_USERNAME=nacos - SPRING_CLOUD_NACOS_DISCOVERY_PASSWORD=nacos - SPRING_CLOUD_NACOS_CONFIG_USERNAME=nacos - SPRING_CLOUD_NACOS_CONFIG_PASSWORD=nacos - SPRING_CLOUD_NACOS_DISCOVERY_IP=${HOST_IP:-192.168.1.101} - NACOS_SERVERS=${NACOS_SERVERS:-192.168.1.101:8848,192.168.1.102:8848,192.168.1.103:8848} - MYSQL_HOST=mysql - MYSQL_PORT=3306 - MYSQL_USERNAME=root - MYSQL_PASSWORD=${MYSQL_ROOT_PASSWORD:-root123456} - REDIS_PASSWORD=${REDIS_PASSWORD:-redis_HA_Cluster_2024} - REDIS_SENTINEL_NODES=${REDIS_SENTINEL_NODES:-192.168.1.101:26379,192.168.1.102:26379,192.168.1.103:26379} - SERVICE_AUTH_TOKEN=${SERVICE_AUTH_TOKEN} - USER_JWT_SECRET=${USER_JWT_SECRET} - JWT_EXPIRATION=${JWT_EXPIRATION} - SENTINEL_DASHBOARD_HOST=${HOST_IP:-192.168.1.101} - SENTINEL_DASHBOARD_PORT=8880 - SPRING_CLOUD_SENTINEL_TRANSPORT_CLIENT_IP=${HOST_IP:-192.168.1.101} - SPRING_CLOUD_SENTINEL_TRANSPORT_PORT=8724 - RECOMMEND_IP=${HOST_IP:-192.168.1.101} - JAVA_OPTS=-Xms256m -Xmx512m depends_on: nacos: condition: service_healthy mysql: condition: service_healthy redis: condition: service_healthy networks: - ha-network video-admin: build: context: ./video-admin dockerfile: Dockerfile container_name: video-admin restart: always ports: - "9006:9006" - "8725:8725" environment: - SPRING_PROFILES_ACTIVE=ha - NACOS_HOST=nacos - NACOS_PORT=8848 - NACOS_USERNAME=nacos - NACOS_PASSWORD=nacos - SPRING_CLOUD_NACOS_DISCOVERY_USERNAME=nacos - SPRING_CLOUD_NACOS_DISCOVERY_PASSWORD=nacos - SPRING_CLOUD_NACOS_CONFIG_USERNAME=nacos - SPRING_CLOUD_NACOS_CONFIG_PASSWORD=nacos - SPRING_CLOUD_NACOS_DISCOVERY_IP=${HOST_IP:-192.168.1.101} - NACOS_SERVERS=${NACOS_SERVERS:-192.168.1.101:8848,192.168.1.102:8848,192.168.1.103:8848} - MYSQL_HOST=mysql - MYSQL_PORT=3306 - MYSQL_USERNAME=root - MYSQL_PASSWORD=${MYSQL_ROOT_PASSWORD:-root123456} - REDIS_PASSWORD=${REDIS_PASSWORD:-redis_HA_Cluster_2024} - REDIS_SENTINEL_NODES=${REDIS_SENTINEL_NODES:-192.168.1.101:26379,192.168.1.102:26379,192.168.1.103:26379} - SERVICE_AUTH_TOKEN=${SERVICE_AUTH_TOKEN} - ADMIN_JWT_SECRET=${ADMIN_JWT_SECRET} - ADMIN_INIT_PASSWORD=${ADMIN_INIT_PASSWORD} - JWT_EXPIRATION=${JWT_EXPIRATION} - SENTINEL_DASHBOARD_HOST=${HOST_IP:-192.168.1.101} - SENTINEL_DASHBOARD_PORT=8880 - SPRING_CLOUD_SENTINEL_TRANSPORT_CLIENT_IP=${HOST_IP:-192.168.1.101} - SPRING_CLOUD_SENTINEL_TRANSPORT_PORT=8725 - ADMIN_IP=${HOST_IP:-192.168.1.101} - JAVA_OPTS=-Xms256m -Xmx512m depends_on: nacos: condition: service_healthy mysql: condition: service_healthy redis: condition: service_healthy networks: - ha-network # ==================== 负载均衡 ==================== nginx: image: nginx:alpine container_name: nginx-lb restart: always ports: - "80:80" - "443:443" volumes: - ./config/nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./config/nginx/conf.d:/etc/nginx/conf.d:ro - nginx_logs:/var/log/nginx depends_on: - video-gateway networks: - ha-network networks: ha-network: driver: bridge volumes: mysql_data: redis_data: sentinel_data: nacos_logs: minio_data: nginx_logs: prometheus_data: grafana_data: