跳到主要内容

多设备同步

角色扮演可以通过 rclone 让数据文件夹与远端的一个文件夹保持一致。rclone 支持大多数网盘、SFTP、WebDAV 和普通文件夹,所以角色扮演本身不处理网络连接。

设置​

  1. 安装 rclone,并用 rclone config --config <文件> 为你的远端创建配置文件。该文件必须放在数据文件夹之外,否则它也会被同步。配置文件可以加密,密码在设置中填写。
  2. 打开设置 → 角色扮演 → 与其他设备同步,填写:
    • 远端和文件夹:rclone 的远端名和文件夹,例如 mydrive:dsh-roleplay。留空则关闭同步。
    • rclone 配置文件:第 1 步文件的绝对路径。
    • rclone 程序:留空则在 PATH 中查找 rclone;也可以填写另一份的路径。
    • 自动同步的间隔(分钟):0 表示只在你于同步页面点击立即同步时才同步。
    • 配置文件密码:只有配置文件已加密时才需要。它保存在 DSH 的凭据存储中,不会写入配置,并通过环境变量交给 rclone。

所有设备请使用同一个远端。

同步什么​

数据文件夹被分成若干单元,每个单元各自同步:

单元内容
worlds/<文件夹>一个世界
sessions/<id>一个故事:数据库、回合、保存的状态和图片
prompts、presets、lorebooks、avatars、ui共享文件夹

单元同步时会被锁定:没有任何东西会写入它,读取它的请求会被拒绝,直到同步完成。期间开始的回合会等待。正在进行回合、或角色仍在反思的故事会被跳过,下次再试;只是在写记录的故事则会等它完成。

世界和共享文件夹用 rclone 的 bisync 逐文件同步,所以两台设备改了不同的文件时,两边的改动都会保留。故事则不同:它的文件彼此关联,因此整体移动。只存在于一侧的故事会被复制到另一侧。

两边都改动时​

角色扮演不做合并。同步页面会把该单元显示为需要选择:

  • 对于故事,或对于两边都有、但在本机从未同步过的世界,请选择保留本机的或保留远端的,另一份会被替换。
  • 对于两边都改动了某些文件的世界,每个这样的文件的两份都会并排保留(名称.conflict1 是本机的,名称.conflict2 是远端的)。请选择保留哪一份,另一份会被删除。

从其他设备拉取故事后,聊天会根据故事文件夹保存的内容重新生成,因此本机的聊天会显示在别处进行的每个回合。你回退放弃的分支中的回合不在聊天记录里,切换到它们时依靠保存的状态。

删除​

配置了同步后,在“存档”页面删除故事时会询问删除范围:

  • 只在本机删除。 远端保留副本,之后的同步不会把故事带回本机。“同步”页面会把它列为仅保留在远端;点重新同步即可取消这一选择,下次同步会重新下载该故事。
  • 在所有设备上删除。 会在远端写入删除标记并移除远端的副本。之后同步的其他设备也会删除各自的副本。如果那台设备在上次同步之后改动过该故事,或从未同步过它,则不会擅自删除:“同步”页面会提供保留这一份(移除标记并重新上传)或在本机一并删除。世界会被移入数据文件夹的回收目录,而不是直接删除。

你手动删除的世界文件夹,不会被自动视为要在所有设备上删除。下次同步会把它显示为需要选择:在所有设备上删除、保留在远端(停止在本机同步)或取回。

无法连接远端时,什么都不会被删除。

限制​

  • 在保存开场白之前(旧版本)开始的故事没有开场白可用来重建聊天:它的聊天会根据各回合重新生成,开场白为“The story begins.”。
  • 世界创作、预设、世界书和会话医生的聊天不会同步,它们属于各自的设备。
  • rclone 按路径对在数据文件夹内的 .sync 保存记录,该文件夹从不同步。数据文件夹或远端的路径过长时会被拒绝并给出提示。

故障排查​

“corrupted on transfer: sizes differ” 表示某个文件到达时的大小与服务器列出的不同。我们的文件在传输途中不会变化,所以是设备与服务器之间的某个环节改写了文件。常见原因是代理或 CDN 往 HTML 页面里加了脚本(机器人检测或统计代码):界面包(ui)和其他含 HTML 的内容会受影响,而文本和图片文件同步正常。错误信息会列出相关文件。确认方法:运行 rclone cat <远程名>:<文件路径>,看末尾是否有你没写过的内容。然后关闭服务器上的响应改写(Cloudflare 上是 JavaScript Detections 或 Bot Fight Mode,或对该主机名关闭代理;反向代理上是响应体缓冲与过滤),或直接访问服务器,或用 rclone crypt 包装远程,让代理只看到不透明的名称和字节。服务器上的文件是完好的;代理不再改动之后重新同步即可。