relay-rs 是一套集中式 TCP/UDP 中继系统。relay-master 控制面(Postgres 存储、mTLS gRPC、axum 管理面板 + Discourse SSO)将期望状态推送给一个或多个 relay-node 数据面;节点负责接受客户端连接并转发至上游。
┌────────────────────┐
│ relay-master │ 控制面
│ 管理面板 :9090 │ (Postgres, JWT/SSO)
│ gRPC mTLS :9443 │
└─────────┬──────────┘
│ 下发 segment 配置 / 心跳
▼
┌───────────┐ ┌───────────┐ ┌───────────┐
│ relay-node│ │ relay-node│ │ relay-node│ 数据面
└───────────┘ └───────────┘ └───────────┘ (TCP/UDP 中继)
curl -fsSL "https://raw.githubusercontent.com/allo-rs/relay-rs/main/scripts/install-master.sh?$(date +%s)" | bash安装脚本会下载 relay-master 二进制、自动创建 Postgres 数据库(通过 Docker,或复用已有的 DATABASE_URL)、生成 CA、写入 /etc/relay-rs/relay-master.env,并启动 relay-master.service。
在 master 主机上生成一次性注册 token:
relay-master node-add --name edge-1在节点主机上执行:
bash <(curl -fsSL https://raw.githubusercontent.com/allo-rs/relay-rs/main/scripts/install-node.sh) \
--master https://master.example.com:9443 \
--ca-b64 "$(cat /etc/relay-rs/relay-ca.b64)" \
--enrollment-token <node-add 输出的 token> \
--node-name edge-1访问 http://<master>:9090(生产环境建议在反向代理处终止 TLS,并相应设置 RELAY_PANEL_EXTERNAL_URL)。
relay-master— 控制面。以 Postgres 为单一数据源,对节点暴露 gRPC mTLS API,并提供管理面板。面板通过 Discourse SSO 认证,使用 JWT 签发会话。relay-node— 数据面。注册时获取 mTLS 客户端证书,持续与 master 同步期望状态,并绑定 TCP/UDP 监听端口将流量转发至上游。relay-proto— 两个二进制共用的 protobuf / tonic 桩代码。
relay-master 从 /etc/relay-rs/relay-master.env 读取配置:
| 变量 | 说明 |
|---|---|
DATABASE_URL |
Postgres 连接字符串(必填) |
RELAY_MASTER_CA_DIR |
CA 及服务端证书目录 |
RELAY_MASTER_TOKEN_DIR |
注册 token 存放目录 |
RELAY_MASTER_LISTEN |
gRPC mTLS 监听地址(如 0.0.0.0:9443) |
RELAY_MASTER_HOSTNAME |
服务端证书 SAN 列表,逗号分隔 |
RELAY_PANEL_LISTEN |
管理面板 HTTP 监听地址(如 0.0.0.0:9090) |
RELAY_PANEL_EXTERNAL_URL |
面板对外访问的公网 URL |
RELAY_PANEL_JWT_SECRET |
32 字节 hex 密钥,用于签发面板会话 |
RELAY_MASTER_PUBLIC_URL |
可选;覆盖面板向节点通告的 master 地址 |
relay-node 从 /etc/relay-rs/relay-node.env 读取配置:
| 变量 | 说明 |
|---|---|
MASTER_ADDR |
master 的 gRPC 地址(如 https://master:9443) |
NODE_STATE_DIR |
节点证书及状态文件存放目录 |
MASTER_CA_PEM_B64 |
(仅注册时)master CA 的 base64 PEM |
ENROLLMENT_TOKEN |
(仅注册时)node-add 生成的一次性 token |
NODE_NAME |
(仅注册时)节点可读名称 |
# 编译全部 crate
cargo build --workspace
# 对生产 crate 执行 clippy
cargo clippy -p relay-proto -p relay-master -p relay-node -- -D warnings
# 单元测试
cargo test --workspace
# 应用 SQL 迁移到本地 Postgres
for f in crates/master/migrations/*.sql; do
psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f "$f"
done
# 构建前端(需要 Bun)
cd panel && bun install && bun run build端到端 smoke 测试(未设置 DATABASE_URL 时自动在 Docker 中启动 Postgres,随后运行 master + node 并验证 TCP 转发):
bash scripts/smoke.shMIT