数据目录与迁移
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.json | host、port(实际绑定的端口)、url 和进程号 pid | 服务器绑定端口后写入,正常退出时删除。记录的进程已经不在时,这个文件被视为过期并忽略 |
eac-user.json | EAC 的 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_DATA_DIR 指向它(或放到默认位置) |
| 只清空用量统计 | 网页 用量 页的 重置统计,或 DELETE /api/v1/stats。不可撤销 |
| 丢弃所有记录 | 停止服务器,删除 hoshimi.db(以及同名的 -wal、-shm 文件)。配置和账号不受影响 |
| 丢弃缓存的模型目录 | 删除 catalog-cache/,下次启动时重新拉取 |
| 恢复默认设置 | 停止服务器,把 config.json 改名。注意渠道账号也在这个文件里,会一并消失 |
先停止服务器
运行中的服务器会把内存中的配置写回 config.json,并持续写入数据库。在它运行时删除或替换这些文件,改动可能被覆盖或丢失。