上个月 dev.to 有人发 Dopbase 实测,自己搭、自己用、没拿钱。我照着跑了一趟,卡在导出。本来就想写个小脚本每周把机密拉出来丢本地加密盘,结果 dopbase export --format json 每次都弹密码提示。试了 --force,试了管道喂密码,全被同一行字挡回来:plaintext access requires interactive confirmation。嘿,你说气不气。这头牛,我今天非钻穿不可。
我一开始真以为是 bug。CI 管道里迁移机密,不让我脚本化,这像什么话?Dopbase 号称给独立开发者和小团队用,导出一个动作得人肉盯着,怎么想怎么别扭。--force 加上,报错一个字没变。
dopbase export --format json --force
# plaintext access requires interactive confirmation
echo "$MASTER_PASSWORD" | dopbase export --format json
# same error: plaintext access requires interactive confirmation
两种姿势倒在同一扇门下,错误文本都没换。活见鬼。
等等,这不对劲。同一个 CLI,dopbase run 就能完全非交互式跑。那篇实测里作者专门建了个 720 小时的 CI 令牌,在 GitHub Actions 里跑生产环境也没问题,机密当环境变量塞给子进程,什么密码都不问。运行能自动化,导出不能——这不是“不会做”,是不做。这俩得拆开。
我往回摸,发现 Dopbase 把“读元数据”和“看明文”从根上分开了。dopbase secret list 默认不显示值,只给名字、版本、更新时间。要看某个值,重新输密码。要导出,还是重新输。跟我惯用的那些云密钥管理工具完全不是一路——那些登录一次拿个 token,后面 API 随便拉。Dopbase 偏不,它把“你已经登录”和“你能拿明文”当成两件事。登录会话只让你看目录,看内容得每次敲门。
这门还不止一道。环境克隆这种写操作也要“近期人工认证”——不是普通登录会话,是个更短的独立窗口。明明还登着管理界面,克隆环境它还是要你再验证一下最近的身份。评论区有人提了句会话 cookie 不等于权限模型,听着像说教,但 Dopbase 把这个当底层假设做了进去。很多人等到写权限隔夜还活着才开始慌,其实人家压根没打算用 cookie 当授权。
中间我一度拍桌子说这是 UI 设计缺陷,导出拦这么死,没法运维。后来试 dopbase import,发现它反而支持非交互式,还有 --dry-run。
dopbase import .env.production --dry-run
# 新增 1 个键,更新 1 个键,未变 0,删除 0
导入能自动,导出不能。它不是按读/写分的,是按“离明文多近”分的。import 是把文件里的东西灌进来,有预览、有合并、有回撤余地;export 是把明文写到 stdout 或文件,这是明文的出口。这个口一旦能脚本化,一个长命的 CI 令牌就能把整个保险柜搬走,还没人知道。dopbase run 不同,run 是值只进子进程环境,不落终端、不落磁盘,所以它敢给 720 小时的令牌。门设在 stdout 和文件这两头,没堵在“能不能用密钥”这头上。这么一想其实很直,但我是撞了墙才看见。
这张表不是浏览器兼容性——今天这头牛没浏览器什么事,我把兼容性换成“绕不绕得过人”了。
| 操作路径 | 非交互式 | 门 | 备注 |
|---|---|---|---|
| dopbase run | 支持 | 无 | 值只进子进程环境,不发到终端 |
| secret list | 支持 | 无 | 只给元数据,不给明文 |
| secret view | 不支持 | 密码确认 | 看一个值也得有人在场 |
| export | 不支持 | 实时密码提示 | --force、管道喂密码全失效 |
| env clone | 不支持 | 近期人工认证 | 独立于登录会话的短期窗口 |
| import | 支持 | 无 | --dry-run 预览合并差异 |
| backup | 支持 | 主密钥 | XChaCha20-Poly1305,加密归档 |
要吐槽的这回到我自个儿了。最拉胯的不是 Dopbase——是我。一开始居然想用管道喂密码过去,一边骂它反自动化,一边用最摆烂的方式对待密钥。按两下回车的事,怎么就不想按了?大概一切都能脚本化的年头,忽然遇到一扇必须人在场的门,第一反应是它出了 bug,不是它堵对了口子。
哦对了,还有个细节。那篇实测里作者专门关掉服务器之后跑 dopbase run,居然还能拿到 development 环境的机密。Dopbase 有按服务器、环境和凭据加密的本地缓存,服务器不可达时自动回退。“掉线也能跑”它都想到了,但离线缓存也没放开明文导出——只是把运行需要的值塞给子进程,不是把保险柜钥匙递给你。
最后,说个跟这篇八竿子打不着的——昨晚我把 Dopbase 备份的 .dop 归档塞进自动化同步任务,结果系统提醒我有个交互式密码提示挂在那儿等了四个钟头。没取消,也没点确认,就那么挂着。早上回来看它还在等,忽然觉得这设计挺诚实:不假装没人也能把门打开,就那么一直等着。扯远了,反正——嘿嘿,下次见。
