# 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 # 生产/客户部署必须保持 false:testing.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 config(Office 转 PDF,企业版功能,社区版镜像不含此功能) # 官方镜像已精简(不含 LibreOffice)。Docker 部署开启预览:./start.sh gotenberg 启动转换 sidecar, # 并在 .env 设置 BYTEDESK_PREVIEW_CONVERT_ENABLED=true + BYTEDESK_PREVIEW_CONVERT_MODE=remote # 自建全量镜像(INSTALL_LIBREOFFICE=true)保持 MODE=local 即可;直跑 jar 在宿主机安装 LibreOffice(docs: development/filepreview) # =============================== # 是否启用 Office 转 PDF 预览(默认关闭,未启用时前端降级提示下载) BYTEDESK_PREVIEW_CONVERT_ENABLED: ${BYTEDESK_PREVIEW_CONVERT_ENABLED:-false} # 转换模式:local(默认,镜像内/宿主机 LibreOffice)/ remote(gotenberg 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 WebSocket(Qwen-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_data(app 写入、logstash 采集共用)由本文件与 compose-logstash.yaml 各自声明(同名 bytedesk_log_data) log_data: name: bytedesk_log_data networks: bytedesk-network: driver: bridge