mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-09-21 09:28:14 +00:00
模型与运行库是发行版能力的一部分,不做成「装完再自己下载」:
- package-linux.sh:新增 stage_multimodal_assets(),打 server/full 前校验产物
SHA256SUMS、逐文件非空、运行库架构与目标一致,缺一即失败;client 包不含。
顺带修掉三个让打包在最后一步才炸的既有缺陷:
· 版本串直接取 git describe(v1.0.0-68-gxxx-dirty)不是合法包版本——deb 要求
数字开头、rpm 不允许 '-'。以前只有显式 VERSION=1.0.3 才打得出来;默认路径
从来没通过过。现在归一化,非数字开头时显式报错。
· 三处 mktemp -d 落在 /tmp(本机 9.8GB tmpfs),而 staging 要复制 719MB 模型,
中途 ENOSPC;报错文本指向某个 .onnx 文件,看着像资产坏了。改为落在与构建产物
同盘的 build/.stage-tmp。
· 开工前删掉旧的 SHA256SUMS:失败时脚本直接退出、不重算,留着像在为残缺产物背书。
- setup.sh:把包内 /usr/lib/homeagent/models/chinese-clip-vit-b16-onnx 软链到
<dataDir>/models/…(不复制 754MB、保持 dataDir 可迁移、已有自定义目录不覆盖)
- homeagent.service:ExecStart 改 /usr/bin/homed(deb 装在那里,此前写 /usr/local/bin,
装了也不会被 unit 用上)、加 ONNXRUNTIME_DIR 与 StateDirectory、MemoryMax 2G→8G
(实测常驻约 4.5GB,2G 会在首次全量建索引时被 cgroup OOM)
- control-{full,server}:补 libstdc++6 / libgcc-s1(libonnxruntime.so 需要)
- providers/{chineseclip,qwen3vl}:findOnnxLib 支持 ONNXRUNTIME_DIR / ONNX_ML_DIR
与包内 /usr/lib/homeagent/onnxruntime,随包的运行库才真的会被用上
- postinst:修掉两个让「装完即用」失效的点——它检查 /lib/systemd/system/ 下的 unit
而 deb 装到 /etc/systemd/system/,于是 daemon-reload/enable **从未执行**;以及
setup.sh 的失败被 `|| true` 吞掉(正是 initconfig 静默缺陷被藏住的原因)。现在
三个候选路径都查、失败可见并给出补救命令、首装 start / 升级 restart。
- docs/zh/multimodal-space.md:新增「随包分发」一节,并修正播种判据的说明
验收(从真实 deb 走一遍,不是读脚本):
- 包内 initconfig 已是动态链接,凭据真的写进 config.db
- 解包 → 按 postinst 顺序跑 setup.sh → 包内 homed 冷启动:
multimodal space active: provider=chineseclip dim=512 fp=cd2a495cf990
modalities=[text image]
- 全新安装的默认值确实被播种(core.plugin.dir / provider / model_dir 都在)
- 真实对话拿到回复(3.4s,回复中含唯一标记)
- 包内模型 SHA256SUMS 5/5 通过;包内 ORT 与源同 sha256;server 包 722MB
(旧版 17MB,差额即模型与运行库);full 包同样含全部资产;client 包不含
72 lines
2.6 KiB
Bash
72 lines
2.6 KiB
Bash
#!/bin/sh
|
||
set -e
|
||
|
||
SERVICE_NAME="homeagent"
|
||
HOMED_BIN="/usr/bin/homed"
|
||
DATA_DIR="/var/lib/homeagent"
|
||
SETUP_SH="/usr/lib/homeagent/setup.sh"
|
||
|
||
# unit 由本包装到 /etc/systemd/system/,而旧 postinst 只查
|
||
# /lib/systemd/system/(merged-usr 下等于 /usr/lib/systemd/system,那里没有
|
||
# 这个文件)——于是 daemon-reload 与 enable **从未执行过**:装完不会开机自启,
|
||
# 而 postinst 全程无报错。这里三个候选位置都看一下。
|
||
find_unit() {
|
||
for p in "/etc/systemd/system/${SERVICE_NAME}.service" \
|
||
"/usr/lib/systemd/system/${SERVICE_NAME}.service" \
|
||
"/lib/systemd/system/${SERVICE_NAME}.service"; do
|
||
if [ -f "$p" ]; then
|
||
printf '%s' "$p"
|
||
return 0
|
||
fi
|
||
done
|
||
return 1
|
||
}
|
||
|
||
case "$1" in
|
||
configure)
|
||
if [ -f "$HOMED_BIN" ]; then
|
||
mkdir -p "$DATA_DIR"
|
||
|
||
# 初始化凭据和数据库。
|
||
#
|
||
# 这里不能再用 `|| true` 吞失败:setup.sh 靠 initconfig 写 config.db,
|
||
# 而 initconfig 曾因 CGO_ENABLED=0 静默空操作(凭据只进了
|
||
# credentials.txt、没进数据库),用户拿它登录必然失败,安装却一声不响。
|
||
# 失败必须看得见,并给出可直接执行的补救命令。
|
||
if [ -x "$SETUP_SH" ]; then
|
||
if ! HOMEAGENT_DATA="$DATA_DIR" "$SETUP_SH"; then
|
||
echo "E: homeagent 初始化失败——凭据可能未写入 config.db。" >&2
|
||
echo "E: 请手动重试:HOMEAGENT_DATA=$DATA_DIR $SETUP_SH" >&2
|
||
fi
|
||
else
|
||
echo "W: 未找到 $SETUP_SH,跳过凭据初始化。" >&2
|
||
fi
|
||
|
||
# 注册 systemd 服务
|
||
if command -v systemctl >/dev/null 2>&1; then
|
||
if find_unit >/dev/null; then
|
||
systemctl daemon-reload 2>/dev/null || true
|
||
systemctl enable "$SERVICE_NAME" 2>/dev/null || true
|
||
# 首次安装就拉起来,装完即可用;升级时重启以真正加载新二进制
|
||
# (仅 enable 不会让已在运行的进程换用新文件)。
|
||
if [ -z "${2:-}" ]; then
|
||
systemctl start "$SERVICE_NAME" 2>/dev/null || \
|
||
echo "W: homeagent 服务未能启动,请检查:systemctl status $SERVICE_NAME" >&2
|
||
else
|
||
systemctl restart "$SERVICE_NAME" 2>/dev/null || \
|
||
echo "W: homeagent 服务未能重启,请检查:systemctl status $SERVICE_NAME" >&2
|
||
fi
|
||
else
|
||
echo "W: 未找到 ${SERVICE_NAME}.service,未启用服务。" >&2
|
||
fi
|
||
fi
|
||
fi
|
||
;;
|
||
abort-upgrade|abort-remove|abort-deconfigure)
|
||
;;
|
||
*)
|
||
;;
|
||
esac
|
||
|
||
exit 0
|