The Lounge 4.5.2 配置参数详解
The Lounge 4.5.2 config.js 全部参数详解:Server settings(public/host/port/reverseProxy/maxHistory/https)、Client settings(theme/prefetch/fileUpload/transports)、Default network、User management(messageStorage/sqlite清理/useHexIp)、WEBIRC、identd/oidentd、LDAP 认证、Debugging(2026-10-27 实测)。
The Lounge 4.5.2 配置参数详解
目标:详解 The Lounge 4.5.2 的全部配置参数。配置文件
config.js是 CommonJS 模块,所有参数在对象里按层级组织;首次启动时 The Lounge 在THELOUNGE_HOME下自动生成带完整注释的模板。本文以官方defaults/config.js为源,所有参数标注默认值、数据类型、影响范围与改法示例;实测基线 4.5.2(2026-07-11 发布)。
一、环境信息
- 版本:The Lounge
4.5.2(Node.js ≥ 22) - 配置文件路径:
- 包管理器(.deb / Yarn / npm)安装:
THELOUNGE_HOME环境变量指定(默认/etc/thelounge) - 自托管进程:
THELOUNGE_HOME=/var/opt/thelounge(4.5.2 官方镜像路径)
- 包管理器(.deb / Yarn / npm)安装:
- 配置文件格式:
config.js(CommonJSmodule.exports = { ... },完整 JavaScript 语法,不是 JSON——可以写注释、条件逻辑、函数) - 修改生效:改完重启 The Lounge 进程(systemd
systemctl restart thelounge、或前台进程 Ctrl+C 重启) - 本文所有示例片段均来自 4.5.2 默认模板,实测环境:Ubuntu 22.04 + Node.js 22.18.0
二、顶层结构速览
module.exports = {
public: false, // 服务器模式:public / private
host: undefined, // Web 监听地址
port: 9000, // Web 监听端口
bind: undefined, // 出站 IRC 连接绑定地址
reverseProxy: false, // 是否 behind 反代
maxHistory: 10000, // 每频道最大历史行数
https: { ... }, // 内置 TLS
theme: "default", // 客户端默认主题
prefetch: false, // URL 预览抓取
disableMediaPreview: false, // 媒体预览
prefetchStorage: false, // 代理缓存
prefetchMaxImageSize: 2048, prefetchMaxSearchSize: 50, prefetchTimeout: 5000,
fileUpload: { ... }, // 文件上传
transports: ["polling", "websocket"], // socket.io 传输
leaveMessage: "The Lounge - https://thelounge.chat",
defaults: { ... }, // 默认 IRC 网络占位
lockNetwork: false, // 锁定默认网络
messageStorage: ["sqlite", "text"],
storagePolicy: { ... }, // SQLite 清理策略
useHexIp: false, // IPv4 hex 编码进 username
webirc: null, // WEBIRC 密码映射
identd: { enable: false, port: 113 },
oidentd: null, // oidentd 配置文件路径
ldap: { ... }, // LDAP 认证
debug: { ircFramework: false, raw: false },
};
三、Server settings 服务器参数
3.1 public — 公开/私有模式
| 类型 | boolean |
| 默认 | false(private 私有模式) |
| 生效时机 | 启动时;切换需重启 |
public: false(私有模式):用户必须先注册/登录才能用,IRC 连接持久——浏览器关掉、重开、换设备,连接和频道都还在,消息滚动历史在;public: true(公开模式):无需账号,任何人直接进首页就有现成的 IRC 连接。代价:浏览器关 = 连接断 = 频道历史清空 = 消息滚动丢失。适合公共电脑/展厅场景。
💡 技术拓展:Shout(The Lounge 前身)默认 public,The Lounge v2 起翻转默认值为 private。这个翻转反映了社区使用场景的变化——早期多作临时公共聊天墙,后期多作 7×24 常驻个人 IRC 终端。两者都仍保留,没有被废弃。
改法示例(切成公开模式):
public: true,
3.2 host — Web 服务监听地址
| 类型 | string | undefined |
| 默认 | undefined(监听所有接口 0.0.0.0) |
"127.0.0.1":只本机可访问;若前面有反向代理(Caddy/Nginx),建议 host 绑127.0.0.1,反代对外——安全隔离;"0.0.0.0"或undefined:所有网卡;"unix:/absolute/path/to/file.sock":UNIX domain socket,Caddy/Nginx 等反代可以直接连 socket,省 TCP 开销。
host: "127.0.0.1", // 只本机 + 反代可访问
3.3 port — Web 服务端口
| 类型 | number |
| 默认 | 9000 |
纯数字端口。若用 unix socket 则忽略。
3.4 bind — 出站 IRC 连接的本地 IP
| 类型 | string | undefined |
| 默认 | undefined(操作系统选出口网卡) |
多网卡/多出口服务器上可以强制 IRC 连接从哪个本地 IP 发出。例如双 WAN:
bind: "10.0.1.50", // 强制 IRC 连接走这块网卡
3.5 reverseProxy — 反向代理信任开关
| 类型 | boolean |
| 默认 | false |
false:The Lounge 自己处理连接,IP 从 socket 取;true:The Lounge 信任X-Forwarded-For/X-Forwarded-Proto头,从反代拿真实 IP 和协议。
用 Caddy/Nginx 反代 The Lounge 时必须设 true,否则所有客户端 IP 都显示成 127.0.0.1,且 WebSocket 升级可能失败。
3.6 maxHistory — 每频道内存历史上限
| 类型 | number |
| 默认 | 10000 行 |
- 单个频道/私聊窗口内存里保留的消息数,超过即顶掉最老的;
-1:无限;- 设小可以减内存,但切换频道回滚到顶会看不到更早的消息。
⚠️
maxHistory只管 内存 里的实时窗口;磁盘落盘由messageStorage控制,两者独立。
maxHistory: 5000, // 每频道内存留 5000 行
3.7 https — 内置 TLS(不推荐)
| 键 | 类型 | 默认 | 说明 |
|---|---|---|---|
https.enable | boolean | false | true 启用 TLS |
https.key | string | "" | 私钥文件路径 |
https.certificate | string | "" | 证书文件路径 |
https.ca | string | "" | CA 证书链(可选) |
官方推荐 交给反向代理做 TLS(Caddy 自动续签、certbot 一键)。内置 TLS 只适合不想搞反代的极简场景。示例:
https: {
enable: true,
key: "/etc/letsencrypt/live/irc.example.com/privkey.pem",
certificate: "/etc/letsencrypt/live/irc.example.com/fullchain.pem",
ca: "",
},
四、Client settings 客户端参数
4.1 theme — 默认主题
| 类型 | string |
| 默认 | "default" |
- 两个内置主题:
"default"(深色)、"morning"(浅色); - 也可以装社区主题(
npm install thelounge-theme-solarized之类),值写包名; - 每个用户登录后可以在自己的客户端设置里覆盖这个默认值。
4.2 prefetch — URL 预览抓取
| 类型 | boolean |
| 默认 | false |
频道/私聊里有人发 URL 时,The Lounge 自动请求目标站点抓 Open Graph 元标签(标题、描述、缩略图),在频道里渲染卡片。开了以后服务器会对外发很多 HTTP 请求——要注意被封、隐私策略、和 prefetchMax* 配合限流。
4.3 disableMediaPreview — 媒体预览禁用
| 类型 | boolean |
| 默认 | false |
true:图片/视频/音频只显示链接,不内嵌预览;- 只在
prefetch: true时有意义; - 开它的好处:客户端浏览器不会向第三方站点发请求(隐私),且跳过混合内容警告(HTTP 图片在 HTTPS 页面里)。
4.4 prefetchStorage — 代理式图片缓存
| 类型 | boolean |
| 默认 | false |
true:The Lounge 自己去抓缩略图和图片,存到${THELOUNGE_HOME}/storage/,然后自己当代理给客户端下发;- 主要目的:解决混合内容警告(页面 HTTPS、图片 HTTP);
- 视频/音频不缓存,只走 HTTPS 原链接。
4.5 prefetchMaxImageSize / prefetchMaxSearchSize / prefetchTimeout
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
prefetchMaxImageSize | number | 2048 KB | 图片超过此大小不预览 |
prefetchMaxSearchSize | number | 50 KB | Open Graph 元标签搜索响应体上限(防 YouTube 等大页撑爆内存) |
prefetchTimeout | number | 5000 ms | 单条 URL 抓取超时 |
prefetchMaxImageSize: 4096, // 允许更大的缩略图
prefetchTimeout: 8000, // 网络慢时多等 3 秒
4.6 fileUpload — 文件上传
| 键 | 类型 | 默认 | 说明 |
|---|---|---|---|
fileUpload.enable | boolean | 隐含 false(对象存在即启用) | 拖放/对话框上传 |
fileUpload.maxFileSize | number | 10240 KB | 单文件上限;-1 无限 |
fileUpload.baseUrl | string | null | null | 自定义下载 URL 前缀(反代场景) |
上传文件落 ${THELOUNGE_HOME}/uploads/,不会被 The Lounge 自动清理——磁盘自己盯紧。
fileUpload: {
enable: true,
maxFileSize: 20480, // 允许 20MB
baseUrl: null, // 默认相对路径
},
4.7 transports — socket.io 传输层
| 类型 | string[] |
| 默认 | ["polling", "websocket"] |
socket.io 提供两种传输:polling(长轮询,兼容性最好)和 websocket(实时、高效)。默认都开,浏览器自动协商——能用 websocket 就上 websocket,不能再回退 polling。
反代场景若能确保 websocket 透传(Caddy/Nginx 默认都能),可以只留 websocket:
transports: ["websocket"], // 强制 websocket,省 polling 开销
4.8 leaveMessage — 默认 quit/part 消息
| 类型 | string |
| 默认 | "The Lounge - https://thelounge.chat" |
用户退出 IRC 或离开频道时,自己没写 part/quit message 的话用这个当默认。每个用户也可以在自己的客户端设置里改。
五、Default network 默认 IRC 网络
5.1 defaults — Connect 窗口占位
| 键 | 类型 | 默认 | 说明 |
|---|---|---|---|
defaults.name | string | "Libera.Chat" | UI 显示名 |
defaults.host | string | "irc.libera.chat" | IRC 服务器 |
defaults.port | number | 6697 | 默认 TLS,明文一般 6667 |
defaults.password | string | "" | IRC 服务器密码 / SASL |
defaults.tls | boolean | true | 是否 TLS |
defaults.rejectUnauthorized | boolean | true | 验证证书 |
defaults.nick | string | "thelounge%%" | %% → 00-99 随机数 |
defaults.username | string | "thelounge" | IRC username 字段 |
defaults.realname | string | "The Lounge User" | IRC realname |
defaults.leaveMessage | string | (继承顶层) | 网络级覆盖顶层 leaveMessage |
defaults.join | string | "#thelounge" | 连接后自动加入的频道,逗号分隔 |
改法(指向自建 IRCd):
defaults: {
name: "Local IRCd",
host: "127.0.0.1",
port: 6667,
password: "",
tls: false,
rejectUnauthorized: false,
nick: "lounge%%",
username: "lounge",
realname: "My Lounge User",
join: "#lounge,#test",
},
5.2 lockNetwork — 锁定默认网络
| 类型 | boolean |
| 默认 | false |
true:Connect 面板里 host、port、TLS 全部灰掉,用户只能连defaults里配置的那个网络;- 适合把 The Lounge 作为单一 IRC 网络的网关(只放某个内网 IRCd 给用户用)。
六、User management 用户管理参数
6.1 messageStorage — 消息落盘方式
| 类型 | string[] |
| 默认 | ["sqlite", "text"] |
"sqlite":每个用户一个 SQLite 文件,自动加载历史(private 模式关键);"text":纯文本日志,不落回滚历史,只作审计;[]:完全关闭落盘(内存模式,重启丢全部)。
messageStorage: ["sqlite"], // 只留 SQLite
⚠️ private 模式下建议 不要 关掉 SQLite——否则重启后频道全部要重连、历史全空,跟 public 模式没区别了。
6.2 storagePolicy — SQLite 自动清理
| 键 | 类型 | 默认 | 说明 |
|---|---|---|---|
storagePolicy.enabled | boolean | 隐含 true | 后台清理任务 |
storagePolicy.maxAgeDays | number | 隐含 90 | 消息保留天数 |
storagePolicy.deletionPolicy | "statusOnly" | "everything" | "statusOnly" | 只删状态行 / 全删 |
storagePolicy: {
enabled: true,
maxAgeDays: 180,
deletionPolicy: "statusOnly",
},
6.3 useHexIp — IPv4 hex 编码
| 类型 | boolean |
| 默认 | false |
true:用户的 IPv4 地址被转成 hex(如192.168.1.50→c0a80132)塞进 IRCusername字段;- 作用:让 IRC 网络按真实 IP 做 host masking(如
nick!c0a80132@*.ircnet); - 只支持 IPv4,IPv6 不处理。
七、WEBIRC 支持
IRC 网络(如 Libera.Chat)可以给 The Lounge 发 WEBIRC 密码,The Lounge 把用户真实 IP 转给 IRCd,nick 就能拿到网络赋予的 cloak/host。两种写法:
7.1 Basic — 主机名 → 密码
webirc: {
"irc.libera.chat": "lounge-webirc-password-libera",
"irc.example.com": "another-password",
},
7.2 Advanced — 函数,自定义加工
可以对 WEBIRC 对象(hostname、username、realname、password)做任意加工:
webirc: {
"irc.example.com": (webircObj, network) => {
webircObj.password = "thisiswebircpassword";
webircObj.hostname = `webirc/${webircObj.hostname}`;
return webircObj;
},
},
| 默认 | null(禁用 WEBIRC) |
| 生效条件 | 必须向 IRC 网络申请密码——IRC 管理员不会随便给 |
八、identd / oidentd
8.1 identd — 内置 identd
| 键 | 类型 | 默认 | 说明 |
|---|---|---|---|
identd.enable | boolean | false | 启动 identd daemon |
identd.port | number | 113 | 监听端口 |
IRC 网络连接前可能发 ident 查询(RFC 1413),看 The Lounge 自称是什么用户。identd 开了以后 The Lounge 自己回 ident 请求。
特权端口问题:Linux 下 bind < 1024 需要 root。若 The Lounge 以非 root 用户跑(推荐),identd.port 改成 1130 之类的高位端口,再在宿主 iptables/反代层把 113 → 1130 映射回去。
8.2 oidentd — 委托给 oidentd
| 类型 | string | null |
| 默认 | null |
如果系统里已经跑着 oidentd(成熟的 identd 守护进程,比内置功能强),把 oidentd 配置文件路径给它,The Lounge 就不再管 identd:
oidentd: "/etc/oidentd.conf",
identd.enable 和 oidentd 二选一,冲突时 oidentd 优先。
九、LDAP 认证(private 模式)
只有 public: false 时 LDAP 才生效。The Lounge 先 bind 进 LDAP 搜索用户 DN,再用用户提供的密码 bind 验证。
9.1 参数表
| 键 | 类型 | 默认 | 说明 |
|---|---|---|---|
ldap.enable | boolean | false | 开关 |
ldap.url | string | "ldap://example.com:389" 样例 | ldap:// 或 ldaps:// |
ldap.tlsOptions | object | {} | ldaps:// 时的 Node.js tls.connect() 选项 |
ldap.primaryKey | string | "uid" | LDAP 主键属性 |
ldap.baseDN | string | undefined | (无) | 简单模式:直接拼 primaryKey=username,baseDN |
ldap.searchDN | object | undefined | (无) | 高级模式:先搜索再验证 |
9.2 两种模式
baseDN 简单模式:直接假设用户 DN = <bindDN>,<primaryKey>=<username>:
ldap: {
enable: true,
url: "ldaps://ldap.example.com:636",
baseDN: "ou=users,dc=example,dc=com", // 最终 DN: uid=alice,ou=users,dc=example,dc=com
primaryKey: "uid",
},
searchDN 高级模式:先用一个只读 bind 用户搜索用户 DN,再验证:
ldap: {
enable: true,
url: "ldaps://ldap.example.com:636",
searchDN: {
rootDN: "cn=thelounge-service,ou=system,dc=example,dc=com",
rootPassword: "service-bind-password",
filter: "(&(objectClass=person)(memberOf=ou=irc-users,dc=example,dc=com))",
base: "dc=example,dc=com",
scope: "sub",
},
primaryKey: "uid",
},
rootDN/rootPassword:有权读用户条目的服务账号;filter:附加过滤,比如「只允许某 OU 里的 person」;scope:base/one/sub(只搜当前节点 / 下一层 / 整棵子树)。
9.3 tlsOptions
当 url 用 ldaps:// 时生效,可以覆盖默认 TLS 行为(比如强制 IPv6):
ldap: {
tlsOptions: {
host: "::1",
servername: "ldap.example.com",
},
},
十、Debugging settings 调试
10.1 debug 对象
| 键 | 类型 | 默认 | 说明 |
|---|---|---|---|
debug.ircFramework | boolean | false | 底层 irc-framework 库的调试输出(verbose) |
debug.raw | boolean | false | 把每条原始 IRC 协议消息打到客户端窗口里 |
debug: {
ircFramework: true, // 开发 IRC 插件/新网络适配时开
raw: true, // 频道里直接能看到 ":irc.libera.chat 001 nick :Welcome ..."
},
⚠️ debug.raw 直接污染频道滚动区,只在排障开,开完记得关。
十一、环境变量覆盖
除了 config.js,两个环境变量影响行为:
| 变量 | 说明 |
|---|---|
THELOUNGE_HOME | 数据目录/配置文件目录;默认 /etc/thelounge(deb 包)或 /var/opt/thelounge(官方镜像) |
NODE_ENV | 设成 production 跳过部分开发期日志 |
CLI 也可以单次覆盖任意配置键(不改文件):
thelounge start -c public=true -c port=8000
# 多个 -c 覆盖多个键;对象深层用点号 -c https.enable=true
十二、实测:改 public 重启生效
以 4.5.2 为例,把 public: false 改成 true:
# 1. 改文件
$ vim /etc/thelounge/config.js # THELOUNGE_HOME=
# public: true, ← 原来是 false
# 2. 重启
$ systemctl restart thelounge
$ systemctl status thelounge
# ● thelounge.service - The Lounge IRC Client
# Active: active (running) since ...
# 3. 验证:直接浏览器打开不需要登录了
$ curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:9000
# 200
切回 private 同理——public: false → 重启 → 浏览器打开会被送到 /login。
十三、安全建议速查
| 设置 | 建议值 | 理由 |
|---|---|---|
public | 自托管:false;公共墙:true | private 模式连接持久、可持久化消息 |
host | 反代场景绑 127.0.0.1 | 减少直接暴露 |
reverseProxy | 反代场景 true | 拿真实 IP、正确升级 WebSocket |
messageStorage | private 模式保留 ["sqlite"] | 否则重启丢全部 |
storagePolicy.maxAgeDays | 按合规要求,常用 90–180 | SQLite 文件会无限增长 |
ldap.enable | 有 AD/OpenLDAP 时开 | 不用再单独管 thelounge 账号 |
debug.* | 生产 false | 日志爆炸、raw 还泄露频道内容 |
transports | 反代能透 websocket 时 ["websocket"] | 省 polling 开销 |
prefetchStorage | 有 HTTPS + 常遇到 http 图片时 true | 解决混合内容警告 |