其他
当仓库用 .sops.yaml + age 加密…
在包含 `.sops.yaml`、加密的 `secrets/<env>.env` 和 `pnpm secrets` 包装器的仓库中,按身份与提权规则管理密钥。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 35/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 40/100 ×0.15
适用场景
当仓库用 .sops.yaml + ag特定
解决思路
- 确认仓库使用 sops 加密 dotenv:每个部署环境一个文件(`secrets/dev.env`、`secrets/prod.env`)并提交到 git,用 age 身份解密;不要寻找 `.env`、secrets 服务或登录会话。
- 每个 checkout、worktree 和云沙箱在 clone 时都已有这些加密文件,唯一需要的输入是 age 私钥。
- 唯一操作入口是 `pnpm secrets`(`tools/secrets.ts`);在存在该包装器的仓库中不要直接调用 `sops`。
- 按身份范围选择密钥:`agent` 是用户级身份,私钥位于每台运行 agent 的机器的 `~/.config/sops/age/keys.txt`,云沙箱中用 `SOPS_AGE_KEY`,只能解密 `dev.env`。
- `personal` 是用户级身份,私钥在用户的密码管理器,能解密所有文件。
- `prod` 是项目级身份,私钥只在对应项目的生产平台,只能解密 `prod.env`。
- 在 `.sops.yaml` 中按公钥列出 recipient(接收者);加密不需要私钥,解密或编辑需要某个 recipient 的私钥。
- 把 `agent` 和 `personal` 当作所有项目共享的本地开发密钥;把 `prod` 当作按项目生成的身份,使单个泄露的部署变量只影响一个项目。
- 管理 dev secrets 时无需询问:用 `pnpm secrets show dev` 查看全部解密内容。
- 用 `pnpm secrets get dev STRIPE_KEY` 获取单个 dev 变量。
- 用 `pnpm secrets set dev STRIPE_KEY sk_test_1` 设置单个 dev 变量。
- 用 `pnpm secrets unset dev STRIPE_KEY` 删除单个 dev 变量。
- 用 `pnpm secrets exec dev -- node apps/worker/src/main.ts` 把解密值放入子进程环境来运行命令。
- 使用 `exec` 时依赖其行为:解密值覆盖 shell 环境,从子进程环境移除 `SOPS_AGE_KEY*`,转发信号,并以子进程状态退出。
- 读写 `prod.env` 需要提权:先检查当前 checkout 是否有 `.age/elevated`;若存在,prod 命令可用,继续执行。
- 若 `.age/elevated` 不存在,让用户在他们自己的终端运行 `op read 'op://Personal/age-personal/private key' | pnpm secrets elevate`(或用户密码管理器输出密钥的等价方式),并说明为什么需要该权限。
- 提权按 checkout 生效,直到 `.age/elevated` 被删除;不要把它复制到另一个 worktree。
- 添加变量时,把变量加入 env schema,并加入每一个你能解密的 `secrets/<env>.env`。
- 如果无法解密 prod,在 PR 中明确说明;类型化 env 检查会让 prod 启动失败直到该值被设置,这是预期信号。
- 绝不把 `AGE-SECRET-KEY-...` 写入受跟踪文件、日志或提交。
- 绝不把 `personal` 或 `prod` 放入云环境。
- 一次性人类设置步骤(生成密钥、安装 `sops` 和 `age`、把 `agent` 密钥接入 agent 工具和云沙箱、配置生产平台、轮换密钥)阅读 `references/setup.md`;用户要求提醒步骤时,按顺序带他们走该文件。
- 对设计依赖的 sops 和 age 行为(身份联合、`updatekeys`、`exec-env` 限制、dotenv 注意事项)阅读 `references/sops-notes.md`。
适用边界 · 注意事项
- 仓库没有 `.sops.yaml`、`secrets/<env>.env` 或 `pnpm secrets`/`tools/secrets.ts` 包装器时,不适用此流程。
- 没有相应 age 私钥(尤其 prod 未提权)时,不要尝试绕过 `pnpm secrets` 或直接调用 `sops` 读写 prod;应请求用户提权或说明无法解密。
- 不要把 `personal`/`prod` 身份用于云环境,也不要把 `AGE-SECRET-KEY-...` 写入受跟踪文件、日志或提交。