mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-11-01 06:47:29 +00:00
feat(systemd,webui,security): 数据目录一致性接线 + 内嵌主密钥注入
## 1. 数据目录一致性(原为死代码) `internal/systemd/sync.go` 能编译但**从未接线** —— 没有任何地方调用它。 内核有**两处**数据目录来源且不等价: -data <dir> ← systemd 单元 → memory/graph.db、插件数据根 core.daemon.data_dir ← 数据库 → memory/text、documents、knowledge 不一致时数据**分裂**:图记忆在 A、文本/知识在 B,检索跨目录、备份会漏。 生产当前两者一致所以没暴露,但 WebUI 允许改 DB 里的值而**无任何提示**。 接线三处: · cmd/homed/main.go 启动时检查,不一致则打告警 + 内联修复命令 · GET /api/v1/system/data-dir 返回诊断(只在真不一致时给 sync_command) · 判据 6 条(InSync/Clean/SyncCommand 内联 sed/备份/daemon-reload/drop-in) ★ 只告警**不改**:静默改 systemd 单元比不提示更危险 —— 改错了服务 起不来,而用户不知道是谁改的。命令里已内联 sed 替换,人复制执行即可。 ## 2. 内嵌主密钥(方案 C) build.sh 支持 `HA_EMBEDDED_KEY_HEX`(64 位 hex)经 -ldflags 注入。 从**环境变量**读而不是写进文件:本仓有两个公开远端,64 位 hex 一旦 写进被跟踪的文件就永久留在 git 历史里。 未设时不注入、不报错:开发机与 CI 本来就不该带生产密钥。 设了但格式不对则**中断构建**(`return 1`)—— 静默产出一个没有内嵌钥的 二进制,会让"防丢失"这个目的悄悄失效。 实测(真机):磁盘上**没有** security.key 时,仅靠 embedded 密钥即可 Submit + 二次加载解密成功;日志确认 `密钥来源 embedded (构建期注入,指纹 0db8e9c5)`。 ## 判据第一版的两个错误(记下来) · 没给 UnitPath 就断言"必须含 sed -i" —— 实际 sed 行只在 UnitPath 非空时生成,判据误报。 · 断言 `/` 必须转义 —— 但 sed 分隔符是 `|` 不是 `/`。`/` 无需转义; 真正必须转义的是 `&`(sed 里表示整个匹配)与 `|`(分隔符)。
This commit is contained in:
@ -210,9 +210,34 @@ build_homed() {
|
||||
"$_graphgen" -out "$BUILD_DIR/depgraph.bin"
|
||||
echo " [graph] digest=$_graph_hash"
|
||||
|
||||
# ★ 内嵌主密钥(用户 2026-10-16 方案 C:字面内嵌,防丢失)。
|
||||
#
|
||||
# 密钥从**环境变量**读,不落仓库:本仓有两个公开远端
|
||||
# (gitcode / github),把 64 位 hex 写进任何被跟踪的文件都会
|
||||
# 永久留在 git 历史里。
|
||||
#
|
||||
# HA_EMBEDDED_KEY_HEX=<64 位 hex> deploy/packaging/build.sh
|
||||
#
|
||||
# 未设时**不注入**(行为与以前完全一致):不报错、不警告 ——
|
||||
# 因为开发机构建与 CI 本来就不应该带生产密钥。但产物会因此
|
||||
# 没有内嵌钥,生产打包时**必须**显式给。
|
||||
local _embedkey="${HA_EMBEDDED_KEY_HEX:-}"
|
||||
local _keyflag=""
|
||||
if [ -n "$_embedkey" ]; then
|
||||
case "$_embedkey" in
|
||||
????????????????????????????????????????????????????????????????)
|
||||
# 64 字符:形状像 32 字节 hex
|
||||
_keyflag=" -X github.com/JianFeeeee/HomeAgent/internal/security.embeddedKeyHex=$_embedkey"
|
||||
echo " [security] 内嵌主密钥已注入(64 位 hex)" ;;
|
||||
*)
|
||||
echo " error: HA_EMBEDDED_KEY_HEX 必须是 64 位 hex(当前 ${#_embedkey} 字符)" >&2
|
||||
return 1 ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
CGO_ENABLED=1 CC="$_cc" "$GO" build -buildvcs=false -trimpath -installsuffix dynlink \
|
||||
${_tagargs[@]+"${_tagargs[@]}"} \
|
||||
-ldflags "$LDFLAGS -X github.com/JianFeeeee/HomeAgent/internal/kernelboot.EmbeddedGraphHash=$_graph_hash" -o "$out" ./cmd/homed/
|
||||
-ldflags "$LDFLAGS -X github.com/JianFeeeee/HomeAgent/internal/kernelboot.EmbeddedGraphHash=$_graph_hash$_keyflag" -o "$out" ./cmd/homed/
|
||||
echo " OK ($(file "$out" | sed 's/.*: //') | $(du -h "$out" | cut -f1))"
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user