name: video-platform services: # 基础设施服务 mysql: image: mysql:8.0 container_name: mysql restart: always environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: video_platform MYSQL_USER: ${MYSQL_APP_USER} MYSQL_PASSWORD: ${MYSQL_APP_PASSWORD} ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql - ./sql/init.sql:/docker-entrypoint-initdb.d/01-init.sql:ro - ./sql/nacos-schema.sql:/docker-entrypoint-initdb.d/02-nacos-schema.sql:ro - ./sql/03-nacos-config-init.sh:/docker-entrypoint-initdb.d/03-nacos-config-init.sh:ro - ./sql/nacos-config-init.sql:/init-sql/nacos-config-init.sql:ro command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-p${MYSQL_ROOT_PASSWORD}"] interval: 10s timeout: 5s retries: 10 networks: - video-network redis: image: redis:7.0-alpine container_name: redis restart: always ports: - "6379:6379" volumes: - redis_data:/data command: redis-server --requirepass ${REDIS_PASSWORD} healthcheck: test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"] interval: 10s timeout: 5s retries: 5 networks: - video-network redis-sentinel: image: redis:7.0-alpine container_name: redis-sentinel restart: always ports: - "26379:26379" volumes: - redis_sentinel_data:/data - ./config/redis/sentinel-single.conf:/usr/local/etc/redis/sentinel.conf:ro command: sh -c "sed \"s/__REDIS_PASSWORD__/${REDIS_PASSWORD}/g\" /usr/local/etc/redis/sentinel.conf > /data/sentinel.conf && redis-sentinel /data/sentinel.conf" depends_on: redis: condition: service_healthy networks: - video-network nacos: image: nacos/nacos-server:v2.3.2 container_name: nacos restart: always environment: - MODE=standalone - 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} - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true - JVM_XMS=512m - JVM_XMX=512m - NACOS_AUTH_ENABLE=true - NACOS_AUTH_TOKEN=${NACOS_AUTH_TOKEN} - NACOS_AUTH_IDENTITY_KEY=serverIdentity - NACOS_AUTH_IDENTITY_VALUE=security - PREFER_HOST_MODE=hostname - NACOS_SERVER_IP=${HOST_IP:-127.0.0.1} ports: - "8848:8848" - "9848:9848" - "9849:9849" 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: - video-network rmqnamesrv: image: apache/rocketmq:5.1.4 container_name: rmqnamesrv restart: always ports: - "9876:9876" command: sh mqnamesrv healthcheck: test: ["CMD-SHELL", "pgrep -f 'NamesrvStartup' || exit 1"] interval: 10s timeout: 5s retries: 10 start_period: 30s networks: - video-network rmqbroker: image: apache/rocketmq:5.1.4 user: root container_name: rmqbroker restart: always ports: - "10909:10909" - "10911:10911" - "10912:10912" environment: - NAMESRV_ADDR=rmqnamesrv:9876 - JAVA_OPTS=-Duser.home=/opt volumes: - ./config/rocketmq/broker-a.conf:/home/rocketmq/rocketmq-5.1.4/conf/broker.conf:ro - rmqbroker_logs:/home/rocketmq/logs - rmqbroker_store:/home/rocketmq/store command: sh mqbroker -c /home/rocketmq/rocketmq-5.1.4/conf/broker.conf depends_on: rmqnamesrv: condition: service_healthy networks: - video-network minio: image: quay.io/minio/minio container_name: minio restart: always ports: - "9100:9000" - "9101:9001" environment: - MINIO_ROOT_USER=${MINIO_ACCESS_KEY} - MINIO_ROOT_PASSWORD=${MINIO_SECRET_KEY} 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: - video-network sentinel: build: context: ./sentinel-dashboard dockerfile: Dockerfile image: sentinel-dashboard:1.8.6 container_name: sentinel restart: always ports: - "8880:8080" networks: - video-network prometheus: image: prom/prometheus:v2.54.1 container_name: prometheus restart: always ports: - "9090:9090" volumes: - ./monitoring/prometheus/prometheus.local.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: - video-network grafana: image: grafana/grafana:11.2.0 container_name: grafana restart: always ports: - "3000:3000" environment: - GF_SECURITY_ADMIN_USER=${GRAFANA_ADMIN_USER} - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD} - 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: - video-network mysqld-exporter: image: prom/mysqld-exporter:v0.16.0 container_name: mysqld-exporter restart: always environment: - MYSQLD_EXPORTER_PASSWORD=${MYSQL_ROOT_PASSWORD} command: - --mysqld.address=mysql:3306 - --mysqld.username=root depends_on: mysql: condition: service_healthy networks: - video-network redis-exporter: image: oliver006/redis_exporter:v1.62.0 container_name: redis-exporter restart: always environment: - REDIS_ADDR=redis://redis:6379 - REDIS_PASSWORD=${REDIS_PASSWORD} depends_on: redis: condition: service_healthy networks: - video-network node-exporter: image: prom/node-exporter:v1.8.2 container_name: node-exporter restart: always 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: - video-network # 微服务 video-gateway: build: context: ./video-gateway dockerfile: Dockerfile container_name: video-gateway restart: always ports: - "9000:9000" environment: - SPRING_PROFILES_ACTIVE=ha - NACOS_HOST=nacos - NACOS_PORT=8848 - NACOS_USERNAME=${NACOS_USERNAME} - NACOS_PASSWORD=${NACOS_PASSWORD} - SPRING_CLOUD_NACOS_DISCOVERY_USERNAME=${NACOS_USERNAME} - SPRING_CLOUD_NACOS_DISCOVERY_PASSWORD=${NACOS_PASSWORD} - SPRING_CLOUD_NACOS_CONFIG_USERNAME=${NACOS_USERNAME} - SPRING_CLOUD_NACOS_CONFIG_PASSWORD=${NACOS_PASSWORD} - SENTINEL_HOST=sentinel - SENTINEL_PORT=8080 - REDIS_PASSWORD=${REDIS_PASSWORD} - REDIS_SENTINEL_NODES=redis-sentinel:26379 - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} - JWT_SECRET=${USER_JWT_SECRET} - USER_JWT_SECRET=${USER_JWT_SECRET} - GATEWAY_IGNORE_URLS=/**/auth/login,/**/auth/register,/**/auth/captcha,/**/auth/refresh,/auth/username/**,/content/video/public/**,/content/category/tree,/content/category/list,/content/tag/list,/content/tag/page,/content/danmaku/all/**,/content/danmaku/time,/content/stat/**,/user/profile/public/**,/user/profile/search,/user/follow/following/**,/user/follow/followers/**,/comment/reply/public/**,/comment/public/**,/recommend/home,/recommend/hot/**,/recommend/similar/**,/recommend/tag/**,/admin/auth/captcha,/admin/auth/login - JWT_EXPIRATION=${JWT_EXPIRATION} - JAVA_OPTS=-Xms128m -Xmx128m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m # 添加IP环境变量,用于服务注册 - GATEWAY_IP=${HOST_IP:-127.0.0.1} depends_on: nacos: condition: service_healthy deploy: resources: limits: memory: 256M networks: - video-network video-auth: build: context: ./video-auth dockerfile: Dockerfile container_name: video-auth restart: always environment: - SPRING_PROFILES_ACTIVE=ha - NACOS_HOST=nacos - NACOS_PORT=8848 - NACOS_USERNAME=${NACOS_USERNAME} - NACOS_PASSWORD=${NACOS_PASSWORD} - SPRING_CLOUD_NACOS_DISCOVERY_USERNAME=${NACOS_USERNAME} - SPRING_CLOUD_NACOS_DISCOVERY_PASSWORD=${NACOS_PASSWORD} - SPRING_CLOUD_NACOS_CONFIG_USERNAME=${NACOS_USERNAME} - SPRING_CLOUD_NACOS_CONFIG_PASSWORD=${NACOS_PASSWORD} - MYSQL_HOST=mysql - MYSQL_PORT=3306 - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} - REDIS_PASSWORD=${REDIS_PASSWORD} - REDIS_SENTINEL_NODES=redis-sentinel:26379 - SERVICE_AUTH_TOKEN=${SERVICE_AUTH_TOKEN} - JWT_SECRET=${USER_JWT_SECRET} - USER_JWT_SECRET=${USER_JWT_SECRET} - JWT_EXPIRATION=${JWT_EXPIRATION} - SENTINEL_DASHBOARD_HOST=sentinel - SENTINEL_DASHBOARD_PORT=8080 - SPRING_CLOUD_SENTINEL_TRANSPORT_PORT=8720 # 添加IP环境变量,用于服务注册 - AUTH_IP=${HOST_IP:-127.0.0.1} depends_on: nacos: condition: service_healthy mysql: condition: service_healthy redis: condition: service_healthy networks: - video-network video-user: build: context: ./video-user dockerfile: Dockerfile container_name: video-user restart: always environment: - SPRING_PROFILES_ACTIVE=ha - NACOS_HOST=nacos - NACOS_PORT=8848 - NACOS_USERNAME=${NACOS_USERNAME} - NACOS_PASSWORD=${NACOS_PASSWORD} - SPRING_CLOUD_NACOS_DISCOVERY_USERNAME=${NACOS_USERNAME} - SPRING_CLOUD_NACOS_DISCOVERY_PASSWORD=${NACOS_PASSWORD} - SPRING_CLOUD_NACOS_CONFIG_USERNAME=${NACOS_USERNAME} - SPRING_CLOUD_NACOS_CONFIG_PASSWORD=${NACOS_PASSWORD} - MYSQL_HOST=mysql - MYSQL_PORT=3306 - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} - REDIS_PASSWORD=${REDIS_PASSWORD} - REDIS_SENTINEL_NODES=redis-sentinel:26379 - MINIO_HOST=minio - MINIO_PORT=9000 - MINIO_ACCESS_KEY=${MINIO_ACCESS_KEY} - MINIO_SECRET_KEY=${MINIO_SECRET_KEY} - MINIO_BUCKET=${MINIO_BUCKET} - SERVICE_AUTH_TOKEN=${SERVICE_AUTH_TOKEN} - JWT_SECRET=${USER_JWT_SECRET} - USER_JWT_SECRET=${USER_JWT_SECRET} - JWT_EXPIRATION=${JWT_EXPIRATION} - SENTINEL_DASHBOARD_HOST=sentinel - SENTINEL_DASHBOARD_PORT=8080 - SPRING_CLOUD_SENTINEL_TRANSPORT_PORT=8721 # 添加IP环境变量,用于服务注册 - USER_IP=${HOST_IP:-127.0.0.1} depends_on: nacos: condition: service_healthy mysql: condition: service_healthy redis: condition: service_healthy networks: - video-network video-content: build: context: ./video-content dockerfile: Dockerfile container_name: video-content restart: always environment: - SPRING_PROFILES_ACTIVE=ha - NACOS_HOST=nacos - NACOS_PORT=8848 - NACOS_USERNAME=${NACOS_USERNAME} - NACOS_PASSWORD=${NACOS_PASSWORD} - SPRING_CLOUD_NACOS_DISCOVERY_USERNAME=${NACOS_USERNAME} - SPRING_CLOUD_NACOS_DISCOVERY_PASSWORD=${NACOS_PASSWORD} - SPRING_CLOUD_NACOS_CONFIG_USERNAME=${NACOS_USERNAME} - SPRING_CLOUD_NACOS_CONFIG_PASSWORD=${NACOS_PASSWORD} - MYSQL_HOST=mysql - MYSQL_PORT=3306 - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} - REDIS_PASSWORD=${REDIS_PASSWORD} - REDIS_SENTINEL_NODES=redis-sentinel:26379 - ROCKETMQ_HOST=rmqnamesrv - ROCKETMQ_PORT=9876 - MINIO_HOST=minio - MINIO_PORT=9000 - MINIO_ACCESS_KEY=${MINIO_ACCESS_KEY} - MINIO_SECRET_KEY=${MINIO_SECRET_KEY} - MINIO_BUCKET=${MINIO_BUCKET} - SERVICE_AUTH_TOKEN=${SERVICE_AUTH_TOKEN} - JWT_SECRET=${USER_JWT_SECRET} - USER_JWT_SECRET=${USER_JWT_SECRET} - JWT_EXPIRATION=${JWT_EXPIRATION} - SENTINEL_DASHBOARD_HOST=sentinel - SENTINEL_DASHBOARD_PORT=8080 - SPRING_CLOUD_SENTINEL_TRANSPORT_PORT=8722 # 添加IP环境变量,用于服务注册 - CONTENT_IP=${HOST_IP:-127.0.0.1} depends_on: nacos: condition: service_healthy mysql: condition: service_healthy redis: condition: service_healthy rmqnamesrv: condition: service_healthy minio: condition: service_healthy networks: - video-network video-admin: build: context: ./video-admin dockerfile: Dockerfile container_name: video-admin restart: always environment: - SPRING_PROFILES_ACTIVE=ha - NACOS_HOST=nacos - NACOS_PORT=8848 - NACOS_USERNAME=${NACOS_USERNAME} - NACOS_PASSWORD=${NACOS_PASSWORD} - SPRING_CLOUD_NACOS_DISCOVERY_USERNAME=${NACOS_USERNAME} - SPRING_CLOUD_NACOS_DISCOVERY_PASSWORD=${NACOS_PASSWORD} - SPRING_CLOUD_NACOS_CONFIG_USERNAME=${NACOS_USERNAME} - SPRING_CLOUD_NACOS_CONFIG_PASSWORD=${NACOS_PASSWORD} - MYSQL_HOST=mysql - MYSQL_PORT=3306 - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} - REDIS_PASSWORD=${REDIS_PASSWORD} - REDIS_SENTINEL_NODES=redis-sentinel:26379 - SERVICE_AUTH_TOKEN=${SERVICE_AUTH_TOKEN} - JWT_SECRET=${ADMIN_JWT_SECRET} - ADMIN_JWT_SECRET=${ADMIN_JWT_SECRET} - ADMIN_INIT_PASSWORD=${ADMIN_INIT_PASSWORD} - APP_INIT_ADMIN_PASSWORD=${ADMIN_INIT_PASSWORD} - JWT_EXPIRATION=${JWT_EXPIRATION} - SENTINEL_DASHBOARD_HOST=sentinel - SENTINEL_DASHBOARD_PORT=8080 - SPRING_CLOUD_SENTINEL_TRANSPORT_PORT=8725 # 添加IP环境变量,用于服务注册 - ADMIN_IP=${HOST_IP:-127.0.0.1} depends_on: nacos: condition: service_healthy mysql: condition: service_healthy redis: condition: service_healthy networks: - video-network video-comment: build: context: ./video-comment dockerfile: Dockerfile container_name: video-comment restart: always environment: - SPRING_PROFILES_ACTIVE=ha - NACOS_HOST=nacos - NACOS_PORT=8848 - NACOS_USERNAME=${NACOS_USERNAME} - NACOS_PASSWORD=${NACOS_PASSWORD} - SPRING_CLOUD_NACOS_DISCOVERY_USERNAME=${NACOS_USERNAME} - SPRING_CLOUD_NACOS_DISCOVERY_PASSWORD=${NACOS_PASSWORD} - SPRING_CLOUD_NACOS_CONFIG_USERNAME=${NACOS_USERNAME} - SPRING_CLOUD_NACOS_CONFIG_PASSWORD=${NACOS_PASSWORD} - MYSQL_HOST=mysql - MYSQL_PORT=3306 - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} - REDIS_PASSWORD=${REDIS_PASSWORD} - REDIS_SENTINEL_NODES=redis-sentinel:26379 - SERVICE_AUTH_TOKEN=${SERVICE_AUTH_TOKEN} - JWT_SECRET=${USER_JWT_SECRET} - USER_JWT_SECRET=${USER_JWT_SECRET} - JWT_EXPIRATION=${JWT_EXPIRATION} - SENTINEL_DASHBOARD_HOST=sentinel - SENTINEL_DASHBOARD_PORT=8080 - SPRING_CLOUD_SENTINEL_TRANSPORT_PORT=8723 # 添加IP环境变量,用于服务注册 - COMMENT_IP=${HOST_IP:-127.0.0.1} depends_on: nacos: condition: service_healthy mysql: condition: service_healthy redis: condition: service_healthy networks: - video-network video-recommend: build: context: ./video-recommend dockerfile: Dockerfile container_name: video-recommend restart: always environment: - SPRING_PROFILES_ACTIVE=ha - NACOS_HOST=nacos - NACOS_PORT=8848 - NACOS_USERNAME=${NACOS_USERNAME} - NACOS_PASSWORD=${NACOS_PASSWORD} - SPRING_CLOUD_NACOS_DISCOVERY_USERNAME=${NACOS_USERNAME} - SPRING_CLOUD_NACOS_DISCOVERY_PASSWORD=${NACOS_PASSWORD} - SPRING_CLOUD_NACOS_CONFIG_USERNAME=${NACOS_USERNAME} - SPRING_CLOUD_NACOS_CONFIG_PASSWORD=${NACOS_PASSWORD} - MYSQL_HOST=mysql - MYSQL_PORT=3306 - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} - REDIS_PASSWORD=${REDIS_PASSWORD} - REDIS_SENTINEL_NODES=redis-sentinel:26379 - JWT_SECRET=${USER_JWT_SECRET} - USER_JWT_SECRET=${USER_JWT_SECRET} - JWT_EXPIRATION=${JWT_EXPIRATION} - SENTINEL_DASHBOARD_HOST=sentinel - SENTINEL_DASHBOARD_PORT=8080 - SPRING_CLOUD_SENTINEL_TRANSPORT_PORT=8724 # 添加IP环境变量,用于服务注册 - RECOMMEND_IP=${HOST_IP:-127.0.0.1} depends_on: nacos: condition: service_healthy mysql: condition: service_healthy redis: condition: service_healthy networks: - video-network networks: video-network: driver: bridge volumes: mysql_data: redis_data: redis_sentinel_data: minio_data: rmqbroker_logs: rmqbroker_store: prometheus_data: grafana_data: