Files
2026-09-19 16:35:35 +08:00

576 lines
34 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Bytedesk 应用服务(bytedesk 镜像)
# 启动方式:./start.sh all(默认)或 ./start.sh bytedesk ...,也可单独(在 deploy/docker 目录):docker compose --env-file .env -f compose/compose-bytedesk.yaml up -d
# 说明:
# - 数据库/MQ 连接参数默认为 mysql + artemis;使用其他组合时由 start.sh 按关键字自动注入
# (写入 .env.app),或在 .env / 环境变量中显式配置 SPRING_DATASOURCE_* / BYTEDESK_MQ_TYPE 等
# - 本文件不声明对中间件的 depends_on,启动顺序由 start.sh 保证(先中间件后应用)
services:
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
restart: unless-stopped
environment:
TZ: Asia/Shanghai
SERVER_PORT: 9003
BYTEDESK_DEBUG: "false"
BYTEDESK_LICENSE_KEY: ${BYTEDESK_LICENSE_KEY:-}
# ===============================
# Database config(默认 MySQL;切换数据库由 start.sh 注入或 .env 显式配置)
# ===============================
SPRING_DATASOURCE_URL: ${SPRING_DATASOURCE_URL:-jdbc:mysql://bytedesk-mysql:${MYSQL_PORT:-3306}/${MYSQL_DATABASE:-bytedesk}?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true}
SPRING_DATASOURCE_USERNAME: ${SPRING_DATASOURCE_USERNAME:-${MYSQL_ROOT_USER:-root}}
SPRING_DATASOURCE_PASSWORD: ${SPRING_DATASOURCE_PASSWORD:-${MYSQL_ROOT_PASSWORD}}
# ===============================
# Message queue config(默认 Artemis;切换 MQ 由 start.sh 注入或 .env 显式配置)
# ===============================
BYTEDESK_MQ_TYPE: ${BYTEDESK_MQ_TYPE:-artemis}
BYTEDESK_MQ_RABBITMQ_ENABLED: ${BYTEDESK_MQ_RABBITMQ_ENABLED:-false}
SPRING_ARTEMIS_MODE: ${SPRING_ARTEMIS_MODE:-embedded}
SPRING_ARTEMIS_BROKER_URL: ${SPRING_ARTEMIS_BROKER_URL:-tcp://bytedesk-artemis:61616}
SPRING_ARTEMIS_USER: ${SPRING_ARTEMIS_USER:-${ARTEMIS_USER}}
SPRING_ARTEMIS_PASSWORD: ${SPRING_ARTEMIS_PASSWORD:-${ARTEMIS_PASSWORD}}
SPRING_JMS_CACHE_ENABLED: ${SPRING_JMS_CACHE_ENABLED:-true}
SPRING_RABBITMQ_HOST: ${SPRING_RABBITMQ_HOST:-bytedesk-rabbitmq}
SPRING_RABBITMQ_PORT: ${SPRING_RABBITMQ_PORT:-5672}
SPRING_RABBITMQ_USERNAME: ${SPRING_RABBITMQ_USERNAME:-${RABBITMQ_DEFAULT_USER}}
SPRING_RABBITMQ_PASSWORD: ${SPRING_RABBITMQ_PASSWORD:-${RABBITMQ_DEFAULT_PASS}}
SPRING_RABBITMQ_VIRTUAL_HOST: ${SPRING_RABBITMQ_VIRTUAL_HOST:-/}
SPRING_RABBITMQ_CONNECTION_TIMEOUT: ${SPRING_RABBITMQ_CONNECTION_TIMEOUT:-5000}
# ===============================
# Custom config
# Enable this first; branding fields below only take effect when custom config is enabled. 启用后,下面的品牌配置才会生效。
# ===============================
BYTEDESK_CUSTOM_ENABLED: "false"
# Leave empty to use the default product name. 留空则使用默认名称。
BYTEDESK_CUSTOM_NAME:
# Leave empty to use the default logo. 留空则使用默认 logo。
BYTEDESK_CUSTOM_LOGO:
# Leave empty to use the default description: Chat As A Service. 留空则使用默认描述。
BYTEDESK_CUSTOM_DESCRIPTION:
# Leave empty to fall back to BYTEDESK_CUSTOM_LOGO. 留空则回退使用 BYTEDESK_CUSTOM_LOGO。
# BYTEDESK_CUSTOM_FAVICON:
BYTEDESK_CUSTOM_SHOW_RIGHT_CORNER_CHAT: "false"
# Floating chat placement: bottom-right / bottom-left. Only applies when the corner chat is enabled. 浮窗位置,仅在启用右下角对话框时生效。
# BYTEDESK_CUSTOM_RIGHT_CORNER_CHAT_PLACEMENT: bottom-left
# 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
# Public MQTT WebSocket URL, typically used behind nginx or another reverse proxy. 外网可访问的 MQTT WebSocket 完整地址。
BYTEDESK_CUSTOM_MQTT_WEBSOCKET_URL: ${BYTEDESK_CUSTOM_MQTT_WEBSOCKET_URL:-}
# Public upload API base URL without the upload path, useful for multi-node or reverse-proxy upload setups. 外网上传 API 基础地址,不带上传路径。
# BYTEDESK_CUSTOM_UPLOAD_API_URL: https://upload.example.com
# Public visitor ticket HTML base URL without trailing slash, used in ticket notification emails. 访客工单页面基础地址,不带末尾斜杠。
# BYTEDESK_CUSTOM_TICKET_HTML_URL: https://support.example.com/ticket
# Default WeChat Mini Program goods detail route. 微信小程序商品详情默认跳转路径。
BYTEDESK_CUSTOM_WECHAT_MINI_PROGRAM_GOODS_DETAIL_PATH: /pages/goods/detail/index
# Default WeChat Mini Program order detail route. 微信小程序订单详情默认跳转路径。
BYTEDESK_CUSTOM_WECHAT_MINI_PROGRAM_ORDER_DETAIL_PATH: /pages/order/detail/index
BYTEDESK_CUSTOM_LOGIN_USERNAME_ENABLE: "true"
BYTEDESK_CUSTOM_LOGIN_2FA_ENABLE: "false"
BYTEDESK_CUSTOM_LOGIN_MAX_RETRY_COUNT: 3
# Lock duration in minutes after reaching max retry count; set to 0 to disable locking. Must match custom.loginMaxRetryLockTime binding. 超过最大重试次数后的锁定时长,需与 loginMaxRetryLockTime 字段绑定一致。
BYTEDESK_CUSTOM_LOGIN_MAX_RETRY_LOCK_TIME: 10
BYTEDESK_CUSTOM_LOGIN_MOBILE_ENABLE: "true"
BYTEDESK_CUSTOM_LOGIN_SCAN_ENABLE: "true"
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"
# Login page language: zh-CN / en-US / zh-TW. 登录页语言。
BYTEDESK_CUSTOM_LANG: zh-CN
# Custom default LLM prompt; leave empty to fall back to the built-in RobotConsts default. 自定义默认 LLM Prompt,留空时回退到内置默认值。
BYTEDESK_CUSTOM_DEFAULT_LLM_PROMPT:
# Show register button on login page; display-only toggle, does not block the register API. 是否显示登录页注册按钮,仅控制显隐。
BYTEDESK_CUSTOM_SHOW_REGISTER_BUTTON: "false"
# Auto-register users when they log in with mobile/email and no account exists yet. 手机号或邮箱登录时若用户不存在则自动注册。
BYTEDESK_CUSTOM_AUTO_REGISTER_ON_LOGIN: "true"
BYTEDESK_CUSTOM_FORCE_VALIDATE_MOBILE: "true"
BYTEDESK_CUSTOM_FORCE_VALIDATE_EMAIL: "true"
# Force visitor authentication; default is false. 是否强制访客身份认证,默认 false。
# BYTEDESK_CUSTOM_FORCE_VISITOR_AUTH: "false"
# ===============================
# Admin config
# ===============================
BYTEDESK_ADMIN_EMAIL: admin@email.com
BYTEDESK_ADMIN_PASSWORD: ${BYTEDESK_ADMIN_PASSWORD}
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
# Verification code used for whitelisted mobile numbers/emails; non-whitelisted accounts get a random 6-digit code. 白名单使用固定验证码,其他账号使用随机 6 位验证码。
BYTEDESK_ADMIN_VALIDATE_CODE: ${BYTEDESK_ADMIN_VALIDATE_CODE}
# ===============================
# Member config
# ===============================
BYTEDESK_MEMBER_PASSWORD: ${BYTEDESK_MEMBER_PASSWORD}
# ===============================
# Performance Testing config
# 生产/客户部署必须保持 falsetesting.enabled + disable-captcha 同为 true 时后端会跳过验证码校验(登录页输错验证码也能通过)
# 仅在使用 jmeter 压测时可临时改为 true
# ===============================
BYTEDESK_TESTING_ENABLED: "false"
BYTEDESK_TESTING_DISABLE_CAPTCHA: "false"
BYTEDESK_TESTING_DISABLE_IP_FILTER: "false"
# IP whitelist for performance testing, comma-separated. 性能测试白名单 IP,逗号分隔。
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
# ===============================
# service config
# ===============================
BYTEDESK_SERVICE_AGENT_SEAT_ENABLED: "false"
# ===============================
# IP location config
# Put classpath database files under starter/src/main/resources/ipdb/. classpath 文件建议放在 starter/src/main/resources/ipdb/。
# When fallback=true, the app automatically switches to another available provider if the default one is unavailable. fallback=true 时会自动回退到其他可用 provider。
# ===============================
BYTEDESK_IP_PROVIDER: ip2region
BYTEDESK_IP_FALLBACK_ENABLED: "true"
BYTEDESK_IP_IP2REGION_DB_FILE: ipdb/ip2region.xdb
BYTEDESK_IP_MAXMIND_CITY_DB_FILE: ipdb/GeoLite2-City.mmdb
BYTEDESK_IP_MAXMIND_LOCALES: zh-CN,en
# ===============================
# Features / JWT / Cache / Redis
# ===============================
BYTEDESK_FEATURES_JAVA_AI: "true"
BYTEDESK_FEATURES_EMAIL_TYPE: javamail
# Base URL for avatar access; change this to a publicly reachable address in real deployments. 头像访问基础地址,请改成对外可访问地址。
BYTEDESK_FEATURES_AVATAR_BASE_URL: ${BYTEDESK_FEATURES_AVATAR_BASE_URL:-http://127.0.0.1:9003}
BYTEDESK_JWT_SECRET_KEY: ${BYTEDESK_JWT_SECRET_KEY}
# 30 days in milliseconds. 30 天,单位毫秒。
BYTEDESK_JWT_EXPIRATION: 2592000000
# 60 days in milliseconds. 60 天,单位毫秒。
BYTEDESK_JWT_REFRESH_TOKEN_EXPIRATION: 5184000000
SPRING_JPA_HIBERNATE_DDL_AUTO: update
# Can be turned off during initial installation; recommended to turn on during upgrades to automatically run database migration scripts. 默认初始安装时可关闭,升级时建议开启以自动执行数据库迁移脚本。
# SPRING_LIQUIBASE_ENABLED: "true"
# SPRING_LIQUIBASE_CHANGE_LOG: classpath:db/changelog/master.xml
#
SPRING_DATA_REDIS_DATABASE: 0
SPRING_DATA_REDIS_HOST: redis-bytedesk
SPRING_DATA_REDIS_PORT: 6379
SPRING_DATA_REDIS_PASSWORD: ${REDIS_PASSWORD}
SPRING_DATA_REDIS_TIMEOUT: 10000
SPRING_DATA_REDIS_REPOSITORIES_ENABLED: "false"
#
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:"
#
BYTEDESK_AI_ASR_TTSASR_ENABLED: "true"
BYTEDESK_AI_ASR_TTSASR_BASE_URL: http://ttsasr-bytedesk:8000
BYTEDESK_AI_ASR_TTSASR_MODEL: funasr
BYTEDESK_AI_ASR_TTSASR_LANGUAGE: auto
# ===============================
# Upload config
# Final file URL = BYTEDESK_UPLOAD_URL + '/' + last segment of BYTEDESK_UPLOAD_DIR + generated relative path. 完整文件访问地址由上传 URL、目录最后一级和系统生成路径组成。
# ===============================
BYTEDESK_UPLOAD_TYPE: local
BYTEDESK_UPLOAD_DIR: /app/uploads
BYTEDESK_UPLOAD_URL: ${BYTEDESK_UPLOAD_URL:-http://127.0.0.1:9003}
# Maximum file size in bytes; default is 10MB. 最大文件大小,单位字节。
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"
# ===============================
# MinIO object storage config
# Keep this disabled when using local storage only. 仅使用本地存储时保持关闭。
# 需先启动 MinIO./start.sh all minio,再在 .env 中设置 BYTEDESK_MINIO_ENABLED=true
# ===============================
BYTEDESK_MINIO_ENABLED: ${BYTEDESK_MINIO_ENABLED:-false}
BYTEDESK_MINIO_ENDPOINT: ${BYTEDESK_MINIO_ENDPOINT:-http://bytedesk-minio:9000}
BYTEDESK_MINIO_ACCESS_KEY: ${MINIO_ROOT_USER}
BYTEDESK_MINIO_SECRET_KEY: ${MINIO_ROOT_PASSWORD}
BYTEDESK_MINIO_BUCKET_NAME: ${BYTEDESK_MINIO_BUCKET_NAME:-bytedesk}
BYTEDESK_MINIO_REGION: us-east-1
BYTEDESK_MINIO_SECURE: false
# ===============================
# File preview configOffice 转 PDF,企业版功能,社区版镜像不含此功能)
# 官方镜像已精简(不含 LibreOffice)。Docker 部署开启预览:./start.sh gotenberg 启动转换 sidecar
# 并在 .env 设置 BYTEDESK_PREVIEW_CONVERT_ENABLED=true + BYTEDESK_PREVIEW_CONVERT_MODE=remote
# 自建全量镜像(INSTALL_LIBREOFFICE=true)保持 MODE=local 即可;直跑 jar 在宿主机安装 LibreOfficedocs: development/filepreview
# ===============================
# 是否启用 Office 转 PDF 预览(默认关闭,未启用时前端降级提示下载)
BYTEDESK_PREVIEW_CONVERT_ENABLED: ${BYTEDESK_PREVIEW_CONVERT_ENABLED:-false}
# 转换模式:local(默认,镜像内/宿主机 LibreOffice/ remotegotenberg sidecar,精简镜像推荐)
BYTEDESK_PREVIEW_CONVERT_MODE: ${BYTEDESK_PREVIEW_CONVERT_MODE:-local}
# remote 模式:gotenberg 服务地址(仅 MODE=remote 时生效,compose 内网默认 http://bytedesk-gotenberg:3000
BYTEDESK_PREVIEW_CONVERT_REMOTE_URL: ${BYTEDESK_PREVIEW_CONVERT_REMOTE_URL:-http://bytedesk-gotenberg:3000}
# remote 模式:单次转换 HTTP 超时(毫秒),默认对齐 task-execution-timeout 3 分钟
BYTEDESK_PREVIEW_CONVERT_REMOTE_TIMEOUT: "180000"
# LibreOffice 安装目录,容器内留空自动探测(仅 local 模式)
# BYTEDESK_PREVIEW_CONVERT_OFFICE_HOME: /usr/lib/libreoffice
# LibreOffice 进程端口,多个逗号分隔(仅 local 模式)
BYTEDESK_PREVIEW_CONVERT_PORTS: "2001"
# 单次转换任务超时(毫秒),默认 3 分钟(仅 local 模式)
BYTEDESK_PREVIEW_CONVERT_TASK_EXECUTION_TIMEOUT: "180000"
# LibreOffice 进程存活超时(毫秒),默认 5 分钟(仅 local 模式)
BYTEDESK_PREVIEW_CONVERT_PROCESS_TIMEOUT: "300000"
# 每个 LibreOffice 进程最大任务数,超过后重启进程(仅 local 模式)
BYTEDESK_PREVIEW_CONVERT_MAX_TASKS_PER_PROCESS: "20"
# 待转换文件大小上限(MB),超过则拒绝转换
BYTEDESK_PREVIEW_CONVERT_MAX_FILE_SIZE_MB: "100"
# 是否允许从对象存储 URL(MinIO 公读直链)下载源文件用于转换,默认 true
BYTEDESK_PREVIEW_CONVERT_REMOTE_SOURCE_ENABLED: "true"
# 远程源文件主机白名单(host 或 host:port,多个逗号分隔),默认仅允许 MinIO endpoint;如需转换 OSS/COS 直链可在此追加
# BYTEDESK_PREVIEW_CONVERT_ALLOWED_REMOTE_HOSTS: oss.example.com,cos.example.com
# ===============================
# Knowledge base config
# Helpcenter and blog can be configured independently with their own theme, static output path, and public API URL. helpcenter 和 blog 可分别配置主题、目录和 API 地址。
# ===============================
BYTEDESK_KBASE_HELPCENTER_THEME: default
BYTEDESK_KBASE_HTML_PATH: /app/helpcenter
BYTEDESK_KBASE_HELPCENTER_API_URL: ${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: ${BYTEDESK_KBASE_BLOG_API_URL:-http://127.0.0.1:9003}
# ===============================
# Socket config
# WebSocket service for realtime messaging. 实时消息 WebSocket 服务配置。
# ===============================
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
# Only required when voice/call integration is enabled. 仅在启用语音/呼叫集成时需要配置。
# ===============================
BYTEDESK_CALL_FREESWITCH_ENABLED: "false"
BYTEDESK_CALL_FREESWITCH_SERVER: 127.0.0.1
BYTEDESK_CALL_FREESWITCH_ESL_PORT: 8021
BYTEDESK_CALL_FREESWITCH_ESL_PASSWORD: ${FREESWITCH_ESL_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
BYTEDESK_CALL_FREESWITCH_DOMAIN: example.com
# 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
# Use service names on the Docker network instead of 127.0.0.1. 容器内请使用 Docker 网络服务名,而不是 127.0.0.1。
# Typically enabled with: ./start.sh webrtc ...coturn + janus
# ===============================
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}
# Optional TLS/TCP TURN relay. 可选的 TLS/TCP TURN 中继。
# BYTEDESK_WEBRTC_JANUS_ICE_SERVERS_2_URLS: turn:bytedesk-coturn:5349?transport=tcp
# BYTEDESK_WEBRTC_JANUS_ICE_SERVERS_2_USERNAME: ${COTURN_USER:-bytedesk}
# BYTEDESK_WEBRTC_JANUS_ICE_SERVERS_2_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"
# ===============================
# Management endpoints
# Current settings disable actuator web exposure by default and keep only the business port active. 当前配置默认关闭 actuator Web 暴露,仅保留业务端口。
# ===============================
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"
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
# OpenTelemetry / OTLP 默认关闭:starter-opentelemetry 附带的 OtlpMeterRegistry 默认向
# http://localhost:4318/v1/metrics 推指标,未部署 OTLP 后端时会刷连接拒绝告警;
# 需要时设为 "true" 开启(OTel 模式还需 SPRING_AUTOCONFIGURE_EXCLUDE 排除 Brave,见 docs
MANAGEMENT_OPENTELEMETRY_ENABLED: "false"
MANAGEMENT_OTLP_METRICS_EXPORT_ENABLED: "false"
# ===============================
# 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 provider and model selection
# Select default providers first, then configure API keys and model options for the providers you actually use. 先选择默认 provider,再为实际使用的 provider 配置密钥和模型参数。
# ===============================
SPRING_AI_MODEL_CHAT: none
SPRING_AI_MODEL_EMBEDDING: none
SPRING_AI_MODEL_VISION: none
SPRING_AI_MODEL_AUDIO: none
SPRING_AI_MODEL_AUDIO_SPEECH: none
SPRING_AI_MODEL_AUDIO_TRANSCRIPTION: none
SPRING_AI_MODEL_RERANK: none
#
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"
SPRING_AI_OLLAMA_EMBEDDING_OPTIONS_MODEL: bge-m3:latest
SPRING_AI_OLLAMA_INIT_PULL_MODEL_STRATEGY: when_missing
SPRING_AI_OLLAMA_EMBEDDING_OPTIONS_MODEL_RERANK: bge-reranker-v2-m3:latest
#
SPRING_AI_ZHIPUAI_API_KEY: ${SPRING_AI_ZHIPUAI_API_KEY:-}
SPRING_AI_ZHIPUAI_CHAT_ENABLED: "false"
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: "false"
SPRING_AI_ZHIPUAI_EMBEDDING_OPTIONS_MODEL: embedding-2
SPRING_AI_ZHIPUAI_EMBEDDING_OPTIONS_DIMENSIONS: 1024
#
SPRING_AI_DEEPSEEK_BASE_URL: https://api.deepseek.com
SPRING_AI_DEEPSEEK_API_KEY: ${SPRING_AI_DEEPSEEK_API_KEY:-}
SPRING_AI_DEEPSEEK_CHAT_ENABLED: "false"
SPRING_AI_DEEPSEEK_CHAT_OPTIONS_MODEL: deepseek-chat
SPRING_AI_DEEPSEEK_CHAT_OPTIONS_TEMPERATURE: 0.7
SPRING_AI_DEEPSEEK_EMBEDDING_ENABLED: "false"
#
SPRING_AI_OPENAI_BASE_URL: https://api.openai.com
SPRING_AI_OPENAI_API_KEY: ${SPRING_AI_OPENAI_API_KEY:-}
SPRING_AI_OPENAI_CHAT_ENABLED: "false"
SPRING_AI_OPENAI_CHAT_OPTIONS_MODEL: gpt-4o
SPRING_AI_OPENAI_CHAT_OPTIONS_TEMPERATURE: 0.7
SPRING_AI_OPENAI_EMBEDDING_ENABLED: "false"
#
SPRING_AI_DASHSCOPE_ENABLED: "false"
SPRING_AI_DASHSCOPE_BASE_URL: https://dashscope.aliyuncs.com
SPRING_AI_DASHSCOPE_API_KEY: ${SPRING_AI_DASHSCOPE_API_KEY:-}
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
# Optional dedicated API key for TTS; falls back to SPRING_AI_DASHSCOPE_API_KEY when empty. 可选语音合成专用 Key,留空时回退到通用 DashScope Key。
SPRING_AI_DASHSCOPE_AUDIO_SYNTHESIS_API_KEY: ${SPRING_AI_DASHSCOPE_AUDIO_SYNTHESIS_API_KEY:-}
SPRING_AI_DASHSCOPE_AUDIO_SYNTHESIS_OPTIONS_MODEL: cosyvoice-v3-flash
SPRING_AI_DASHSCOPE_AUDIO_SYNTHESIS_OPTIONS_VOICE: longanhuan
SPRING_AI_DASHSCOPE_AUDIO_TRANSCRIPTION_API_KEY: ${SPRING_AI_DASHSCOPE_AUDIO_TRANSCRIPTION_API_KEY:-}
SPRING_AI_DASHSCOPE_AUDIO_TRANSCRIPTION_ENABLED: "false"
SPRING_AI_DASHSCOPE_AUDIO_TRANSCRIPTION_OPTIONS_MODEL: qwen3-asr-flash
SPRING_AI_DASHSCOPE_AUDIO_TRANSCRIPTION_REALTIME_MODEL: fun-asr-realtime
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"
# ===============================
# Bytedesk AI defaults
# Shared application defaults consumed by execution endpoints and admin forms. 执行接口与管理台表单共享的应用默认值。
# ===============================
BYTEDESK_AI_TTS_LANGUAGE: zh-CN
BYTEDESK_AI_TTS_AUDIO_FORMAT: mp3
# TTS Realtime WebSocketQwen-Audio Realtime 中继地址)
BYTEDESK_AI_TTS_REALTIME_WS_URL: ${BYTEDESK_AI_TTS_REALTIME_WS_URL:-wss://dashscope.aliyuncs.com/api-ws/v1/realtime}
# ASR Realtime WebSocket(实时语音识别中继上游地址,浏览器经应用中转连接)
BYTEDESK_AI_ASR_REALTIME_WS_URL: ${BYTEDESK_AI_ASR_REALTIME_WS_URL:-wss://dashscope.aliyuncs.com/api-ws/v1/inference}
BYTEDESK_AI_ASR_SOURCE_FORMAT: mp3
BYTEDESK_AI_ASR_TIMEOUT_MS: 180000
BYTEDESK_AI_ASR_POLL_INTERVAL_MS: 1500
# ===============================
# SearXNG web search / SearXNG 联网搜索(企业版高级功能,可选)
# 应用侧代码位于 enterprise/ai 模块,社区版镜像不含此功能
# 需先启动 SearXNG./start.sh all searxng
# 测试接口: /spring/ai/api/v1/searxng/*bytedesk.debug=true 时可用)
# ===============================
BYTEDESK_AI_SEARXNG_ENABLED: ${BYTEDESK_AI_SEARXNG_ENABLED:-false}
BYTEDESK_AI_SEARXNG_BASE_URL: ${BYTEDESK_AI_SEARXNG_BASE_URL:-http://searxng-bytedesk:8080}
BYTEDESK_AI_SEARXNG_TIMEOUT_MS: ${BYTEDESK_AI_SEARXNG_TIMEOUT_MS:-10000}
BYTEDESK_AI_SEARXNG_MAX_RESULTS: ${BYTEDESK_AI_SEARXNG_MAX_RESULTS:-5}
# ===============================
# Neo4j knowledge graph / Neo4j 知识图谱(企业版高级功能,可选)
# 应用侧代码位于 enterprise/ai 模块,社区版镜像不含此功能
# 需先启动 Neo4j./start.sh all neo4j
# 测试接口: /spring/ai/api/v1/neo4j/*bytedesk.debug=true 时可用)
# ===============================
BYTEDESK_AI_NEO4J_ENABLED: ${BYTEDESK_AI_NEO4J_ENABLED:-false}
BYTEDESK_AI_NEO4J_URI: ${BYTEDESK_AI_NEO4J_URI:-bolt://neo4j-bytedesk:7687}
BYTEDESK_AI_NEO4J_USERNAME: ${BYTEDESK_AI_NEO4J_USERNAME:-neo4j}
BYTEDESK_AI_NEO4J_PASSWORD: ${BYTEDESK_AI_NEO4J_PASSWORD:-bytedesk-neo4j}
BYTEDESK_AI_NEO4J_DATABASE: ${BYTEDESK_AI_NEO4J_DATABASE:-neo4j}
#
SPRING_AI_SILICONFLOW_BASE_URL: https://api.siliconflow.cn
SPRING_AI_SILICONFLOW_API_KEY: ${SPRING_AI_SILICONFLOW_API_KEY:-}
SPRING_AI_SILICONFLOW_CHAT_ENABLED: "false"
SPRING_AI_SILICONFLOW_CHAT_OPTIONS_MODEL: Qwen/QwQ-32B
SPRING_AI_SILICONFLOW_CHAT_OPTIONS_TEMPERATURE: 0.7
#
SPRING_AI_GITEE_BASE_URL: https://ai.gitee.com
SPRING_AI_GITEE_API_KEY: ${SPRING_AI_GITEE_API_KEY:-}
SPRING_AI_GITEE_CHAT_ENABLED: "false"
SPRING_AI_GITEE_CHAT_OPTIONS_MODEL: Qwen/QwQ-32B
SPRING_AI_GITEE_CHAT_OPTIONS_TEMPERATURE: 0.7
#
SPRING_AI_TENCENT_BASE_URL: https://hunyuan.cloud.tencent.com
SPRING_AI_TENCENT_API_KEY: ${SPRING_AI_TENCENT_API_KEY:-}
SPRING_AI_TENCENT_CHAT_ENABLED: "false"
SPRING_AI_TENCENT_CHAT_OPTIONS_MODEL: hunyuan-t1-latest
SPRING_AI_TENCENT_CHAT_OPTIONS_TEMPERATURE: 0.7
#
SPRING_AI_BAIDU_BASE_URL: https://qianfan.baidubce.com/v2
SPRING_AI_BAIDU_API_KEY: ${SPRING_AI_BAIDU_API_KEY:-}
SPRING_AI_BAIDU_CHAT_ENABLED: "false"
SPRING_AI_BAIDU_CHAT_OPTIONS_MODEL: ernie-x1-32k-preview
SPRING_AI_BAIDU_CHAT_OPTIONS_TEMPERATURE: 0.7
#
SPRING_AI_VOLCENGINE_BASE_URL: https://ark.cn-beijing.volces.com/api/v3
SPRING_AI_VOLCENGINE_API_KEY: ${SPRING_AI_VOLCENGINE_API_KEY:-}
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 / MCP / logging
# Search/vector storage, MCP switches, and module-level log verbosity. 检索向量存储、MCP 开关以及模块日志级别。
# ===============================
SPRING_AI_VECTORSTORE_TYPE: elasticsearch
#
SPRING_ELASTICSEARCH_URIS: http://elasticsearch-bytedesk:9200
SPRING_ELASTICSEARCH_USERNAME: elastic
SPRING_ELASTICSEARCH_PASSWORD: ${ELASTIC_PASSWORD}
#
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
SPRING_AI_VECTORSTORE_ELASTICSEARCH_SIMILARITY: cosine
#
SPRING_AI_MCP_CLIENT_ENABLED: "false"
SPRING_AI_MCP_SERVER_ENABLED: "false"
SPRING_AI_MCP_SERVER_STDIO: "false"
SPRING_AI_MCP_SERVER_TYPE: SYNC
SPRING_AI_VECTORSTORE_WEAVIATE_ENABLED: "false"
#
LOGGING_LEVEL_COM_BYTEDESK_AI: WARN
LOGGING_LEVEL_COM_BYTEDESK_CORE: WARN
LOGGING_LEVEL_COM_BYTEDESK_KBASE: WARN
LOGGING_LEVEL_COM_BYTEDESK_SERVICE: WARN
LOGGING_LEVEL_COM_BYTEDESK_SOCIAL: WARN
LOGGING_LEVEL_COM_BYTEDESK_WECHAT: WARN
LOGGING_LEVEL_COM_BYTEDESK_SHOP: WARN
LOGGING_LEVEL_COM_BYTEDESK_TEAM: WARN
LOGGING_LEVEL_COM_BYTEDESK_TICKET: WARN
LOGGING_LEVEL_COM_BYTEDESK_STARTER: WARN
LOGGING_FILE_NAME: /app/logs/bytedeskim.log
LOGGING_PATTERN_FILE: '[RID:%X{requestId} TRACEID:%X{traceId}] %d{yyyy-MM-dd HH:mm:ss.SSS} %5p --- [%15.15t] %-40.40logger{39} : %m%n%wEx'
#
WECHAT_PAY_ENABLED: "false"
WECHAT_PAY_CERTPATH: ''
# Aliyun AccessKey / 阿里云访问密钥(短信与 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:-}
# Aliyun SMS sign/template / 阿里云短信签名与模板Code,在 .env 中配置
ALIYUN_SMS_SIGNNAME: ${ALIYUN_SMS_SIGNNAME:-}
ALIYUN_SMS_TEMPLATECODE: ${ALIYUN_SMS_TEMPLATECODE:-}
ALIYUN_SMS_DOMAIN: dysmsapi.aliyuncs.com
ALIYUN_SMS_VERSION: "2017-05-25"
ALIYUN_SMS_ACTION: SendSms
SPRINGDOC_SHOW_ACTUATOR: "false"
SPRINGDOC_SWAGGER_UI_ENABLED: "false"
SPRINGDOC_SWAGGER_UI_PATH: /index.html
SPRINGDOC_API_DOCS_ENABLED: "false"
SPRINGDOC_API_DOCS_PATH: /v3/api-docs
BYTEDESK_TRANSLATE_BAIDU_APPID: ${BYTEDESK_TRANSLATE_BAIDU_APPID:-}
BYTEDESK_TRANSLATE_BAIDU_KEY: ${BYTEDESK_TRANSLATE_BAIDU_KEY:-}
ports:
- 9003:9003
- 9885:9885
volumes:
- upload_data:/app/uploads
- helpcenter_data:/app/helpcenter
- blog_data:/app/blog
- log_data:/app/logs
- ../../freeswitch/conf:/app/freeswitch/conf:ro
networks:
- bytedesk-network
volumes:
upload_data:
name: bytedesk_upload_data
helpcenter_data:
name: bytedesk_helpcenter_data
blog_data:
name: bytedesk_blog_data
# 说明:log_dataapp 写入、logstash 采集共用)由本文件与 compose-logstash.yaml 各自声明(同名 bytedesk_log_data
log_data:
name: bytedesk_log_data
networks:
bytedesk-network:
driver: bridge