Skip to content
返回客户端

搭建 relay 节点 ​

relay 是浏览器和原版 DDNet 服务器之间的桥:

text
浏览器 ── WebRTC DataChannel / WebSocket ──> relay ── UDP ──> DDNet 服务器

relay 只监听明文 HTTP/WS;生产环境的 HTTPS/WSS 通常由 nginx 终止。

如果 relay 所在设备无法配置 TLS,使用 WebRTC-only + HTTP 信令即可:master 会自动把 http:// 的 signalUrl 改写成 HTTPS 的 /v1/signal/<id>/rtc/offer 代理,relay 本身不需要证书。 UDP 数据仍然直连 relay。

要求 ​

  • Linux amd64(Alpine 兼容)
  • 能出站访问目标 DDNet 服务器的 UDP 端口
  • 防火墙放行 relay 的 HTTP/WS 端口,以及 WebRTC 的固定 UDP 端口
  • 生产环境需要一个域名和 nginx 证书

方式一:Docker Compose(推荐) ​

参见 使用 Docker Compose。生产 compose 直接拉取 GHCR 镜像:

text
ghcr.io/landminehq/ddnet-web-relay:latest
ghcr.io/landminehq/ddnet-web-master:latest

方式二:二进制 ​

参见 使用二进制文件。

从源码构建 ​

bash
cd relay-go

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
  go build -mod=vendor -trimpath -ldflags="-s -w" \
  -o relay ./cmd/relay

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
  go build -mod=vendor -trimpath -ldflags="-s -w" \
  -o relay-master ./cmd/master

两个产物都是静态二进制,可直接复制到 Alpine 容器。

启动 relay ​

最小启动:

bash
RELAY_HOST=0.0.0.0 \
RELAY_PORT=8390 \
RELAY_ALLOW_NO_ORIGIN=true \
./relay

生产环境应配置 token、Origin 和公网广告地址:

bash
RELAY_HOST=0.0.0.0 \
RELAY_PORT=8390 \
RELAY_TOKENS='replace-with-a-strong-token' \
RELAY_ORIGINS='https://play.example.com' \
RELAY_ALLOW_NO_ORIGIN=false \
ALLOW_PRIVATE=false \
RTC_ENABLED=true \
RTC_UDP_PORT=443 \
RTC_PUBLIC_IP='203.0.113.10' \
RELAY_MASTER_DOMAIN='https://master.landmine.top' \
RELAY_MASTER_ADVERTISE_URL='wss://play.example.com' \
./relay

常用配置 ​

变量说明
RELAY_HOST / RELAY_PORTHTTP/WS 监听,默认容器内 0.0.0.0:8390
RELAY_TOKENS客户端 token 列表;设置后 relay 不注册到 master
RELAY_ORIGINS允许的浏览器 Origin,生产必填
RELAY_ALLOW_NO_ORIGIN是否允许无 Origin 的客户端;生产建议 false
ALLOW_PRIVATE是否允许 relay 连接私网 UDP 目标,默认关闭
RELAY_ALLOWLIST额外允许的 host/IP/CIDR
RTC_ENABLED是否启用 WebRTC
RTC_UDP_PORT固定共享 ICE UDP 端口;0 表示跟随 relay TCP 端口
RTC_PUBLIC_IPNAT/1:1 映射后的公网 IP
RTC_ICE_SERVERS可选 STUN/TURN URL 列表
RELAY_MASTER_DOMAINmaster 地址,默认 https://master.landmine.top
RELAY_MASTER_ADVERTISE_URLWebSocket 注册地址 / WebRTC 信令推导 base
RELAY_MASTER_SIGNAL_URL显式 WebRTC 信令 URL(WebRTC-only 时有用)
RELAY_MASTER_TRANSPORTSwebsocket,webrtc(RTC 开启时)或 webrtc
MASTER_PUBLIC_URL(master)对外 HTTPS master 地址,用于生成信令代理链接
RELAY_MASTER_INTERVAL_MS注册/心跳间隔,默认 30000

WebRTC 与固定端口 ​

所有 WebRTC peer 共用同一个 ice.UDPMuxDefault 固定 UDP 端口,不会按用户分配端口。

开发环境可以让 TCP 和 UDP 都监听 8390:

text
RELAY_PORT=8390
RTC_UDP_PORT=8390

生产环境通常让 nginx 占 TCP 443,relay 占 UDP 443:

text
RELAY_PORT=8390
RTC_UDP_PORT=443

公网防火墙需要同时放行 TCP 443 和 UDP 443。NAT 后设置 RTC_PUBLIC_IP。

注册到 master ​

默认会注册到:

text
https://master.landmine.top/v1/register

注册使用 transports 数组。master 会逐项验证:

  • websocket:访问 <relay公网URL>/ws 做 RFC6455 握手;
  • webrtc:建立真实 WebRTC DataChannel,验证信令和 ICE。

至少一项成功才进入 /v1/serverlist。只注册 WebRTC:

bash
RELAY_MASTER_TRANSPORTS=webrtc \
RELAY_MASTER_SIGNAL_URL=https://relay.example.com/rtc/offer \
./relay

之后每 15 分钟逐项复检;某项失败只移除该项,全部失败才移除节点。

如果 relay 设置了 RELAY_TOKENS,按约定它不会注册到公共 master;同时会尝试移除之前注册过的同 URL 节点。

健康检查 ​

bash
curl http://127.0.0.1:8390/healthz
curl http://127.0.0.1:8391/healthz

反向代理 ​

Go relay 不做 TLS。生产使用 deploy/nginx.conf 或等价配置:

  • /udp/、/ws、/healthz、/api/、/rtc/ → relay 127.0.0.1:8390
  • /relay-master/ → master 127.0.0.1:8391
  • 静态站点 → dist/web
  • WebRTC UDP → relay 的固定 UDP 端口

DDNet Web — 浏览器 DDNet 客户端与 relay 节点