跳转到内容
use-cases / hobby-project-graveyard-stays-alive / hero
CONTAINERS · COST OPTIMIZE

让兴趣项目坟场也养得起的方案

Heroku 上 11 个半成品副业项目就是 11 个每月 7 美元的 dyno。在 Hoody 上,11 个容器跑在一台 29 美元的机器上。闲置的不收费。终于有人去访问 2023 年写的国际象棋引擎时,URL 会在毫秒内唤醒容器。

容器文档
use-cases / hobby-project-graveyard-stays-alive / lifecycle

三种状态,一张账单

Hoody 容器是一台真正的 Linux 机器,不必运行也能保持低成本。大多数项目终其一生都待在中间那一列。

状态 · 已停止

仅文件系统

POST /containers/[id]/stop 让 CPU 和 RAM 降至零。只有磁盘上的 BTRFS 增量保留下来——通常只有几百兆。容器没了,但项目还在。

成本仅磁盘
状态 · 闲置

无人访问就关停

11 个项目大部分都待在这个状态。没有进程在运行,没有 RAM 被占用。机器唯一付费的就是文件系统,而 BTRFS 会在服务器上的所有容器之间对基础镜像去重。

成本≈ 0¢ / 小时
状态 · 活动

请求到达即唤醒

对容器 URL 的一次 GET 会在 5–15 秒内完成冷启动(暂停状态则瞬时唤醒)。访客感知到短暂加载,请求落地,流量结束后容器又回到睡眠。

唤醒< 15 秒

Hoody 给容器记录了三种生命周期操作:已停止(无 CPU、无 RAM,文件系统保留)、已暂停(冻结在 RAM 中)以及活动状态。已停止是坟场的天然休息状态——磁盘增量让项目以接近零的边际成本继续存活。

use-cases / hobby-project-graveyard-stays-alive / wake

终于有人来访问时会发生什么

两个窗口。访客发出一次普通的 GET。容器启动、响应,然后回到睡眠。整个流程跑在项目一直使用的那个 Hoody URL 上。

visitor.curl
访客 · 2023 年的旧链接
# 有人点开了一个旧 README 里的链接GET https://chess-engine.containers.hoody.com/# 冷启动唤醒后的响应 200 OK · text/html · 4.2 kB# 总耗时:0.41 秒
containers/$CID/start
服务器 · 容器生命周期
# 服务端唤醒追踪[t+0ms] rootfs 挂载(BTRFS 子卷)[t+8ms] 命名空间 + cgroup 附加[t+34ms] init pid 1 → systemd(或你的 CMD)[t+72ms] 200 OK ← 请求交给应用# 闲置超时后回到已停止

POST /api/v1/containers/[id]/start 是显式的生命周期操作;通过容器的 HTTPS 主机名路由会自动触发同样的唤醒。没有单独的唤醒端点——访问 URL 就是唤醒。

use-cases / hobby-project-graveyard-stays-alive / powers

你不必再亲手了结的项目

当闲置免费时,这 11 个项目就不再是每月账单要不要付的问题,而只是一个文件夹。你过去要做的那些决定,不再需要做了。

一年触发两次的脚本

报税季触发的提醒脚本依然能触发

在 1099 表格出来时给你发提醒的脚本一年只跑一次。在 7 美元/月的 dyno 上,每次触发要花 84 美元。在这里它睡 364 天,为一次 HTTP 调用唤醒,然后再睡。你都忘了写过它。它还在工作。

分享链接

现在还有人在读 2022 年的 demo

有人晚了两年才在 Hacker News 上看到你的 `recipe-tracker-2022` 博文。链接依然解析得到。容器唤醒、渲染页面,然后回到睡眠。你不会因为这次流量峰值收到 30 美元的账单。

创意余地

你不再提前掐死项目

在按应用计费的方案里,你在动手前就先在脑子里筛掉点子。在这里不必。把那个还没成形的东西推上去。忘掉它。多年后再找回来。打开 URL。它还在。

use-cases / hobby-project-graveyard-stays-alive / cost

账单的形态

按应用收费会在你 11 个项目无人访问的每一秒都向你计费。按服务器收费只为机器收一次费,然后让项目在里面叠起来。

  1. 按应用堆栈 · 之前$77/月

    11 个 Heroku Eco dyno,每个约 7 美元;或 11 个 Render Web 服务。无论有没有人来访问,账单一样。

  2. 一台裸金属机器$29/月

    Hoody 服务器起价大约相当于两个 dyno 的钱。11 个容器装得下。第 12 个不再额外计费。

  3. 闲置容器成本0¢/小时

    BTRFS 增量 + KSM 去重让一个已停止容器只占磁盘成本。睡眠状态不计费,机器才计费。

Hoody 市场价格因区域和规格而异;文档中的入门价格大约 20 美元/月起。容器密度取决于工作负载——轻量副业项目可以紧密堆叠,任何长期占用 RAM 的负载需要更多余量。

use-cases / hobby-project-graveyard-stays-alive / punchline

坟场不再是一笔托管账单了。它只是一个文件夹。

之前 · 11 张账单之后 · 一台机器 + 一个文件夹
之前 · 按应用11 个 dyno × $7 = $77/月11 张发票 · 按应用做下线决定
现在 · 按服务器1 台机器 × $29 = $29/月一张发票 · 容器来来去去
阅读容器文档
use-cases / hobby-project-graveyard-stays-alive / replaces

本方案替代了什么

按应用计费的托管方案对每个休眠项目都收费。按服务器计费给坟场加了一个软上限。下面这些平台是按副业项目数量收费,而不是按服务器:

  • Heroku Eco / Basic dyno每个 dyno、每个应用、每月 5–7 美元——即使闲置也照收
  • DigitalOcean droplet按 VM 计费迫使你把项目挤到更少的机器上
  • Render Web 服务免费档会进入睡眠并冷启动;付费档按服务计费
  • Railway按服务用量计费——11 个服务,11 个计数器
  • Fly.io machines按应用计费;自动停机有用,但仍是按应用
  • Vercel 免费档闲置兴趣项目有冷启动惩罚,还有 serverless 账单的意外
use-cases / hobby-project-graveyard-stays-alive / cta

可以全部留下。限制是文件夹的容量,不是预算。

阅读容器指南
use-cases / hobby-project-graveyard-stays-alive / related

阅读其他内容