Galene 1.2 配置参数详解
Galene 1.2 三层配置体系逐项详解:galene 启动参数、全局 config.json、会议室 groups/*.json(权限/密码/编解码/外部 TURN),字段对照源码核实并附生产配置模板。
Galene 1.2 配置参数详解
目标:逐项详解 Galene 1.2 的三层配置体系——galene 主程序命令行参数、全局配置
data/config.json、会议室配置groups/*.json(含权限与密码格式、外部 TURN 的ice-servers.json),并给出生产配置模板。字段定义已对照 1.2.1 源码(group/group.go、group/description.go)核实,示例均在 Ubuntu 24.04.5 LTS + Galene 1.2.1 实测通过。
一、环境信息
- 操作系统:Ubuntu 24.04.5 LTS,x86_64
- 组件版本:Galene 1.2.1
- 安装布局:
/opt/galene/(galene二进制、static/、data/、groups/、recordings/),systemd 单元galene.service - 配置文件:
/opt/galene/data/config.json(全局)、/opt/galene/groups/<组名>.json(会议室)、/opt/galene/data/ice-servers.json(外部 TURN,可选) - 管理工具:
galenectl(自签名证书环境命令需带-insecure)
二、前置条件
- 已按《Ubuntu 24.04 安装 Galene 1.2 指南》完成安装并能
systemctl status galene看到active (running)。 - 已完成
galenectl initial-setup(生成data/config.json)。 - 本文示例管理员账号
admin/q1w2e3r4(仅测试环境使用)。
三、参数查看与修改方式
Galene 的配置分三层,修改方式各不相同:
| 层 | 载体 | 查看方式 | 修改方式 | 生效时机 |
|---|---|---|---|---|
| 启动参数 | systemd 单元 ExecStart 或命令行 | galene -help | 改 systemd 单元后 daemon-reload + restart | 需重启服务 |
| 全局配置 | data/config.json | 直接查看文件 | 手工编辑或 galenectl initial-setup | 实时生效,无需重启 |
| 会议室配置 | groups/<组名>.json | galenectl show-group -group <名> 或直接查看文件 | galenectl update-group 或直接编辑文件 | 实时生效,无需重启 |
查看启动参数完整清单(实测回显):
/opt/galene/galene -help
Usage of /opt/galene/galene:
-cpuprofile file
store CPU profile in file
-data directory
data directory (default "./data/")
-groups directory
group description directory (default "./groups/")
-http address
web server address (default ":8443")
-insecure
act as an HTTP server rather than HTTPS
-mdns
gather mDNS addresses
-memprofile file
store memory profile in file
-mutexprofile file
store mutex profile in file
-recordings directory
recordings directory (default "./recordings/")
-relay-only
require use of TURN relays for all media traffic
-static directory
web server root directory (default "./static/")
-turn address
built-in TURN server address ("" to disable) (default "auto")
-udp-range port
UDP port (multiplexing) or port1-port2 (range)
四、参数总览
4.1 启动参数总览
| 参数 | 默认值 | 类别 | 说明 |
|---|---|---|---|
-http | :8443 | 网络 | Web 服务监听地址(HTTPS + WebSocket 信令) |
-turn | auto | 网络 | 内置 TURN 服务器地址;"" 关闭 |
-udp-range | 不限 | 网络 | 媒体 UDP 端口收敛(单端口复用或 port1-port2 范围) |
-insecure | 关 | 网络 | 以纯 HTTP 运行(仅反向代理终结 TLS 时使用) |
-relay-only | 关 | 网络 | 强制所有媒体流经 TURN 中继(最严格连通性兜底) |
-mdns | 关 | 网络 | 收集 mDNS 地址(局域网发现场景) |
-data | ./data/ | 存储 | 数据目录(全局配置、证书、令牌库) |
-groups | ./groups/ | 存储 | 会议室定义目录 |
-recordings | ./recordings/ | 存储 | 录制文件目录 |
-static | ./static/ | 存储 | Web 客户端静态文件目录 |
-cpuprofile / -memprofile / -mutexprofile | 关 | 诊断 | 输出 Go pprof 采样文件,性能分析用 |
4.2 全局配置 data/config.json 字段总览
| 字段 | 类型 | 说明 |
|---|---|---|
users | 对象 | 服务器管理员表,每项含 password 与 permissions(此处仅 "admin" 有意义) |
writableGroups | 布尔 | 为 true 时允许通过管理 API / galenectl 修改会议室定义;否则只读 |
canonicalHost | 字符串 | 规范主机名;用其他主机名访问会被 302 重定向到该名 |
allowOrigin | 字符串数组 | 允许访问本服务器的 HTTP Origin 列表(跨域嵌入客户端时用) |
allowAdminOrigin | 字符串数组 | 同 allowOrigin,但作用于管理 API |
proxyURL | 字符串 | 反向代理后的外部根 URL(代理部署时必填) |
admin | 数组 | 已废弃(1.0 起由 users + permissions:"admin" 取代) |
4.3 会议室配置 groups/<组名>.json 字段总览
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
displayName | 字符串 | 组名 | 页面顶部展示的友好名 |
description | 字符串 | 空 | 描述,公开组会显示在首页 |
contact / comment | 字符串 | 空 | 联系方式/备注,服务器不解释 |
public | 布尔 | false | 是否列入首页公开会议室列表 |
redirect | URL | 空 | 设置后加入该组的请求被重定向到此 URL,其余字段基本失效 |
max-clients | 整数 | 不限 | 同时在线人数上限 |
max-history-age | 整数(秒) | 14400(4 小时) | 聊天历史保留时长(历史不落盘) |
not-before / expires | RFC3339 时间 | 空 | 允许加入的时间窗口 |
allow-recording | 布尔 | false | 允许在本组录制 |
unrestricted-tokens | 布尔 | false | 允许普通用户(非 op)创建邀请令牌 |
auto-subgroups | 布尔 | false | 访问 <组>/<子组> 时按需自动创建子组 |
autolock | 布尔 | false | 组初始锁定;最后一名 op 退出后自动锁定 |
autokick | 布尔 | false | 最后一名 op 退出后踢出所有人(官方建议用 autolock 代替) |
users | 对象 | 空 | 组内用户表(见 5.6) |
wildcard-user | 对象 | 空 | 通配用户:未列入 users 的任意用户名按其规则认证 |
authKeys / authServer / authPortal | 数组/URL | 空 | 外部认证(JWK 密钥、认证服务器、认证门户),见 5.7 |
codecs | 字符串数组 | ["vp8","opus"] | 允许的编解码器,见 5.8 |
op / presenter / other / allow-subgroups / allow-anonymous | — | — | 已废弃字段(1.0 之前的旧权限模型),勿再使用 |
五、核心参数分类详解
5.1 网络与监听(-http、-turn、-udp-range、-insecure、-relay-only)
-http :8443:Web 服务地址。改成:443需 root 或 capability;反代场景常保持 8443。-turn:内置 TURN(仅 IPv4)。取值行为:auto(默认):无data/ice-servers.json时等同:1194,有则等同关闭;:1194:监听本机所有公网 IPv4 地址的 1194/TCP+UDP(有公网 IP 时的推荐值);203.0.113.1:1194:监听本机全部地址,但向客户端通告指定地址(NAT + 端口映射场景);"":关闭内置 TURN,改用ice-servers.json中的外部 TURN。
-udp-range:收敛媒体 UDP 端口。-udp-range 20000-40000限定范围(建议数千以上跨度);-udp-range 10000表示只用单端口并在用户态解复用。便于防火墙精细化放行。-insecure:以纯 HTTP 运行。仅当上游有反向代理终结 TLS 时使用;公网直跑绝不要开。-relay-only:强制全部媒体走 TURN 中继,牺牲性能换最严格的连通性(高安全内网场景)。
💡 技术拓展:NAT 穿透技术不止 TURN 一种。常见选项——
技术 原理 代价 适用 STUN 探测 NAT 后的公网映射地址,打洞直连 免费、低延迟 大多数家用/办公 NAT TURN 服务器中继全部媒体流 消耗服务器带宽 对称型 NAT / 严格防火墙 ICE 自动在 host/srflx/relay 候选中择优 协议框架(非独立服务) WebRTC 的标准机制,贯穿始终 Galene 内置 TURN 兼做 STUN;本文实验环境因 NAT 无公网地址,实测日志出现
TURN: no public addresses,生产上要么放行 1194,要么配置外部 TURN(见 5.9)。
5.2 存储目录(-data、-groups、-recordings、-static)
四个目录默认值均为相对路径 ./,因此 systemd 单元的 WorkingDirectory=/opt/galene 与默认参数配合即得 /opt/galene/data 等布局。注意 data/ 内的 config.json、cert.pem、key.pem、var/tokens.jsonl 都是敏感文件,官方包内自动设为属主 0600;备份 data/var/tokens.jsonl 无需停机。
5.3 诊断参数(-cpuprofile、-memprofile、-mutexprofile)
传入文件路径即开启对应 pprof 采样,退出时写文件,用 go tool pprof <文件> 分析。仅排障时临时加在 ExecStart 上,常态关闭。
5.4 全局配置 data/config.json
实测环境生成的完整文件:
{
"writableGroups": true,
"users": {
"admin": {
"password": {
"type": "bcrypt",
"key": "$2a$12$BaXbi3neOCI89tHJdmZVCOxxmePW12.ApiWaIp342cd36fYDuSPX2"
},
"permissions": "admin"
}
}
}
逐项说明:
users:服务器级管理员(可调用管理 API、被 galenectl 使用)。密码永远存哈希,不写明文。writableGroups:true时 galenectl 可建/改/删会议室;设为false后 API 只读,会议室只能手工编辑groups/文件管理。canonicalHost:例如"galene.example.org",用户用 IP 或别名访问时被重定向到规范名。proxyURL:反代场景的外部根 URL,如"https://galene.example.org/"。allowOrigin/allowAdminOrigin:把 Galene 客户端嵌入第三方站点(iframe/自有前端)时配置跨域来源。
5.5 会议室展示与生命周期参数
以一个实测公开组为例(galenectl show-group -group city-watch 回显):
{
"description": "示例公开会议组",
"displayName": "City Watch 会议室",
"max-clients": 20,
"public": true
}
public: true使该组出现在服务器首页(实测https://localhost:8443/public-groups.json返回含此组的数组,含location、endpoint、displayName、clientCount字段)。max-clients控制人数上限;max-history-age(秒)控制聊天历史保留,默认 14400。not-before/expires用于「限时会议」:值形如"2026-11-01T09:00:00+08:00"。redirect可把废弃组指向新地址而不删除。
5.6 用户与权限(users、wildcard-user、permissions)
users 把用户名映射到「密码 + 权限」。实测组文件节选:
"users": {
"admin": {"password": {"type": "bcrypt", "key": "$2a$08$mkxddgxf2BR0DFNuD66OfO7xOGrhoSE8WynRvgC2Gv4brIMQ8/bte"}, "permissions": "op"},
"fred": {"password": {"type": "bcrypt", "key": "$2a$08$vpnc0uvQR6PWFnZXNrzGNuNc.4VU2b82CzngTHnOFTjCgtY9Dbfai"}, "permissions": "present"}
},
"wildcard-user": {"password": {"type": "bcrypt", "key": "$2a$08$.wBpn6icYV6GOk3grnyuVuzf4CWyRAp.kBYicLCFhhNI2/vGDUiM2"}, "permissions": "present"}
权限简写(推荐,源码 permissionsMap 定义):
| 简写 | 能力 |
|---|---|
op | 主持人:全部会场操作(静音他人、踢人、锁定、发令牌等),无组管理权 |
present | 普通参会:发布音视频 + 聊天 |
message | 仅聊天 |
observe | 仅收看收听 |
caption | 仅字幕 |
admin | 仅组管理(配合管理 API) |
⚠️ 注意:
permissions也接受内部原子权限数组(如["present","message"]),但官方不推荐——原子权限随版本变动,简写更稳定。
wildcard-user 是「未登记用户名」的兜底规则:配固定密码则「任意用户名 + 统一口令」;配 {"type":"wildcard"} 密码则「任意用户名 + 任意口令」的完全开放会议:
galenectl -insecure create-user -group city-watch -wildcard
galenectl -insecure set-password -group city-watch -wildcard -type wildcard
5.7 密码哈希格式与外部认证
password 字段支持四种形态:
| 形态 | 示例 | 说明 |
|---|---|---|
| 明文 | "password": "q1w2e3r4" | 仅临时测试;galenectl 不会生成明文 |
| bcrypt | {"type":"bcrypt","key":"$2a$08$IEWT33vBYyKmV5IfOX8hXO3d49RO64p50Zmb6dfdlCcMpps8bube."} | 默认(1.2 起 cost 默认 8) |
| pbkdf2 | {"type":"pbkdf2","hash":"sha-256","key":"0928ea6b06c296415c5a799cbe8e8afafc2e7ae1c1455f4e6b51fa9a42a176e0","salt":"8b4f020bc5ef36df","iterations":4096} | 兼容选项 |
| wildcard | {"type":"wildcard"} | 任意口令(仅 wildcard-user 用) |
手工生成哈希(实测回显):
galenectl hash-password -password q1w2e3r4 # 默认 bcrypt
galenectl hash-password -password q1w2e3r4 -type pbkdf2 # pbkdf2
{"type":"bcrypt","key":"$2a$08$IEWT33vBYyKmV5IfOX8hXO3d49RO64p50Zmb6dfdlCcMpps8bube."}
{"type":"pbkdf2","hash":"sha-256","key":"0928ea6b06c296415c5a799cbe8e8afafc2e7ae1c1455f4e6b51fa9a42a176e0","salt":"8b4f020bc5ef36df","iterations":4096}
外部认证三件套:authKeys(JWK 公钥数组,须显式指定 alg)、authServer(认证服务器 URL,客户端拿到口令后自行向认证服务器换令牌,口令不经过 Galene)、authPortal(认证门户 URL,客户端先跳转门户再携 username+token 跳回)。用于对接 LDAP/OAuth2,官方提供 galene-ldap 与 Python 示例认证服务器。
5.8 媒体编解码(codecs)
codecs 数组限定组内可用编解码器,默认 ["vp8","opus"]。可选值:
| 类型 | 取值 | 兼容性说明 |
|---|---|---|
| 视频 | vp8(默认) | 全浏览器兼容、功能完整 |
| 视频 | vp9 | 画质更好;Safari 不兼容、Firefox 略有缺陷 |
| 视频 | av1 | 画质最好;部分浏览器支持,不支持录制与 SVC |
| 视频 | h264 | 苹果设备支持好;Debian/部分安卓不兼容;有专利风险 |
| 音频 | opus(默认) | 唯一支持录制的音频编码 |
| 音频 | g722/pcmu/pcma | 兼容传统终端,无特殊需求不建议用 |
示例(启用 VP9 与 AV1 的回退链):"codecs": ["av1","vp9","vp8","opus"]。
5.9 外部 TURN:data/ice-servers.json
服务器在 NAT 后(实测日志 TURN: no public addresses)时,把 -turn 设为 ""(或保持 auto)并提供本文件。单 TURN 示例:
[
{
"urls": ["turn:turn.example.org:443", "turn:turn.example.org:443?transport=tcp"],
"username": "galene",
"credential": "secret"
}
]
配合 coturn 的 use-auth-secret 时加 "credentialType": "hmac-sha1"。可配置多个 TURN 做冗余,ICE 自动择优。文件存在且内置 TURN 开启时,优先使用外部服务器。
六、生产配置模板
适用画像:2C4G 小规格服务器、有公网 IP、50 人以内的团队日常会议。
/opt/galene/data/config.json:
{
"writableGroups": true,
"canonicalHost": "galene.example.org",
"users": {
"admin": {
"password": {"type": "bcrypt", "key": "$2a$12$<用 galenectl initial-setup 生成>"},
"permissions": "admin"
}
}
}
/opt/galene/groups/team.json(内部周会室):
{
"displayName": "团队周会",
"description": "每周一例会",
"public": true,
"max-clients": 50,
"max-history-age": 14400,
"allow-recording": true,
"codecs": ["vp8", "opus"],
"users": {
"admin": {"password": {"type": "bcrypt", "key": "<bcrypt 哈希>"}, "permissions": "op"}
},
"wildcard-user": {"password": {"type": "bcrypt", "key": "<bcrypt 哈希>"}, "permissions": "present"}
}
systemd ExecStart 建议:/opt/galene/galene -http :8443 -turn :1194 -udp-range 20000-40000,防火墙放行 8443/TCP、1194/TCP+UDP、20000-40000/UDP。
七、常见问题(FAQ)
Q1:改了 config.json / 组 JSON 需要重启吗?
不需要。官方明确两层 JSON 均实时加载(实测改组定义后立即 show-group 可见新值)。只有启动参数(-http、-turn 等)需要 systemctl restart galene。
Q2:writableGroups 设为 false 后 galenectl 还能做什么?
只读操作(list-groups、show-group、list-users、list-tokens)可用;一切写操作(create/update/delete)被拒绝。此时管理会议室靠手工编辑 groups/ 文件。
Q3:公开组设置了 public: true 但首页看不到?
检查组名是否在 URL 中可访问(curl -sk https://<主机>:8443/public-groups.json 应列出该组);注意 redirect 组与已过期(expires)组不展示。
Q4:-udp-range 设单端口和设范围有何区别?
单端口(如 -udp-range 10000)由服务器在用户态解复用,最省防火墙规则但吞吐略低;范围方式每路流独占端口,性能更好。官方提示该机制尚在完善,日志中看到使用其他端口属正常。
Q5:如何彻底关闭内置 TURN?
ExecStart 加 -turn "",并提供 data/ice-servers.json(否则无公网直达路径的客户端无法连通媒体)。
八、参考链接
- 官方管理手册(源码内
galene.md、含 Group description reference):https://github.com/jech/galene - 管理 API 说明(
galene-api.md):https://github.com/jech/galene/blob/master/galene-api.md - 站内文档:《Galene 1.2 介绍与选型指南》https://www.quzuo.net/document/OS394POo9wtA、《Ubuntu 24.04 安装 Galene 1.2 指南》https://www.quzuo.net/document/JmXRH0x02qtd、《Galene 1.2 Docker Compose 部署指南》https://www.quzuo.net/document/8hoLi6NGyKYn