跳转到内容

隐私政策

最后更新:2026-09-04。

Server Box 是连接你所配置服务器的客户端。它没有用户账号,开发者也不运营任何中转 SSH、SFTP 或 Monitor 流量的服务。连接时,流量会从 App 直接发往你设置的地址。

App 还会为诊断和你使用的功能发起独立的网络请求。下文会说明这些请求的目标和内容。Server Box 不包含广告,不使用广告标识符,也不会跨 App 追踪。

数据 保存方式和行为
服务器名称、地址、端口、用户名和设置 加密的 SQLite 数据库
SSH 密码、私钥、Monitor 和 BMC 凭据 加密的 SQLite 数据库;数据库加密密钥保存在系统钥匙串中
AI provider 的 API key 系统钥匙串,每个 provider 一项
备份密码、WebDAV 密码和 GitHub token 系统安全存储
App 日志 仅保存在本机日志文件中;为便于排查问题,会保留当前运行和上一次运行的日志
Agent 对话、记忆笔记、AI provider 与工具设置 本机加密数据库;对话中可能包含 prompt、模型回复、命令输出、终端文本、文件内容和读取的网页
活动终端输出 保存在活动会话中;会话结束后,终端不会继续保留这些内容
下载的城市级位置数据 仅在你确认下载后,以未加密文件保存在 App 数据目录中;详见地球仪与位置数据
服务器上报的公网网卡地址结果,包括明确的“无公网地址”结果 保存在 App 加密数据库中,每台服务器一条。记录保存满 7 天后,后续的状态轮询可以刷新。坐标不保存;每次需要时都从下载的数据重新计算

Agent 对话、记忆笔记、AI provider 与工具设置不会加入备份,也不会通过设备同步发送。在你从对话历史中删除前,对话会保留在本设备上。Agent 对话仍可能被发送给你配置的 AI provider;详见 AI 请求。

备份只在你主动请求时创建。根据选项和格式,备份可能包含服务器设置和凭据、私钥、代码片段、端口映射、容器设置、连接历史及 App 设置。AI provider 设置与 API key、Agent 对话以及设备本地状态不会包含在内。

未设置备份密码时,本地备份可能不加密。设置备份密码后,备份会在写入或上传前加密。自动远程备份要求设置非空的备份密码。备份发送到 iCloud、WebDAV 或 GitHub Gist 后,还会受到对应 provider 的存储、访问和保留规则约束。

自动诊断是 Server Box 发送到开发者诊断服务的唯一 telemetry。第一次自动上传前,引导页会先展示选择;之后可以随时在 设置 → 应用 → 隐私 中更改。

级别 自动发送的内容
不发送 不发送任何内容。本机日志仍保留在设备上,你仍可以准备手动报告。
基本信息 已捕获的崩溃和错误,以及构建信息、平台信息和必要的诊断操作记录。App 正常运行时不会持续发送数据。
完整信息 基本信息的全部内容,外加可用的性能追踪,以及 App 运行期间的粗粒度功能使用事件。

Android 默认值为不发送。iOS、macOS、Linux 和 Windows 默认值为基本信息。在支持自动诊断的构建中,第一次自动上传前都会显示引导页。

改为不发送会立即停止自动发送,不会等到下次启动。

根据平台和错误类型,自动报告可能包含:

  • 错误类型、错误信息和调用栈
  • App 构建号、存储 schema 版本,以及该构建是否包含本机 Linux userland
  • 操作系统和内核信息、硬件型号、CPU 核心数、内存大小,以及 App 的内存占用(具体取决于平台)
  • 语言、locale 和时区
  • Dart 与 Flutter 运行时版本
  • 结构化诊断操作记录,例如使用的连接方式、终端或文件 backend 类型,以及某项操作的结果(如果有记录)
  • 平台提供的 native crash、ANR 或 hang 原因和 trace(如果可用)

这些记录使用固定的 action 名称,服务器相关的值会改用粗粒度信息或脱敏值。它们不会把终端输出、文件内容、密码或私钥作为诊断字段发送。无论选择哪个级别,App 都不会上传普通日志。

