services: bytedesk-mysql: image: mysql:9.3.0 container_name: mysql-bytedesk environment: MYSQL_DATABASE: bytedesk MYSQL_ROOT_PASSWORD: r8FqfdbWUaN3 TZ: Asia/Shanghai # 添加这一行 ports: - "13306:3306" volumes: - mysql_data:/var/lib/mysql networks: - bytedesk-network # healthcheck: # test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$MYSQL_ROOT_PASSWORD"] # interval: 10s # timeout: 5s # retries: 5 bytedesk-redis: image: redis:8.2.1 container_name: redis-bytedesk ports: - "16379:6379" command: sh -c "chown -R redis:redis /data && exec redis-server --requirepass qfRxz3tVT8Nh" volumes: - redis_data:/data networks: - bytedesk-network # healthcheck: # test: ["CMD", "redis-cli", "-a", "qfRxz3tVT8Nh", "ping"] # interval: 10s # timeout: 5s # retries: 5 # ActiveMQ Artemis 消息队列 # http://localhost:18161/console,使用 admin/admin 作为登录凭据 bytedesk-artemis: image: apache/activemq-artemis:2.40.0 container_name: artemis-bytedesk environment: - ARTEMIS_USER=admin - ARTEMIS_PASSWORD=admin - ANONYMOUS_LOGIN=false - EXTRA_ARGS=--http-host 0.0.0.0 --relax-jolokia ports: - "16161:61616" # JMS - "16162:61617" # AMQP - "18161:8161" # Web Console - "15672:5672" # AMQP - "16163:61613" # STOMP - "11883:1883" # MQTT volumes: - artemis_data:/var/lib/artemis/data networks: - bytedesk-network healthcheck: test: ["CMD", "curl", "--fail", "-u", "admin:admin", "http://localhost:8161/console/jolokia/"] interval: 30s timeout: 10s retries: 5 # ElasticSearch 向量数据库 bytedesk-elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:9.4.2 container_name: elasticsearch-bytedesk environment: - node.name=bytedesk-es01 - cluster.name=bytedesk-es-cluster - discovery.type=single-node - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" - xpack.security.enabled=true - ELASTIC_PASSWORD=bytedesk123 ulimits: memlock: soft: -1 hard: -1 entrypoint: ["bash", "-c", "IK_PLUGIN_DIR=/tmp/ik-plugin-cache; IK_PLUGIN_FILE=$$IK_PLUGIN_DIR/elasticsearch-analysis-ik-9.4.2.zip; IK_PLUGIN_TMP=$$IK_PLUGIN_FILE.tmp; mkdir -p $$IK_PLUGIN_DIR; if [ ! -d /usr/share/elasticsearch/plugins/analysis-ik ]; then echo 'Installing IK plugin...'; curl -fsSL -o $$IK_PLUGIN_TMP https://www.weiyuai.cn/download/elasticsearch-analysis-ik-9.4.2.zip && mv $$IK_PLUGIN_TMP $$IK_PLUGIN_FILE; /usr/share/elasticsearch/bin/elasticsearch-plugin install --batch file://$$IK_PLUGIN_FILE; fi; exec /usr/local/bin/docker-entrypoint.sh"] volumes: - elasticsearch_data:/usr/share/elasticsearch/data # 默认安装 IK 分词插件(缓存目录中的 zip 文件) # 如缓存目录中无 zip 文件,将自动从 https://www.weiyuai.cn/download/elasticsearch-analysis-ik-9.4.2.zip 下载 - ./elasticsearch-analysis-ik-9.4.2.zip:/tmp/ik-plugin-cache ports: - "19200:9200" - "19300:9300" networks: - bytedesk-network # healthcheck: # test: ["CMD-SHELL", "curl -s -f http://localhost:9200/_cluster/health?wait_for_status=yellow || exit 1"] # interval: 30s # timeout: 10s # retries: 5 # MinIO 对象存储服务 # http://localhost:19000 - MinIO Console # http://localhost:19001 - MinIO API bytedesk-minio: image: minio/minio:RELEASE.2025-07-31T00-00-00Z container_name: minio-bytedesk environment: - MINIO_ROOT_USER=minioadmin - MINIO_ROOT_PASSWORD=minioadmin123 - TZ=Asia/Shanghai ports: - "19000:9000" # API - "19001:9001" # Console volumes: - minio_data:/data command: minio server /data --console-address ":9001" networks: - bytedesk-network healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 10s retries: 5 # Coturn TURN server # https://hub.docker.com/r/coturn/coturn # 参考:https://github.com/coturn/coturn/blob/master/docker/coturn/README.md # 说明:TURN 需要开放一段 UDP 中继端口范围(RFC 5766)。Docker 对超大端口段映射性能较差, # 这里按官方示例收敛到 49160-49200(可按需调整)。 bytedesk-coturn: image: coturn/coturn:4.6.3 container_name: coturn-bytedesk restart: always ports: - "13478:3478" - "13478:3478/udp" - "15349:5349" - "15349:5349/udp" - "49160-49200:49160-49200/udp" command: - -n - --log-file=stdout - --min-port=49160 - --max-port=49200 - --lt-cred-mech - --fingerprint - --no-multicast-peers - --no-cli - --no-tlsv1 - --realm=${COTURN_REALM:-bytedesk.local} - --user=${COTURN_USER:-bytedesk}:${COTURN_PASS:-bytedesk123} volumes: - coturn_data:/var/lib/coturn networks: - bytedesk-network # FreeSwitch 语音通话服务 # https://hub.docker.com/r/bytedesk/freeswitch # 使用自定义构建的 FreeSWITCH 镜像(支持 ARM64/AMD64) bytedesk-freeswitch: # image: bytedesk/freeswitch:latest image: registry.cn-hangzhou.aliyuncs.com/bytedesk/freeswitch:latest container_name: freeswitch-bytedesk restart: always # 使用 -nf (no fork) 参数在前台运行,避免容器退出 command: ["freeswitch", "-nf", "-nonat", "-nonatmap"] environment: # 时区设置 - TZ=Asia/Shanghai # 完全禁用 IPv6 - DISABLE_IPV6=true ports: # SIP 端口 - "15060:5060/tcp" # SIP 内部 - "15060:5060/udp" # SIP 内部 - "15080:5080/tcp" # SIP 外部 - "15080:5080/udp" # SIP 外部 - "15061:5061/tcp" # SIP 内部 TLS - "15081:5081/tcp" # SIP 外部 TLS # WebRTC 端口 - "15066:5066/tcp" # WebSocket 信令 - "17443:7443/tcp" # WebRTC WSS # ESL 管理端口 - "18021:8021/tcp" # HTTP 服务端口 - "18081-18082:8081-8082/tcp" # RTP 媒体端口范围 - "16000-16129:6000-6129/udp" volumes: # 配置文件目录 - 使用本地配置文件覆盖容器内的配置(经验证实际使用 /usr/local/freeswitch/etc/freeswitch) - ../freeswitch/conf:/usr/local/freeswitch/etc/freeswitch # Lua 脚本目录 - 92-ai-bot 等拨号计划依赖 nlsml_to_text.lua - ../freeswitch/scripts:/usr/local/freeswitch/share/freeswitch/scripts # 数据持久化目录 - freeswitch_data:/usr/local/freeswitch/db # 日志目录 - ../freeswitch/log:/usr/local/freeswitch/log # 声音目录 - ../freeswitch/sounds:/usr/local/freeswitch/sounds # 录音目录 - ../freeswitch/recordings:/usr/local/freeswitch/recordings # 挂载 ODBC 配置(ARM64 MariaDB 驱动) - ../freeswitch/etc/odbc.ini:/etc/odbc.ini:ro - ../freeswitch/etc/odbcinst.ini:/etc/odbcinst.ini:ro depends_on: - bytedesk-mysql networks: - bytedesk-network bytedesk: # image: bytedesk/bytedesk:latest # hub.docker.com enterprise # image: bytedesk/bytedesk-ce:latest # hub.docker.com community image: registry.cn-hangzhou.aliyuncs.com/bytedesk/bytedesk:latest # aliyun enterprise # mage: registry.cn-hangzhou.aliyuncs.com/bytedesk/bytedesk-ce:latest # aliyun community container_name: bytedesk depends_on: - bytedesk-mysql - bytedesk-redis - bytedesk-elasticsearch - bytedesk-artemis - bytedesk-minio # bytedesk-mysql: # condition: service_healthy # bytedesk-redis: # condition: service_healthy # bytedesk-elasticsearch: # condition: service_healthy # bytedesk-artemis: # condition: service_healthy environment: TZ: Asia/Shanghai SERVER_PORT: 9003 # bytedesk config BYTEDESK_DEBUG: "false" # open profile 数据源类型:mysql / postgresql / oracle / kingbase / h2 BYTEDESK_DATASOURCE_ACTIVE: mysql # 申请licenseKey # https://www.weiyuai.cn/docs/zh-CN/docs/faq#%E9%97%AE%E9%A2%9813%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E8%AF%95%E7%94%A8%E7%89%88license BYTEDESK_LICENSE_KEY: # enable custom config: name, logo, description # enable custom system config 是否开启自定义系统配置 BYTEDESK_CUSTOM_ENABLED: "false" # custom system name 自定义系统名称 BYTEDESK_CUSTOM_NAME: # custom logo url 自定义logo地址 BYTEDESK_CUSTOM_LOGO: # custom system description 自定义系统描述 BYTEDESK_CUSTOM_DESCRIPTION: BYTEDESK_CUSTOM_SHOW_RIGHT_CORNER_CHAT: "false" BYTEDESK_CUSTOM_SHOW_DEMO: "false" BYTEDESK_CUSTOM_PRIVACY_POLICY_URL: https://www.weiyuai.cn/privacy.html BYTEDESK_CUSTOM_TERMS_OF_SERVICE_URL: https://www.weiyuai.cn/terms.html # 外网可访问的 MQTT WebSocket 地址(nginx/反向代理场景),例如:wss://api.weiyuai.cn/websocket BYTEDESK_CUSTOM_MQTT_WEBSOCKET_URL: # 外网可访问的访客工单页面地址(完整URL,不带末尾斜杠),用于邮件中的工单会话直达链接,例如:https://support.weiyuai.cn/ticket # BYTEDESK_CUSTOM_TICKET_HTML_URL: https://support.example.com/ticket # enable login username 登录用户名开启 BYTEDESK_CUSTOM_LOGIN_USERNAME_ENABLE: "true" # enable 2fa 双重验证开启 BYTEDESK_CUSTOM_LOGIN_2FA_ENABLE: "false" # 密码错误最大重试次数, 默认3次, 0表示不限制。 BYTEDESK_CUSTOM_LOGIN_MAX_RETRY_COUNT: 3 # 超过次数默认锁定10分钟, 0表示不锁定 BYTEDESK_CUSTOM_LOGIN_MAX_RETRY_LOCK_TIME: 10 # enable login mobile 手机号登录开启 BYTEDESK_CUSTOM_LOGIN_MOBILE_ENABLE: "true" # enable login scan 扫码登录开启 BYTEDESK_CUSTOM_LOGIN_SCAN_ENABLE: "true" # enable github login BYTEDESK_CUSTOM_LOGIN_GITHUB_ENABLE: "false" BYTEDESK_CUSTOM_DOC_URL_SHOW: "true" BYTEDESK_CUSTOM_DOC_URL: https://www.weiyuai.cn/docs/zh-CN/ # Show HelpDocButton in admin console; hidden unless explicitly enabled. 是否显示 admin 帮助文档按钮,默认不显示,明确开启才显示。 BYTEDESK_CUSTOM_HELP_DOC_BUTTON_ENABLED: "false" BYTEDESK_CUSTOM_LANG: zh-CN # Custom default LLM prompt; leave empty to fall back to the built-in RobotConsts default. BYTEDESK_CUSTOM_DEFAULT_LLM_PROMPT: # show register button 是否显示登录页注册按钮(仅控制显隐) BYTEDESK_CUSTOM_SHOW_REGISTER_BUTTON: "false" # force validate mobile 强制验证手机号 BYTEDESK_CUSTOM_FORCE_VALIDATE_MOBILE: "true" # force validate email 强制验证邮箱 BYTEDESK_CUSTOM_FORCE_VALIDATE_EMAIL: "true" # Admin config BYTEDESK_ADMIN_EMAIL: admin@email.com BYTEDESK_ADMIN_PASSWORD: admin BYTEDESK_ADMIN_NICKNAME: SuperAdmin BYTEDESK_ADMIN_MOBILE: 13345678000 BYTEDESK_ADMIN_MOBILE_WHITELIST: 18888888000,18888888001,18888888002,18888888003,18888888004,18888888005 BYTEDESK_ADMIN_EMAIL_WHITELIST: 100@email.com,101@email.com,102@email.com,103@email.com,104@email.com,105@email.com BYTEDESK_ADMIN_VALIDATE_CODE: 123456 # Member config BYTEDESK_MEMBER_PASSWORD: 123456 # Performance Testing config. 生产/客户部署必须保持 false,仅 jmeter 压测时临时开启(true 会绕过验证码和 IP 过滤) BYTEDESK_TESTING_ENABLED: "false" # BYTEDESK_TESTING_ACCOUNT_COUNT: 300 # BYTEDESK_TESTING_ACCOUNT_USERNAME: test # BYTEDESK_TESTING_ACCOUNT_PASSWORD: password BYTEDESK_TESTING_DISABLE_CAPTCHA: "false" BYTEDESK_TESTING_DISABLE_IP_FILTER: "false" # whitelist ip for performance testing BYTEDESK_TESTING_IP_WHITELIST: 127.0.0.1,127.0.0.2 # Organization config BYTEDESK_ORGANIZATION_NAME: MyCompany BYTEDESK_ORGANIZATION_CODE: bytedesk BYTEDESK_ORGANIZATION_ALLOW_CREATE_ORG: "true" BYTEDESK_ORGANIZATION_ALLOW_JOIN_ORG: "true" BYTEDESK_ORGANIZATION_DEFAULT_VIP_LEVEL: 0 BYTEDESK_ORGANIZATION_DEFAULT_VIP_DAYS: 365 BYTEDESK_ORGANIZATION_DEFAULT_MAX_MEMBERS: 20 BYTEDESK_ORGANIZATION_DEFAULT_MAX_AGENTS: 20 BYTEDESK_ORGANIZATION_DEFAULT_MAX_WORKGROUPS: 20 # Features config BYTEDESK_FEATURES_JAVA_AI: "true" BYTEDESK_FEATURES_EMAIL_TYPE: javamail # 头像的访问地址,请修改为服务器实际的地址 BYTEDESK_FEATURES_AVATAR_BASE_URL: http://127.0.0.1:9003 # CORS config # BYTEDESK_CORS_ALLOWED_ORIGINS: * # JWT config BYTEDESK_JWT_SECRET_KEY: 1dfaf8d004207b628a9a6b859c429f49a9a7ead9fd8161c1e60847aeef06dbd2 BYTEDESK_JWT_EXPIRATION: 2592000000 BYTEDESK_JWT_REFRESH_TOKEN_EXPIRATION: 5184000000 # db config SPRING_DATASOURCE_URL: jdbc:mysql://mysql-bytedesk:3306/bytedesk?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true SPRING_DATASOURCE_USERNAME: root SPRING_DATASOURCE_PASSWORD: r8FqfdbWUaN3 SPRING_JPA_HIBERNATE_DDL_AUTO: update # redis config SPRING_DATA_REDIS_DATABASE: 0 SPRING_DATA_REDIS_HOST: redis-bytedesk SPRING_DATA_REDIS_PORT: 6379 SPRING_DATA_REDIS_PASSWORD: qfRxz3tVT8Nh SPRING_DATA_REDIS_TIMEOUT: 10000 SPRING_DATA_REDIS_REPOSITORIES_ENABLED: "false" # Cache config BYTEDESK_CACHE_LEVEL: 2 BYTEDESK_CACHE_PREFIX: bytedeskim BYTEDESK_CACHE_REDIS_STREAM_KEY: bytedeskim:stream SPRING_CACHE_TYPE: redis SPRING_CACHE_REDIS_TIME_TO_LIVE: 1800000 SPRING_CACHE_REDIS_CACHE_NULL_VALUES: "false" SPRING_CACHE_REDIS_USE_KEY_PREFIX: "true" SPRING_CACHE_REDIS_KEY_PREFIX: "bytedeskim:cache:" # Upload config BYTEDESK_UPLOAD_TYPE: local BYTEDESK_UPLOAD_DIR: /app/uploads # 上传文件的访问地址,请修改为服务器实际的地址 BYTEDESK_UPLOAD_URL: http://127.0.0.1:9003 # 文件上传安全配置 BYTEDESK_UPLOAD_SECURITY_MAX_FILE_SIZE: 10485760 BYTEDESK_UPLOAD_SECURITY_ENABLE_IMAGE_VALIDATION: "true" BYTEDESK_UPLOAD_SECURITY_ENABLE_FILE_NAME_FILTER: "true" BYTEDESK_UPLOAD_SECURITY_FORCE_RENAME: "true" BYTEDESK_UPLOAD_SECURITY_MAX_FILE_NAME_LENGTH: 255 BYTEDESK_UPLOAD_SECURITY_ENABLE_UPLOAD_LOG: "true" BYTEDESK_UPLOAD_SECURITY_ENABLE_VIRUS_SCAN: "false" # Watermark config 水印配置 # BYTEDESK_WATERMARK_ENABLED: "false" # BYTEDESK_WATERMARK_TEXT: bytedesk.com # BYTEDESK_WATERMARK_POSITION: BOTTOM_RIGHT # BYTEDESK_WATERMARK_FONT_SIZE: 24 # BYTEDESK_WATERMARK_FONT_NAME: Arial # BYTEDESK_WATERMARK_COLOR: 255,255,255,128 # BYTEDESK_WATERMARK_OPACITY: 0.5 # BYTEDESK_WATERMARK_MARGIN: 20 # BYTEDESK_WATERMARK_IMAGE_ONLY: "true" # BYTEDESK_WATERMARK_MIN_IMAGE_SIZE: 100 # BYTEDESK_WATERMARK_MAX_IMAGE_SIZE: 5000 # MinIO配置(当使用MinIO时) BYTEDESK_MINIO_ENABLED: "false" BYTEDESK_MINIO_ENDPOINT: http://bytedesk-minio:9000 # Docker内部通信使用服务名 BYTEDESK_MINIO_ACCESS_KEY: minioadmin BYTEDESK_MINIO_SECRET_KEY: minioadmin123 BYTEDESK_MINIO_BUCKET_NAME: bytedesk BYTEDESK_MINIO_REGION: us-east-1 BYTEDESK_MINIO_SECURE: false # Knowledge base config # BYTEDESK_KBASE_THEME: default # # legacy keys (helpcenter defaults) # BYTEDESK_KBASE_HTML_PATH: /app/helpcenter # # 知识库的访问地址,请修改为服务器实际的地址 # BYTEDESK_KBASE_API_URL: http://127.0.0.1:9003 # split config: helpcenter/blog BYTEDESK_KBASE_HELPCENTER_THEME: default BYTEDESK_KBASE_HTML_PATH: /app/helpcenter BYTEDESK_KBASE_HELPCENTER_API_URL: http://127.0.0.1:9003 BYTEDESK_KBASE_BLOG_THEME: default BYTEDESK_KBASE_BLOG_HTML_PATH: /app/blog BYTEDESK_KBASE_BLOG_API_URL: http://127.0.0.1:9003 # Socket config BYTEDESK_SOCKET_HOST: 0.0.0.0 BYTEDESK_SOCKET_WEBSOCKET_PORT: 9885 BYTEDESK_SOCKET_LEAK_DETECTOR_LEVEL: SIMPLE BYTEDESK_SOCKET_PARENT_EVENT_LOOP_GROUP_THREAD_COUNT: 1 BYTEDESK_SOCKET_CHILD_EVENT_LOOP_GROUP_THREAD_COUNT: 8 BYTEDESK_SOCKET_MAX_PAYLOAD_SIZE: 10240 # Call FreeSwitch config BYTEDESK_CALL_FREESWITCH_ENABLED: "false" BYTEDESK_CALL_FREESWITCH_SERVER: 127.0.0.1 BYTEDESK_CALL_FREESWITCH_ESL_PORT: 8021 BYTEDESK_CALL_FREESWITCH_ESL_PASSWORD: password BYTEDESK_CALL_FREESWITCH_SIP_PORT: 5060 BYTEDESK_CALL_FREESWITCH_WEBRTC_PORT: 7443 BYTEDESK_CALL_FREESWITCH_WS_PORT: 5066 BYTEDESK_CALL_FREESWITCH_CALL_TIMEOUT: 120 # AI 会话并发守护(每个组织最大并发 AI 语音会话数,超限返回忙线) BYTEDESK_CALL_AI_SESSION_MAX_CONCURRENCY_PER_ORG: 10 # 僵死会话 TTL(分钟),超时未释放的会话会被定时清理 BYTEDESK_CALL_AI_SESSION_STALE_TTL_MINUTES: 30 # 僵死会话清理间隔(毫秒) BYTEDESK_CALL_AI_SESSION_SWEEP_INTERVAL_MS: 60000 # 分机导入来源:esl 或 directory。默认优先通过 ESL list_users 读取 FreeSWITCH 目录分机。 BYTEDESK_CALL_FREESWITCH_EXTENSION_IMPORT_SOURCE: esl # 当 ESL list_users 不可用或返回空时,是否回退扫描应用容器内挂载的 FreeSWITCH conf/directory。 BYTEDESK_CALL_FREESWITCH_EXTENSION_IMPORT_DIRECTORY_FALLBACK_ENABLED: "false" # AI hotline 动态入口路由同步:为已发布的 AI 分机自动创建/回填 CallRoute。 BYTEDESK_CALL_AI_HOTLINE_ROUTE_SYNC_ENABLED: "true" # 调试开关:开启后仅记录将要同步的路由,不真正写入数据库。 BYTEDESK_CALL_AI_HOTLINE_ROUTE_SYNC_DRY_RUN: "false" # xml_curl 功能开关:dialplan/directory/configuration/phrases 后备处理 BYTEDESK_CALL_FREESWITCH_XMLCURL_DIALPLAN_ENABLED: "true" BYTEDESK_CALL_FREESWITCH_XMLCURL_DIRECTORY_ENABLED: "false" BYTEDESK_CALL_FREESWITCH_XMLCURL_CONFIGURATION_ENABLED: "false" BYTEDESK_CALL_FREESWITCH_XMLCURL_PHRASES_ENABLED: "false" # xml_curl directory 用户列表:user1@domain:password,... BYTEDESK_CALL_FREESWITCH_XMLCURL_DIRECTORY_USERS: "1000@default:1234" # xml_curl configuration 白名单,逗号分隔(支持 100-200 范围写法) BYTEDESK_CALL_FREESWITCH_XMLCURL_CONFIG_WHITELIST: # 目录回退时扫描的 FreeSWITCH conf 根目录;需与下方 volumes 中的宿主机挂载保持一致。 BYTEDESK_CALL_FREESWITCH_CONF_DIR: /app/freeswitch/conf BYTEDESK_CALL_MRCP_ENABLED: "false" BYTEDESK_CALL_MRCP_PROFILE: java-mrcp BYTEDESK_CALL_MRCP_HOST: 0.0.0.0 BYTEDESK_CALL_MRCP_PORT: 1544 BYTEDESK_CALL_MRCP_TTS_PROVIDER: dashscope BYTEDESK_CALL_MRCP_ASR_PROVIDER: dashscope BYTEDESK_CALL_MRCP_ASR_MODE: recording-file BYTEDESK_CALL_MRCP_TTS_VOICE: longanhuan # WebRTC / Janus config BYTEDESK_WEBRTC_JANUS_ENABLED: "true" BYTEDESK_WEBRTC_JANUS_WS_URL: ws://bytedesk-janus:8188/janus BYTEDESK_WEBRTC_JANUS_LOG_ENABLED: "true" BYTEDESK_WEBRTC_JANUS_OPERATION_TIMEOUT_MS: 10000 BYTEDESK_WEBRTC_JANUS_HEALTH_TIMEOUT_MS: 3000 BYTEDESK_WEBRTC_JANUS_ICE_SERVERS_0_URLS: stun:bytedesk-coturn:3478 BYTEDESK_WEBRTC_JANUS_ICE_SERVERS_1_URLS: turn:bytedesk-coturn:3478?transport=udp BYTEDESK_WEBRTC_JANUS_ICE_SERVERS_1_USERNAME: ${COTURN_USER:-bytedesk} BYTEDESK_WEBRTC_JANUS_ICE_SERVERS_1_CREDENTIAL: ${COTURN_PASS:-bytedesk123} BYTEDESK_WEBRTC_JANUS_ADMIN_ENABLED: "true" BYTEDESK_WEBRTC_JANUS_ADMIN_WS_URL: ws://bytedesk-janus:7188/janus BYTEDESK_WEBRTC_JANUS_ADMIN_HTTP_URL: http://bytedesk-janus:8088/janus BYTEDESK_WEBRTC_JANUS_ADMIN_SECRET: ${JANUS_ADMIN_SECRET:-janusoverlord} BYTEDESK_WEBRTC_RECORD_DIR: /app/uploads/webrtc-video-recordings BYTEDESK_WEBRTC_JANUS_VIDEO_ROOM_DEFAULT_PUBLISHERS: 6 BYTEDESK_WEBRTC_JANUS_VIDEO_ROOM_DEFAULT_PERMANENT: "false" BYTEDESK_WEBRTC_JANUS_AUDIO_BRIDGE_DEFAULT_PERMANENT: "false" # 废弃 Cluster config # BYTEDESK_CLUSTER_ENABLED: "false" # Push config # BYTEDESK_PUSH_APNS_BUNDLE_ID: com.kefux.im # BYTEDESK_PUSH_APNS_P12_URL: 123.p12 # BYTEDESK_PUSH_APNS_P12_PASSWORD: 123456 # druid SPRING_DATASOURCE_DRUID_STAT_VIEW_SERVLET_LOGIN_USERNAME: admin@email.com SPRING_DATASOURCE_DRUID_STAT_VIEW_SERVLET_LOGIN_PASSWORD: admin # Actuator security configuration MANAGEMENT_ENDPOINTS_ENABLED_BY_DEFAULT: "false" MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE: '' MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_EXCLUDE: '*' MANAGEMENT_ENDPOINT_HEALTH_ENABLED: "false" MANAGEMENT_ENDPOINT_INFO_ENABLED: "false" MANAGEMENT_SERVER_PORT: -1 MANAGEMENT_ENDPOINTS_WEB_BASE_PATH: '/management' SPRING_SECURITY_BASIC_ENABLED: "true" # Zipkin Tracing Configuration MANAGEMENT_TRACING_ENABLED: "false" MANAGEMENT_ZIPKIN_TRACING_ENABLED: "false" MANAGEMENT_ZIPKIN_TRACING_ENDPOINT: http://127.0.0.1:19411/api/v2/spans MANAGEMENT_TRACING_SAMPLING_PROBABILITY: 0.0 # =============================== # Spring Boot Admin Client (bytedesk-monitor) # Uncomment to register this instance with a monitor server. 取消注释以注册到监控服务端。 # =============================== # SPRING_BOOT_ADMIN_CLIENT_URL: http://bytedesk-monitor:9103 # SPRING_BOOT_ADMIN_CLIENT_USERNAME: admin # SPRING_BOOT_ADMIN_CLIENT_PASSWORD: admin # SPRING_BOOT_ADMIN_CLIENT_INSTANCE_NAME: bytedesk-starter # SPRING_BOOT_ADMIN_CLIENT_INSTANCE_SERVICE_BASE_URL: http://127.0.0.1:9003 # ai config # 默认对话配置 # https://www.weiyuai.cn/docs/zh-CN/docs/provider/model_text SPRING_AI_MODEL_CHAT: zhipuai # 默认向量模型 # https://www.weiyuai.cn/docs/zh-CN/docs/provider/model_embedding SPRING_AI_MODEL_EMBEDDING: zhipuai # 默认视觉模型 # https://www.weiyuai.cn/docs/zh-CN/docs/provider/model_vision SPRING_AI_MODEL_VISION: zhipuai # 默认语音模型 SPRING_AI_MODEL_AUDIO: zhipuai SPRING_AI_MODEL_AUDIO_SPEECH: none SPRING_AI_MODEL_AUDIO_TRANSCRIPTION: none # 默认重排序模型 SPRING_AI_MODEL_RERANK: zhipuai # ollama SPRING_AI_OLLAMA_BASE_URL: http://host.docker.internal:11434 SPRING_AI_OLLAMA_CHAT_ENABLED: "false" SPRING_AI_OLLAMA_CHAT_OPTIONS_MODEL: qwen3:0.6b SPRING_AI_OLLAMA_CHAT_OPTIONS_TEMPERATURE: 0.7 SPRING_AI_OLLAMA_EMBEDDING_ENABLED: "false" # 如果主要处理中文内容,推荐使用BGE模型,在中文语义理解上表现更好 # https://huggingface.co/BAAI/bge-m3: Dimension: 1024, Sequence Length: 8192 SPRING_AI_OLLAMA_EMBEDDING_OPTIONS_MODEL: bge-m3:latest # https://docs.spring.io/spring-ai/reference/api/chat/ollama-chat.html#auto-pulling-models # always/when_missing/never SPRING_AI_OLLAMA_INIT_PULL_MODEL_STRATEGY: when_missing # https://huggingface.co/BAAI/bge-reranker-v2-m3 SPRING_AI_OLLAMA_EMBEDDING_OPTIONS_MODEL_RERANK: bge-reranker-v2-m3:latest # zhipuai # 申请智谱AI API Key:https://www.bigmodel.cn/usercenter/proj-mgmt/apikeys # SPRING_AI_ZHIPUAI_BASE_URL: https://open.bigmodel.cn/api/paas SPRING_AI_ZHIPUAI_API_KEY: 'sk-xxx' SPRING_AI_ZHIPUAI_CHAT_ENABLED: "true" SPRING_AI_ZHIPUAI_CHAT_OPTIONS_MODEL: glm-4.5-flash SPRING_AI_ZHIPUAI_CHAT_OPTIONS_TEMPERATURE: 0.7 SPRING_AI_ZHIPUAI_CHAT_OPTIONS_TOP_P: 0.9 SPRING_AI_ZHIPUAI_CHAT_OPTIONS_MAX_TOKENS: 4096 SPRING_AI_ZHIPUAI_CONNECTION_TIMEOUT: 30 SPRING_AI_ZHIPUAI_READ_TIMEOUT: 10 SPRING_AI_ZHIPUAI_WRITE_TIMEOUT: 10 SPRING_AI_ZHIPUAI_PING_INTERVAL: 10 SPRING_AI_ZHIPUAI_MAX_IDLE_CONNECTIONS: 8 SPRING_AI_ZHIPUAI_KEEP_ALIVE_DURATION: 1 SPRING_AI_ZHIPUAI_EMBEDDING_ENABLED: "true" # SPRING_AI_ZHIPUAI_EMBEDDING_BASE_URL: https://api.bigmodel.cn # SPRING_AI_ZHIPUAI_EMBEDDING_API_KEY: 'sk-xxx' SPRING_AI_ZHIPUAI_EMBEDDING_OPTIONS_MODEL: embedding-2 # SPRING_AI_ZHIPUAI_EMBEDDING_OPTIONS_MODEL: embedding-3 SPRING_AI_ZHIPUAI_EMBEDDING_OPTIONS_DIMENSIONS: 1024 # deepseek # 申请key https://api-docs.deepseek.com/zh-cn/ SPRING_AI_DEEPSEEK_BASE_URL: https://api.deepseek.com SPRING_AI_DEEPSEEK_API_KEY: 'sk-xxx' SPRING_AI_DEEPSEEK_CHAT_ENABLED: "false" # deepseek-reasoner or deepseek-chat SPRING_AI_DEEPSEEK_CHAT_OPTIONS_MODEL: deepseek-chat SPRING_AI_DEEPSEEK_CHAT_OPTIONS_TEMPERATURE: 0.7 SPRING_AI_DEEPSEEK_EMBEDDING_ENABLED: "false" # openai # https://docs.spring.io/spring-ai/reference/api/chat/openai-chat.html SPRING_AI_OPENAI_BASE_URL: https://api.openai.com SPRING_AI_OPENAI_API_KEY: 'sk-xxx' SPRING_AI_OPENAI_CHAT_ENABLED: "false" SPRING_AI_OPENAI_CHAT_OPTIONS_MODEL: gpt-4o # SPRING_AI_OPENAI_CHAT_OPTIONS_MODEL: gpt-4o-mini SPRING_AI_OPENAI_CHAT_OPTIONS_TEMPERATURE: 0.7 SPRING_AI_OPENAI_EMBEDDING_ENABLED: "false" # alibaba # 阿里云百炼大模型获取api key: # https://bailian.console.aliyun.com/?apiKey=1#/api-key # 阿里云百炼大模型模型列表: # https://bailian.console.aliyun.com/?spm=a2c4g.11186623.0.0.11c67980m5X2VR#/model-market SPRING_AI_DASHSCOPE_ENABLED: "false" SPRING_AI_DASHSCOPE_BASE_URL: https://dashscope.aliyuncs.com SPRING_AI_DASHSCOPE_API_KEY: 'sk-xxx' SPRING_AI_DASHSCOPE_CHAT_ENABLED: "false" SPRING_AI_DASHSCOPE_CHAT_OPTIONS_MODEL: qwen-max SPRING_AI_DASHSCOPE_CHAT_OPTIONS_TEMPERATURE: 0.7 SPRING_AI_DASHSCOPE_CHAT_OPTIONS_TOP_P: 3 SPRING_AI_DASHSCOPE_AUDIO_TRANSCRIPTION_ENABLED: "false" SPRING_AI_DASHSCOPE_IMAGE_ENABLED: "false" SPRING_AI_DASHSCOPE_EMBEDDING_ENABLED: "false" SPRING_AI_DASHSCOPE_EMBEDDING_OPTIONS_MODEL: text-embedding-v1 SPRING_AI_DASHSCOPE_AUDIO_SYNTHESIS_ENABLED: "false" # siliconflow # https://siliconflow.com/ # https://docs.spring.io/spring-ai/reference/api/chat/siliconflow-chat.html SPRING_AI_SILICONFLOW_BASE_URL: https://api.siliconflow.cn SPRING_AI_SILICONFLOW_API_KEY: 'sk-xxx' SPRING_AI_SILICONFLOW_CHAT_ENABLED: "false" SPRING_AI_SILICONFLOW_CHAT_OPTIONS_MODEL: Qwen/QwQ-32B SPRING_AI_SILICONFLOW_CHAT_OPTIONS_TEMPERATURE: 0.7 # gitee # https://ai.gitee.com/ # https://ai.gitee.com/docs/best-practice/integration SPRING_AI_GITEE_BASE_URL: https://ai.gitee.com SPRING_AI_GITEE_API_KEY: 'sk-xxx' SPRING_AI_GITEE_CHAT_ENABLED: "false" SPRING_AI_GITEE_CHAT_OPTIONS_MODEL: Qwen/QwQ-32B SPRING_AI_GITEE_CHAT_OPTIONS_TEMPERATURE: 0.7 # tencent # https://console.cloud.tencent.com/hunyuan/start# # https://cloud.tencent.com/document/product/1729/111007 SPRING_AI_TENCENT_BASE_URL: https://api.hunyuan.cloud.tencent.com SPRING_AI_TENCENT_API_KEY: 'sk-xxx' SPRING_AI_TENCENT_CHAT_ENABLED: "false" SPRING_AI_TENCENT_CHAT_OPTIONS_MODEL: hunyuan-t1-latest SPRING_AI_TENCENT_CHAT_OPTIONS_TEMPERATURE: 0.7 # baidu # https://console.bce.baidu.com/iam/#/iam/apikey/list # https://cloud.baidu.com/doc/WENXINWORKSHOP/s/Fm2vrveyu SPRING_AI_BAIDU_BASE_URL: https://qianfan.baidubce.com/v2 # model builder(可用) SPRING_AI_BAIDU_API_KEY: 'bce-v3/xxx' SPRING_AI_BAIDU_CHAT_ENABLED: "false" SPRING_AI_BAIDU_CHAT_OPTIONS_MODEL: ernie-x1-32k-preview SPRING_AI_BAIDU_CHAT_OPTIONS_TEMPERATURE: 0.7 # volcengine 火山引擎 # api key: https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey?apikey=%7B%7D # https://www.volcengine.com/docs/82379/1330626 SPRING_AI_VOLCENGINE_BASE_URL: https://ark.cn-beijing.volces.com/api/v3 SPRING_AI_VOLCENGINE_API_KEY: 'sk-xxx' SPRING_AI_VOLCENGINE_CHAT_ENABLED: "false" SPRING_AI_VOLCENGINE_CHAT_OPTIONS_MODEL: doubao-1-5-pro-32k-250115 SPRING_AI_VOLCENGINE_CHAT_OPTIONS_TEMPERATURE: 0.7 # vector store SPRING_AI_VECTORSTORE_TYPE: elasticsearch # SPRING_AI_VECTORSTORE_TYPE: none # elasticsearch # 浏览器可视化插件管理 es-client: https://gitee.com/q2316367743/es-client # 配置参数 https://docs.spring.io/spring-ai/reference/api/vectordbs/elasticsearch.html#elasticsearchvector-properties SPRING_ELASTICSEARCH_URIS: http://elasticsearch-bytedesk:9200 SPRING_ELASTICSEARCH_USERNAME: elastic SPRING_ELASTICSEARCH_PASSWORD: bytedesk123 SPRING_AI_VECTORSTORE_ELASTICSEARCH_ENABLED: "true" SPRING_AI_VECTORSTORE_ELASTICSEARCH_INITIALIZE_SCHEMA: "true" SPRING_AI_VECTORSTORE_ELASTICSEARCH_INDEX_NAME: bytedesk_vs_index SPRING_AI_VECTORSTORE_ELASTICSEARCH_DIMENSIONS: 1024 # cosine/l2_norm/dot_product SPRING_AI_VECTORSTORE_ELASTICSEARCH_SIMILARITY: cosine # mcp SPRING_AI_MCP_CLIENT_ENABLED: "false" SPRING_AI_MCP_SERVER_ENABLED: "false" SPRING_AI_MCP_SERVER_STDIO: "false" SPRING_AI_MCP_SERVER_TYPE: SYNC # weaviate SPRING_AI_VECTORSTORE_WEAVIATE_ENABLED: "false" # SPRING_MAIN_ALLOW_BEAN_DEFINITION_OVERRIDING: "true" # logging config LOGGING_LEVEL_COM_BYTEDESK_AI: DEBUG LOGGING_LEVEL_COM_BYTEDESK_CORE: DEBUG LOGGING_LEVEL_COM_BYTEDESK_KBASE: DEBUG LOGGING_LEVEL_COM_BYTEDESK_SERVICE: DEBUG LOGGING_LEVEL_COM_BYTEDESK_SOCIAL: DEBUG LOGGING_LEVEL_COM_BYTEDESK_WECHAT: DEBUG LOGGING_LEVEL_COM_BYTEDESK_SHOP: DEBUG LOGGING_LEVEL_COM_BYTEDESK_TEAM: DEBUG LOGGING_LEVEL_COM_BYTEDESK_TICKET: DEBUG LOGGING_LEVEL_COM_BYTEDESK_STARTER: DEBUG # LOGGING_PATTERN_CONSOLE: '[RID:%X{requestId} TRACEID:%X{traceId}] %clr(%d{$${LOG_DATEFORMAT_PATTERN:yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr($${LOG_LEVEL_PATTERN:%5p}) %clr($${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n$${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}' # LOGGING_PATTERN_FILE: '[RID:%X{requestId} TRACEID:%X{traceId}] %clr(%d{$${LOG_DATEFORMAT_PATTERN:yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr($${LOG_LEVEL_PATTERN:%5p}) %clr($${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n$${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}' # LOGGING_FILE_NAME: logs/bytedeskim.log # LOGGING_FILE_MAX_SIZE: 10MB # LOGGING_FILE_MAX_HISTORY: 5 # wechat config WECHAT_PAY_ENABLED: "false" WECHAT_PAY_CERTPATH: '' # 阿里云访问密钥(短信与 OSS 共用),获取 https://ram.console.aliyun.com/profile/access-keys ALIYUN_ACCESS_KEY_ID: ${ALIYUN_ACCESS_KEY_ID:-} ALIYUN_ACCESS_KEY_SECRET: ${ALIYUN_ACCESS_KEY_SECRET:-} # 阿里云短信服务的签名,可以在控制台找到,如是中文,请转为Unicode ALIYUN_SMS_SIGNNAME: ${ALIYUN_SMS_SIGNNAME:-} #阿里云短信服务的模板Code,可以在控制台找到 ALIYUN_SMS_TEMPLATECODE: ${ALIYUN_SMS_TEMPLATECODE:-} # Artemis JMS 配置 SPRING_ARTEMIS_MODE: embedded # SPRING_ARTEMIS_MODE: native SPRING_ARTEMIS_BROKER_URL: tcp://artemis-bytedesk:61616 SPRING_ARTEMIS_USER: admin SPRING_ARTEMIS_PASSWORD: admin # SPRING_ARTEMIS_EMBEDDED_QUEUES: DLQ SPRING_JMS_CACHE_ENABLED: "true" # SPRING_JMS_LISTENER_CONCURRENCY: 3 # SPRING_JMS_LISTENER_MAX_CONCURRENCY: 20 # SPRING_JMS_LISTENER_ACKNOWLEDGE_MODE: client # SPRING_JMS_LISTENER_AUTO_STARTUP: "true" # SPRING_JMS_LISTENER_MAX_ATTEMPTS: 5 # SPRING_JMS_LISTENER_INITIAL_INTERVAL: 1000 # SPRING_JMS_LISTENER_MAX_INTERVAL: 10000 # SPRING_JMS_LISTENER_MULTIPLIER: 2.0 # SPRING_JMS_LISTENER_RECEIVE_TIMEOUT: 1000 # SPRING_JMS_LISTENER_MISSING_QUEUES_FATAL: "false" # springdoc SPRINGDOC_SHOW_ACTUATOR: "false" # swagger-ui # http://服务器ip:9003/swagger-ui/index.html SPRINGDOC_SWAGGER_UI_ENABLED: "false" SPRINGDOC_SWAGGER_UI_PATH: /index.html # api-docs SPRINGDOC_API_DOCS_ENABLED: "false" SPRINGDOC_API_DOCS_PATH: /v3/api-docs # 百度翻译 https://fanyi-api.baidu.com/doc/21 BYTEDESK_TRANSLATE_BAIDU_APPID: placeholder BYTEDESK_TRANSLATE_BAIDU_KEY: placeholder ports: - 9003:9003 - 9885:9885 volumes: - upload_data:/app/uploads - helpcenter_data:/app/helpcenter - blog_data:/app/blog - ../freeswitch/conf:/app/freeswitch/conf:ro networks: - bytedesk-network volumes: mysql_data: name: bytedesk_mysql_data redis_data: name: bytedesk_redis_data elasticsearch_data: name: bytedesk_elasticsearch_data upload_data: name: bytedesk_upload_data helpcenter_data: name: bytedesk_helpcenter_data blog_data: name: bytedesk_blog_data artemis_data: name: bytedesk_artemis_data minio_data: name: bytedesk_minio_data coturn_data: name: bytedesk_coturn_data freeswitch_data: name: bytedesk_freeswitch_data networks: bytedesk-network: driver: bridge