個人開発SaaS を ConoHa VPS 2GB プランで運用した実測ガイド (Fastify + SQLite + pm2、2026年版)
Fastify + SQLite + pm2 で月額935円、リリース25回の実測経験

個人開発の Instagram自動運用 SaaS (Electron デスクトップ + Fastify バックエンド) を、ConoHa VPS 2GB プランで半年以上運用してきました。サブスク事業で月935円の VPS 代だけで動かしてリリースは25回、Stripe 決済を組み込んだ本番運用が回せています。本記事では「なぜ ConoHa VPS 2GB を選んだか」「Fastify + SQLite + pm2 という最小構成の運用実測」「Xserver VPS / さくらVPS との比較」「移行時に踏み抜いた4つの罠」を実コストと数値ベースで共有します。
選定理由 — 個人開発SaaS で最初に検討すべき3条件
個人開発の SaaS で VPS を選ぶときに、私が最終的に重視した3条件は次のとおりです。
- 月額が固定で安価 (1,000円以下) — サブスク事業は黒字化前のキャッシュフローが厳しい、固定費は徹底圧縮
- Docker・pm2 などのプロセスマネージャ運用が公式サポート — Node.js / Python のサービス常駐に必要
- 東京リージョン or 日本国内 — Webhook 応答速度 (Stripe → 自社API) で 100ms 以下を確保したい
この条件で実候補に上がったのが、ConoHa VPS / Xserver VPS / さくらの VPS / Hetzner Cloud の4つでした。比較結果は次表のとおりです。
| VPS | 2GBプラン月額 | 初期費用 | 東京リージョン | 長期割引 | サポート |
|---|---|---|---|---|---|
| ConoHa VPS | 935円 | 0円 | ◎ | 長期契約割引あり | 日本語・電話可 |
| Xserver VPS | 1,150円 | 0円 | ◎ | 12ヶ月以上で実質減額 | 日本語・電話可 |
| さくらの VPS | 1,738円 | 0円 | ◎ | 年契約12%引き | 日本語・電話可、老舗 |
| Hetzner Cloud (海外) | $4.90 (約740円) | 0円 | × | なし | 英語のみ |
最終的に ConoHa VPS 2GB プラン (月935円) を選びました。時間課金で気軽に始められ、東京リージョン、日本語サポートが揃っており、長期契約割引もあるという点が決め手でした。Hetzner は最安ですが東京リージョンがなく、Stripe Webhook の往復で 200ms 以上かかるため候補から外しました。
実装スタック — なぜ Fastify + SQLite + pm2 にしたか
VPS の運用負荷を最小化するために、ミドルウェアは「シンプル」を最優先しました。最終的に落ち着いた構成は次のとおりです。
- Web フレームワーク: Fastify (Express より高速、TypeScript 親和性良)
- DB: SQLite (PostgreSQL じゃなく、別プロセス不要)
- プロセス管理: pm2 (Docker じゃなく、軽量で起動が早い)
- HTTPS化: nginx + Let's Encrypt (Caddy も検討したが、既存設定流用優先)
- ファイル配信: 静的 LP も Fastify 経由で配信 (CDN なし、低トラフィック想定)
SQLite を選んだ理由は、サブスクの個人開発で「DB バックアップ = ファイルコピー1個で完結」が運用負荷を圧倒的に下げるためです。PostgreSQL も検討しましたが、別プロセスのメモリ消費 (約 150MB 追加) と、ダンプ・リストアの工数を考えて見送りました。SQLite の WAL モードを有効にしておけば、書き込み中の読み取りもブロックされません。
実測値 — メモリ消費・CPU 使用率・帯域
半年以上の本番運用で取得した実測値が、個人開発VPS選定の最重要データです。私の環境の数字を共有します。
- Fastify プロセス (pm2 管理下): 起動時 70MB、定常 180-280MB、ピーク (Stripe webhook バースト時) 約 420MB
- SQLite: WAL ファイル含め定常 30-80MB
- nginx: 約 25MB
- OS (Ubuntu 24.04) 全体: 約 350-450MB
- 合計: 定常 600-800MB、ピーク 約 1.1GB
ConoHa VPS 2GB プランの実メモリは約 2,048MB なので、ピーク時でもメモリ使用率は約 55% で運用できています。CPU 使用率は定常 5-15% (3コア中)、ピーク (リリース直後のダウンロード集中) でも 60% を超えることはありませんでした。帯域は月数十GB レベルで、3TB の転送量上限に対して使い切る心配はないです。
運用工数 — リリース25回で蓄積したフロー
個人開発で重要なのは「リリースのたびに手順を思い出さなくていい」状態を作ることです。私の運用フローは次のとおりです。
- ローカルで変更 → コミット → push (GitHub)
- VPS で git pull
- 必要なら npm install
pm2 restart gramshiftで再起動- ログ確認 (
pm2 logs)、UptimeRobot で外形監視結果を確認
合計 3-5分でリリースが完了します。CI/CD パイプラインは組まずに手動運用にしたのは、個人開発でリリース頻度が週1回程度なら、CI構築の初期工数がペイしないと判断したためです。リリース頻度が日次以上に上がったら GitHub Actions で自動化する予定です。
移行時に踏み抜いた4つの罠
VPS 移行・運用で実際に踏んだトラブルです。同じ罠を踏まないためのチェックポイントとして共有します。
罠1: pm2 の自動起動設定漏れ
VPS 再起動 (ConoHa 側のメンテナンスやカーネル更新) のあと、pm2 がプロセスを自動再起動してくれず、サイト全停止に気づくのが翌朝、というケースがありました。原因は pm2 startup + pm2 save の設定が初期構築時に漏れていたためです。次のコマンドを必ず実行しておくべきです。
pm2 startup
# 出力されたコマンドをコピペして実行 (systemd 連携)
pm2 save
# 現在のプロセスリストを永続化
これで VPS 再起動後も pm2 がプロセスを復帰させます。
罠2: SQLite の WAL ファイル肥大
SQLite を WAL モードで運用していると、稀に .wal ファイルが数GBに肥大することがあります。原因は「長時間トランザクションを開いたまま終了し忘れる」「接続が異常切断される」等です。私の場合、運用2ヶ月目に db.sqlite3-wal が 4GB に膨らんでディスク逼迫しました。対策は次のとおりです。
- 定期的に
PRAGMA wal_checkpoint(TRUNCATE)を実行 (毎日 cron で1回でOK) - 接続を貼りっぱなしにせず、短時間でクローズ
- 外形監視で
df -h結果を週次でメール通知
罠3: Stripe Webhook のタイムアウト
サブスク開始時の Stripe Webhook (checkout.session.completed など) で、自社 API が 10秒以上応答せず、Stripe 側がリトライを繰り返す現象がありました。原因は、Webhook ハンドラ内で「DB 更新 + Discord 通知 + メール送信」を同期実行していたためです。対策は次のとおりです。
// Bad: 同期実行で 10秒超え
app.post('/webhook/stripe', async (req, res) => {
await verifyStripeSignature(req);
await updateDb(...);
await sendDiscord(...);
await sendEmail(...);
res.send({ ok: true });
});
// Good: 即返信して非同期処理
app.post('/webhook/stripe', async (req, res) => {
await verifyStripeSignature(req);
res.send({ ok: true }); // Stripe には即返信
// 重い処理は非同期化 (setImmediate or キュー)
setImmediate(async () => {
try {
await updateDb(...);
await sendDiscord(...);
await sendEmail(...);
} catch (e) { logger.error(e); }
});
});
Stripe Webhook は5秒以内の応答が推奨です。重い処理は別途キューに積むのが安全です。
罠4: HTTPS 証明書の自動更新失敗
Let's Encrypt の証明書は90日で期限切れになります。certbot の自動更新 cron が動いているはずが、ある日「ChromeでHTTPS警告」が出てサイト訪問が激減しました。原因は、80番ポートを nginx が独占していて、certbot が一時的に listen できず更新失敗していたためです。対策は次の2点です。
certbot renew --deploy-hook "systemctl reload nginx"で reload を組み込む- UptimeRobot の「SSL 期限切れアラート」を有効化し、30日前から通知
Xserver VPS / さくらVPS との比較 — 実体験ベース
過去に検討したことのある他社 VPS との比較を、個人開発者目線でまとめます。
- Xserver VPS: 月1,150円、ConoHa よりやや高いが、12ヶ月以上の長期契約で実質減額。エックスサーバー本体 (レンタルサーバー) と同じ管理画面を使えるため、メディア運用と SaaS 開発を併用する人には統合管理しやすい
- さくらの VPS: 月1,738円、老舗で安定感は最高、業務用途向け。個人開発の SaaS 初期にはオーバースペック気味
- Hetzner Cloud (海外): 月$4.90、最安だが東京リージョンなし、Webhook 応答が遅れる
長期運用 (3年以上) を前提に、メディアサイトも併用するなら Xserver VPS も有力候補です。エックスサーバー本体のレンタルサーバー契約と組み合わせると、メディアサイトと SaaS の両方を管理画面1つで運用できます。
結論 — 個人開発SaaS の最小構成
個人開発の SaaS で月935円の VPS、Fastify + SQLite + pm2、リリース25回をこなしてきた経験から、次のことが言えます。
- 固定費は月1,000円台で十分黒字化を目指せる、最初から高額プランを契約する必要はない
- シンプル構成 (Fastify + SQLite + pm2) は運用工数が最小、Docker compose にする必要は (個人開発で MAU 数百〜数千レベルなら) 薄い
- 移行時の罠は pm2 自動起動・SQLite WAL・Stripe Webhook・HTTPS 自動更新の4つを最初から潰しておく
- 外形監視 (UptimeRobot 等) は無料で組める、運用初期から必須
個人開発で「サブスクの黒字化までキャッシュフローが厳しい」と感じている方は、ConoHa VPS 2GB プランのような最安構成から始めることを強く勧めます。スケールが必要になったらプランアップグレード (CPU/メモリ増強) で対応すれば十分間に合います。
関連の運用記録は ノーコード自動化カテゴリ と 自動化レシピカテゴリ に蓄積しています。同じく Claude Code を使った VPS への自動デプロイ運用は Zapier vs Make vs n8n を実運用で比較 もご参照ください。