错误信息和调用栈来自底层 library,可能包含 App 没有主动创建的文本,因此不能保证每个异常都不包含服务器细节。不要把自动诊断理解为任意异常文本都已匿名化。

App 不会安装 native crash signal handler。平台提供 native crash、ANR 或 hang 记录时,Server Box 会在下次启动时读取它。如果启用了自动诊断,这条记录随后可以作为错误报告发送;否则会保留在本机,并可能出现在手动报告中。

完整信息会发送性能追踪,例如连接服务器或列出目录所需的时间,但不会发送这些操作的内容。它还会把相同的结构化面包屑转换为粗粒度的功能使用事件,例如打开过终端,或文件操作使用了 SFTP 而不是 SCP。这些事件不包含 prompt、终端输出、文件内容、键盘输入或屏幕录制。

本项目使用的 OpenPanel analytics destination 写在源码中,错误上报 destination 也写在源码中。因此从未修改源码构建的版本——包括 F-Droid 重构建、fork 和你自己的 checkout——都会使用相同的 destination,除非构建者修改它们。完整信息默认关闭,必须手动开启;在你选择完整信息前,未修改的构建不会发送功能使用事件。

本项目实现了两个 analytics integration,它们对 identifier 的处理方式不同:

  • 本项目使用的 OpenPanel integration 接受按安装区分的标识符。它是保存在设备上的随机 128-bit 值:开启完整信息时创建,离开该级别时删除,也不会进入备份。该值不由设备标识符、账号或硬件信息推导,只用于关联同一安装在多次启动中的事件,并统计不同安装的数量;它不用于识别个人或设备。
  • App 也实现了 Aptabase integration,但发布版本没有配置它。它不使用持久的安装标识符;事件携带的 session ID 会在闲置一小时后轮换,因此不同启动之间的 session 无法关联。

根据 destination,事件可能携带操作系统及版本、设备类型和可用时的设备型号、App 版本和构建号,以及 locale。事件不包含广告标识符或账号标识符。

analytics service 还可能根据设备连接时使用的 IP 地址推导大致位置:国家和城市,以及代表该城市的坐标,不是你的精确位置。对于本项目使用的 OpenPanel 数据,该位置会与按安装区分的标识符一起保存;IP 地址本身不会作为事件字段保存。

结构化诊断记录在创建时就会转换为可发送的内容,然后才交给上报组件。它们使用固定的 action 名称,服务器名称、地址或用户名等值会改用替代值记录。

手动报告的处理方式不同。发生崩溃后,Server Box 会根据上一次运行保留的日志,以及平台提供的 native crash 或 hang 信息生成报告。它会替换能够识别的服务器名称、SSH host、SSH 用户名和 Monitor 地址,但不会声称整份报告已经匿名化。

最新一份报告保存在设置 → App → 隐私 → 崩溃报告下;只有存在报告时才会显示该入口。你可以先阅读完整内容,再选择复制、复制并打开 GitHub issue 页面,或删除。App 不会自动发布报告。这条手动路径在所有诊断级别下都可用,包括不发送。

任何级别都不会自动上传 App 日志。 基本信息和完整信息可能发送导致运行结束的错误及 stack trace,并附带上文描述的构建和平台信息,但不包含日志行。如果错误发生在上报通道启动之前,App 可能在下一次启动时把它作为错误补发。保存在本机的手动报告会一直保留,直到你删除它,或后续崩溃用新报告替换它。

旧日志、临时连接的主机,以及 App 无法识别的值,仍可能出现在手动报告中。因此手动报告不保证匿名。粘贴到 GitHub 的内容是公开的,并受 GitHub 隐私声明约束。

Agent 使用你在 设置 → 应用 → AI → 提供商 中添加的 provider:模型目录中的内置 provider,以及自定义 endpoint。只有在你发送 Agent 消息后,App 才会发起请求,并且请求只发往对话所用 model 的 provider。

