
字节笔记本
2026年10月6日 · 约 5 分钟读完
给 Codex 开台 DigitalOcean 云开发机
让 coding agent 干活,最怕本地环境一团乱麻:依赖冲突、磁盘吃紧、公司机器不敢乱装东西。Codex 桌面版支持把一台 SSH 主机接成远程工作区,agent 的所有操作都落在远端,本地只留一个界面。问题是怎么快速开出这样一台机器。DigitalOcean 官方给 Codex 做了插件,功能齐全,但要求先安装 DO Connected App 才能完成认证。本文介绍一个等价的开源替代:不走 Connected App,只用一个 DO API token 加三个 Python 脚本,在 Codex 里说一句话,就能开好一台云开发机并自动接上工作区。
和官方插件的差别
两个方案功能完全相同,差别在认证和依赖:官方插件绑定 Codex 平台的 App 机制,必须安装 DigitalOcean 的 Connected App;开源替代把认证换成环境变量里的 DO API token,任何能跑 Python 3 的地方都能用,不依赖平台的 App 支持。

三个脚本撑起全流程
整个插件的核心是一份流程说明加三个脚本,全部只用 Python 标准库,不装任何第三方包:
- do_api.py:DigitalOcean API v2 的薄封装,覆盖 SSH 密钥和 Droplet 的增删查。token 从环境变量 DIGITALOCEAN_TOKEN 读取,永远不写进任何文件;
- keygen.py:生成 ed25519 密钥对,同时产出一个随机前缀,形如 bright-hawk-a3f2。机器名、本地 SSH 别名、DO 侧密钥名都由它派生,多开几台也不会互相覆盖;
- configure_ssh.py:把 Host 块写进本机 ssh config,带上 StrictHostKeyChecking accept-new 防中间人,然后反复探测登录,直到 cloud-init 执行完毕才返回。
流程说明里还有一条硬规矩:只允许用这三个脚本和本地 OpenSSH,doctl 一律禁用。每一步动作都走可预期的脚本接口,方便审计。
十步流程:从 token 到工作区
使用前先准备三样东西:一个有余额的 DigitalOcean 账号、一个 Write 权限的 API token(导出成 DIGITALOCEAN_TOKEN)、本机的 ssh 和 Python 3。
- 验证 token:先调一次密钥列表接口,通了才继续;
- 本地生成 SSH 密钥对和随机前缀;
- 把公钥传到 DigitalOcean 拿到 key id;如果同名或同指纹的密钥已经存在,直接复用旧 id,不建重复;
- 选区域:默认纽约 nyc3,一共 9 个可选,旧金山、多伦多、伦敦、法兰克福、阿姆斯特丹、新加坡、班加罗尔、悉尼都在列;
- 选规格:默认 s-2vcpu-4gb,约每月 24 美元;另有 4 核 8G、8 核 16G 两档通用型和两个高性价比档;镜像要求至少 1 核 2G 内存;
- 创建 Droplet:镜像固定为 Codex Universal,id 是 233103029。报错要按原因处理:区域没有这个规格就换区域或换规格,配额或支付问题去控制台解决,不盲目重试;
- 挂一个 5 分钟后触发的心跳定时器,到此暂停,不空转;
- 心跳唤醒后查状态:拿到 active 加公网 IPv4 就继续;还没好就改成 1 分钟间隔继续等,机器启动慢是正常的;
- 配好本地 SSH 并等 cloud-init,最长约 8 分钟,每 5 秒打印一次进度,看到 READY 才算数;
- 生成一条 codex:// 深链,点开就把这台机器加进 Codex,选好远程目录就能开工。

等待的艺术:心跳而不是死循环
开机加初始化全程要 10 到 15 分钟,其中大部分是纯等待。这个方案没有让 agent 睡循环傻等,而是用 Codex 自带的 heartbeat 自动化:机器创建成功后先约一个 5 分钟后的检查点,当前线程直接停掉;到点自动唤醒查一次状态,没好就把间隔缩到 1 分钟,好了就删掉心跳继续干活。等待期间线程停着,不空耗,也不需要人工盯着屏幕。
成本与清理
Droplet 从创建那一刻起按小时计费,用完必须删。清理就两条命令:droplet-delete 删机器,key-delete 可选,把 DO 侧的公钥也顺手删掉;本机私钥留着无害。如果中途放弃,同样记得清理,别让机器空转烧钱。
小结
如果你已经在用 Codex,又想要一台随开随删的干净远程开发机,这套 DO API 方案是目前最轻的路径:不需要 Connected App,不需要额外依赖,token 和私钥都不离开本机。代价也要清楚:按小时计费的裸机器长期用不如包月划算,开完记得删。



