InstaBox 的机器空闲 30 分钟就会自动休眠(auto-suspend)。本仓库一个 keepalive.sh 搞定保活:用官方 activity lease 定期续租,让机器一直醒着;另有 Cloudflare Worker 版,不想自己找台常开机器时用;Docker 版给 NAS / 群晖 / 1Panel 这类容器环境。三种跑法都支持多账号(多把 key 无限叠加)和 409 自愈(被挂起自动唤醒再续租)。
为什么不能直接把休眠关掉(
autoSuspendAfterSeconds=0)?2026-10-18 实测:普通/邀请制账号的/v1/me里有"fixedAutoSuspendSeconds": 1800、"manualLifecycle": false,服务端把空闲挂起阈值锁死在账号级,因此对PATCH /v1/machines/{id}传autoSuspendAfterSeconds: 0(或任何值,含官方instabox auto-suspend <box> 0与 SDKsetAutoSuspend)一律被静默忽略:返回 200,值仍是 1800。所以只能用租约这条官方口子。
为什么不在机器里面跑保活:机器一 suspend,里面的 cron/systemd 定时器全都冻住,谁也叫不醒自己。续租必须来自外部、靠那次出网请求带出去 —— 这也是 Worker 版要放到 Cloudflare 的原因;
keepalive.sh装在你自己的常开机器上,同样满足。
三种跑法都得先有一把 InstaBox 账号的 API key(形如 ibk_...)——下面命令里的 ibk_xxx 都指它。key 不是脚本生成的,要在 InstaBox 网页控制台里创建,入口藏得有点深:
- 打开 instabox.sh,用 GitHub 或 Google 登录进控制台
- 点右上角账号菜单 → Profile → API keys
- 点 Create Key,权限二选一:
- Full access —— 全权限,省事
- Restricted —— 自己勾 scope;只做保活用
machines:write就够(write 含 read;machines:delete、images:*都不需要)
- 建完立刻复制:key 只在创建时显示一次,弹窗关了网页上再也看不到,丢了只能删掉重建
几个容易踩的点:
- key 长这样
ibk_...;GitHub/Google 登录只用来进控制台和建 key,不能拿登录态当 key 用 - 一把 key 对应一个账号。多个账号就建多把,安装时逗号连起来:
key=ibk_aaa,ibk_bbb - key 泄露或要换:到同一个 API keys 页面 revoke 旧的、建新的,然后改本机
.env(见下文) - 官方文档:https://instabox.sh/docs/keys-sdk
把脚本装到任何一台常开的机器(VPS/NAS/路由器),cron/systemd 定时续租,也支持多账号:
# 保活名下全部机器(有几台保几台,机器名都不用填)
key=ibk_xxx bash <(curl -Ls https://raw.githubusercontent.com/pingmike2/instabox-keepalive/main/keepalive.sh)
# 只保某一台
key=ibk_xxx machine=qqq bash <(curl -Ls https://raw.githubusercontent.com/pingmike2/instabox-keepalive/main/keepalive.sh)
# 非 root: curl -Ls <同一个地址> | sudo -E env key=ibk_xxx machine=qqq sh
# 多账号:key 逗号分隔多把,每把 key 各保各的,无限叠加、单个也能跑
key=ibk_aaa,ibk_bbb,ibk_ccc bash <(curl -Ls https://raw.githubusercontent.com/pingmike2/instabox-keepalive/main/keepalive.sh)就一个文件:不带参数=安装/更新,uninstall=卸载,--once / --watch / --status / --release=手动用,--help 看全部参数。装完会立刻做一次续租自检,失败就不装;服务形式按系统自动挑 systemd → OpenRC → cron。
想升级直接再跑一次安装命令(按现有 .env 重装,key 不会丢);以后加账号就是往 .env 的 INSTABOX_API_KEY 后面续 ,ibk_xxx。
机器筛选
- 不填
machine(推荐):脚本用你的 key 调GET /v1/machines自己列出名下所有机器,全部保活,新加机器下一轮自动跟上 - 填
machine=qqq只保这一台;也可以填机器 id(m_...);machine=all和不填一样 - 多把 key 时
machine对每把 key 各自生效(比如machine=qqq就是每把 key 各保自己名下的qqq)
日常
sh /root/instabox-keepalive/keepalive.sh --status # 机器状态(不填机器=全部)
sh /root/instabox-keepalive/keepalive.sh --once # 手动续一次
sh /root/instabox-keepalive/keepalive.sh --release # 放掉租约,恢复空闲休眠
sh /root/instabox-keepalive/keepalive.sh uninstall # 彻底卸载(停服务、删 unit、清 cron、放租约、删目录)变量(.env 或安装环境变量;--dir 默认 /root/instabox-keepalive,--service 默认 instabox-keepalive,还有 --lease --ttl --raw --cron --no-start)
| 变量 | 默认 | 说明 |
|---|---|---|
INSTABOX_API_KEY |
无(必填) | ibk_...,多把逗号分隔 |
INSTABOX_MACHINE |
空=全部 | 机器名 / id / all |
INSTABOX_LEASE |
keepalive |
租约名 |
INSTABOX_LEASE_TTL |
300 |
秒,30–3600 |
INSTABOX_RENEW_EVERY |
0.6 × ttl |
续租间隔 |
INSTABOX_AUTO_RESUME |
1 |
遇 409 先 resume(stopped 用 start 兜底)再续;0 只报错不唤醒 |
INSTABOX_WAKE_GAP / INSTABOX_WAKE_TRIES |
5 / 3 |
唤醒后轮询间隔/次数 |
INSTABOX_API_URL |
https://api.instabox.sh |
换私有网关时才用 |
密钥安全:key 只落本机 <安装目录>/.env(0600,不进进程列表);安装时 key 会出现在命令行一次,装完记得 history -c;建议只用 machines:write 权限的 key。
每个账号要一把各自独立的 key——都在同一个 Profile → API keys 页面里分别 Create Key(换台账号就先用那个账号登录一次网页建 key,见上文《获取账号的 API key》)。
keepalive.sh 和 Worker 都支持多账号:第 N 个账号的变量名 = 单账号变量名 + _N 后缀(脚本里也可以直接 key=ibk_aaa,ibk_bbb)。
| 1 号账号(和单账号完全一样) | 2 号账号 | 说明 |
|---|---|---|
INSTABOX_API_KEY |
INSTABOX_API_KEY_2 |
Secret,必填 |
INSTABOX_MACHINE |
INSTABOX_MACHINE_2 |
可选,留空 = 该账号全部机器 |
INSTABOX_LEASE |
INSTABOX_LEASE_2 |
可选,默认 keepalive |
INSTABOX_LEASE_TTL |
INSTABOX_LEASE_TTL_2 |
可选,默认 900 |
INSTABOX_AUTO_RESUME |
INSTABOX_AUTO_RESUME_2 |
可选,默认 1 |
- 加一个账号 = 往
INSTABOX_API_KEY里续,ibk_xxx(脚本和 Worker 同款写法),或面板上加一个INSTABOX_API_KEY_2Secret - 带后缀的优先,没写的自动继承不带后缀的全局值;
INSTABOX_MACHINE也会继承,所以两个账号机器名不一样时记得写INSTABOX_MACHINE_2 - 编号可以不连续(只配
_2也能跑);INSTABOX_API_KEY_1等同于INSTABOX_API_KEY - 同一把 key 配了两次只续一次
- 一个变量塞多把也行(推荐,无限叠加):
INSTABOX_API_KEY = "ibk_aaa,ibk_bbb,ibk_ccc"(逗号分隔)→ 自动按顺序当 1、2、3 号账号,加账号就是往里续一段,ibk_xxx。两种写法混着用也行:显式_N变量永远占自己的编号,多出来的往外推空位(比如INSTABOX_API_KEY="kA,kB"且_2=kX→ 1=kA、2=kX、3=kB)。单把 key 的老用法不变 - 每个账号的机器列表分开缓存、分开续租:某个账号 key 失效或机器被挂起,不影响其它账号
/accounts看现在认到了几个账号(key 打码);?account=2只操作 2 号(/、/status、/release都支持)
Worker 侧补充(只对 Worker 生效;VPS 版没有 KV 和子请求限制)
- KV 绑定不用动:还是
LOG、还是每小时最多 1 条,多账号只是让每条日志里多几个account编号 - 免费版 Worker 每次调用最多 50 个子请求:一个账号大约「1 次列机器 + 每台 1 次续租」,账号/机器多的时候别超(付费版 1000 次)
配置示例:三把 key,其它全用全局值(Worker 面板)
面板 Variables and Secrets 里最终就这几条(key 和 token 都是 Secret):
| 变量 | 类型 | 值 |
|---|---|---|
INSTABOX_API_KEY |
Secret | ibk_aaa…(1 号账号) |
INSTABOX_API_KEY_2 |
Secret | ibk_bbb…(2 号账号) |
INSTABOX_API_KEY_3 |
Secret | ibk_ccc…(3 号账号) |
TOKEN |
Secret | 自己起一串随机值,例如 openssl rand -hex 16 的输出 |
INSTABOX_LEASE_TTL |
Text | 900 |
INSTABOX_LOG_MODE |
Text | hourly |
INSTABOX_MACHINE / INSTABOX_LEASE / INSTABOX_AUTO_RESUME 都不写,效果就是:每个账号保活自己名下全部机器、租约名 keepalive、碰到挂起/停掉自动唤醒。
懒人写法(推荐):三种等价 —— 要几个加几个。
# 单变量塞多把(推荐):加账号就是往里续 ",ibk_xxx"
INSTABOX_API_KEY = ibk_aaa,ibk_bbb,ibk_ccc
# 或每把一个 secret(老写法,效果一样)
INSTABOX_API_KEY = ibk_aaa
INSTABOX_API_KEY_2 = ibk_bbb
INSTABOX_API_KEY_3 = ibk_ccc
# 或混着用(显式 _N 的编号优先,多出来的往外推空位)
INSTABOX_API_KEY = ibk_aaa,ibk_bbb
INSTABOX_API_KEY_2 = ibk_xxx # 占死 2 号位;任务变成 1=aaa 2=xxx 3=bbb反过来,如果几个账号都只想保活同名的那台机器(比如都叫 qqq):Worker 只写 INSTABOX_MACHINE=qqq,脚本写 machine=qqq,所有账号都会继承这个筛选。
宿主机不想装东西就丢进容器:镜像里装的就是这个仓库的 keepalive.sh。
cd docker
cp .env.example .env && chmod 600 .env # 填 INSTABOX_API_KEY=ibk_xxx
docker compose up -d --build
docker compose logs -f变量名、多账号写法和 VPS 版完全一致,一份 .env 两边通用;--status / --once / --release 也能当一次性命令跑:
docker compose run --rm instabox-keepalive --status没有常开的机器也不影响保活:把续租放到 Cloudflare Worker 上,cron 每 9 分钟自动跑一次,和你的任何机器无关。推荐网页面板部署(不用装 wrangler),想用命令行看最后面的《CLI 部署》。
-
Cloudflare 面板 →
Workers & Pages→Create→Worker→ 起个名字(例如instabox-keepalive)→Deploy -
Edit code,把worker/worker.js的内容整段粘进去(覆盖默认代码)→Deploy -
Settings→Variables and Secrets,加这几条(INSTABOX_API_KEY多账号写法见《多个账号》):变量 类型 值 INSTABOX_API_KEYSecret(加密) 你的 ibk_...(多账号见下面《多个账号》)TOKENSecret(自己起一串随机值) 之后所有请求都要带 ?token=INSTABOX_MACHINEText 留空 = 保活该 key 名下全部机器;填 qqq只保一台(多台用逗号分隔)INSTABOX_LEASEText keepalive(可选)INSTABOX_LEASE_TTLText 900(建议;不填默认 300,会比 cron 间隔小)INSTABOX_LOG_MODEText hourly(默认)/every/off,控制写 KV 的频次INSTABOX_AUTO_RESUMEText 1(默认)。机器被平台挂起/停掉时,先resume(stopped 用start兜底)再续租;设0只报错不唤醒INSTABOX_API_URLText https://api.instabox.sh(换私有网关时才用加这个变量)TOKEN强烈建议一定要设:不设的话,任何知道你 Worker 域名的人都能触发续租/释放。INSTABOX_LEASE_TTL要比 cron 间隔大:间隔 9 分钟就填900,填300会在两次续租之间出现空窗。 -
Settings→Triggers→Cron Triggers→Add Cron Trigger,填*/9 * * * *(每 9 分钟)→ 保存。这就是自动保活的开关 -
想看
/log:Storage & Databases→KV→Create namespace,然后在 Worker 的Settings→Bindings里加一个 KV 绑定,变量名填LOG、选刚建的空间。不绑也能用,只是/log是空的
部署完打开 /accounts?token=...,看到 #1、#2、#3 三行(key 打码)就说明三把 key 都认到了;再打开 /status?token=... 看每个账号下的机器。
机器筛选
- 不填
INSTABOX_MACHINE(推荐):Worker 用你的 key 调GET /v1/machines自己列出名下所有机器,全部保活 —— 一个账号默认 支持多台,新加机器下一轮自动跟上 - 填
qqq只保这一台;也可以填机器 id(m_...);多台用逗号分隔,例如qqq,box2 - 机器名由你创建机器时指定(
instabox ls或网页面板都能看到) - 租约是每台机器各一份,名字相同也不会互相干扰
续租对 suspended / stopped 的机器一律回 409 machine_not_running——光续租是空转,机器不会自己醒。默认 INSTABOX_AUTO_RESUME=1:碰到这个错就先 POST /resume(stopped 的用 /start 兜底),等它变成 running 再立刻续租;日志里这条会带 "resumed":true 和 "wake":["resume:202"]。设成 0 就只报错、不唤醒。
https://<你的worker>.workers.dev/?token=xxx 所有账号各续租一次
https://<你的worker>.workers.dev/status?token=xxx 所有账号的机器状态
https://<你的worker>.workers.dev/accounts?token=xxx 配了哪些账号(key 打码)
https://<你的worker>.workers.dev/log?token=xxx 最近 48 条保活日志
https://<你的worker>.workers.dev/log?token=xxx&format=text 纯文本,方便 grep
https://<你的worker>.workers.dev/release?token=xxx 放掉租约
https://<你的worker>.workers.dev/status?token=xxx&account=2 只看 2 号账号(/、/release 同样支持)
?token= 就是上面那个 TOKEN 变量;设了就必须带,不带返回 401 token 不对。不带 format=text 时返回 JSON,任何路由都能加 &format=text 看纯文本。cron 跑的结果和 / 一样,也写进 /log(绑了 KV 才有),每条记着时间、租约、几台、每台到期时间;多账号时每台机器还带 account 编号(1、2…)。
免费版 KV 每天 1000 次写、10 万次读。默认 hourly 模式下,同一小时的连续成功只写 1 条:每天约 24 次写(失败会立刻写,不受去重影响),占额度 2.4%,怎么跑都不会满。手动 /?token= 触发一定写日志,不参与去重。
多账号不会增加写次数:一条日志装的是所有账号的汇总,hourly 模式下仍然每小时最多 1 条,额度算法和单账号完全一样。KV 绑定名、namespace、log 这个 key 也都不用改。
| cron 间隔 | 次数/天 | every 模式写/天 |
hourly 模式写/天 |
|---|---|---|---|
*/9 |
160 | 160 | ~24 |
*/4 |
360 | 360 | ~24 |
* * * * * |
1440 | 1440(超了) | ~24 |
也就是说:间隔 4 分钟以上用默认值随便跑;间隔 1 分钟的 every 会超额度,这时候要么留 hourly,要么把 INSTABOX_LOG_MODE 设成 off 完全不写。
多账号(worker/wrangler.toml 里已带 cron 和 INSTABOX_LEASE_TTL=900):
cd worker
npx wrangler secret put INSTABOX_API_KEY # 1 号账号(key 只进 secret,不写进 wrangler.toml)
npx wrangler secret put INSTABOX_API_KEY_2 # 2 号账号,要几个加几个
npx wrangler secret put TOKEN
npx wrangler deployworker/wrangler.toml 里已经设好 crons = ["*/9 * * * *"] 和 INSTABOX_LEASE_TTL = "900",按需改就行。
| 项目 | 在本项目里干什么活 |
|---|---|
| InstaBox | 提供机器与官方 activity lease 接口,文档里写清了 key 与租约用法 |
| jyucoeng/instabox-keepalive | 早期 Worker 版的多账号实现,本项目在其基础上合并了 VPS 版与 409 自愈 |
仅用于管理你自己账号下的 InstaBox 机器。请自行确认每把 key 的权限范围与所在机器的可信程度 —— Worker 能读到这些 key,能读到它们的人也能操作你的机器。使用本项目产生的一切后果由使用者自行承担。