コンテンツにスキップ
use-cases / preview-env-per-pr-cheap / hero
コンテナ · スナップショット · PR プレビュー

プルリクエストごとのプレビュー環境、月中

ステージングコンテナを 1 度だけスナップショット化します。新しい PR ごとに、独自の URL を持つコンテナへスナップショットがクローンされます。レビュアーがリンクを開くとコンテナが起動し、誰も見ていないと昼寝し、PR がクローズされたら 1 行の cron が破棄します。60 ブランチ、60 URL、定額の請求。

CRON · マージ済みプレビューを破棄1 行、5 分ごと
# PR がマージされると、cron がそのコンテナを削除する。*/5 * * * * curl -X DELETE https://api.hoody.com/api/v1/containers/$MERGED_PR_CID
スナップショット系統1 つのベース · 多数のクローン
STAGING-BASEsnap-2026-05-01 · 4.2 GB
コピーオンライトページを共有30 / 30 コンテナ
use-cases / preview-env-per-pr-cheap / mechanism

PR が URL になるまで

3 つの呼び出し。1 行の cron。すでに持っている CI パイプラインが、自分で書くなら同じ順序で呼び出します。

    01
    ステップ 01 · 1 度だけ

    ステージングコンテナをスナップショット

    ステージングスタック(アプリ、データベース、キュー、フィクスチャ)を実行するコンテナを選びます。スナップショットを POST し、staging-base と命名。ファイル、プロセス、メモリがキャプチャされます。スナップショットは tarball ではなく、差分対応の出発点であり、クローンはコピーではなくページを共有します。

    02
    ステップ 02 · PR ごと

    プッシュ時にスナップショットをクローン

    CI が GitHub プッシュ Webhook を受け取り、source_snapshot=staging-base でコンテナ API に POST します。シードデータベースと PR のブランチがチェックアウトされた状態で、新しいコンテナが数秒で起動。URL はステータスチェックとして返されます。

    03
    ステップ 03 · マージ時

    PR がクローズされたら破棄

    5 分ごとの cron エントリがマージ済み PR を巡回しコンテナを DELETE します — もしくはマージ Webhook がインラインで実行します。コンテナのディスク差分は回収され、URL は解放され、コンテナのスロットは次の PR のためにプールへ戻ります。

ステップ 02 は yarn install くらいの時間です。ステップ 03 は HTTP コール 1 回。PR のコンテナが存在したことを他の誰かが知る必要はありません。

use-cases / preview-env-per-pr-cheap / api

CI が呼び出す正確なエンドポイント

Hoody Containers と Snapshots API の実エンドポイント 3 つ。すでにある GitHub Actions ステップに差し込んでください。

プレビュー環境 · 呼び出し表containers + snapshots
  • POSTmethod · path
    /api/v1/containers/[staging_id]/snapshots

    staging-base スナップショットを取得

    Body: [ "alias": "staging-base", "expiry": 30 ]。snap-20260501-093000 のようなスナップショット名を返します。main ブランチデプロイごとに 1 度実行 — すべての PR クローンは最新キャプチャから派生します。

  • POSTmethod · path
    /api/v1/projects/[project_id]/containers

    PR ごとに新しいコンテナをクローン

    Body は server_id と container_image を選び、PR 番号、ブランチ参照、データベース名を注入するため environment_vars を渡します。コンテナはゼロからではなく、スナップショットのファイルシステムから起動します — キャッシュやシードデータはすでにそこにあります。

  • DELETEmethod · path
    /api/v1/containers/[pr_container_id]

    PR がクローズされたらプレビューを引退

    1 つの呼び出し。コンテナがシャットダウンし、ディスク差分が回収されます。それ以外に分解する必要はありません。誰も見ていない間にクローズされた PR は、5 分間隔の cron エントリが処理します。

Hoody Container Snapshots API および Containers API のエンドポイントです。スナップショットの有効期限は日数指定。コンテナ作成は environment_vars、ssh_public_key、autostart、ramdisk、realm_ids を受け付けます — 完全なリクエストスキーマはドキュメントを参照してください。

