refactor: 枚举移入Models目录,命名空间更新为Rainbow.Entity.Models
大石头 authored at 2026-07-02 12:54:58
19.17 KiB
RainbowBridge
# Rainbow 架构设计 > 版本:v2.2 | 日期:2026-07-03 | [← 返回 README](/NewLife/RainbowBridge/Blob/master/Doc/../README.md) > > 需求对应:[需求文档](/NewLife/RainbowBridge/Blob/master/Doc/需求文档.md) | 功能清单:[功能模块清单](/NewLife/RainbowBridge/Blob/master/Doc/功能模块清单.md) --- ## 1. 架构概览 Rainbow 采用**前后端分离 + Cube 后台 + 数据库驱动 + 跨平台适配**架构(StarChat 模式)。Linux 全功能主力,dnsmasq 为 DNS/DHCP 核心,通过 `IDhcpDnsAdapter` 接口预留自研服务器扩展能力。 ``` 用户浏览器 ├── / → React SPA(仪表盘/终端/WAN/DNS/防火墙) ├── /admin → Cube 魔方后台(用户/角色/日志/系统配置) ├── /api/* → RESTful JSON API └── 拦截页(:9080) → DNS 拦截提示页(独立端口) ───────────────────────────────────────────────────────── ┌─────────────────────────────────────────────────────────┐ │ React 前端(Web/) │ │ Vite + TypeScript + TailwindCSS + 星语UI规范 │ │ Dashboard │ 终端 │ 多WAN │ DNS │ 防火墙 │ 设置 │ ├─────────────────────────────────────────────────────────┤ │ Rainbow.Web(双入口:API + Cube) │ │ ┌──────────────────┐ ┌──────────────────────────────┐ │ │ │ RESTful API │ │ Cube /admin 后台 │ │ │ │ [ApiController] │ │ [EntityController] │ │ │ │ /api/system │ │ /admin 用户/角色/日志/配置 │ │ │ │ /api/devices │ │ 菜单+权限+审计 │ │ │ │ /api/dns/rules │ │ │ │ │ └──────────────────┘ └──────────────────────────────┘ │ │ + 拦截页服务(:9080,DNS 阻断时展示提示页) │ ├─────────────────────────────────────────────────────────┤ │ XCode 实体层(Rainbow.Data) │ │ Model.xml → xcode 生成实体类(14+ 表) │ │ Device / DnsRule / DnsBlacklist / DhcpBinding ... │ │ Services: ShellExecutor / DnsmasqManager / WanManager │ │ Adapters: IOSAdapter / IFirewallAdapter / IDhcpDnsAdapter │ ├─────────────────────────────────────────────────────────┤ │ SQLite 数据库(Rainbow.db) │ ├─────────────────────────────────────────────────────────┤ │ 系统层(按平台适配) │ │ Linux: pppd / dnsmasq / iptables / iproute2 / /proc │ │ Windows: netsh / Get-NetAdapter / WMI / perf counters │ │ macOS: pfctl / networksetup / sysctl / bootpd │ └─────────────────────────────────────────────────────────┘ ``` ### 1.1 项目组成 | 项目 | 类型 | 框架 | 说明 | |------|------|------|------| | `Rainbow.Data` | 类库 | net6.0 + XCode | 实体(Model.xml)+ Services + 跨平台适配器 | | `Rainbow.Web` | Web API + Cube | net10.0 | RESTful API + Cube /admin + StarAgent | | `Web/` | 前端 | React 19 + Vite + TailwindCSS | SPA 前端,星语UI规范 | | `XUnitTest` | 测试 | net10.0 + xUnit | 单元测试 / 集成测试 / E2E | ### 1.2 核心设计决策 | 决策点 | 选择 | 理由 | |--------|------|------| | 前端框架 | React 19 + Vite + TailwindCSS | 前后端分离,现代化 UI,星语UI规范 | | 后台管理 | Cube /admin(StarChat 模式) | RBAC/菜单/日志/配置开箱即用 | | 数据层 | XCode ORM + SQLite + Model.xml | 建模即代码,零配置 | | 系统交互 | ShellExecutor + Sudo 白名单 | 安全执行系统命令,跨平台命令适配 | | DNS/DHCP | dnsmasq(Linux 主力),接口预留自研 | 当前依托成熟稳定的 dnsmasq,`IDhcpDnsAdapter` + `DhcpDnsConfig` 接口设计确保未来可替换 | | DNS 拦截 | DNS 重定向 + iptables REDIRECT + 独立端口拦截页 | 不影响 Rainbow 主服务 | | 进程守护 | StarAgent | 自动发现/崩溃重启/远程管理 | | 跨平台 | Linux 全功能 / Windows P1 / macOS P2 | 按平台成熟度分期覆盖,通过适配器接口统一 | ### 1.3 DnsmasqManager 配置同步数据流 ``` Web 配置(DnsRule/DnsBlacklist/DhcpPool/DhcpBinding) ↓ CRUD 钩子自动触发 DnsmasqManager.ApplyAsync() ↓ 从 SQLite 读取全量配置 生成 /etc/dnsmasq.d/rainbow.conf ↓ 写入磁盘 systemctl reload dnsmasq(或 kill -HUP) ↓ 零停机重载 dnsmasq 生效 → 设备 DHCP 分配到正确 IP/DNS ``` DNS 黑名单命中统计: ``` dnsmasq 查询日志(/var/log/dnsmasq.log) ↓ TimerX 每分钟增量解析 匹配 DnsBlacklist 域名 → 批量更新 Hits + LastHit ↓ /api/dns/blacklist/stats 返回真实拦截数据 ``` --- ## 2. 数据模型(Model.xml) ### 2.1 Entity 目录结构 ``` Rainbow.Data/ ├── Model.xml ← 数据模型定义 ├── Entity/ ← xcode 自动生成 │ ├── 设备.cs / 设备.Biz.cs │ ├── WAN接口.cs / WAN接口.Biz.cs │ ├── PPPoE账号.cs / PPPoE账号.Biz.cs │ ├── DHCP地址池.cs / DHCP地址池.Biz.cs │ ├── DNS规则.cs / DNS规则.Biz.cs │ ├── 防火墙规则.cs / 防火墙规则.Biz.cs │ ├── 网络日志.cs / 网络日志.Biz.cs │ └── 配置快照.cs / 配置快照.Biz.cs ├── Services/ │ ├── ShellExecutor.cs ← 跨平台命令执行 │ ├── SudoWhitelist.cs │ ├── ShellAuditLogger.cs │ ├── ConfigBackup.cs │ ├── MonitorCollector.cs │ ├── WanManager.cs │ ├── PppManager.cs │ ├── DnsmasqManager.cs ← 配置同步 + DHCP tag(本次迭代核心) │ ├── DhcpDnsConfig.cs ← 结构化配置 DTO(接口预留) │ ├── FirewallManager.cs │ ├── IOSAdapter.cs ← 系统监控接口 + Debian/Windows/Mac 实现 │ ├── AdapterFactory.cs ← 平台感知适配器工厂 │ ├── FirewallAdapters.cs ← IFirewallAdapter + Iptables/Nftables │ ├── DhcpDnsAdapters.cs ← IDhcpDnsAdapter + Dnsmasq/Systemd/Bind9 │ ├── INetworkRouteManager.cs ← 路由管理接口(新增) │ ├── INetworkStatProvider.cs ← 流量统计接口(新增) │ ├── INetworkInterfaceManager.cs ← 网口管理接口(新增) │ ├── Windows/ ← Windows 平台适配器(P1) │ └── Mac/ ← macOS 平台适配器(P2) └── Models.cs ← DTO 模型类 ``` ### 2.2 核心表设计 详见 `Rainbow.Data/Model.xml`: | 表名 | 中文 | 主键 | 关键索引 | |------|------|------|---------| | Device | 设备 | Id (Int64, 雪花) | MacAddress UNIQUE | | WanInterface | WAN接口 | Id (Int32 自增) | Name UNIQUE | | PppoeAccount | PPPoE账号 | Id (Int32 自增) | InterfaceName UNIQUE | | DhcpPool | DHCP地址池 | Id (Int32 自增) | | | DnsRule | DNS规则 | Id (Int32 自增) | Domain | | FirewallRule | 防火墙规则 | Id (Int32 自增) | RuleType, IsEnabled | | NetworkLog | 网络日志 | Id (Int64, 雪花) | CreateTime | | ConfigSnapshot | 配置快照 | Id (Int32 自增) | CreateTime | --- ## 3. API 设计 ### 3.1 控制器结构(Rainbow.Web/Controllers/) ``` Controllers/ ├── HealthController.cs [Route("api/health")] ├── SystemController.cs [Route("api/system")] ├── DashboardController.cs [Route("api/dashboard")] ├── DeviceController.cs [Route("api/devices")] ├── WanController.cs [Route("api/wan")] ├── PppoeController.cs [Route("api/pppoe")] ├── DhcpController.cs [Route("api/dhcp")] ├── DnsController.cs [Route("api/dns")] ├── FirewallController.cs [Route("api/firewall")] ├── BackupController.cs [Route("api/backup")] └── LogController.cs [Route("api/logs")] ``` ### 3.2 API 规范 - 所有接口返回 JSON,使用 `ActionResult<T>` 或 `IActionResult` - 成功返回 `Ok(data)`,失败返回 `BadRequest(new { error = "..." })` - 控制器继承 `ControllerBase`,使用 `[ApiController]` 特性 - 参考 StarChat Controller 模式:构造函数注入服务 ### 3.3 关键接口示例 ```csharp [ApiController] [Route("api/devices")] public class DeviceController : ControllerBase { [HttpGet] public ActionResult<List<Device>> GetDevices() { ... } [HttpPost("{mac}/block")] public async Task<ActionResult> BlockDevice(String mac) { ... } [HttpPut("{mac}/alias")] public async Task<ActionResult> UpdateAlias(String mac, [FromBody] AliasDto dto) { ... } } ``` --- ## 4. 前端架构(Web/) ### 4.1 目录结构 ``` Web/ ├── src/ │ ├── App.tsx ← 路由 + 布局 │ ├── main.tsx ← 入口 │ ├── pages/ ← 页面组件 │ │ ├── Dashboard.tsx │ │ ├── Devices.tsx │ │ ├── WanPage.tsx │ │ ├── PppoePage.tsx │ │ ├── DhcpPage.tsx │ │ ├── DnsPage.tsx │ │ ├── FirewallPage.tsx │ │ └── SettingsPage.tsx │ ├── components/ ← 通用组件 │ │ ├── GaugeChart.tsx │ │ ├── TrafficChart.tsx │ │ └── StatusCard.tsx │ ├── lib/ ← API 调用 + 工具 │ │ ├── api.ts │ │ └── theme.ts │ ├── stores/ ← Zustand 状态管理 │ └── styles/ ← TailwindCSS + 主题变量 ├── package.json ├── vite.config.ts └── tsconfig.json ``` ### 4.2 设计规范 遵循 `星语UI规范.md` 三大核心维度: - **玻璃拟态**:半透明磨砂背景 + 细边框 + 柔和阴影 - **品牌渐变**:主色调 `#5B5BFF → #8B5CF6` - **微动效**:hover 上浮、Modal scaleIn、Toast slideInRight --- ## 5. 开发工作流 ### 5.1 数据建模 1. 编辑 `Rainbow.Data/Model.xml` 定义表结构 2. 执行 `xcode Rainbow.Data` 生成实体类到 `Entity/` 3. 实体类即拥有完整 CRUD 能力 ### 5.2 API 开发 1. 在 `Rainbow.Web/Controllers/` 创建 API 控制器 2. 注入 Service 和 XCode 实体 3. 接口从数据库读取 → 必要时执行系统命令 → 返回 ### 5.3 前端开发 ```bash cd Web pnpm install pnpm dev # 开发服务器(默认代理到 http://localhost:8080) pnpm build # 生产构建 → Web/dist/ ``` --- ## 6. 部署 ```bash # 1. 构建后端 dotnet publish -c Release -o /opt/rainbow Rainbow.Web/ # 2. 构建前端 cd Web && pnpm build && cp -r dist /opt/rainbow/wwwroot/ # 3. sudo 白名单 cp deploy/rainbow.sudoers /etc/sudoers.d/rainbow # 4. StarAgent 自动发现并守护 ``` --- (完) ``` ┌──────────────────────────────────────────────────────────────────┐ │ Web 表现层(NewLife.Cube MVC) │ │ Dashboard │ 多WAN │ PPPoE │ DHCP/DNS │ 防火墙 │ IPv6 │ │ VLAN │ 静态路由 │ VPN(WireGuard/OpenVPN) │ 防沉迷 │ │ 认证登录 │ SSO │ RBAC │ 操作日志 │ 系统设置 │ ├──────────────────────────────────────────────────────────────────┤ │ 桥接服务层(Rainbow.Data) │ │ ShellExecutor · WanManager · PppManager │ │ DnsmasqManager · FirewallManager · VlanManager │ │ RouteManager · VpnManager · MonitorCollector │ │ DeviceTracker · ConfigBackup │ ├──────────────────────────────────────────────────────────────────┤ │ Linux 网络层(Linux Kernel) │ │ pppd · dnsmasq · iptables/nftables · iproute2 · wireguard │ │ /proc /sys · conntrack · StarAgent · openvpn │ └──────────────────────────────────────────────────────────────────┘ ``` ### 1.1 项目组成 | 项目 | 类型 | 目标框架 | OutputType | 说明 | |------|------|---------|-----------|------| | `Rainbow.Data` | 类库 | netstandard2.0 | Library | 配置类(`Config<T>`)、数据模型、桥接服务实现 | | `Rainbow.Web` | Cube MVC 应用 | net10.0 | Exe | Web 管理界面,集成 Cube 全功能认证+SSO | | `XUnitTest` | 单元测试 | net10.0 | Library | xUnit,覆盖桥接服务层核心逻辑和配置类 | ### 1.2 NuGet 依赖链(仅 NewLife 系列) ``` Rainbow.Web ──→ NewLife.Cube.Core ──→ NewLife.Core │ ├── NewLife.Remoting │ └── NewLife.Stardust.Extensions └──→ Rainbow.Data ──→ NewLife.XCode ──→ NewLife.Core └── NewLife.Stardust ``` ### 1.3 模块关系 ``` Rainbow.Web (Areas/) ├── Admin/ │ ├── HomeController 仪表盘 │ └── SystemController 系统设置 └── Network/ ├── WanController 多WAN ├── PppoeController PPPoE ├── DhcpController DHCP ├── DnsController DNS ├── FirewallController 防火墙 ├── VlanController VLAN ├── RouteController 静态路由 ├── VpnController VPN └── MonitorController 实时监控 │ DI Rainbow.Data ──→ ShellExecutor/WanManager/DnsmasqManager/... │ sudo + 文件 IO Linux 网络栈 ──→ pppd/dnsmasq/iptables/iproute2/wireguard/openvpn ``` ### 1.4 核心设计决策 | 决策点 | 选择 | 理由 | |--------|------|------| | Web 框架 | NewLife.Cube(MVC) | RBAC + SSO + 菜单 + CRUD 开箱即用 | | 分层 | 两层(Web + Data) | 单入口应用,复杂度在桥接服务层 | | 多 WAN | iproute2 策略路由 | 内核原生,比 mwan3 更底层可控 | | IPv6 | dnsmasq DHCPv6 + RA + ip6tables | 与 IPv4 统一入口 | | VLAN | `ip link type vlan` | 内核原生 802.1Q | | VPN | WireGuard(优先)+ OpenVPN | 性能与兼容性兼顾 | | 进程守护 | StarAgent | 自动发现/崩溃重启/远程管理/零配置 | | 数据持久化 | SQLite + `Config<T>` JSON | 轻量零配置,配置热更新 | ### 1.5 StarAgent 守护 Rainbow 不做 systemd 服务,由 StarAgent 统一管理。StarAgent 自动发现 `/opt/rainbow` 下的 .NET 项目,提供崩溃重启、健康检查、远程管理和日志聚合。 ### 1.6 认证体系 Cube 内置全功能认证:表单登录 + 验证码 → RBAC(角色→菜单→按钮) → OAuth2.0/OIDC SSO → JWT Token。`WebSetting` 中配置 `SSOServer`/`AppId`/`Secret` 即可接入第三方认证中心。 --- ## 2. 桥接服务层 ### 2.1 命令执行安全边界 ``` 用户操作 → Controller → Service(Rainbow.Data) → ShellExecutor.Execute(cmd, args, needSudo, timeout) → SudoWhitelist.IsWhitelisted(cmd) // 白名单正则校验 → Process.Start(sudo, argList) // ArgumentList 防注入 → SemaphoreSlim(4) 并发控制 // 最多 4 个 Shell 进程 → 超时 CancellationTokenSource // 默认 30s → 审计日志(命令/参数/耗时/退出码) ``` ### 2.2 各服务管理器 | 服务 | 核心方法 | 系统工具 | |------|---------|---------| | `WanManager` | `AddWan()` / `SetLoadBalance()` / `CheckFailover()` | ip, iptables, ping | | `PppManager` | `ConnectAsync()` / `DisconnectAsync()` / `GetStatusAsync()` | pppoe-start/stop/status, ip | | `DnsmasqManager` | `GetLeasesAsync()` / `AddStaticLeaseAsync()` / `SetDhcpv6()` / `SetRA()` | dnsmasq, systemctl | | `FirewallManager` | `AddPortForwardAsync()` / `BlockMacAsync()` / `AddIp6tablesRuleAsync()` | iptables, ip6tables, nft | | `VlanManager` | `CreateVlanAsync()` / `DeleteVlanAsync()` | ip link | | `RouteManager` | `AddRouteAsync()` / `AddPolicyRouteAsync()` | ip route, ip rule | | `VpnManager` | `CreateWireGuardAsync()` / `CreateOpenVpnAsync()` / `GetVpnStatusAsync()` | wg, wg-quick, openvpn, systemctl | | `MonitorCollector` | `GetNetworkStatsAsync()` / `GetCpuUsageAsync()` / `GetIPv6StatusAsync()` | /proc, ip | | `ConfigBackup` | `BackupAsync()` / `RollbackAsync()` | 文件 IO | --- ## 3. 多 WAN 负载均衡 ``` ISP-A(PPPoE)──ppp0──┐ ┌──eth0(LAN)──内网 ├─ 软路由 ─┤ ISP-B(DHCP)───eth1──┘ └──eth0.10(VLAN10) ``` **实现**:每 WAN 口独立路由表(`ip route add table 100/200`) → iptables 按连接标记 fwmark(statistic nth/random) → `ip rule fwmark` 选择路由表。 **模式**:轮询(每包交替)/ 权重(按带宽比例)/ 源地址哈希(固定出口)/ 策略路由(目标 IP 匹配)/ 故障切换(ping 检测 + 自动切路由)。 --- ## 4. IPv6 双栈 ``` ISP ──IPV6CP──→ ppp0(全球单播 IPv6 + /60 PD前缀) │ ┌───────────┴───────────┐ │ dnsmasq │ │ DHCPv6(IA_NA/IA_PD) │ │ RA(SLAAC) │ └───────────┬───────────┘ │ ┌───────────┴───────────┐ │ eth0(LAN) │ │ 内网设备获取 IPv6 │ │ ip6tables 防火墙 │ └───────────────────────┘ ``` --- ## 5. 部署 ```bash # 1. 发布 dotnet publish -c Release -o /opt/rainbow Rainbow.Web/ # 2. StarAgent 自动发现并守护(无需 systemd) # 3. sudo 白名单 cp deploy/rainbow.sudoers /etc/sudoers.d/rainbow ``` --- (完)