Hoshimi

数据目录与迁移

Hoshimi 把配置、数据库和其他文件放在哪里,每个文件存什么、保留多久,日志去了哪里,以及如何备份、重置和从旧版本迁移。

Hoshimi 的所有状态都在一个数据目录里:配置文件、记录用量和对话的数据库,以及少数几个给人或其他程序读的文件。搬家、备份或重置时只需要处理这一个文件夹。

数据目录在哪里

系统默认位置
Linux~/.local/share/hoshimi,设置了 XDG_DATA_HOME 时为 $XDG_DATA_HOME/hoshimi
macOS~/Library/Application Support/hoshimi
Windows%APPDATA%\hoshimi

设置环境变量 HOSHIMI_DATA_DIR 可以换到任意位置(支持 ~,会被解析为绝对路径)。服务器和所有命令都按这个变量找数据目录,所以想让 hoshimi config、hoshimi login 等命令操作同一份数据,就在运行它们的环境里设置同样的值:

export HOSHIMI_DATA_DIR=/srv/hoshimi
hoshimi config path          # /srv/hoshimi/config.json
hoshimi serve
$env:HOSHIMI_DATA_DIR = "D:\hoshimi"
hoshimi serve

查看正在使用的位置:

  • hoshimi config path 打印配置文件路径,它所在的文件夹就是数据目录;
  • hoshimi env 列出 Hoshimi 读取的环境变量和当前已设置的值;
  • 网页界面的 设置 › 关于 显示 数据目录、配置文件 和 数据库;
  • GET /api/v1/settings 返回 data_dir 和 config_path。

目录里有什么

<数据目录>/
├── config.json                 设置和渠道账号
├── config.json.corrupt-<时间>   无法解析时保留下来的原文件副本
├── hoshimi.db                  数据库:用量、签到、探测结果、Playground 对话
├── hoshimi.db-wal / -shm       SQLite 的预写日志文件
├── server.json                 正在运行的服务器的地址、端口和进程号
├── eac-user.json               EAC 渠道的 GitHub 授权
├── oauth-installation-id       部分渠道浏览器登录使用的本机安装 id
├── catalog-cache/              各渠道最近一次成功拉取的模型目录
└── workspace/                  Playground 工具的默认工作目录

不是每个文件都会出现:它们在第一次用到时才创建。设计上,随流量增长的记录都放进数据库;需要人手查看、编辑或给其他程序读取的东西保持为普通文件。

文件内容说明
config.json全部设置和渠道账号的凭据见配置文件。含明文令牌,权限尽量限制为仅所有者可读写
hoshimi.db用量统计、签到状态与历史、探测结果、Playground 对话和附件见下文
server.jsonhost、port(实际绑定的端口)、url 和进程号 pid服务器绑定端口后写入,正常退出时删除。记录的进程已经不在时,这个文件被视为过期并忽略
eac-user.jsonEAC 的 GitHub 授权令牌、登录名、头像和保存时间见 EAC。权限仅所有者可读写
catalog-cache/*.json模型目录快照文件名是渠道、选项和账号配置的哈希。只含模型元数据和账号 id,不含凭据。只恢复 7 天以内的快照;可以随时删除
workspace/Playground 工具读写的文件只在 playground.workspace 留空时使用

数据库 hoshimi.db

一个 SQLite 文件保存网关积累的所有记录:

内容保留多久
每一次调用的记录server.stats_keep_days 天(默认 90)
每小时汇总120 天
每日汇总和累计计数永久
每日签到状态最近一次
签到历史365 天
模型探测结果每个模型最近一次
Playground 对话、消息和附件直到删除;临时对话在离开时和下次启动时删除

用量统计大约每秒批量写入一次,服务器退出时再写一次;对话消息在发送时写入。每次启动时,上次中断在半路的回复会被标记为已停止,未发送的附件会被清理。

数据库使用 WAL 模式,并设置了 5 秒的忙等待,所以服务器运行时,命令行也可以同时读写同一个文件。

数据库结构的升级

数据库结构按编号依次升级,版本号记在 SQLite 的 user_version 中。新版本的 Hoshimi 第一次打开旧数据库时自动完成升级,不需要手动操作。

如果数据库是被更新版本的 Hoshimi 用过的,旧版本启动时会警告:

… was last used by a newer Hoshimi (database schema N, this one knows M); what it recorded may not show correctly

此时旧版本仍可运行,但部分记录可能显示不正确。降级前先备份数据目录。

日志

Hoshimi 不写日志文件,所有日志都输出到标准错误(stderr)。服务器开始监听后,标准输出会打印一行 SERVER_READY url=http://…,方便脚本获取实际地址。

HOSHIMI_LOG_LEVEL=DEBUG hoshimi serve      # 级别:DEBUG、INFO(默认)、WARNING、ERROR
hoshimi serve --debug                      # 同样打开调试日志
hoshimi serve --no-open 2>> hoshimi.log    # 需要日志文件时自己重定向

作为系统服务运行时,日志由服务管理器收集(如 journalctl),见安装。

从旧版本迁移

移动配置文件

旧版本的 --config 参数和 HOSHIMI_CONFIG 环境变量已经移除,当前工作目录下的 config.json 既不会被读取,也不会被自动迁移。升级后先运行:

hoshimi config path

在启动新版本之前,把旧的配置文件移动到它打印的位置。

让旧的 JSON 记录自动导入

更早的版本把用量、签到和探测结果分别存在 stats.json、checkin.json 和 probe.json 中。升级后第一次启动时,这三个文件会被导入 hoshimi.db,然后改名为 *.migrated。无法读取的文件改名为 *.corrupt,对应的记录从空开始。数据库里已经有这类记录时不会再次导入。

确认

hoshimi check

检查配置能否读取,并列出将要启用的渠道和账号数量。确认无误后可以删除 *.migrated 文件。

备份与重置

要做的事方法
完整备份停止服务器,复制整个数据目录
搬到另一台机器复制数据目录,在新机器上用 HOSHIMI_DATA_DIR 指向它(或放到默认位置)
只清空用量统计网页 用量 页的 重置统计,或 DELETE /api/v1/stats。不可撤销
丢弃所有记录停止服务器,删除 hoshimi.db(以及同名的 -wal、-shm 文件)。配置和账号不受影响
丢弃缓存的模型目录删除 catalog-cache/,下次启动时重新拉取
恢复默认设置停止服务器,把 config.json 改名。注意渠道账号也在这个文件里,会一并消失

先停止服务器

运行中的服务器会把内存中的配置写回 config.json,并持续写入数据库。在它运行时删除或替换这些文件,改动可能被覆盖或丢失。

本页目录