一台主机,任意多台副机
m-ui 从设计上就是多服务器的 sing-box 面板,不是后加的插件。每台服务器跑同一个二进制;一台是主机负责算账,其余只管转发。

角色
| 主机 | 副机 | |
|---|---|---|
| 面板 | 完整:线路、用户、上游、代理、设置 | 只读展示主机下发的内容;本机设置、证书、日志可改 |
| 数据面 | 内嵌 sing-box,跑自己的线路 | 内嵌 sing-box,跑部署到它的线路 |
| 算账 | 汇总各机流量,判定配额、到期、设备数 | 每个用户一个单调计数器,上报增量 |
| 订阅 | 提供订阅(副机也可以,数据一样) | 同样的数据、同样的格式 |
接入一台副机
- 在新服务器上用同一条安装命令装 m-ui。
- 在它的面板里 设置 → 作为副服务器运行,配对卡片里有它的 API 地址与令牌。
- 回到主机 服务器 → 新增服务器,贴上地址和令牌,起个名字,填域名或 IP。副机证书各自签发(自签就行)。
就这些。五秒内副机显示 在线 · 已同步,开始跑部署到它的线路。
同步什么、怎么同步
主机每 5 秒构造一份快照 —— 线路、上游、带凭据的用户、用户↔线路分配、外部节点、代理、订阅相关设置 —— 哈希成一个修订号,并发推给所有副机。已经是这个修订号的副机什么都不做;不是的就应用并重载数据面,用的是和主机一样的三级重载:改用户只换入站用户表,改上游只换出站,只有改线路才重启 sing-box(起不来则回滚)。
同一轮里主机再拉每台副机的报告:自上次游标以来的流量、每个用户的在线源 IP、版本、内核状态、证书剩余天数。某台机器慢或失联只耽误它自己,其它机器按时同步。
跨服务器的流量、配额与设备数
- 流量只记一次。副机保存每用户的单调计数器;主机为每台副机存一个游标,只加增量。副机重装(计数器归零)会被识别并重新对齐,不会重复计费。
- 配额与到期只在主机判定。用完的用户在下一份快照里就不存在了,几秒内所有服务器都不再服务他。
- 设备数是所有服务器上不同源 IP 的总数。主机合并各机的在线 IP,再把"别处看到的 IP"下发给每台机器,所以上限 3 意味着总共 3 台设备,不是每台服务器 3 台。
多服务器时的订阅
部署到 N 台服务器的线路在用户订阅里出现 N 次,命名为 线路 – 服务器,各用自己的域名或 IP。Clash、sing-box 和通用链接的客户端按延迟选,或者让用户自己挑。给线路加一台服务器,所有人的订阅下次刷新就多出节点 —— 不用逐个改用户。只想让某个用户、某个套餐或某个代理拿一条线路在某一台服务器上的入口时,勾那个入口而不是整条线路,订阅里就只出那一个。
副机掉线时
- 副机拿着手里的配置照常转发,上面的用户没有感觉。
- 主机把它标为离线,配置了 Telegram 的话一分钟后告警,之后每 5 秒继续尝试。
- 它回来后,游标从断点继续补齐流量,当前快照重新推送。中间被停用的用户在这次推送里被移除。
流量倍率
每台服务器有一个倍率(默认 1)。走倍率 2 的服务器,流量按两倍计入用户配额 —— 适合专线或带宽贵的机器。时序图表记的仍是真实字节,只有用户的配额计量被放大。