Galene 1.2 Docker Compose 部署指南
以源码多阶段构建自建镜像的方式用 Docker Compose 部署 Galene 1.2.1:Dockerfile 与 compose 全量清单、数据持久化、管理员初始化、运维命令与常见问题,全链路实测。
Galene 1.2 Docker Compose 部署指南
目标:用 Docker Compose 以「源码自建镜像」方式部署 Galene 1.2.1 视频会议服务器,完成数据持久化、管理员初始化与会议室验证。Dockerfile、compose 文件与全部命令回显已在 Docker Engine 29.9.2 / Docker Compose v5.6.1 环境实测通过。
一、环境信息
- 操作系统:Ubuntu 24.04 LTS(任何能运行 Docker 的 Linux 发行版均可)
- Docker Engine:29.9.2;Docker Compose:v5.6.1
- 组件版本:Galene 1.2.1(源码构建);镜像内基础层:golang:1.27-bookworm(构建)+ debian:bookworm-slim(运行)
- 产出镜像:
galene:1.2.1,实测体积 168MB - 容器名:
galene-1.2.1-server - 端口映射:8443/TCP(HTTPS + WebSocket)、1194/TCP+UDP(内置 TURN)
- 持久化目录(bind mount):
./data、./groups、./recordings
二、镜像选型说明
Galene 官方不发布任何容器镜像:源码仓库没有 Dockerfile,Docker Hub 也没有官方账号的镜像(2026-10-25 实查,仅有零星社区镜像,最高者约 9.3k 次拉取,版本与安全更新均无保障)。因此本文采用多阶段构建从源码自建镜像的方案:
- 构建阶段用
golang:1.27-bookworm编译galene与galenectl(纯 Go、CGO_ENABLED=0,无动态库依赖); - 运行阶段用
debian:bookworm-slim仅携带二进制与static/网页目录,以非 root 用户(uid 10001)运行。
这样镜像内容完全可控,且与《Ubuntu 24.04 安装 Galene 1.2 指南》的源码版本严格一致。
三、前置条件
- 已安装 Docker Engine 与 Docker Compose 插件(
docker compose version可执行)。 - 构建机可访问互联网(拉取基础镜像与 Go 模块)。
- 防火墙放行:8443/TCP、1194/TCP+UDP(TURN,服务器有公网 IP 时建议放行)。
- 本文演示账号:
admin/q1w2e3r4(仅测试环境使用)。
四、部署步骤
4.1 目录结构
建立项目目录(本文以 /root/galene/ 为例),最终结构如下:
/root/galene/
├── Dockerfile
├── docker-compose.yml
├── data/ # 全局配置与令牌(容器内 /opt/galene/data)
├── groups/ # 会议室定义(容器内 /opt/galene/groups)
└── recordings/ # 录制文件(容器内 /opt/galene/recordings)
4.2 编写 Dockerfile
以下为实测通过的多阶段构建文件。ARG GOPROXY 默认使用国内代理,避免 Go 模块拉取超时(实测 proxy.golang.org 不可达,见「十一、常见问题」Q1):
FROM golang:1.27-bookworm AS build
ARG GOPROXY=https://goproxy.cn,direct
WORKDIR /src
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates wget \
&& rm -rf /var/lib/apt/lists/* \
&& wget -q https://github.com/jech/galene/archive/refs/tags/galene-1.2.1.tar.gz \
&& tar xzf galene-1.2.1.tar.gz \
&& mv galene-galene-1.2.1 galene
WORKDIR /src/galene
RUN CGO_ENABLED=0 go build -ldflags='-s -w' . \
&& cd galenectl && CGO_ENABLED=0 go build -ldflags='-s -w' .
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates curl \
&& rm -rf /var/lib/apt/lists/* \
&& useradd -r -u 10001 -m galene
WORKDIR /opt/galene
COPY --from=build /src/galene/galene /usr/local/bin/galene
COPY --from=build /src/galene/galenectl/galenectl /usr/local/bin/galenectl
COPY --from=build /src/galene/static ./static
RUN mkdir -p data groups recordings && chown -R galene:galene /opt/galene
USER galene
EXPOSE 8443/tcp 1194/tcp 1194/udp
ENTRYPOINT ["/usr/local/bin/galene"]
CMD ["-http", ":8443"]
逐段说明:第一阶段下载 galene-1.2.1 源码并编译出 galene、galenectl 两个静态二进制;第二阶段把二进制拷入 /usr/local/bin/、static/ 拷入工作目录,创建 uid 10001 的 galene 用户并切换到该用户运行;ENTRYPOINT 固定为主程序,CMD 提供默认参数(可被 compose 的 command 覆盖)。
4.3 编写 docker-compose.yml
name: galene-1.2.1-stack
services:
galene:
build: .
image: galene:1.2.1
container_name: galene-1.2.1-server
restart: unless-stopped
ports:
- "8443:8443/tcp"
- "1194:1194/tcp"
- "1194:1194/udp"
volumes:
- ./data:/opt/galene/data
- ./groups:/opt/galene/groups
- ./recordings:/opt/galene/recordings
command: ["-http", ":8443", "-turn", ":1194"]
说明:command 显式开启内置 TURN(默认 auto 在检测到 data/ice-servers.json 时会自动关闭,显式写出更直观);三个 bind mount 分别持久化配置、会议室与录制文件。
⚠️ 注意:Compose 会把项目名中的点号规范化,实际项目名会显示为
galene-121-stack,属正常现象,不影响使用。
4.4 创建数据目录并修正属主
容器内进程以 uid 10001 运行,bind mount 目录必须先建好并改为该属主,否则 Galene 无权限写配置与令牌文件:
cd /root/galene
mkdir -p data groups recordings
chown -R 10001:10001 data groups recordings
4.5 构建并启动
docker compose build
docker compose up -d
构建完成后再执行 docker compose up -d,实测输出:
Container galene-1.2.1-server Running
确认镜像与容器状态(实测回显):
docker images | grep galene
docker compose ps
galene:1.2.1 168MB
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
galene-1.2.1-server galene:1.2.1 "/usr/local/bin/gale…" galene 7 minutes ago Up 6 minutes 0.0.0.0:1194->1194/tcp, [::]:1194->1194/tcp, 0.0.0.0:8443->8443/tcp, 0.0.0.0:1194->1194/udp, [::]:8443->8443/tcp, [::]:1194->1194/udp
4.6 初始化管理员与第一个会议室
galenectl 已随镜像装入容器,用 docker exec 在容器内完成初始化(自签名证书环境需 -insecure;initial-setup -config 指向数据卷内的服务器配置文件,使其持久化):
docker exec galene-1.2.1-server galenectl -insecure -server https://localhost:8443 \
-admin-username admin -admin-password q1w2e3r4 \
initial-setup -config /opt/galene/data/config.json
docker exec galene-1.2.1-server galenectl -insecure -server https://localhost:8443 \
-admin-username admin -admin-password q1w2e3r4 create-group -group team
docker exec galene-1.2.1-server galenectl -insecure -server https://localhost:8443 \
-admin-username admin -admin-password q1w2e3r4 create-user -group team -user admin -permissions op
docker exec galene-1.2.1-server galenectl -insecure -server https://localhost:8443 \
-admin-username admin -admin-password q1w2e3r4 set-password -group team -user admin -password q1w2e3r4
以上命令成功时均无输出。验证(实测回显):
docker exec galene-1.2.1-server galenectl -insecure -server https://localhost:8443 \
-admin-username admin -admin-password q1w2e3r4 list-groups
docker exec galene-1.2.1-server galenectl -insecure -server https://localhost:8443 \
-admin-username admin -admin-password q1w2e3r4 list-users -l -group team
team
admin op
4.7 访问验证
curl -sk -o /dev/null -w '%{http_code}\n' https://localhost:8443/
curl -sk -o /dev/null -w '%{http_code}\n' https://localhost:8443/group/team/
200
200
浏览器访问 https://<服务器地址>:8443/group/team/,忽略自签名证书警告,用 admin / q1w2e3r4 登录即可开会。
五、数据持久化说明
| 宿主目录 | 容器内路径 | 内容 | 备份建议 |
|---|---|---|---|
./data | /opt/galene/data | 全局配置 config.json、TLS 证书(cert.pem/key.pem)、令牌库 var/tokens.jsonl | 必须备份 |
./groups | /opt/galene/groups | 会议室与用户定义(每房间一个 JSON) | 必须备份 |
./recordings | /opt/galene/recordings | 会议录制 WebM 文件 | 按需备份 |
实测持久化与重启一致性:docker compose restart 后会议室与用户完好(数据在宿主目录中);备份即打包这三个目录,恢复即放回并 chown -R 10001:10001。
六、环境变量表
Galene 运行时不使用环境变量做配置(全部通过启动参数与 JSON 配置文件)。本部署涉及的环境变量/构建参数仅一项:
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
GOPROXY | 构建参数(ARG) | https://goproxy.cn,direct | 构建期 Go 模块代理;海外网络可 --build-arg GOPROXY=https://proxy.golang.org,direct 覆盖 |
七、配置参数说明
常用启动参数(compose 的 command 即 galene 启动参数,逐项详解见《Galene 1.2 配置参数详解》):
| 参数 | 默认 | 说明 |
|---|---|---|
-http | :8443 | Web 服务监听地址(HTTPS) |
-turn | auto | 内置 TURN 地址;"" 关闭;auto 在无 ice-servers.json 时等同 :1194 |
-data / -groups / -recordings / -static | ./data 等 | 各目录位置,容器内保持默认即可 |
-udp-range | 无限制 | 收敛媒体 UDP 端口范围,便于防火墙放行 |
-insecure | 关 | 以纯 HTTP 运行(仅在反向代理终结 TLS 时使用) |
八、配置文件挂载
除目录整体挂载外,也可单独挂载配置文件实现「配置即代码」:
data/config.json:管理员与全局开关(writableGroups、canonicalHost、proxyURL等),初始内容由 4.6 的initial-setup生成,修改后无需重启容器即可生效。data/cert.pem/data/key.pem:正式 TLS 证书放入./data/即自动启用,替换后重启容器生效。data/ice-servers.json:外部 TURN/STUN 配置(NAT 环境必需),内容见常见问题 Q3。groups/<组名>.json:会议室定义可直接在宿主编辑,Galene 实时加载,无需重启。
九、等价 docker run
不使用 Compose 时,与本文 compose 配置等价的命令:
docker build -t galene:1.2.1 .
docker run -d --name galene-1.2.1-server --restart unless-stopped \
-p 8443:8443/tcp -p 1194:1194/tcp -p 1194:1194/udp \
-v /root/galene/data:/opt/galene/data \
-v /root/galene/groups:/opt/galene/groups \
-v /root/galene/recordings:/opt/galene/recordings \
galene:1.2.1 -http :8443 -turn :1194
十、常用运维命令
docker compose ps # 查看容器状态
docker compose logs -f # 跟踪服务日志
docker compose restart # 重启服务(改启动参数后)
docker compose down && docker compose up -d # 重建容器(改 compose 文件后)
docker exec -it galene-1.2.1-server galenectl -insecure list-groups # 容器内执行管理命令示例
docker compose build --no-cache && docker compose up -d # 升级版本后重建镜像
升级 Galene 版本:修改 Dockerfile 中源码包版本号 → docker compose build → docker compose up -d(数据目录保留,自动延续)。
十一、常见问题(FAQ)
Q1:构建时 Go 模块下载超时?
构建期默认走 GOPROXY=https://goproxy.cn,direct(Dockerfile 内置 ARG),可覆盖;若首行 # syntax=docker/dockerfile:1 指令因无法拉取 docker/dockerfile:1 镜像而报错,直接删除该行即可(本文 Dockerfile 已不含该行)。基础镜像拉取缓慢时给 Docker 配置镜像加速器或代理。
Q2:容器启动后配置/令牌写入失败或会议室不保存?
bind mount 目录属主未改为 10001。执行 chown -R 10001:10001 data groups recordings 后 docker compose restart。
Q3:日志出现 TURN: no public addresses / Relay test failed: i/o timeout?
实测日志:
2026/10/25 07:36:06 TURN: no public addresses
2026/10/25 07:36:26 Relay test failed: i/o timeout
2026/10/25 07:36:26 Perhaps you didn't configure a TURN server?
服务器在 NAT 后或 1194 端口未放行时内置 TURN 不可用。有公网 IP 时放行 1194/TCP+UDP;NAT 环境在 ./data/ice-servers.json 配置公网可达的 TURN(例如 coturn),并把 compose 的 command 改为 ["-http", ":8443", "-turn", ""] 关闭内置 TURN,重启容器生效。
Q4:galenectl 报 x509: certificate is not valid for any names?
自签名证书导致,命令加 -insecure;或将正式证书放入 ./data/cert.pem、key.pem 并把 -server 改为证书对应的域名。
Q5:如何在反向代理后运行?
compose 的 command 加 -insecure(纯 HTTP 由代理终结 TLS),代理需透传 /ws 的 WebSocket Upgrade,并在 data/config.json 设置 proxyURL 为外部访问地址;1194 端口仍建议容器直接暴露(媒体中继不走 HTTP 代理)。
十二、参考链接
- Galene 官方安装说明(源码内
galene-install.md):https://github.com/jech/galene - Docker Compose 官方文档:https://docs.docker.com/compose/
- 站内文档:《Galene 1.2 介绍与选型指南》https://www.quzuo.net/document/OS394POo9wtA、《Ubuntu 24.04 安装 Galene 1.2 指南》https://www.quzuo.net/document/JmXRH0x02qtd