Docker 部署¶
本页面介绍如何使用官方镜像运行 tuic-server。客户端仍按快速入门在宿主机或其它容器中运行。
前置条件¶
- 已安装 Docker;使用 Compose 时需要 Docker Compose 插件。
- 服务器必须允许 UDP 监听端口(默认示例为
8443)。 - 一个用于存放
config.toml的宿主机目录,例如/etc/tuic。
镜像¶
镜像由 CI 从 .github/Dockerfile 构建并发布到 GitHub Container Registry:
- 同时提供
linux/amd64与linux/arm64两种架构。 latest指向最近一次发布;也可以使用对应的版本标签(例如ghcr.io/itsusinn/tuic-server:1.2.3)。镜像仅在推送v*版本标签时发布,普通分支或 PR 构建不会推送。- 镜像入口为
/usr/bin/tuic-server,默认命令为-d /etc/tuic,因此会读取挂载到/etc/tuic的配置目录。 - 容器的工作目录为
/var/lib/tuic,并设置了IN_DOCKER=true;后者让服务器在未显式指定格式时按配置文件内容推断格式,而不只依赖扩展名。 - 最终阶段基于
gcr.io/distroless/cc:包含 glibc 运行时与 CA 证书(可用于 ACME 申请),但不含 shell、包管理器及curl/wget等工具,因此无法docker exec进入容器调试。
准备配置¶
容器不包含配置文件,需要先在宿主机上生成。可以借助一次性容器调用 --init;该命令会把 config.toml 写入进程的当前工作目录,因此必须用 -w 指定到挂载目录:
mkdir -p /etc/tuic
docker run --rm -w /etc/tuic -v /etc/tuic:/etc/tuic ghcr.io/itsusinn/tuic-server --init
该命令会在 /etc/tuic 中生成一个包含 5 个随机用户的 config.toml;若当前目录已存在 config.toml,命令会报错退出,不会覆盖已有文件。你也可以从快速入门中的最小配置开始,或使用配置生成器在浏览器本地生成成对的服务器与客户端配置。
请确认 config.toml 中的 server 监听地址允许来自容器的连接,例如 [::]:8443。
运行容器¶
docker run¶
docker run -d \
--name tuic-server \
--restart unless-stopped \
-p 8443:8443/udp \
-v /etc/tuic:/etc/tuic:ro \
-v /var/lib/tuic:/var/lib/tuic \
ghcr.io/itsusinn/tuic-server:latest
-p 8443:8443/udp必须显式指定/udp;TUIC 不使用 TCP 监听端口。-v /etc/tuic:/etc/tuic:ro以只读方式挂载配置目录,与默认命令-d /etc/tuic对应。-v /var/lib/tuic:/var/lib/tuic以可写方式挂载数据目录,用于持久化data_dir(ACME 证书等);如不需要持久化可省略。- 如需使用不同的目录,请覆盖命令,例如
ghcr.io/itsusinn/tuic-server -d /config。
容器的工作目录是 /var/lib/tuic。配置中的 data_dir 默认为空,会解析为该工作目录;TLS 证书与私钥的相对路径也基于 data_dir 解析,而不是配置文件所在目录。因此配置里应使用绝对路径,或显式设置 data_dir,否则相对路径会指向容器内临时的 /var/lib/tuic。如需持久化 ACME 等数据,请把宿主机目录挂载到该路径。
Docker Compose¶
services:
tuic-server:
image: ghcr.io/itsusinn/tuic-server:latest
container_name: tuic-server
restart: unless-stopped
ports:
- "8443:8443/udp"
volumes:
- /etc/tuic:/etc/tuic:ro
- /var/lib/tuic:/var/lib/tuic
若服务器使用 ACME 自动申请证书,HTTP-01 验证还需要开放 TCP 端口 80。此时可在 ports 中追加 "80:80/tcp",或改用 network_mode: host 让容器直接使用宿主机网络。
ACME 证书会写入 data_dir。默认情况下 data_dir 为空并解析为容器内 /var/lib/tuic,属于容器可写层,容器重建后会丢失并触发重新申请。如需持久化,把宿主机目录挂载到容器内的 /var/lib/tuic 即可,无需修改 data_dir,配置目录也仍可保持 :ro。挂载示例见上文的 docker run 与 Docker Compose。
验证¶
日志应显示服务器正在监听并已准备好进行 TLS 连接。随后从本地机器向服务器发送一个 SOCKS5 请求进行验证。
排错¶
- 客户端无法连接:确认 UDP 端口已放行、端口映射包含
/udp,以及云服务商的安全组允许 UDP。 - TLS 验证失败:确认客户端
tls.sni与证书域名一致;自签名证书仅在测试时使用skip_cert_verify = true。 - ACME 申请失败:确认
80/tcp可达,且域名已正确解析到服务器。 - 无法进入容器排查:镜像基于 Distroless,不含 shell,
docker exec ... sh不可用;请使用docker logs查看日志,并通过挂载的配置目录定位问题。 - 提示证书或数据文件不存在:相对路径基于
data_dir(默认容器工作目录/var/lib/tuic)解析,而非配置文件所在目录;请改用绝对路径或设置data_dir。
通过配置验证仅表示字段有效;并不意味着 DNS、证书、防火墙或实际网络连接已通过验证。