Chitchatter 配置参数详解
Chitchatter(main 分支 b0114d5)配置参数全解:7 项前端构建变量 + 3 项 RTC API 服务端变量 + Nginx 托管层关键配置,逐项给出默认值、生效方式与实测验证。
Chitchatter 配置参数详解
目标:把 Chitchatter(main 分支 commit b0114d5)全部可配置项讲清楚——构建时环境变量(Vite 注入)、RTC 配置 API 服务端变量、静态托管层(Nginx)关键配置,以及嵌入 SDK 的构建期取值来源;每一项均给出默认值、生效方式与实测验证。已在 Ubuntu 22.04(Node.js v24.16.0)实测通过。
一、环境信息
本文所有命令与回显均在以下实测环境中执行:
- 操作系统:Ubuntu 22.04.5 LTS(x86_64)
- Node.js:v24.16.0(npm 11.13.0)
- Chitchatter:main 分支 commit
b0114d52eb786d240ef3a9d2b3691b215e29dbf0(项目无正式版本号,package.json中version为0.0.0) - 源码路径:
/opt/chitchatter;构建产物部署于/var/www/chitchatter,由 Nginx 1.18.0 托管(HTTPS 443) - RTC 配置 API:
simple-api-server.js(仓库自带),监听127.0.0.1:3003,由 systemd 托管
二、前置条件
阅读本文前需要一份已构建的 Chitchatter 源码树(含 node_modules)。从零完成的完整步骤见本专栏《Ubuntu 22.04 安装 Chitchatter 指南》篇;最低限度地,确认以下两点即可跟随本文操作:
cd /opt/chitchatter && git rev-parse --short HEAD && ls dist/sdk.js
实测回显:
b0114d5
dist/sdk.js
三、参数查看与修改方式
Chitchatter 是纯前端单页应用,没有运行时配置文件:所有前端配置都是「构建时」经 Vite 注入到静态产物里的环境变量,改任何一项都必须重新执行 npm run build 并重新发布 dist/。唯一的例外是随仓库附带的 RTC 配置 API(simple-api-server.js)——它是独立 Node 进程,配置经进程环境变量注入,改完重启进程即可。
三类配置的修改入口:
| 配置类别 | 修改入口 | 生效方式 |
|---|---|---|
前端构建变量(VITE_*) | 构建命令行前置变量,或源码根目录 .env 文件 | 重新 npm run build,重新发布 dist/ |
RTC 配置 API(RTC_CONFIG 等) | 进程环境变量(systemd 单元 Environment=) | 重启 API 进程(systemctl restart) |
| 托管层(Nginx) | /etc/nginx/sites-enabled/chitchatter | nginx -t && systemctl reload nginx |
⚠️ 注意:Vite 会自动读取源码根目录的
.env文件(仓库内附带的.env是官方注释模板,含全部可配项说明)。命令行前置变量(如VITE_ROUTER_TYPE=hash npm run build)优先级高于.env文件。
四、参数总览
全部可配置项一览(来源:源码 src/config/*、sdk/sdk.ts、simple-api-server.js 与仓库 .env 模板,逐项核对):
| 参数 | 作用域 | 默认值 | 说明 |
|---|---|---|---|
VITE_RTC_CONFIG_ENDPOINT | 前端构建 | 未设置(功能隐藏) | RTC 配置拉取端点,控制「增强连接」开关是否出现 |
VITE_ROUTER_TYPE | 前端构建 | browser | 前端路由模式:browser / hash |
VITE_HOMEPAGE | 前端构建 | package.json 的 homepage(https://chitchatter.im/) | 首页地址,同时是 sdk.js 嵌入的默认根地址 |
VITE_GITHUB_REPO | 前端构建 | https://github.com/jeremyckahn/chitchatter | 界面抽屉中仓库/commit 链接 |
VITE_TRACKER_URL | 前端构建 | 未设置(用 Trystero 默认公共 tracker) | 追加一个自建 WebTorrent tracker 地址 |
VITE_STREAMSAVER_URL | 前端构建 | https://jeremyckahn.github.io/StreamSaver.js/mitm.html | 文件下载的 StreamSaver mitm 页面地址 |
VITE_API_BASE_URL | 前端构建(仅开发) | 未设置 | npm run dev 时的 API 基地址,生产构建不使用 |
RTC_CONFIG | API 服务端 | 未设置(回退到内置公共 TURN) | Base64 编码的 RTCConfiguration JSON |
PORT | API 服务端 | 3003 | simple-api-server.js 监听端口(绑定 127.0.0.1) |
CORS_ALLOW_ALL | API 服务端 | 未设置(严格白名单) | 设为 true 时 CORS 放开为 *(仅调试用) |
关键结论:Chitchatter 自身配置面很小(前端 7 项 + API 3 项),其余「配置」都发生在托管层(HTTPS、SPA 回退、CORS 头)与源码常量(tracker 列表、社区房间列表)上。下文分类逐项详解。
五、核心参数分类详解
5.1 前端构建变量(VITE_*)
5.1.1 VITE_RTC_CONFIG_ENDPOINT:增强连接(TURN 下发)开关
这是自托管最重要的一项。Chitchatter 内置一个公共 TURN 服务器兜底(见 5.2),但生产环境应使用自己的 TURN;浏览器端在「设置 → Networking」里打开 Enhanced Connectivity 后,会从该端点拉取 RTC 配置。
源码行为(src/config/enhancedConnectivity.ts):只有设置了该变量,设置页才出现 Networking 区域;不设置则功能彻底隐藏,只用兜底 TURN。
实测:构建时注入后,产物中可检索到端点字符串:
grep -c "api/get-config" /var/www/chitchatter/assets/Bootstrap-*.js | grep -v ":0"
实测回显(本文构建注入了 VITE_RTC_CONFIG_ENDPOINT=/api/get-config):
/var/www/chitchatter/assets/Bootstrap-BuRYNN6P.js:1
/var/www/chitchatter/assets/Bootstrap-JKYa_DP9.js:1
取值可以是同源相对路径(推荐,如 /api/get-config,由 Nginx 反代到 API 进程),也可以是完整的跨域 URL(此时 API 的 CORS 白名单需覆盖你的站点,见 5.2)。
5.1.2 VITE_ROUTER_TYPE:路由模式
browser(默认):BrowserRouter,URL 干净(/public/<房间名>),但要求托管层支持 SPA 回退(见 5.3);房间名会出现在 HTTP 请求路径里,服务器日志可见房间名。hash:HashRouter,房间名放在#之后(/#/public/<房间名>),不随 HTTP 请求发出,服务器看不到房间名;且任何静态文件服务器(对象存储、CDN)都能直接托管,无需回退规则。
非法取值会被忽略并回退 browser(源码 src/config/router.ts 有 console.warn 提示)。
实测构建一个 hash 版(产物发布到另一站点目录对比验证):
cd /opt/chitchatter
VITE_ROUTER_TYPE=hash npm run build
构建产物部署到 8080 端口站点后验证页面可访问:
curl -s http://127.0.0.1:8080/ | grep -o '<title>[^<]*</title>'
实测回显:
<title>Chitchatter</title>
💡 技术拓展:单页应用的路由模式不止这两种名称背后的实现——常见方案对比:
方案 URL 形态 服务器配合 本文场景取舍 History/Browser 路由 /public/room需要 SPA 回退规则 默认,URL 美观 Hash 路由 /#/public/room不需要任何规则 隐私更好(房间名不出现在请求里)、静态托管零配置 Memory 路由 URL 不变 不需要 嵌入/测试场景,Chitchatter 未采用 注重隐私(不让托管服务器看到房间名)或托管到纯静态对象存储时选
hash;本文默认部署用browser。
5.1.3 VITE_HOMEPAGE:首页与 SDK 默认根地址
两个作用:界面内「回首页」链接的目标;sdk.js 嵌入时 <chat-room> 未指定 root-url 属性时的默认站点根地址(源码 sdk/sdk.ts 的 defaultRoot)。
⚠️ 注意(实测踩坑):构建脚本写死了取值来源——
npm run build实际执行cross-env VITE_HOMEPAGE=$(npm pkg get homepage) vite build,即强制取自package.json的homepage字段(默认https://chitchatter.im/),命令行环境变量无法覆盖。因此自托管站点若要让sdk.js默认指向自己,必须修改package.json的homepage后再构建;不改的话,嵌入方必须显式写root-url属性(实测不写的后果见《Chitchatter 嵌入集成使用指南》篇)。
5.1.4 VITE_GITHUB_REPO:仓库链接
界面左侧抽屉底部「GitHub」链接与 commit 链接的拼接前缀(src/components/Shell/Drawer.tsx)。仓库 .env 模板中默认已设置为官方仓库地址;fork 后改成自己的仓库地址即可。
5.1.5 VITE_TRACKER_URL:自建 WebTorrent tracker
向 tracker 列表最前面追加一个自建 tracker 地址(源码 src/config/trackerUrls.ts 的 unshift),其余默认公共 tracker 仍保留为后备。官方注释说明:该变量本意服务 npm run dev 开发;自托管生产实例建议直接改源码里的 trackerUrls 数组常量。
⚠️ 注意:HTTPS 站点里的浏览器拒绝连接明文
ws://tracker(混合内容限制),生产自建 tracker 必须以wss://暴露(可用 Nginx 反代 WebSocket 实现,见《Ubuntu 22.04 安装 Chitchatter 指南》篇自建 tracker 一节)。
默认公共 tracker(Trystero 内置,实测从构建产物中检索):
grep -o "wss://[a-zA-Z0-9./_-]*" /var/www/chitchatter/assets/Bootstrap-*.js | sort -u
实测回显:
/var/www/chitchatter/assets/Bootstrap-BuRYNN6P.js:wss://
/var/www/chitchatter/assets/Bootstrap-BuRYNN6P.js:wss://tracker.btorrent.xyz
/var/www/chitchatter/assets/Bootstrap-BuRYNN6P.js:wss://tracker.openwebtorrent.com
/var/www/chitchatter/assets/Bootstrap-JKYa_DP9.js:wss://
/var/www/chitchatter/assets/Bootstrap-JKYa_DP9.js:wss://tracker.btorrent.xyz
/var/www/chitchatter/assets/Bootstrap-JKYa_DP9.js:wss://tracker.openwebtorrent.com
5.1.6 VITE_STREAMSAVER_URL:文件下载服务
Chitchatter 的 P2P 文件分享经 StreamSaver.js 流式写盘,需要一个 mitm.html 中转页。默认使用作者托管的公共实例;自托管时把 StreamSaver.js 的 mitm.html 放到自己站点并改此变量(源码 src/config/streamSaverUrl.ts)。
5.1.7 VITE_API_BASE_URL:仅开发用
仅 npm run dev 开发模式生效(src/hooks/useTurnConfig.ts 里 import.meta.env.DEV 才读取),把 API 请求指到本地 simple-api-server.js(默认 http://localhost:3003)。生产构建忽略。
5.2 RTC 配置 API 服务端参数(simple-api-server.js)
仓库自带的 simple-api-server.js 是一个约 260 行的零依赖 Node HTTP 服务,只做一件事:GET /api/get-config 返回 RTC 配置(TURN 服务器),让前端「增强连接」功能动态获取 TURN 而不把凭据硬编码进前端产物。
5.2.1 RTC_CONFIG:Base64 编码的 RTCConfiguration
取值为 Base64 编码的 JSON,结构遵循 W3C RTCConfiguration(核心是 iceServers 数组)。生成方式(演示 TURN 账号 admin / 密码 q1w2e3r4,指向本机示例 TURN 地址):
echo '{"iceServers":[{"urls":"stun:stun.l.google.com:19302"},{"urls":"turn:turn.chitchatter.local:3478","username":"admin","credential":"q1w2e3r4"}]}' | base64 -w 0
实测回显:
eyJpY2VTZXJ2ZXJzIjpbeyJ1cmxzIjoic3R1bjpzdHVuLmwuZ29vZ2xlLmNvbToxOTMwMiJ9LHsidXJscyI6InR1cm46dHVybi5jaGl0Y2hhdHRlci5sb2NhbDozNDc4IiwidXNlcm5hbWUiOiJhZG1pbiIsImNyZWRlbnRpYWwiOiJxMXcyZTNyNCJ9XX0=
服务端启动时经环境变量注入(systemd 单元片段):
[Service]
Environment=RTC_CONFIG=eyJpY2VTZXJ2ZXJzIjpbeyJ1cmxzIjoic3R1bjpzdHVuLmwuZ29vZ2xlLmNvbToxOTMwMiJ9LHsidXJscyI6InR1cm46dHVybi5jaGl0Y2hhdHRlci5sb2NhbDozNDc4IiwidXNlcm5hbWUiOiJhZG1pbiIsImNyZWRlbnRpYWwiOiJxMXcyZTNyNCJ9XX0=
ExecStart=/usr/local/bin/node simple-api-server.js
实测验证(经 Nginx 同源反代调用):
curl -sk https://localhost/api/get-config
实测回显:
{"urls":"turn:turn.chitchatter.local:3478","username":"admin","credential":"q1w2e3r4"}
注意返回体只含 TURN 那一项:源码在 iceServers 数组里 find 第一个 turn: 条目返回,STUN 项不下发(浏览器端另有默认处理)。若 RTC_CONFIG 未设置、Base64/JSON 非法或结构不含 TURN,服务端回退到内置公共 TURN 并打印告警日志:
{"urls":["turn:relay1.expressturn.com:3478"],"username":"efQUQ79N77B5BNVVKF","credential":"N4EAUgpjMzPLrxSS"}
(该回退值硬编码在 simple-api-server.js 第 48-52 行,是作者购买的公共 ExpressTURN 实例,有速率限制,生产必须用自己的。)
5.2.2 PORT 与绑定地址
PORT 环境变量控制监听端口,默认 3003;绑定地址写死 127.0.0.1(源码 server.listen(PORT, '127.0.0.1')),即设计上只允许本机反代访问,不直接对公网开放。
5.2.3 CORS_ALLOW_ALL 与来源白名单
默认严格模式:仅白名单内 Origin(https://chitchatter.im、官方 Vercel 预览域、localhost:3000/3001/3003)会被回显到 Access-Control-Allow-Origin,其余一律回落为 https://chitchatter.im。自托管并跨域调用 API 时有两个选择:同源反代(推荐,前端用相对路径 /api/get-config,根本不触发 CORS);或设 CORS_ALLOW_ALL=true 放开为 *(源码明确注释为 DEBUG MODE,不安全,仅限调试)。
端点行为实测矩阵:
curl -sk https://localhost/api/get-config # GET,正常
curl -sk -X POST -o /dev/null -w "%{http_code}\n" https://localhost/api/get-config
curl -sk -o /dev/null -w "%{http_code}\n" https://localhost/api/nope
实测回显:
{"urls":"turn:turn.chitchatter.local:3478","username":"admin","credential":"q1w2e3r4"}
405
404
即:仅支持 GET,非 /api/get-config 路径一律 404。
5.3 托管层(Nginx)关键配置
Chitchatter 本体无服务器配置,但托管层有三处配置错了功能就坏的点,本文实测站点配置如下(完整从零配置见《Ubuntu 22.04 安装 Chitchatter 指南》篇):
server {
listen 80;
server_name _;
return 301 https://$host$request_uri; # ① 强制 HTTPS
}
server {
listen 443 ssl;
server_name _;
ssl_certificate /etc/ssl/certs/chitchatter.crt;
ssl_certificate_key /etc/ssl/private/chitchatter.key;
root /var/www/chitchatter;
index index.html;
location / {
try_files $uri $uri/ /index.html; # ② SPA 回退(browser 路由必需)
}
location /api/ {
proxy_pass http://127.0.0.1:3003; # ③ RTC 配置 API 同源反代
proxy_set_header Host $host;
}
location = /sdk.js {
add_header Access-Control-Allow-Origin *; # ④ 允许第三方站点引用 SDK
add_header Cache-Control "no-cache";
}
gzip on;
gzip_types text/css application/javascript application/json image/svg+xml;
}
逐项说明:
| 配置点 | 不配置的后果 |
|---|---|
| ① 强制 HTTPS | WebRTC 的 getUserMedia/DataChannel 依赖安全上下文(Secure Context),明文 HTTP 下摄像头/麦克风不可用,功能残缺 |
② SPA 回退 try_files ... /index.html | browser 路由模式下直接打开/刷新 /public/<房间名> 会 404(实测验证了回退生效:curl /public/demo-room 返回 200 的 index.html);用 VITE_ROUTER_TYPE=hash 构建可不需要此项 |
③ /api/ 反代 | 「增强连接」端点 404,设置页 Networking 开关拉取配置失败 |
④ sdk.js 的 CORS 头 | 第三方站点 <script src> 引用虽不受 CORS 限制,但显式放开可避免部分严格环境(如带 crossorigin 的模块加载)失败;no-cache 保证嵌入方及时拿到新 SDK |
实测验证(HTTP 跳转、HTTPS 首页、SDK 头):
curl -s -o /dev/null -w "%{http_code}\n" http://localhost/
curl -sk https://localhost/ | grep -o '<title>[^<]*</title>'
curl -skI https://localhost/sdk.js | grep -iE "access-control|cache-control"
实测回显:
301
<title>Chitchatter</title>
Access-Control-Allow-Origin: *
Cache-Control: no-cache
5.4 构建期常量(改源码,不属于变量)
以下「配置」没有环境变量入口,只能改源码后重新构建,列出供评估:
| 常量 | 位置 | 内容 |
|---|---|---|
| 公共 tracker 列表 | Trystero 库默认(src/config/trackerUrls.ts 可追加) | wss://tracker.btorrent.xyz、wss://tracker.openwebtorrent.com 等 |
| 社区房间列表 | src/config/communityRooms.ts | 内置 8 个公共房间(news、politics、crypto 等) |
| iframe 权限白名单 | src/config/iframeFeatureAllowList.ts | camera;microphone;display-capture;fullscreen |
| SDK 配置握手超时 | sdk/sdk.ts configRequestTimeout | 10000ms |
六、生产配置模板
适用场景:单台 2C4G 云主机,Ubuntu 22.04,HTTPS 自托管,自有 TURN,面向小团队私密沟通(日活数十人量级;静态托管几乎不占资源,瓶颈在 TURN 带宽)。
- 构建变量(一次性写入
.env或构建命令行):
# /opt/chitchatter/.env
VITE_RTC_CONFIG_ENDPOINT=/api/get-config
VITE_ROUTER_TYPE=browser
VITE_GITHUB_REPO="https://github.com/jeremyckahn/chitchatter"
# 并把 package.json 的 "homepage" 改为你的站点根地址,例如:
# "homepage": "https://chat.example.com/",
- API 服务端 systemd 环境(
/etc/systemd/system/chitchatter-api.service):
[Service]
Environment=RTC_CONFIG=<上一步 base64 生成的值>
Environment=PORT=3003
ExecStart=/usr/local/bin/node simple-api-server.js
- 托管层:按 5.3 的 Nginx 配置,证书换正式证书(Let's Encrypt 或企业 CA 均可)。
改完备三项验证(全部实测命令):curl -sk https://<域名>/ | grep '<title>Chitchatter</title>'(站点)、curl -sk https://<域名>/api/get-config(TURN 下发)、grep -c "api/get-config" /var/www/chitchatter/assets/Bootstrap-*.js(构建注入)。
七、常见问题
Q1:改了 .env 后页面行为没有变化?
VITE_* 是构建时注入的,改完必须重新 npm run build 并把新 dist/ 发布到站点目录;仅刷新浏览器无效。验证是否注入成功:grep -c "你的端点串" /var/www/chitchatter/assets/Bootstrap-*.js。
Q2:设置页里找不到「Networking / Enhanced Connectivity」开关?
构建时没有设置 VITE_RTC_CONFIG_ENDPOINT(源码行为:未设置则功能整体隐藏)。重新构建并注入该变量,同时确认 API 端点可用(curl 返回 TURN JSON)。
Q3:VITE_HOMEPAGE 设了环境变量为什么不生效?
构建脚本 cross-env VITE_HOMEPAGE=$(npm pkg get homepage) 会用 package.json 的 homepage 字段覆盖命令行变量。要么改 package.json 的 homepage,要么在嵌入侧用 root-url 属性显式指定(见《Chitchatter 嵌入集成使用指南》篇)。
Q4:/api/get-config 返回的 JSON 里没有我配的 STUN 服务器?
正常现象:服务端只返回 iceServers 中第一个 turn: 条目(simple-api-server.js 的 find 逻辑),STUN 项不下发。
Q5:HTTPS 站点里自建 tracker 连不上?
浏览器混合内容限制,ws:// 在 HTTPS 页面被拦截。tracker 必须经 wss:// 暴露(Nginx 反代 WebSocket 加 Upgrade/Connection 头),并确认 VITE_TRACKER_URL 用的是 wss:// 地址。
Q6:CORS_ALLOW_ALL=true 能用于生产吗?
不能。源码注释明确标注为 DEBUG MODE(INSECURE)。生产用同源反代(/api/ 反代到 127.0.0.1:3003)彻底回避 CORS。
八、参考链接
- 源码仓库(含
.env官方注释模板):https://github.com/jeremyckahn/chitchatter - Vite 环境变量机制:https://vite.dev/guide/env-and-mode
- W3C RTCConfiguration 规范:https://www.w3.org/TR/webrtc/#rtcconfiguration-dictionary
- Trystero(信令抽象,含默认 tracker 列表):https://github.com/dmotz/trystero
- StreamSaver.js(mitm.html 配置说明):https://github.com/jimmywarting/StreamSaver.js
本专栏其他篇目:《Chitchatter 介绍与选型指南》《Ubuntu 22.04 安装 Chitchatter 指南》《Chitchatter Docker Compose 部署指南》《Chitchatter 嵌入集成使用指南》。