根据操作类型,请求可能包含你的 prompt、选中的终端文本、最近的对话历史、配置的服务器名称,以及 Agent 工作所需的上下文。执行命令或文件操作后,结果可能随后续请求发送,让模型继续工作。

命令输出和文件内容可能包含密码、token 或其他敏感信息,即使这些内容并非 Server Box 主动添加。发送前请检查内容,并阅读 provider 的隐私政策。

provider 的 API key 保存在系统钥匙串中,只会发送给该 provider。位于其他机器上的明文 http:// 自定义 provider 会被拒绝,除非为该 provider 允许,因为 key 会以明文传输。Agent 使用 网页读取 工具时,会从本机请求网页;你添加的 MCP 服务器会收到对其工具的调用。从远程来源安装或更新 skill 时,App 会通过 https 从你输入的来源(GitHub、GitLab 或该网站)下载;从本机文件夹或 .zip 安装时只在本地读取,不发起请求。skills 以文件形式保存在本机,不会加入备份。MCP 服务器的请求头和登录 token 保存在本机的加密 App 数据库中,不会加入备份,只发送给该服务器,并且除本机服务器外只通过 https 发送。Server Box 不会通过开发者的服务中转 AI 请求。

地球仪会把每台服务器画在一个坐标上。Server Box 使用保存在本机的数据解析位置,不会把服务器地址发送给地理位置 API,也不会为每次查询向数据集服务发起请求。如果服务器配置使用域名,本设备仍可能通过系统 DNS 服务解析域名,这与 App 连接该服务器时的行为相同。

按以下顺序,第一个能给出答案的来源决定服务器画在哪里:

  • 你在服务器编辑页 更多 → 位置 中填写的坐标。
  • 机器自己上报的公网地址,仅在 App 通过内网地址连接时使用。该地址来自常规 SSH 或 Monitor 状态轮询,再通过已下载的城市级数据集解析;不会额外执行命令或访问外部公网 IP 查询服务。
  • SSH 或 Monitor 连接所用的地址,通过已下载的城市级数据集解析。

城市级数据集不随 App 附带,也不会自动下载。在地球仪或 设置 → 服务器 → 通用 → 地球仪 中点击 下载 后,App 会先获取一个很小的 manifest,让确认对话框显示当前下载大小、安装后占用、数据源 URL 和许可署名。只有你确认后,App 才会获取数据文件。当前通常需要下载约 25 MB,安装后占用约 52 MB;应以 App 显示的 manifest 数值为准。数据集每月更新;点击 更新 会替换已安装的文件,不会额外保留副本。点击 删除 可移除数据集。位置数据由 DB-IP 提供,采用 CC BY 4.0 许可。

下载服务可以看到来自你当前网络的 manifest 或数据文件请求,包括 HTTP 服务通常可见的网络 IP 地址和请求时间。安装完成后,每次位置查询都只读取本机文件;下载服务不会收到按次查询请求,因此无法知道查询了哪些服务器地址、查询数量或查询时间。

通过数据集自动解析的坐标不会保存。每次需要时,App 都会从已安装的数据集重新计算;删除数据集后,这些自动解析的位置将不再可用。你在服务器设置中手动填写的坐标不依赖该数据集,删除数据集后仍可使用。

App 只保存服务器最近上报的公网网卡地址结果,包括“未上报公网地址”。这项记录位于 App 的加密数据库中,不会进入备份或同步。记录保存满 7 天后,后续的常规状态轮询可以刷新它。

关闭 地球仪 会从服务器页移除按钮,并停止位置解析,但不会删除已下载的数据集或已保存的上报地址结果。如需移除数据文件,请在数据集一行使用 删除。上报地址记录没有单独的手动清理入口;删除服务器时,对应记录也会被删除。

在完整信息级别下,地球仪与其他功能一样可以上报粗粒度的功能使用事件,例如打开视图,以及各来源分别定位了多少台服务器。在基本信息级别下,相关的脱敏 breadcrumb 也可能随错误报告一同发送。事件不包含坐标、地址、服务器名称或国家。

以下请求只会在对应功能被使用时发起,不携带上文所述的自动诊断 payload。

