SMN Relayer 部署
SMN Relayer 为部署和运行在服务端的 P2P 通信中间件,用于不同 MPC Node 之间的通信。Relayer 依赖 Redis 中间件维护 Relayer 集群状态,因此在部署 Relayer 前开发者需要准备 Redis 实例或者 Redis Cluster。
交付物
| 交付物 | 说明 |
smn-relayer:X.Y.Z | relayer docker 镜像 |
| relayer.toml | relayer 配置文件模版 |
运行环境和依赖
| 类型 | 规格 | 说明 |
| Docker 运行环境 | 最小规格要求:2 CPU、4 G内存、20 G 存储 | 用于运行 Relayer docker 镜像 |
| Redis | 版本 ≥ 7.0,RAM ≥ 1 G | 用于缓存中间数据和 relayer 集群间通信。当前版本支持单机 Redis 和 Redis Cluster 模式 |
| RemoteParty 信息 | - | 需要提前准备好 SMN Service 配置信息,在配置 Relayer 时需要 SMN Service 的公钥 |
准备配置文件
我们在用户目录下准备一个文件夹 relayer:
cd ~
mkdir relayer && cd relayer && mkdir logs && mkdir preStop
touch relayer.toml在 relayer 中创建的 relayer.toml 内容如下,修改配置文件中 redis 等相关配置为开发者的配置:
# 公网接口,通过此端口只能访问 /sendandreceive 和 /websocket
[RelayerServer]
# 服务监听端口
Port = 9001
# Relayer 会向 Embedded MPC Node 提供 /sendandreceive 接口进行 HTTP 通信,
# 如果在浏览器端访问该接口时需要该接口允许跨域访问,开发者可以配置多个域,并且支持使用通配符 *
# 比如 CorsOriginPattern = ['xxx.com', '*.xxx.com', 'http://xxx.com', 'https://xxx.com']
# 如果列表为空,则禁止 /sendandreceive 接口被跨域访问
# 如果开发者使用了自己的网关产品,则需要检查网关是否需要额外对跨域进行配置
CorsOriginPattern = []
# 内部应用调用接口,包含所有 API,如 /sendandreceive 以及 /websocket 和 OTT 相关 token 接口,及 /check 接口
# 不可以和 RelayerServer.Port 使用同一个端口
[APIServer]
Port = 8070
[MessageCache]
# Time-to-live,消息存活时间,支持 s 和 m 秒和分钟,如 300s,5m
TTL = '5m'
[Redis]
# Redis 模式,单机模式:Single,集群模式:Cluster
# 如果使用了 Proxy 模式的 Cluster 集群服务,这里使用 Single 模式即可
# 如果使用 Aliyun 的 Proxy 模式的 Cluster 集群服务,需要在控制台修改 script_check_enable=0
Mode = 'Single'
# Signle 和 Cluster 如需用户名和密码都在这里配置
# Redis 用户名,如果为空,使用 '' 即可
Username = ''
# Redis 密码,未设置密码时使用 '' 即可
Password = ''
# 以下为 Single 配置项
# Redis 节点地址,如果需要支持 TLS 请使用 rediss 前缀
Address = 'redis://127.0.0.1:6379'
# Redis 数据库编号
Database = 0
# 以下为 Cluster 配置项
# 读取操作模式,主节点读:Master,从节点读:Slave
ReadMode = 'Master'
# 订阅模式,订阅主节点:Master,订阅从节点:Slave
SubscriptionMode = 'Master'
# 集群节点地址,所有 Master 节点和 Slave 节点地址
# 或者配置单个 Master 节点,Relayer 将会根据单个 Master 节点发现其他 Master/Slave 节点
Addresses = ['redis://127.0.0.1:6370','redis://127.0.0.2:6371','redis://127.0.0.3:6372']
# MPC Node Service 的 Party 信息
[[RemoteParty]]
# ID 的取值范围为 [1,2,3,4,5,6,7,8,9]
ID = 1
# 必填, 16 进制字符串编码的公钥,用于鉴权 MPC Node 连接
PublicKey = ''
[Log]
# 日志级别,支持 Debug、Info、Warning、Error、Off 等级,其中 Off 为不输出日志
Level = 'Info'
Filepath = '/opt/logs'使用 docker 启动 relayer
在 relayer 文件夹内,使用以下命令启动 relayer,日志存储在当前目录 logs 文件夹下:
cd ~/relayer
docker run \
-d \
--rm \
-p 9001:9001 \
-p 8070:8070 \
-v $(pwd)/relayer.toml:/opt/safeheron/relayer.toml \
-v $(pwd)/logs:/opt/logs \
-v $(pwd)/preStop:/opt/safeheron/preStop \
-v /etc/localtime:/etc/localtime:ro \
--name relayer \
smn-relayer:X.Y.Z使用以下命令查看 relayer 日志输出:
tail -f logs/web_info.log使用一下命令查看 relayer 是否正常启动,如果正常启动则返回 HTTP 状态码为 200:
curl 127.0.0.1:8070/check -v使用以下命令停止容器:
docker stop relayer至此,SMN Relayer 部署完成。开发者需要记录 Relayer 所在服务器 IP,在部署 MPC Node Service 或者集成 Embedded MPC Node 是需要依赖 Relayer 的通信地址:ws://ip:9001。
更新 relayer
在更新 relayer 前准备好需要更新的 smn-relayer 镜像,更新流程为停止当前正在运行的 docker 容器,使用新镜像启动即可。停止当前运行的容器:
docker stop relayer在包含配置文件 relayer.toml 的文件夹中启动容器,注意,需要使用新镜像的 tag:
cd ~/relayer
docker run \
-d \
--rm \
-p 9001:9001 \
-p 8070:8070 \
-v $(pwd)/relayer.toml:/opt/safeheron/relayer.toml \
-v $(pwd)/logs:/opt/logs \
-v $(pwd)/preStop:/opt/safeheron/preStop \
-v /etc/localtime:/etc/localtime:ro \
--name relayer \
smn-relayer:X.Y.Z使用以下命令查看 relayer 日志输出:
tail -f logs/web_info.log使用以下命令查看 relayer 是否正常启动,如果正常启动则返回 HTTP 状态码为 200:
curl 127.0.0.1:8070/check -v高可用和扩容

Relayer 的集群部署模式如上图所示,同一个 Relayer 集群通过同一个 Redis/Redis Cluster 维护 Relayer 自身集群状态,因此只需要使用相同的配置启动多个 Relayer,通过负载均衡器代理 Relayer 服务即可。
Relayer 通过部署多实例的方式提供高可用服务以及通过横向增加实例的方式进行扩容。在部署多个 Relayer 实例时,这些实例必须都连接相同的 Redis ,并且使用相同的配置项,如 TTL、SMN Service 公钥等。
Relayer 服务端口分为 APIServer 端口(默认为 8070)和 RelayerServer 端口(默认为 9001),其中 APIServer 端口具有所有 API 权限,为了保证安全,仅在内网开放,或挂载到内网负载均衡器;RelayerServer 端口仅支持通信消息的收发,可向公网开发。
Load Balance 本身的高可用和扩容一般由云厂商 Load Balance 类产品或者成熟的负载均衡产品提供。Redis 通过单机主从/多副本架构,或者 Cluster 多主多从/多副本方式实现高可用,依托 Redis 自身分片的机制实现扩容。
文档变更记录
2024-03-21 1.1.0 版本更新
- 增加 APIServer.Port 配置项
- Docker 启动命令增加 preStop 目录挂载,暴露 8070 端口
- 服务健康检查端口统一使用 8070 端口
- 更新高可用和扩容章节中的图示及端口挂载描述