version: '3.8' # urban-lifeline 开发环境 Docker Compose 配置 # 使用主机的 MySQL 数据库 networks: urban-lifeline: driver: bridge name: urban-lifeline services: nacos: image: nacos/nacos-server:v3.1.0 container_name: urban-lifeline-nacos restart: unless-stopped networks: - urban-lifeline ports: - "8081:8080" # Nacos Console (Web UI) - 映射到主机 8081 - "8848:8848" # Nacos HTTP API - "9848:9848" # Nacos gRPC 客户端请求 - "9849:9849" # Nacos gRPC 服务间同步 environment: # 运行模式 MODE: standalone # 数据库配置 - 使用主机 MySQL SPRING_DATASOURCE_PLATFORM: mysql MYSQL_SERVICE_HOST: host.docker.internal # Docker Desktop # MYSQL_SERVICE_HOST: 172.17.0.1 # Linux 使用此行,注释上一行 MYSQL_SERVICE_PORT: 3306 MYSQL_SERVICE_DB_NAME: nacos_config MYSQL_SERVICE_USER: root MYSQL_SERVICE_PASSWORD: "123456" MYSQL_SERVICE_DB_PARAM: allowPublicKeyRetrieval=true&useSSL=false # JVM 配置 JVM_XMS: 512m JVM_XMX: 512m JVM_XMN: 256m # 认证配置(开发环境关闭) NACOS_AUTH_ENABLE: "false" NACOS_AUTH_TOKEN: ZlRkR2ZxR3BvZ1F0a3JxY2V6RUx2cUh1Rkx6V1ZQbE9kUVd1R1VOcWFFS2t3dG5hS0E9PQ== NACOS_AUTH_IDENTITY_KEY: ZlRkR2ZxR3BvZ1F0a3JxY2V6RUx2cUh1Rkx6V1ZQbE9kUVd1R1VOcWFFS2t3dG5hS0E9PQ== NACOS_AUTH_IDENTITY_VALUE: ZlRkR2ZxR3BvZ1F0a3JxY2V6RUx2cUh1Rkx6V1ZQbE9kUVd1R1VOcWFFS2t3dG5hS0E9PQ== volumes: # 数据持久化到主机目录 - ../../../.data/docker/nacos/data:/home/nacos/data - ../../../.data/docker/nacos/logs:/home/nacos/logs healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8848/nacos/"] interval: 30s timeout: 10s retries: 5 start_period: 60s # Linux 需要添加 extra_hosts 来访问主机服务 extra_hosts: - "host.docker.internal:host-gateway" minio: image: minio/minio:latest container_name: urban-lifeline-minio restart: unless-stopped networks: - urban-lifeline ports: - "9000:9000" # MinIO API 端口 - "9001:9001" # MinIO Console (Web UI) 端口 environment: # 管理员账户配置 MINIO_ROOT_USER: minioadmin MINIO_ROOT_PASSWORD: minioadmin123 # Console 地址配置 MINIO_CONSOLE_ADDRESS: ":9001" MINIO_ADDRESS: ":9000" # 时区设置 TZ: Asia/Shanghai volumes: # 数据持久化到主机目录 - ../../../.data/docker/minio/data:/data - ../../../.data/docker/minio/config:/root/.minio command: server /data --console-address ":9001" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3 start_period: 30s # ====================== Jitsi Meet 视频会议服务 ====================== jitsi-web: image: jitsi/web:stable-9584 container_name: urban-lifeline-jitsi-web restart: unless-stopped networks: - urban-lifeline ports: - "8280:80" # 保留原 HTTP 端口 - "8443:443" # 保留原 HTTPS 端口(仅保留映射,实际禁用 HTTPS) environment: # 基础配置(局域网访问) TZ: Asia/Shanghai # 关键:使用 http:// 协议的完整 URL PUBLIC_URL: http://192.168.0.253:8280 # 关键:禁用 HTTPS,让容器生成 ws:// 而不是 wss:// ENABLE_HTTPS: 0 ENABLE_HTTP_REDIRECT: 0 DISABLE_HTTPS: 1 # XMPP 配置 XMPP_DOMAIN: meet.jitsi XMPP_AUTH_DOMAIN: auth.meet.jitsi XMPP_BOSH_URL_BASE: http://jitsi-prosody:5280 XMPP_MUC_DOMAIN: muc.meet.jitsi XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.jitsi XMPP_GUEST_DOMAIN: guest.meet.jitsi # Jicofo 配置(完全保留原设置) JICOFO_COMPONENT_SECRET: jicofo-secret JICOFO_AUTH_USER: focus # JVB 配置(完全保留原设置) JVB_AUTH_USER: jvb JVB_AUTH_PASSWORD: jvb-password # JWT 认证配置(完全保留原设置) ENABLE_AUTH: 1 ENABLE_GUESTS: 1 AUTH_TYPE: jwt JWT_APP_ID: urbanLifeline JWT_APP_SECRET: urbanLifelinejitsi JWT_ACCEPTED_ISSUERS: urbanLifeline JWT_ACCEPTED_AUDIENCES: jitsi JWT_ASAP_KEYSERVER: https://192.168.0.253:8280/ JWT_ALLOW_EMPTY: 0 JWT_AUTH_TYPE: token JWT_TOKEN_AUTH_MODULE: token_verification # 界面/功能配置(完全保留原设置) ENABLE_RECORDING: 0 ENABLE_TRANSCRIPTIONS: 0 ENABLE_SUBDOMAINS: 0 ENABLE_XMPP_WEBSOCKET: 1 ENABLE_SCTP: 1 # 日志/HTTPS 配置 ENABLE_LETSENCRYPT: 0 LETSENCRYPT_DOMAIN: 192.168.0.253 volumes: - ../../../.data/docker/jitsi/web:/config - ../../../.data/docker/jitsi/web/crontabs:/var/spool/cron/crontabs - ../../../.data/docker/jitsi/transcripts:/usr/share/jitsi-meet/transcripts depends_on: - jitsi-prosody healthcheck: test: ["CMD", "curl", "-f", "http://localhost:80/"] interval: 30s timeout: 10s retries: 3 start_period: 60s # XMPP 服务(Prosody)- 完全保留原配置 jitsi-prosody: image: jitsi/prosody:stable-9584 container_name: urban-lifeline-jitsi-prosody restart: unless-stopped networks: - urban-lifeline expose: - "5222" # XMPP客户端连接(内部) - "5347" # XMPP组件连接(内部) - "5280" # BOSH/WebSocket(内部) environment: TZ: Asia/Shanghai # XMPP域配置(完全保留) XMPP_DOMAIN: meet.jitsi XMPP_AUTH_DOMAIN: auth.meet.jitsi XMPP_MUC_DOMAIN: muc.meet.jitsi XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.jitsi XMPP_GUEST_DOMAIN: guest.meet.jitsi # Jicofo组件密钥(完全保留) JICOFO_COMPONENT_SECRET: jicofo-secret JICOFO_AUTH_USER: focus JICOFO_AUTH_PASSWORD: focus-password # JVB认证(完全保留) JVB_AUTH_USER: jvb JVB_AUTH_PASSWORD: jvb-password # JWT认证(完全保留) ENABLE_AUTH: 1 ENABLE_GUESTS: 1 AUTH_TYPE: jwt JWT_APP_ID: urbanLifeline JWT_APP_SECRET: urbanLifelinejitsi JWT_ACCEPTED_ISSUERS: urbanLifeline JWT_ACCEPTED_AUDIENCES: jitsi JWT_ALLOW_EMPTY: 0 JWT_AUTH_TYPE: token JWT_TOKEN_AUTH_MODULE: token_verification # 日志配置(完全保留) LOG_LEVEL: info # 公共URL(局域网访问) PUBLIC_URL: 192.168.0.253:8280 volumes: - ../../../.data/docker/jitsi/prosody/config:/config - ../../../.data/docker/jitsi/prosody/prosody-plugins-custom:/prosody-plugins-custom healthcheck: test: ["CMD", "prosodyctl", "status"] interval: 30s timeout: 10s retries: 3 start_period: 90s # 会议焦点控制器(Jicofo)- 完全保留原配置 jitsi-jicofo: image: jitsi/jicofo:stable-9584 container_name: urban-lifeline-jitsi-jicofo restart: unless-stopped networks: - urban-lifeline environment: TZ: Asia/Shanghai # XMPP配置(完全保留) XMPP_DOMAIN: meet.jitsi XMPP_AUTH_DOMAIN: auth.meet.jitsi XMPP_MUC_DOMAIN: muc.meet.jitsi XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.jitsi XMPP_SERVER: jitsi-prosody # Jicofo认证(完全保留) JICOFO_COMPONENT_SECRET: jicofo-secret JICOFO_AUTH_USER: focus JICOFO_AUTH_PASSWORD: focus-password # JWT配置(完全保留) AUTH_TYPE: jwt # JVB配置(完全保留) JVB_BREWERY_MUC: jvbbrewery # 日志级别(完全保留) JICOFO_ENABLE_HEALTH_CHECKS: "true" volumes: - ../../../.data/docker/jitsi/jicofo:/config depends_on: - jitsi-prosody healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8888/about/health"] interval: 30s timeout: 10s retries: 3 start_period: 90s # 视频桥接服务(JVB)- 仅修复 WebSocket 相关,保留IP/端口 jitsi-jvb: image: jitsi/jvb:stable-9584 container_name: urban-lifeline-jitsi-jvb restart: unless-stopped networks: - urban-lifeline ports: - "10000:10000/udp" # 保留原 UDP 端口 - "4443:4443/tcp" # 保留原 TCP 端口 environment: TZ: Asia/Shanghai # XMPP配置(完全保留) XMPP_DOMAIN: meet.jitsi XMPP_AUTH_DOMAIN: auth.meet.jitsi XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.jitsi XMPP_SERVER: jitsi-prosody # JVB认证(完全保留) JVB_AUTH_USER: jvb JVB_AUTH_PASSWORD: jvb-password # JVB配置(完全保留) JVB_BREWERY_MUC: jvbbrewery JVB_PORT: 10000 JVB_STUN_SERVERS: stun.l.google.com:19302,stun1.l.google.com:19302 # 本地IP配置(局域网IP - 关键配置!) DOCKER_HOST_ADDRESS: 192.168.0.253 JVB_ADVERTISE_IPS: 192.168.0.253 # 启用统计(完全保留) JVB_ENABLE_APIS: rest,colibri # 性能优化(完全保留) JVB_TCP_HARVESTER_DISABLED: "false" JVB_TCP_PORT: 4443 JVB_TCP_MAPPED_PORT: 4443 volumes: - ../../../.data/docker/jitsi/jvb:/config depends_on: - jitsi-prosody healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/about/health"] interval: 30s timeout: 10s retries: 3 start_period: 90s