Galene 1.2 Docker Compose 部署指南

以源码多阶段构建自建镜像的方式用 Docker Compose 部署 Galene 1.2.1:Dockerfile 与 compose 全量清单、数据持久化、管理员初始化、运维命令与常见问题,全链路实测。

GaleneGaleneDocker ComposeWebRTC2026/10/25

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:8443Web 服务监听地址(HTTPS)
-turnauto内置 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 代理)。

十二、参考链接