痛点拆解
① 全局默认目录被多项目写入,技能缓存与本地状态互相污染。② 日志打在单一文件,审计无法按项目切片。③ 复用宽权限令牌,一旦泄露影响所有队列与频道。
日志与配置策略矩阵
先选型再落盘(对照表可直接贴评审纪要):
| 维度 | 独立配置子树 | 日志独立 APFS 卷 | 日志同卷子路径 |
|---|---|---|---|
| 隔离强度 | 高(路径天然分界) | 高(配额与卸载) | 中(靠权限与轮转) |
| 运维成本 | 低 | 中 | 低 |
| 适用 | 默认必选 | 合规或多租户计费 | 小团队成本敏感 |
步骤 1:目录骨架与权限
以 team_alpha / proj_ios 为例,组名与项目一一对应:
sudo dseditgroup -o create proj_ios 2>/dev/null || true
sudo mkdir -p /srv/openclaw/{team_alpha/proj_ios/{config,logs},_quarantine}
sudo chown -R root:proj_ios /srv/openclaw/team_alpha/proj_ios
sudo chmod 0750 /srv/openclaw/team_alpha/proj_ios/config
sudo chmod 0770 /srv/openclaw/team_alpha/proj_ios/logs
检查点:namei -l /srv/openclaw/team_alpha/proj_ios/config 每一级目录应为 drwxr-x--- 且组为 proj_ios。
步骤 2:绑定每项目配置根
在 LaunchAgent 或 systemd 风格 plist 中注入(示意变量名,团队可与现有模板对齐):
export OPENCLAW_CONFIG_ROOT=/srv/openclaw/team_alpha/proj_ios/config
export OPENCLAW_STATE_DIR=/srv/openclaw/team_alpha/proj_ios/config/state
install -d -m 0750 -g proj_ios "$OPENCLAW_STATE_DIR"
模板分层与密钥仍走仓库渲染流程,细节见上文环境模板专文;此处只保证运行时根不回落到用户家目录。
步骤 3:日志分卷或子路径
子路径模式(默认可用):
export OPENCLAW_LOG_DIR=/srv/openclaw/team_alpha/proj_ios/logs
install -d -m 0770 -g proj_ios "$OPENCLAW_LOG_DIR"
# logrotate 片段:按项目文件,保留 14~30 天
分卷模式:将卷挂载到 /srv/openclaw/team_alpha/proj_ios/logs 后再 chgrp proj_ios,可在磁盘报表里直接按卷做配额。
步骤 4:最小权限令牌
为每项目签发仅告警或仅读构建状态的机器人令牌,禁止写仓库设置类 scope;轮换流程可与频道告警与令牌轮换一致。密钥文件落地仍建议 0440 + 单一服务账户只读。
sudo install -m 0440 -g proj_ios secrets/proj_ios/notify.token \
/srv/openclaw/team_alpha/proj_ios/config/secrets/notify.token
sudo stat -f "%Sp %g" /srv/openclaw/team_alpha/proj_ios/config/secrets/notify.token
步骤 5:检查点与排错
发布前后跑三条探测,失败即回滚配置根或权限:
python3 - <<'PY'
import os
root = os.environ["OPENCLAW_CONFIG_ROOT"]
assert os.path.commonpath([root, "/Users"]) != "/Users", "fallback home"
PY
find "$OPENCLAW_LOG_DIR" -maxdepth 1 -type f -name '*.log' -ls
test -w "$OPENCLAW_LOG_DIR" && echo "log_dir_writable"
若日志出现在其他项目子树,优先查是否继承了错误的 OPENCLAW_LOG_DIR;若权限拒绝,核对进程辅助组是否包含 proj_ios。
可引用阈值
- 配置目录 0750、密钥文件 0440,服务账户不入项目外组。
- 文本日志保留 十四至三十天,单文件超 二百兆 强制轮转。
- 令牌 scope 仅保留发送消息与读取运行状态两类,默认关闭仓库管理。
FAQ
问:CI 与人工共用节点怎么办?答:为 CI 单独子目录与只读构建令牌,Runner 标签与路径前缀一致,避免写 config/state。
问:能否软链到家目录?答:不推荐;软链跨权限边界时 namei -l 易踩坑,审计也不直观。
下一步
把本文检查点写进发布单,和队列参数文章交叉验证。更多 OpenClaw 专题见 OpenClaw 索引;站点入口 首页、帮助中心、博客列表均可免登录浏览。