请求 目标 时机和内容
AI 请求 你配置的 endpoint 发送 Agent 消息时;详见 AI 请求
备份或同步 iCloud、你的 WebDAV server 或 GitHub Gist 上传、下载或同步备份时;携带选定的备份文件,文件可能已加密
检查更新 api.github.com 开启自动检查更新后,在启动时发起
Linux userland manifest github.com App 检查本机 Linux 环境是否有更新时发起;携带版本元数据和签名
Linux userland 镜像 经验证的 manifest 指定的 distribution mirror 或 source URL 安装或更新本机 Linux 环境时发起;下载的镜像会按 manifest 中的 digest 校验
城市级位置数据 ipgeo.lollipopkit.com,失败时回退到 GitHub Releases 在地球仪或 设置 → 服务器 → 通用 → 地球仪 中点击 下载,或在设置中点击 更新 时发起。App 会先请求 manifest,确认后才下载数据压缩包;后续位置查询均在本机完成。详见地球仪与位置数据。
服务器 logo 或发行版标识 你配置的 URL 设置自定义 logo 或标识 URL 后发起;图片 provider 可能会收到该请求
赞助链接 cdn.lollipopkit.com 打开赞助链接时发起
文档和 issue 链接 serverbox.lollipopkit.com 或 github.com 打开对应链接时发起

连接你自己的服务器、配置的 BMC 以及你部署的 Monitor agent,会直接发往这些 endpoint,不会经过开发者的基础设施。

错误报告和性能追踪会发送到开发者运营的 Sentry-compatible server:sentry.lollipopkit.com。发布版本中的完整信息功能使用事件会发送到开发者运营的 OpenPanel analytics server:diag.lollipopkit.com。Aptabase integration 只有在构建版本提供 Aptabase endpoint 和 app key 时才会启用。

Sentry 和 OpenPanel 的 destination 写在源码中,因此从未修改源码构建的版本也会向这两个地址发送数据,除非构建者修改它们。完整信息仍默认关闭,必须由用户明确选择。

诊断数据不会用于广告,不会与其他公司共享,也不会用于跨 App 或跨网站追踪。诊断服务可能会在排查相应问题所需的期限内保留报告。如需请求删除报告,请在 github.com/lollipopkit/flutter_server_box 提交 issue,并提供大致时间、App 版本和问题的简短描述。不要在公开 issue 中包含密码、密钥或其他敏感内容。

Watch App、complication 以及 iOS 和 Android 主屏幕小组件会直接读取你部署的 Monitor agent。Server Box 会为每个 surface 签发只读 credential。它只能访问 Monitor metrics 接口(/api/v1/status、/api/v1/metrics 和 /api/v1/metrics/history),不能打开 shell、执行命令或浏览文件。

credential 保存在 Watch 自己的钥匙串中;在 iOS 上保存在共享钥匙串组中;在 Android 上使用 AndroidKeyStore 密钥加密保存。小组件的配置列表会包含服务器名称和 Monitor 地址,以便选择服务器;credential 则单独保存在平台安全存储中。配置了 Monitor 的服务器会自动包含在同步范围内。Watch 可以在设置中单独排除服务器;小组件会发布所有配置了 Monitor 的服务器,不使用单独的排除列表。只要 App 能联系 Monitor agent,排除或删除服务器就会吊销对应 Watch 或小组件 credential。

App Store 和 Google Play 版本还可能受到平台自身上报机制的影响。Apple 和 Google 按照各自的政策收集相关信息,这些信息不是由 Server Box 通过上述诊断服务收集的。详见 Apple 隐私政策 和 Google 隐私政策。F-Droid 版本没有商店提供的崩溃上报渠道,这也是其默认诊断级别为不发送的原因之一。

Server Box 是服务器管理工具,不以儿童为目标用户,也不会明知地收集用于识别儿童的信息。

如果收集方案发生实质变化,App 会再次显示诊断数据询问。旧的回答不会被视为对实质不同方案的同意。

请在 github.com/lollipopkit/flutter_server_box 提交 issue。