云同步
Cloud Sync V3 预览
设置中的 Cloud Sync V3 提供独立的 V4 同步空间,首批支持 WebDAV、S3 和本地目录后端。选择 V3 后先保存设置,再生成同步预览。确认时会重新检查本地数据和已可见的远端发布;预览过期时须重新生成。
连接、分组、代理、隧道、快捷命令、笔记、自定义图标和主题按稳定 ID 合并。不同字段可自动合并,同字段冲突保留候选和本机当前值;可以在预览中选择候选,也可以先同步无冲突部分。删除和并发编辑会保留存在性冲突。外观偏好可单独开启,仅同步主题、终端字体、光标和对比度白名单。快捷键是独立的可选范围,按操作合并;关闭后保留已有配置。
首次确认会在配置目录创建并回读验证加密的 cloud-sync-v3-safety-<id>.nya 备份。旧云端数据保留,检测到旧客户端后续写入时暂停自动同步;可手动生成导入预览,确认后保留双方资源和冲突候选。V4 的合并结果先原子应用到本机,再发布;上传失败显示“等待发布”,重试会复用已保留的精确密文。已完成回读验证的状态会单独显示。
AI 非敏感配置是独立的可选范围,包含供应商配置、手动添加的模型、自定义操作及默认模式。API 密钥和请求头由独立的敏感数据范围控制;代理、执行权限、外部工具路径和自动发现的模型保留在本机。未开启敏感数据同步时,涉及本机密钥的地址变更和删除会暂缓,需先在本机编辑确认。无效引用、循环和不完整配置也会暂缓相关原子组;预览列出暂缓字段,其他有效修改继续应用,完整候选保留在副本中。
密码、私钥、凭据、OTP、连接/代理密码及 AI 密钥可在独立的敏感数据范围中开启,默认关闭。因果副本只保存版本引用,值使用独立加密对象;接收后用本机密钥重新加密。SSH/VNC 信任范围也默认关闭,每项收到的身份新增、变更和删除都须在本机预览中单独确认;自动同步不会授予信任。关闭范围保留已有数据,重新开启会重新合并。其他 Provider 的 V4 写入尚未开放。引用缺失凭据的认证组会暂缓,待接收设备补齐本机凭据后重新应用。原有 Provider 的旧协议入口保留;选择 V3 后不会因失败而自动写回旧协议。自动双向同步要求首次迁移已确认、自动推送和拉取均开启,并且没有活动会话或未保存设置。
完成 V3 迁移后,在安全设置修改主密码会先发布并回读验证新的 rotation-<id> 子空间,再原子切换密码、远程命名空间和本地副本。失败或上传期间有新的本地编辑时,原密码和原空间继续有效;重试复用已保存的密文。旧空间保留,其他设备须使用新的命名空间和密码接入 。云账户/范围变更须与改密分开保存。已有 V4 副本时不能直接关闭主密码。
下面介绍的是保留用于兼容的旧快照协议与 Provider 设置。.nya 始终是独立备份,不携带 V4 Writer 身份、发布历史或同步副本。
NyaTerm 的 云同步 能力,解决的不是“远程文件传输”,而是把应用里的可移植配置数据同步到一份加密的远端核心快照。
远端使用不可变快照和每台设备独立的提交记录:
sync/snapshots/<revision>.redb.enc保存加密快照,是当前协议的正常数据路径sync/heads/保存每台设备的提交记录及上传中的临时标记,用于识别并保留并发修改sync/latest.redb保存供兼容读取使用的最新 revision、设备、时间和 hash 元数据sync/current.redb.enc是尽力更新的兼容/恢复副本,不是唯一权威数据源
两台设备同时推送时,各自的提交都会保留;下一次检查发现并发分支后,会要求明确选择本地或云端。远端存储若存在可见性延迟,冲突可能在后续检查才出现。判断先后关系使用因果记录,不依赖设备时钟。
.nya 本地导出 / 导入仍然是配置备份和迁移入口。云端旧快照会按保留策略清理;设备正在引用、尚未解决的并发分支及上传中的快照受到保护。云同步不会自动删除用户云端已有的旧 backups/ 数据,保留的快照也不替代独立备份。
当前支持这些远程存储提供方:
- WebDAV
- S3 兼容存储
- Gitee 代码片段(Gitee Snippet)
- GitHub Gist
- Google Drive
- OneDrive
- AliyunDrive
先决条件:先设置主密码
在使用 设置 → 云同步 前,你必须先到 设置 → 安全 设置 主密码。
这是硬性前置条件。没有主密码时:
- 不能启用云同步
- 不能执行测试连接、推送、拉取等手动操作
上传到云端的是加密后的可移植快照。新快照使用随机盐的 Argon2id 派生密钥,再通过 AES-256-GCM 加密和认证;版本头、参数、盐和 nonce 也参与认证。
旧 NyaTerm 和 Dragonfly 快照仍可读取。下次实际上传或显式覆盖会写成新格式;仅检查到内容相同不会重写旧密文。新格式需要所有参与同步的设备升级到支持它的版本,旧客户端无法解密新快照,也不具备新的并发保护。升级前建议保留本地 .nya 备份。
升级后第一次检查,如果旧同步基线无法证明完整数据未变,可能需要手动确认冲突;这是为了保护此前未计入变更 hash 的 VNC 信任记录和扩展数据。
从哪里进入
这项功能主要有两个入口:
1. 设置 → 云同步
这里是主要配置页,负责:
- 选择 provider
- 配置远程命名空间与 provider 根路径
- 设置自动同步策略
- 运行测试连接、立即推送、立即拉取
- 在冲突发生时执行处理
2. 工作区中的 Cloud Sync / 云同步面板
主工作区侧栏里的 云同步 面板用于查看:
- 当前状态
- 最近的同步活动
- 最近一次检查、同步时间
- 冲突状态与快速处理入口
改配置去设置页,看运行状态看工作区面板。
Provider 配置
通用项
无论使用哪种 provider,都需要先确认这几项:
- 启用云同步
- 存储提供方配置
- 设备名称
- 远程命名空间
其中:
- 设备名称 会写入快照元数据,方便你识别是哪台设备上传的内容
- 远程命名空间 是 NyaTerm 在远端保存云同步快照时使 用的顶层路径前缀
WebDAV
如果 provider 选的是 WebDAV,通常需要填写:
- WebDAV Endpoint
- Provider Root(可选)
- 用户名
- 密码
WebDAV 认证同时支持 Basic 和 Digest 两种方式。当服务端要求 Digest 时,NyaTerm 会自动改用 Digest,以提升对 NAS / 网关的兼容性。
S3 兼容存储
如果 provider 选的是 S3 兼容,通常需要填写:
- S3 Endpoint
- Bucket
- Region
- Provider Root(可选)
- Access Key ID
- Secret Access Key
- Session Token(可选)
- Virtual Host Style(按 provider 要求决定是否开启)
Gitee 代码片段(Snippet)
如果 provider 选的是 Gitee 代码片段,NyaTerm 会把加密后的云同步对象保存到一个 Gitee 代码片段中。
Gitee 的文件数量限制也适用于快照、设备提交及临 时标记。设备较多或保留了多个冲突分支时,可能需要使用新的代码片段或更换存储提供方;不会为了腾出位置删除未解决的分支。
通常需要填写:
- Gitee 个人访问令牌(Personal Access Token)
- 代码片段 ID
GitHub Gist
如果 provider 选的是 GitHub Gist,NyaTerm 会通过 GitHub device flow 授权,并把加密后的云同步对象保存到一个私有 Gist 中。
通常需要:
- 点击 连接 GitHub
- 在浏览器打开的 GitHub 授权页面输入设备码
- 授权
gistscope
在 GitHub device-flow 授权流程中,如果没有填写 Gist ID,NyaTerm 会在授权成功后自动创建并回填一个私有 Gist;已有 Gist ID 时,会先验证并复用该 Gist。
Google Drive / OneDrive / AliyunDrive
如果 provider 选的是 Google Drive、OneDrive 或 AliyunDrive,NyaTerm 会通过桌面端原生 HTTP adapter 访问对应网盘服务。
当前需要手动填写 OAuth 信息:
- Refresh Token
- Client ID
- Client Secret
- Access Token(可选,长期同步建议依赖 Refresh Token)
- Provider Root(可选)
AliyunDrive 还需要填写 Drive Type,通常为 resource。
配置校验
当前实现会先做最基本的 provider 校验:
- WebDAV 至少需要填写 endpoint
- S3 至少需要填写 endpoint 与 bucket
Access Key ID和Secret Access Key需要成对出现- GitHub Gist 需要完成 GitHub 授权;Gist ID 可以在授权流程中自动创建并回填,也可以使用已有 ID
- Google Drive / OneDrive / AliyunDrive 需要填写 Refresh Token、Client ID、Client Secret
建议在真正启用自动策略前,先执行一次 测试连接。
自动同步策略
启动时检查
开启后,NyaTerm 会在启动时检查远端是否已经有新的同步快照。
常见结果包括:
- 本地与云端一致
- 远端有更新,可以拉取
- 本地有尚未同步的变化
- 本地和云端都变了,进入冲突状态
所有 Provider(包括 GitHub Gist)还会每 15 分钟检查一次;窗口重新聚焦时也会检查,聚焦检查至少间隔 120 秒。关闭“启动时检查”只跳过启动检查。失败时会退避重试,限 流时遵守服务端有效的 Retry-After;认证失效会暂停,修改设置后恢复。
自动拉取远端变更
开启 自动拉取远端变更 后,如果启动检查或同步检查发现“只有远端发生变化”,NyaTerm 会自动拉取并应用当前云端快照。
它只处理本地没有未同步变更的情况;存在活动会话或未保存设置草稿时,会等到安全后再拉取。本地和云端都变了时仍然进入冲突状态,不会自动选一边覆盖另一边。
本地变更后的自动推送
开启后,当受支持的本地配置数据发生变化并保存完成时,NyaTerm 会在一个防抖窗口后自动推送快照。
你可以设置:
- 同步防抖秒数
它是「保存后延迟推送」,不是实时双向同步。
手动操作
测试连接
先验证 provider 配置与远端布局是否可用。
立即推送
把当前设备的可移植配置快照上传到云端。用于刚完成一组设置调整后,或需要明确控制何时写入云端时。
立即拉取
把云端当前最新同步快照拉回本地并应用。用于另一台设备已经推送过更新,需要让当前设备显式对齐时。
冲突是怎么出现的?
如果本地状态和云端状态自上次同步后都发生了变化,就会进入冲突状态。
典型场景:
- A 设备改了设置但还没拉取 B 的更新
- B 设备已经把新的同步快照推到了云端
- A 再尝试推送或启动检查时发现双方都变了
这时你会看到冲突预览,例如:
- 本地快照哈希
- 远程 revision
- 远程设备信息
- 当前云端快照时间与 hash
- 冲突提示信息
冲突怎么处理?
当前实现提供两种处理方式:
下载远程版本
分支列表显示每个并发 revision、设备名称(旧快照显示缩短的 UUID)、时间、可读状态及差异数量。仅有一个可读分支时自动选中;有多个可读分支时必须先选择。差异摘要仅展示已知集合新增、删除、修改数量、设置分类以及未知实体是否变化,不显示凭据、OTP、笔记或命令正文。
把选定的远端快照拉回当前设备并应用。当前设备上未同步的本地变更会丢失,选它之前先确认云端版本是要保留的那份。
上传本地版本
用当前设备的本地快照解决当前预览中已观察到的分支。确认时会重新校验本地内容、所选快照和分支集合;发生变化会刷新预览,要求再次确认。远端那份变更会被覆盖,其他设备后续会以这份状态为准。
这里要特别注意:
- 当前不是字段级 merge
- 也不是多人协作式冲突解决
- 本质上是“本地快照”和“远程快照”二选一
NyaTerm 保留独立的设备提交和因果记录。明确选择本地或云端会生成覆盖已观察到分支的新提交;选择云端时会固定使用预览中明确选定的 revision。若其他设备随后提交新的并发修改,仍会再次提示冲突。sync/snapshots/ 是现行协议的数据路径,不要手动清空。