持久化与存储
说明即使 recreate container 也必须保留的数据,以及它们的保存位置。
两个持久化边界
/app/data
├─ accounts.json
├─ accounts/<account>/chatdb.sqlite
├─ accounts/<mid>/settings.json
├─ backups/
├─ logs/
├─ plugins/
└─ token/session 等应用状态
/app/storage
├─ cache/cdn-cache/
├─ cache/icons/
├─ saved-media/
└─ media-index.sqlite
标准 Compose 把主机侧的 ./data 与 ./storage 分别 bind mount 到上述路径。container 本身可以删除并重新创建,但删除这两个主机目录会丢失持久状态。
Bind mount ownership
即使 image 内的 /app/data 属于 bun 用户,一旦叠加主机 bind mount,就会以主机文件系统的 ownership/permission 为准。entrypoint 只在启动初期以 root 修正 ownership,确认可写后降权到 unprivileged user。
“看起来恢复成功,reload 后又消失”
restore -> memory 中已有历史
-> DB 写入失败
-> UI 暂时看起来正常
-> reload/restart
-> 历史消失
出现这种情况时,先检查 bind mount 与写权限,不要只怀疑 Protocol 解密。当前聊天历史写入每个 account 的 SQLite,因此 UI 中短暂看到内容并不能证明持久化成功。
docker inspect vyline
docker logs vyline
du -sh data storage
Storage 容量显示
Backend 扫描 data 与 storage 计算已用空间,可用容量则通过保存位置所在 filesystem 的 statfs 取得。cache、已保存 media、backup 分开统计。主机侧修改保存路径后,实际 mount 到该路径的 filesystem 就会成为容量显示的依据。