use-cases / preview-env-per-pr-cheap / powers

プレビューが無料になると変わるもの

計算がレビュアーの行動を制限しなくなります。プレビュー 1 つ $40 では高すぎた 3 つの習慣が、PR ごとのコストが端数誤差になると自然に現れます。

レビュー速度

レビュアーはクリックする、プルしない

バグ再現のためにブランチをローカルにチェックアウトする人はいません。URL を開いて壊れているところをクリックし、PR にスクリーンショットを残します。レビュールーフは差分が示唆するものではなく、コードが実際に行っていることに基づいて回ります。

予算

アイドル PR はコストゼロ

今レビューされていない 50 件の PR は、CPU ゼロ、RAM ゼロ。staging-base スナップショットのページをディスク上で共有するため、フットプリントもほとんど差分のみ。請求は PR の数ではなく、ボックスで上限が決まります。

デザイン & プロダクト

ステークホルダーがループに加わる

デザイナー、サポートエンジニア、セールスリード — URL を持つ誰もが PR を試せます。彼らがブランチを git checkout することはなかったでしょう。リンクがあれば、リリース前に変更を実際に見るようになります。

use-cases / preview-env-per-pr-cheap / compare

ドル換算、率直に

月に 30 PR を開くチーム。以前の数字は標準的なプレビュー環境の請求額。以後の数字は、30 件全部とステージングが収まる Hoody ベアメタル 1 台です。

以前 · VERCEL プレビュー、PRO チーム

$480/月

シート単位の Pro 価格に加え、ビルド分数と帯域幅。月 30 PR デプロイをこなす 6 人エンジニアチームの場合。ほとんどのチームは次の 20 件が本当にお金になるため、アクティブな 10 件にプレビューを制限します。

VS
以後 · HOODY · ベアメタル 1 台

$30/月

Hoody マーケットプレイスのミッドティアサーバー 1 台がステージング、30 件の PR クローン、CI キャッシュをまかないます。次の 60 件は $0 で追加できます — コピーオンライトにより、各クローンはスナップショットのページに差分が加わるだけです。

Vercel Pro の表示価格はシートあたり月 $20 + 使用量。Hoody ベアメタル価格はマーケットプレイス主導で、エントリーティアは月 $20 未満から。コンテナ密度はワークロード次第 — 一般的な Web アプリは数十〜数百個収まります。大規模なステートフルサービスはより余裕が必要です。

use-cases / preview-env-per-pr-cheap / punchline

プレビュー環境は予算項目ではなくなり、デフォルトになります。

以前 · アクティブな 10 件で打ち止め以後 · プルリクエストごとに 1 つ
以前のポリシーはこんな見た目だった声の大きい 10 件の PR だけプレビュー残り 20 件はコメントにスクリーンショット
今はこんな見た目になるすべての PR · すべての差分 · すべてのレビュアーポリシードキュメントなし、プレビューを依頼するチケットなし
use-cases / preview-env-per-pr-cheap / replaces

これが置き換えるもの

プレビュー環境製品はシート単位、分単位、または稼働中コンテナ単位で価格を設定します。Hoody はサーバー単位 — 30 番目のプレビューは 1 番目と同じコストです。

  • Vercel プレビュー環境 (Pro / Enterprise)シート単位 + ビルド分数 + 帯域幅
  • GitHub Codespaces プレビューレビュアーが見ていてもいなくても時間単位で請求
  • AWS Fargate プレビュータスクタスクごとの vCPU + メモリ時間 + データ転送
  • Render プレビュー環境環境単位の価格、アイドルは無料ではない
  • Heroku review appsPR ごとに dyno 1 個、レビュー単位で dyno-時間
  • Netlify deploy preview + ビルド分数ビルド分数は全プッシュを計測し、レビューは計測しない
use-cases / preview-env-per-pr-cheap / cta

1 度スナップショット。PR ごとにクローン。マージで破棄。レビュアーは継ぎ目を感じません。

スナップショットガイドを読む
use-cases / preview-env-per-pr-cheap / related

他のユースケースを読む