Flutter Server Box 深度指南:跨平台服务器状态监控与运维工具箱
【免费下载链接】flutter_server_boxServerBox - server status & toolbox项目地址: https://gitcode.com/GitHub_Trending/fl/flutter_server_box
导读
Flutter Server Box(ServerBox)是一个基于 Flutter 开发的服务器状态监控与运维工具箱,为 Linux、BSD 与 Windows 服务器提供可视化状态图表与 SSH/SFTP 管理能力,覆盖 iOS、Android、macOS、Linux、Windows 五大桌面与移动平台。本文以仓库根目录 README.md 为主线,结合 monitor 服务端 agent、配置示例、Makefile 与 pubspec.yaml 等仓库证据,系统讲解其功能矩阵、各平台安装方式、Monitor agent 的部署与安全配置、双通道(SSH 与 HTTP)接入模型,以及从源码构建开发的完整流程,帮助读者在几分钟内完成从安装到生产级部署的全过程。
项目是什么:一份直白的定位
README 对它的定义只有一句话:A Flutter project which provides charts to display Linux, Unix and Windows server status and tools to manage servers.(一个用 Flutter 开发的、为 Linux/Unix/Windows 服务器提供状态图表与管理工具的 Flutter 项目)。把这句话拆开,对应的是项目里两条核心能力线:
- 看状态:CPU、传感器、GPU、磁盘、网络等指标的实时图表,以及 S.M.A.R.T. 硬盘健康信息;
- 管服务器:SSH 终端、SFTP 文件传输、Docker 容器管理、进程管理与 systemd 服务管理、命令片段(snippets)。
在技术实现上,ServerBox 与大多数"远程 SSH 客户端 + 图表"工具的最大区别在于其共享解析器架构:App 端与 Monitor agent 共用同一套 Rust 状态解析逻辑。从 crates/sbm_parser 的目录结构看,它同时维护着 linux/bsd/windows 三套命令清单与解析器(linux.rs、bsd.rs、windows.rs、script.rs),并由 crates/sbm_ffi 通过 flutter_rust_bridge 以 FFI 方式编入 App,由 crates/sbm_native 在 Monitor agent 侧原生采样。App 与 agent 对同一条服务器输出给出完全一致的解读,这正是图表数据可信度的来源。
功能矩阵:从图表到终端再到平台能力
README 的 Features 一节概括了三组能力,仓库源码(lib/ 与 monitor/)为其提供了完整佐证:
核心监控与管理能力
| 能力 | 说明 | 仓库证据 |
|---|---|---|
| 状态图表 | CPU、传感器(sensors)、GPU 等指标实时曲线,含历史数据 | crates/sbm_parser/src 多平台解析器;监控周期在 monitor/config.example.toml 中由interval_seconds控制 |
| SSH 终端 | 全功能终端模拟,基于 vendored 的 xterm.dart | 依赖声明见 pubspec.yaml(xterm: path: packages/xterm) |
| SFTP | 文件浏览、上传下载与编辑 | 底层协议实现见 lib/data/ssh 与 packages/dartssh2 |
| 容器 / 进程 / 服务管理 | Docker 容器、进程列表、systemd 服务操作 | monitor 的POST /api/v1/exec端点承载对应命令 |
| S.M.A.R.T. | 硬盘健康状态读取 | 由 monitor 扩展采集周期获取(需要smartctl) |
| 基准测试 | 内置 yabs 基准脚本执行与结果解析 | assets/yabs.b64(由 scripts/update-yabs.sh 更新,运行前经 base64 内嵌) |
平台特性
- 生物认证:App 解锁可配置指纹/面容验证;
- 推送通知:服务器告警通过 Monitor agent 推送到手机;
- 桌面小组件(Home Widget)与 watchOS App:不打开 App 也能看到服务器状态;
- 跟随系统颜色:亮/暗色主题与系统设置联动。
16 种语言
README 明确指出当前支持 16 种语言,清单见 lib/l10n/,与仓库实际文件一一对应:阿塞拜疆语、德语、英语、西班牙语、法语、印尼语、意大利语、日语、韩语、荷兰语、葡萄牙语、俄语、土耳其语、乌克兰语、简体中文、繁体中文(app_az.arb至app_zh_tw.arb共 16 个 ARB 文件)。译者信息记录在该目录的 git 历史中。
安装与下载:按平台各取所需
README 的安装表格给出了每个平台的官方渠道,并特别提示:只从可信来源下载软件包。
| 平台 | 渠道与注意事项 |
|---|---|
| iOS | App Store;或 GitHub Release 中的_NoSign.ipa(未签名,需自行签名后安装,适合无法访问 App Store 的地区或侧载场景) |
| macOS | App Store(仅支持 Apple silicon);GitHub Release 按架构提供.dmg;或brew install --cask server-box |
| Android | GitHub Release / 项目 CDN 包仓库 / F-Droid / OpenAPK |
| Linux / Windows | GitHub Release / 项目 CDN 包仓库 |
从发布脚本看,各平台产物由fl_build统一命名:pubspec.yaml 中fl_build.appName: ServerBox,macOS 侧通过 scripts/release/release-macos-dmg.sh 与 scripts/release/package-dmg-from-xcarchive.sh 生成按架构区分的 DMG。
架构视角:一个 monorepo,两条接入通道
.claude/skills/serverbox-onboarding/SKILL.md 将仓库组织方式描述为 monorepo,各目录职责如下:
| 路径 | 职责 |
|---|---|
| lib/ | Flutter App 本体(页面、Provider、Store、SSH 客户端) |
| crates/sbm_parser | 共享状态解析器:命令清单与解析逻辑的唯一事实来源,App 经 FFI 与 Monitor 共用 |
| crates/sbm_ffi | flutter_rust_bridge 绑定 crate,由 hook/rust_build_environment.dart 在构建时编译进 App |
| crates/sbm_native | 仅 Monitor 使用的原生逐平台采样器 |
| monitor/ | ServerBox Monitor:部署在服务器上的 Rust agent 及其 Svelte 网页面板 |
| packages/ | 以路径依赖方式引用的 vendored Dart 分支(dartssh2、xterm、fl_lib 等) |
| docs/ | Astro Starlight 文档站,英文与中文镜像 |
两种接入方式:SSH 与 Monitor HTTP
一台服务器在 App 中可以按两种方式添加:
- SSH 方式:App 直接以 SSH 连接服务器,适合愿意暴露 SSH 端口、需要终端与 SFTP 的场景;
- Monitor(agent)方式:服务器上安装 Monitor agent,App 通过其 HTTP API 访问,不携带任何 SSH 凭据。它是不方便暴露 SSH 端口的主机的第二选择,且由于 agent 独立采集并落库,图表在 App 首次连接之前就有历史数据。
SKILL.md 明确说明"每条已配置的传输通道各自贡献能力",并指出一个典型现象:"终端按钮消失了"通常是 agent 的能力模型问题,而不是 bug——App 只展示 agent 在GET /api/v1/capabilities上声明接受的功能。
存储与状态
- 本地数据库:App 使用 SQLite 存储,且在 pubspec.yaml 中通过
hooks.user_defines.sqlite3.source: sqlite3mc将编译进 App 的 SQLite 替换为SQLite3MultipleCiphers(sqlite3mc),整文件加密(含 key 与索引),且不依赖平台安装 OpenSSL; - 状态管理:Riverpod(
flutter_riverpod/riverpod/riverpod_annotation,见 pubspec.yaml),数据层由lib/data/provider/与lib/data/store/承载。
ServerBox Monitor:让"App 关闭时"也持续工作
README 的 Help 一节给出了 Monitor 的定位:它是安装在你服务器上的 agent。不打开 ServerBox App 时仍需工作的功能都依赖它——推送服务、桌面小部件和手表 App。除此之外,它同时是第二种添加服务器的方式(HTTP 访问)、历史数据的采集者,以及自带网页面板的独立服务。
安装与运行
Monitor 的完整安装说明见 monitor/README.md 与 monitor/README_zh.md。安装脚本 monitor/install.sh 支持install、uninstall、upgrade三个命令和--user、--system两种模式,并自动检测 systemd 与 OpenRC 两类 init 系统:
# 方式一:从本仓库 checkout 直接执行(与远程管道安装等价) ./install.sh install # systemd:以当前账号安装 systemctl --user 服务 sudo ./install.sh install # OpenRC (Alpine):写 /etc/init.d 需要 root, # 但 agent 仍以你 sudo 前的账号运行 sudo ./install.sh install --system # 两种 init 系统下均以 root 运行 # 方式二:离线 / 未发布构建 SBM_INSTALL_PKG=/path/to/server-box-monitor ./install.sh install安装脚本的设计有几个值得注意的安全取舍(均来自 monitor/install.sh 源码注释):
- 默认以普通账号运行:
--user模式下安装systemctl --user服务(~/.config/systemd/user/server_box_monitor.service),并尝试loginctl enable-linger防止登出后服务停止;OpenRC 下则通过command_user指定运行账号。脚本明确拒绝在 root 下静默安装 user 服务,也拒绝在 NixOS 上硬装 system 服务(NixOS 的/etc/systemd/system位于只读 store,应改用 monitor/nix/module.nix 模块); - 校验下载包:自动下载最新
monitor-v*release,并用官方发布的 SHA256SUMS 校验,防止供应链篡改; - 生成随机密钥:首次安装时从
/dev/urandom生成JWT_SECRET写入~/.local/share/server-box-monitor/.env(0600 权限); - agent 默认监听
0.0.0.0:3770,当frontend/dist存在时在同一地址提供网页面板。
配置文件:config.toml 逐项解读
Monitor 的配置为二进制旁的config.toml(TOML 格式),所有键与注释都收录在 monitor/config.example.toml;升级后应复查该文件,因为不同 release 之间可能调整配置格式。执行cargo run -- config可打印解析后的实际值。
核心配置项如下:
| 配置段 | 键 | 默认值 | 说明 |
|---|---|---|---|
| 顶层 | database_url | sqlite:serverbox_monitor.db | 指标与告警的 SQLite 数据库 |
| 顶层 | jwt_secret | 首次启动自动生成 | 面板鉴权密钥;显式设置时至少 32 字符,持久化于数据库旁的jwt.secret(0600) |
[server] | host/port | 0.0.0.0/3770 | 监听地址与端口 |
[server] | name | 从主机名推导 | 机器在 App 与推送中的显示名(依次取SBM_HOSTNAME、/etc/host_hostname、OS 主机名) |
[server] | cors_allowed_origins | 空(仅同源) | 允许跨域调用 API 的来源,如托管在 Cloudflare Pages 上的面板 |
[server.tls] | cert_path/key_path | 无 | 可选 TLS 配置,远程终端与文件 API 的硬性要求 |
[monitoring] | interval_seconds | 7 | 核心指标(cpu/mem/disk/net/uptime 等)采集周期 |
[monitoring] | push_rate | 1/1m | 告警规则的最短触发频率 |
[monitoring.extended] | interval_secs | interval_seconds × 10(下限 120s) | 电池/传感器/SMART/AMD-GPU 等扩展数据采集周期(这些字段仍需smartctl、sensors、amd-smiCLI 工具) |
[monitoring.extended.idle_pause] | enabled/threshold_secs | true/interval_seconds × 4 | 无人轮询时暂停扩展采集,核心指标与告警不受影响 |
[monitoring.data_retention] | metrics_days/alerts_days | 30/90 | 系统指标与告警记录保留天数 |
[monitoring.data_retention] | cleanup_interval_hours | 24 | 清理任务运行周期 |
[monitoring.data_retention] | max_db_size_mb | 256 | SQLite 文件硬上限,超出后丢弃最旧时序行;0关闭 |
[[monitoring.rules]] | name/monitor_type/threshold/matcher | 内置 CPU/内存/磁盘三条示例 | 告警规则,如threshold = ">=77%"、matcher = "cpu" |
[remote_access] | ssh_addr | 127.0.0.1:22 | 面板终端连接的 SSH 服务器地址 |
[remote_access.terminal] | enabled | false | 面板网页内终端(默认关闭,无法从面板打开) |
[remote_access.fs] | enabled/roots | false/[] | 文件浏览 API;roots必填,未命名目录则服务为空 |
[remote_access.exec] | timeout_secs/max_output_bytes/max_request_bytes | 60 / 依内存而定(≥1 MiB) | POST /api/v1/exec单条命令的资源上限 |
[[push]] | name/push_type及各自字段 | 见示例 | 推送渠道:webhook、serverchan、bark、iOS 推送 |
推送配置示例(节选自 monitor/config.example.toml):
[[push]] name = "webhook" push_type = "webhook" url = "http://localhost:5700" method = "POST" [push.headers] "Content-Type" = "application/json" [push.body_template] message = "Server {{name}}: {{message}}" [[push]] name = "ios" push_type = "ios" token = "" title = "ServerBox Monitor" content = "{{message}}"App 功能与 agent 能力的对应关系
以monitor方式添加的服务器只通过 agent 的 HTTP API 访问,agent 通过GET /api/v1/capabilities上报其接受的能力,App 只提供这些能力(见 monitor/README.md):
| App 功能 | 需要的 agent 配置 |
|---|---|
| 状态、图表、历史曲线 | 仅需登录 |
| 进程、systemd、容器、snippet、电源 | full_access(POST /api/v1/exec) |
| 终端 | full_access(/api/v1/terminal/ws) |
| 文件浏览 | [remote_access.fs] enabled = true且配置roots |
注意:monitor 服务器不提供 SFTP 与端口转发——agent 没有将连接中继到 App 指定地址的端点。需要这两项功能时,请以 SSH 方式添加该服务器。
远程访问与安全开关
[remote_access]是 Monitor 安全模型的核心,所有开关默认关闭,且是纯配置文件决策,不能从面板的设置页修改。理解这三个开关是安全部署的关键:
[remote_access.terminal] enabled:为面板增加浏览器内终端。agent 作为SSH 客户端连接ssh_addr,因此会话权限完全等同于浏览器登录的那个 SSH 账号——仅面板密码不会获得 shell,sshd 自己的日志、AllowUsers与两步验证提示照常生效。会话在连接断开后保留几分钟(detached_timeout_secs),手机切换网络可以接回同一 shell;full_access:去掉 SSH 登录这一步,任何登录面板的人都能以 agent 运行账号的身份打开 shell、执行命令并访问本机可达的任何地址。未设置时跟随平台:Linux 默认开启,macOS 与 Windows 默认关闭。README 的警告非常直白:此时面板密码就等于本机的一个 shell——这正是install.sh默认安装 user 服务的原因。如果以 root 运行 agent,务必关闭它。可用环境变量SBM_FULL_ACCESS=0/1覆盖(环境变量优先于配置文件),面板的首次使用提示可以关闭它但永远无法开启;[remote_access.fs] enabled+roots:文件 API 的开关。roots不是可选参数——不命名目录就什么都不服务。每个请求都会解析为真实路径(跟随符号链接、拒绝..),落在roots之外的一律拒绝,因此根目录内的链接指向/etc也逃不出去。roots = ["/"]等于"整台机器",等于把面板密码升级成一个 shell,agent 启动时会就此给出警告。
TLS 与明文传输限制
终端拒绝在明文监听上运行,因为其第一条消息就携带 SSH 密码。以下方式可以满足安全要求:
- 配置
[server.tls]; - 同机反向代理终结 TLS(loopback 流量无法在网络上被读取);
- 在 HTTP 之外已有传输加密的可信私有网络(如 Tailscale)中,管理员可显式设置
allow_insecure = true——且 App 端还必须对该 Monitor 连接单独开启「允许不安全 HTTP」,两端开关缺一不可。否则 SSH 凭据、Bearer token 与文件内容全部明文传输,不应在普通局域网或不受控制的网络中使用。
其他安全细节(源码注释确认)
- agent 在首次连接时固定 sshd 的 host key,之后不匹配即拒绝,而不是静默重新固定;清除固定需手动删除
ssh_known_hosts中的对应记录; access_log记录谁在何时从何处打开了什么、结果如何,永不记录凭据;- 登录失败按来源地址和用户名双重限流。
开发与构建:从源码跑起来
README 将开发指南指向文档站,同时仓库的 Makefile 与 .claude/skills/serverbox-onboarding/SKILL.md 给出了完整的本地开发命令与环境要求。
环境要求(以仓库当前内容为准)
| 组件 | 版本要求 |
|---|---|
| Flutter | ≥ 3.44.9(pubspec.yamlenvironment:) |
| Dart SDK | ≥ 3.11.0(同上) |
| Rust | FFI crate 固定 1.97.1(crates/sbm_ffi/rust-toolchain.toml) |
| Node | 24(monitor 面板与文档站) |
常用命令
make deps # flutter pub get make run # flutter run make gen # build_runner + gen-l10n(改动带注解的 model 后必须执行) make analyze # flutter analyze lib test integration_test make test # cargo build -p sbm_ffi && flutter test cargo test --workspace # parser、native sampler、FFI、monitor 全部测试 make monitor-dev # agent API 在 :3770 + 面板 dev server 在 :3000 make build PLATFORM=<android|ios|macos|linux|windows>新手最容易踩的四个坑(SKILL.md 明确记载)
- 先初始化子模块:
packages/*是路径依赖,未初始化子模块时flutter pub get会直接因目录缺失失败。执行git submodule update --init --recursive; - Rust 不是可选项:即使只是
flutter run,hook/rust_build_environment.dart 也会把crates/sbm_ffi编译进每次 App 构建。没有 Rust 工具链就没有 App; - flutter_rust_bridge 必须在两处保持一致:pubspec.yaml(
flutter_rust_bridge: 2.13.0)与 crates/sbm_ffi/Cargo.toml 版本不一致时,RustLib.init会在启动时抛错且报错信息不提及版本; - 改动带注解的 model 后必须
make gen:不得手改*.g.dart、*.freezed.dart及lib/src/rust/下任何文件。
测试体系
仓库的 test/ 目录包含 200+ 测试文件,覆盖解析器兼容(如crates/sbm_parser/tests/dart_compat.rs、hostile_input.rs)、SSH 认证、文件传输、终端会话、告警规则、配置迁移(test_config_migration.rs)、隐私与安全策略等;make test会先构建 FFI crate 再运行 Flutter 测试,保证解析器双端一致。
贡献、翻译与许可
- 任何正面贡献都受欢迎,开发规范见 CONTRIBUTING.md(本地环境、commit 规范、提交前检查、翻译流程);
- 贡献者需在第一个 PR 下留一条评论签署一次 CLA(CLA.md,中文见 CLA_zh.md):它授予权利让你的工作在 App Store 版本中随 AGPLv3 源码一起发布,你自己的版权仍属于你;
- 翻译贡献同样欢迎,流程见 CONTRIBUTING.md;
- 提交 issue 前请先确认:① 附带完整日志(点击首页右上角导出)并按 bug 模板提交;② 确认问题确实由 ServerBox 引起;③ 欢迎具体、建设性的反馈,主观偏好类请求(如"更喜欢另一种 UI")可能不被采纳;
- 仓库许可证为AGPL v3(lollipopkit & all contributors);Monitor agent 为GPL v3(lollipopkit 2023),见 monitor/README.md。
结语
从 README.md 出发可以清晰地看到,ServerBox 不是简单把图表和 SSH 拼在一起的客户端,而是一套"App + 服务端 agent + 共享 Rust 解析器"的完整监控运维体系:App 端负责多平台体验与交互,monitor agent 负责 7×24 采集、告警推送与面板服务,crates/sbm_parser 保证两端对服务器输出的一致解读。安装 App 之后,为服务器装上 Monitor agent 并在config.toml中按需打开[remote_access]开关,即可获得包含历史曲线、推送告警、桌面小组件与 watchOS 在内的完整能力;需要更深一层的终端与文件能力时,再以 SSH 方式接入。若需深入理解各功能的设计取舍,仓库文档站的内容(对应 docs/src/content/docs)提供了架构、SSH、SFTP、终端、状态管理等专题说明。
【免费下载链接】flutter_server_boxServerBox - server status & toolbox项目地址: https://gitcode.com/GitHub_Trending/fl/flutter_server_box
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考