Files
LinkPort/docs/single-file-storage.md
曾志威 9da95beb42
continuous-integration/drone Build is failing
feat: refine management UI, connection diagnostics and local startup
Migrate the workspace to React and Ant Design, improve account forms and responsive layouts, support outbound diagnostics and SSH fingerprint confirmation, and persist the management startup port. Preserve database migrations, remove S3 settings storage, and improve gateway audit handling.
2026-10-13 19:43:23 +08:00

5.2 KiB
Raw Permalink Blame History

SQLite 配置存储

当前格式(2026-10-06)

配置数据库使用 PRAGMA user_version=3,保存管理员、目标、网关、共享代理、文件资产、配置历史、随机主密钥和自动 TLS 身份。命令、输出及连接事件使用当前 audit/ 分片;完整灾备需要同时保存这些分片。默认数据库为用户主目录 .linkport/linkport.sqlite,可用 LINKPORT_DATA 显式指定;不再搜索工作目录或 AppData 的旧路径。

新空库自动初始化。按最新要求保留数据库迁移:支持版本 0–3 的旧库升级,保留旧 proxies、账号名称与凭据、作用域、审计拆分和 SSH 主机密钥迁移。迁移全部成功后才写入 schema 3;未来版本拒绝打开。外置密钥旧库需要原密钥,Windows 可读取原 DPAPI 密钥;错误密钥不会被替代密钥覆盖。保留 migrate-data、migrate-key 命令和旧 tls/cert.pem / tls/key.pem 的身份导入。

最新范围覆盖此前“旧格式全部不可用”的决定:前端删除旧适配,数据库继续负责将持久化旧格式转换为当前格式,包括网关账号权限及内联代理转共享引用。不要手工修改版本号。实际部署迁移前必须停服并完整备份数据目录;本次只使用临时库验证,没有部署或修改真实数据。

配置包、模板和 WebDAV 同步内容使用 version=2,旧 version=1 配置包拒绝导入。加密配置导出的外层 AES-GCM envelope 仍为版本 1,但内部必须是版本 2 配置包;它与 SQLite schema 版本是不同概念。WebDAV 使用当前 JSON 配置包,旧同步 passphrase 参数已移除并由 API 拒绝;WebDAV 登录密码继续保密、省略时仅在同一端点/账号下保留。

文件与备份

Windows 使用命名互斥量,Unix 使用数据库文件锁;启动脚本不再读取旧 desktop.lock。运行时可能产生 -wal、-shm、-journal,不得运行中删除或只复制主库。离线完整灾备应保存配置库、边文件、审计分片和主动使用的外部文件。

按用户要求,start-dev.cmd 的开发启动备份跳过根目录 audit/、logs/、*.log、*.log.*,保留数据库及 SQLite 边文件、证书、密钥与其他配置;不会删除源日志。这份启动备份不包含审计历史。

主密钥与密文存于同一 SQLite,持有完整库即能恢复凭据,应按敏感文件保护。自动 TLS 从库内读取或新建;显式 LINKPORT_TLS_CERT / LINKPORT_TLS_KEY 仍是当前自定义证书功能。export-ca 只导出公开证书。

验证与剩余项

隔离测试覆盖未来数据库拒绝且文件内容不变、旧库迁移及重复重开、外置密钥导入、错误密钥拒绝、快照校验、TLS 持久化、账号秘密省略保留和新配置包导入。协议检查使用仓库 fixture,不代表真实上游服务器验收。

用户进一步确认后,S3 设置模型、读取、建表及旧设置密钥校验已删除;新库不含 S3 设置表,不对真实旧库执行删表迁移。旧内联 Kubernetes / TCP 转发路径仍因自动审批阻挡暂留,因此尚不能声明所有兼容代码已清理完毕。完整执行结果和限制见 变更原因。

网关审计异步消费(2026-10-08)

原因:同步审计持有全局写锁并逐条提交 SQLite,基准约 2.1ms/条,并发没有扩展性。用户明确要求正常转发不等待审计落盘。

行为:网关命令及输出只入内存队列,单个后台消费者按 FIFO 写入,复制输出缓冲与结果指针;连续普通命令最多 64 条、约 1MiB 合并为事务。原同步 Store API 保留供维护、导入和直接调用;协议鉴权与访问控制保持同步。关闭 Store 先拒绝新入队,再等待已接受记录消费完成。

容量和失败语义:队列上限 8192 条、64MiB(另有至多一个正在消费的批次)。满载拒收最新审计记录,写盘失败的批次计为失败,不重试且不回传给业务;写盘失败在消费者中限频记录日志,monitoring 响应 auditQueue 提供 pending/pendingBytes/written/failed/dropped 计数;入队路径不执行日志 I/O。计数为进程全局、内存统计;pending 不含正在消费的批次。异常退出可能丢失尚未提交的记录。这是从强制同步审计变为尽力异步审计的明确行为变化。

兼容和范围:不更改 SQLite schema、密文格式或真实目标数据。记录在审计页面可能稍后出现。仅后台存储与网关回调、监控 JSON 增加字段,不涉及前端资源。验证使用临时 SQLite 和协议 fixtures,非真实上游压测;实际验证:异步专项通过;最终 store/gateway/api 三包全部通过,go vet ./... 和可执行文件构建通过。全量 go test ./... 的其他包通过,cluster 的 TestMySQLReplicationAndGroupDiscovery 在依赖 go-mysql 的 WritePublicKeyAuthPacket 中空指针崩溃;未修改该无关 fixture。旧网关同步审计断言已按最终一致性调整并通过。基准含队列完全落盘:同步并发 2069900 ns/op,异步合并提交 77919 ns/op,约 26.6 倍;不是业务端到端 QPS 结论。构建产物 artifacts/linkport-async-audit.exe,未替换运行实例。