DIRECTION
RFC
RFC-001:产品定位
Decision:
OrbitMesh 定位为一站式网络基础设施控制平面。
Reason:
目标用户需要稳定、可观测、可编排的网络基础设施能力,而不是传统流媒体代理订阅。
RFC-002:Control Plane / Data Plane 分离
Decision:
Control Plane 不进入用户流量路径。
Reason:
提高可扩展性,避免控制平面故障影响已有流量。
RFC-003:Edge Runtime Pull 模式
Decision:
Node 上的 Edge Runtime 主动连接控制平面并拉取配置。
Reason:
支持 BYOH、NAT、防火墙环境,不需要控制平面 SSH Node host。
RFC-004:BYOH First
Decision:
第一阶段优先支持用户自带主机。
Reason:
降低平台成本,避免公网出口费用过高,适合早期技术用户。
RFC-005:Runtime 可替换
Decision:
sing-box 是 MVP Traffic runtime,但产品模型不绑定 sing-box。
Reason:
未来会支持 Xray、EasyTier、Tailscale、Traefik、frp、NGINX、Envoy、WireGuard 等 Runtime Plugin。
RFC-006:Desired State
Decision:
Control Plane 保存 Desired State,Compiler 生成 runtime config。
Reason:
避免业务模型和具体 runtime 配置耦合。
RFC-007:Service-aware Routing
Decision:
Traffic routing 围绕 GitHub、Docker、OpenAI、Anthropic 等开发者服务建模。
Reason:
专业用户关心服务体验,而不是出口名称。
RFC-008:多租户优先
Decision:
从第一版开始所有租户资源都保留 tenant_id。
Reason:
Personal、Team、Enterprise 都以租户为边界。
RFC-009:配置回滚
Decision:
Edge Runtime 必须保留 last known good config。
Reason:
配置错误不能导致 runtime 不可用。
RFC-010:日志最小化
Decision:
默认不记录用户访问 URL,不记录敏感 token。
Reason:
降低隐私和安全风险。
RFC-011:Traffic Role 替代 Ingress / Egress Gateway
Decision:
不再把 Ingress Gateway 和 Egress Gateway 作为 OrbitMesh 顶层产品资源。
正式模型:
Node
CapabilityBinding: traffic.entry / traffic.exit / traffic.relay
RuntimeBinding: sing-box / xray / ...
Endpoint: public or private reachable address
Reason:
Ingress / Egress 作为泛化 Gateway 资源会把 OrbitMesh 固化成 sing-box traffic panel,无法自然表达 Mesh、Gateway、Tunnel、多 runtime、多 capability 和 endpoint 绑定。
Entry / Exit / Relay 是 Traffic Capability 内部角色;sing-box 是实现这些角色的 Runtime Plugin。
Migration:
这是破坏性模型升级。旧 gateway type 数据通过 SQL 迁移为 capability role,不做 API alias,不做程序 fallback。
RFC-012:Device-bound Edge Runtime Identity
Decision:
Edge Runtime 身份绑定到设备本地生成的长期 device identity。Deployment token 只是 enrollment / re-enrollment 授权,不是设备身份。edge_secret 不作为长期身份凭据,也不做兼容保留。
Reason:
控制平面生成并下发的共享 secret 可以被复制,不能证明同一个 Node 只由同一台设备运行。设备应在本地生成不可外发私钥,注册时提交公钥和设备指纹,后续 Runtime API 使用请求签名。重新生成 deployment token 后,同一设备可以重新注册并复用原身份;不同设备必须创建新身份,除非未来实现显式 replace/reset 操作。
RFC-013:Edge Runtime CLI / Daemon 分离
Decision:
Edge Runtime 长期形态拆分为 orbitmesh CLI 和 orbitmeshd daemon。orbitmeshd 作为 systemd 管理的长期进程负责身份、心跳、Desired State 同步、Runtime Apply 和自动更新;orbitmesh 作为本地命令通过 Unix Socket 调用 daemon。
Reason:
CLI 和 daemon 分离可以避免用户命令直接修改 daemon 状态,便于实现手动更新、自动更新、诊断命令、包管理器安装和权限边界,也符合 Linux 主机 agent 的常见运维模型。
RFC-014:Edge Runtime Managed Updates
Decision:
Edge Runtime 更新必须基于 release manifest、checksum、签名、安装方式记录和更新策略。支持 standalone、package、container 三类安装方式;standalone 使用版本目录和原子 symlink 切换,package 使用系统包管理器,container 不做自更新。
Reason:
直接覆盖 latest 二进制无法表达版本、渠道、兼容性、校验、灰度和回滚。manifest + install method 能同时支持快速安装、自动更新、手动更新、企业受控发布和未来包仓库分发。
RFC-015:Domain and Certificate Automation
Decision:
ACME、域名分配和证书生命周期是 OrbitMesh Endpoint 基础能力,必须前置于 Traffic subscription 输出。系统必须同时支持平台级默认证书和租户级自定义域名证书。
Reason:
Trojan 依赖 TLS。若 subscription 直接生成协议配置而没有稳定的证书与域名资源模型,后续会在 sing-box、Traefik、Console 和用户配置之间产生重复 TLS 参数和不一致状态。把域名、证书和 endpoint 抽象为 Control Plane 资源后,runtime adapter 只消费 Domain / Certificate / Endpoint,subscription 只消费已就绪的 public endpoint。
Boundary:
- 系统级能力由平台管理,负责默认 endpoint 名称、默认证书申请、续期和状态同步。
- 租户级能力由用户配置,支持自定义域名、DNS 校验、托管证书和 ACME 自动申请续期。
- 控制面保存域名、证书元数据、状态和 secret 引用;不在业务表明文保存私钥。
- 私钥材料优先在 Node 本地或外部 secret manager 中生成和保存。Control Plane 只下发引用、路径或 ACME 配置。
- Traffic Entry、Gateway Endpoint、Tunnel Endpoint 和 future Traefik adapter 必须复用同一套证书资源,不允许各自实现证书申请状态机。
RFC-016:Breaking Model Alignment
Decision:
暂停新增功能开发,优先完成现有 Traffic MVP 对齐。
Scope:
- Documentation。
- SQL migration。
- Ent schema。
- Proto and OpenAPI。
- Control Plane services。
- Edge Runtime protocol。
- Console routes and labels。
Reason:
继续在旧模型上叠加功能会放大后续迁移成本。先完成现有功能对齐,后续 Mesh、Gateway、Tunnel 和更多 Runtime Plugin 才能自然扩展。
Open Questions
- Mesh Capability 首个 runtime 是否选择 EasyTier。
- Gateway Capability 首个 runtime 是否选择 Traefik。
- Tunnel Capability 首个 runtime 是否选择 frp 还是 Cloudflare Tunnel。
- Prometheus 指标接入放在生产硬化阶段还是 Team 版本。