一个测试脚本的
os.remove(),把config.yaml和.env一起删了——
飞书 API Key、视觉模型配置,全部消失。
就在准备重装系统的时候,我突然想到:
进程还活着。配置就藏在它的内存里。
事故现场
一切正常的一天。突然,vision 报错:
Error analyzing image: No LLM provider configured for task=vision provider=auto截图分析用不了了。查配置:
cat~/.hermes/config.yaml# bash: No such file or directoryconfig.yaml 不存在了。
再查.env:
cat~/.hermes/.env# bash: No such file or directory也没了。
飞书 AppID、App Secret、DeepSeek API Key、小米视觉模型 Key——全在这一份.env里。现在什么都没了。
谁干的?
翻测试记录。半小时前,我跑了一个"保存配置"的自动化测试——验证 save_config 写文件是否正确。测试脚本的清理逻辑:
# 测试结束清理(测试脚本里)forfin[config.yaml,.env,config.json,...]:ifos.path.exists(f):os.remove(f)测试脚本操作的是真实路径——~/.hermes/config.yaml、~/.hermes/.env。
我本意是"清理测试数据"。结果:清理的是生产配置。
测试代码没有隔离环境,直接删了真实文件。
后果有多严重
✅ config.yaml: 有备份(config.yaml.good——标准备份)——能恢复 ❌ .env: 没有备份!——飞书AppID/Secret/DEEPSEEK_API_KEY/XIAOMI_API_KEY 全丢.env里的飞书凭证,是智能体跑在飞书上的"身份证"。没它,网关一重启,飞书直接断开。
更要命的是:我没有 .env 的备份。这些 Key 在配置中心页面上配置过一次,之后就没有再出现过明文。
灵光一现:进程还活着
看着还在正常运行的系统,我突然想到一件事:
gateway 进程是半小时前启动的。启动的那一刻,它把 .env 里的全部变量加载进了自己的环境。
文件删了,但进程的环境变量还在——就在:
/proc/<PID>/environLinux 上,每个进程的环境变量都暴露在这里。进程不死,配置不丢。
恢复过程
# 1. 找到 gateway 进程pid=14754# ps aux | grep "hermes gateway run"# 2. 读它的环境变量(\x00 分隔)env=open(f'/proc/{pid}/environ','rb').read().split(b'\x00')# 3. 解析 KEY=VALUE,筛选需要的pairs={}forkvinenv:ifb'='inkv:k,v=kv.split(b'=',1)k=k.decode('utf-8')ifany(xink.upper()forxin['FEISHU','DEEPSEEK','XIAOMI','API_SERVER']):pairs[k]=v.decode('utf-8')# 4. 写回 .envwithopen('~/.hermes/.env','w')asf:fork,vinsorted(pairs.items()):f.write(f"{k}={v}\n")结果:
✅ 恢复 17 个 key: FEISHU_APP_ID / FEISHU_APP_SECRET / FEISHU_DOMAIN DEEPSEEK_API_KEY / XIAOMI_API_KEY / XIAOMI_BASE_URL API_SERVER_ENABLED / API_SERVER_KEY / ...飞书凭证、模型 Key,一个不少。
进程的内存,成了配置的最后一道备份。
复盘:三个本可以避免的错误
1. 测试代码必须隔离环境。
# 错误:测试操作真实路径os.remove('~/.hermes/config.yaml')# 正确:测试用临时 HOME,碰不到生产os.environ['HERMES_HOME']='/tmp/test_hermes'测试代码访问生产路径,是最危险的越界——它自己都不知道自己在删什么。
2. 秘密文件必须备份。
.env这种文件,平时"看不见"(不在 git 里、不导出),丢了才想起它多重要。
教训:密钥文件备份一份到安全位置(哪怕离线),或者至少:让 gateway 进程活着——它就是一份活备份。
3. /proc/PID/environ 是最被低估的恢复工具。
文件删了、备份没有、git 没有——但只要进程没重启,环境变量就在:
/proc/<PID>/environ读它、解析它、写回文件——配置失而复得。
文件是配置的躯壳,进程是配置的灵魂。
躯壳没了,灵魂还在——
只要进程没死,配置就永远有一份复印件,
藏在 /proc 里,等你来取。
(真实事故记录:测试脚本 os.remove 删除了生产 config.yaml 和 .env,从运行中的 gateway 进程 /proc/PID/environ 恢复全部 17 个密钥配置。教训:测试隔离、密钥备份、进程内存是最后的保险。)