月額4万円のインフラコストを5千円に削減!Coolifyで自前PaaSを構築した全記録

Vercel/Heroku/Netlifyで月額4万円かかっていたインフラコストを、Coolifyで月額5千円に削減。3ヶ月の運用で年間45万円のコスト削減に成功した実践記録。
代表 / エンジニア
TL;DR
- Vercel/Heroku/Netlifyで月額4万円かかっていたインフラコストを、Coolifyで月額5千円に削減
- Xserver VPSの2GBプラン(月額1,150円)で5つのWebサービスを安定運用中
- SSL証明書の自動化、GitHub連携、マルチサイト運用が全て無料で実現
- 3ヶ月の運用で年間45万円のコスト削減に成功
はじめに
2024年の年明け、経理から見せられたクラウドサービスの請求書を見て、正直焦りました。
Vercelが$60、Herokuが$50、Netlifyが$19、そしてAWSの開発環境で$150。合計すると月額約4万円。年間48万円です。エンジニア1人の月給に近い金額が、ただサーバーを借りるだけで消えていく。
最初は「これがクラウドネイティブな開発スタイルだ」と自分に言い聞かせていました。でも、プロジェクトが増えるたびに請求額が膨らんでいくのを見て、このままではマズいと思い始めたんです。
そもそも、なぜこんなに高いのか。Vercelは確かに便利です。git pushするだけでデプロイされる。でも、その裏側で何が起きているかといえば、結局はDockerコンテナが動いているだけ。Herokuも同じです。
「これ、自分たちでできるんじゃないか?」
その疑問から、私たちの旅が始まりました。
導入前の課題:インフラコストの現実
請求書の内訳を見てみましょう。生々しい数字ですが、これが現実でした。
Vercel Pro(月額$60)
- コーポレートサイト
- LPサイト
- ブログサイト
1プロジェクトあたり$20。「Pro」プランなので、チーム機能やAnalyticsが使える。でも正直、使いこなせていませんでした。
Heroku(月額$50)
- メインAPIサーバー(Dyno Standard): $25
- バッチ処理サーバー(Dyno Standard): $25
Herokuの価格改定で無料プランが廃止され、仕方なく有料プランに。PostgreSQLのアドオンを入れると、さらに$9追加。
Netlify(月額$19)
- 静的サイトホスティング
- フォーム機能
- Identity機能
最初は無料プランでしたが、帯域制限に引っかかって有料プランに移行。
AWS EC2(月額$150)
- 開発・検証環境
- t3.medium × 2台
- RDS(PostgreSQL)
- ELB
開発環境なのに本番より高い。でも「AWSの勉強にもなるから」と自分を納得させていました。
合計: 月額$279(約4万円)
これが毎月、クレジットカードから引き落とされていました。
Coolifyとの出会い
最初はKubernetesを検討しました。「本格的にやるならk8sだろう」という安直な考えです。しかし、調べれば調べるほど、私たちには過剰だということがわかってきました。
5つのWebアプリを動かすためにKubernetesクラスタを組むのは、コンビニに行くのにフェラーリで行くようなもの。確かにカッコいいけど、維持費も学習コストも馬鹿にならない。
Docker Swarmも検討しました。Kubernetesより簡単という触れ込みでしたが、それでも私たちの規模には大げさすぎる。Dokkuは良さそうでしたが、UIがなく、すべてCLIベースなのがネックでした。
そんな時、GitHubのトレンドに上がっていたのがCoolifyでした。
READMEを読んで驚きました。「Open-source & self-hostable Heroku / Netlify alternative」とある。まさに探していたものじゃないか。しかも、管理画面のスクリーンショットを見る限り、かなり洗練されている。
半信半疑で試してみることにしました。
検討した選択肢
| ソリューション | 初期学習コスト | 月額費用 | 運用難易度 | 採用判断 |
|---|---|---|---|---|
| Kubernetes | 非常に高い | $200〜 | 高い | ❌ オーバースペック |
| Docker Swarm | 高い | $100〜 | 中〜高 | ❌ 学習コスト高い |
| Dokku | 中 | $10〜 | 中 | 🤔 検討対象 |
| Coolify | 低い | $10〜 | 低い | ✅ 採用! |
実装編:3週間での移行プロセス
Week 1: 検証環境での実験
金曜日の夕方、みんなが帰った後のオフィスで、Xserver VPSの最小プラン(月額830円)を契約しました。失敗しても痛くない金額です。
VPSを選んだ理由は単純で、日本のサービスなので支払いが楽だったから。技術的な理由は後付けです。
SSHでログインして、READMEに書いてあったコマンドをコピペ。
curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash
インストールが始まりました。Dockerをインストールして、docker-composeでCoolifyを起動する仕組みのようです。5分ほどで完了。
ブラウザでアクセスすると、想像以上に洗練された管理画面が現れました。最初のアカウントを作成して、GitHubと連携。リポジトリを選択して、ブランチを指定して、デプロイボタンをクリック。
15分後、最初のNext.jsアプリが動きました。
「え、これだけ?」
拍子抜けするほど簡単でした。Vercelとほぼ同じ体験です。違うのは、これが自分のサーバーで動いているということだけ。
Week 2: 本番環境の構築
月曜日の朝会で検証結果を報告。「Coolifyいけます」の一言に、CTOの目が輝きました。
本番用にXserver VPS 2GBプラン(月額1,150円)を契約。スペックは控えめですが、私たちの規模ならこれで十分なはず。
- CPU: 3コア
- メモリ: 2GB
- SSD: 50GB NVMe
- 転送量: 無制限
セットアップは検証環境と同じ。30分もかからずにCoolifyが起動しました。
最初のアプリをデプロイ。ビルドが始まって...クラッシュ。
FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
ここで諦めてプランをアップグレードする選択肢もありました。でも、それでは結局コストが増えてしまう。何とか2GBで動かしたい。
調べると、スワップファイルを作れば仮想的にメモリを増やせることがわかりました。
# 4GBのスワップファイルを作成 sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile # 再起動しても有効になるよう設定 echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
さらに、Node.jsのメモリ上限も調整。Coolifyの環境変数設定で追加:
NODE_OPTIONS=--max-old-space-size=3072
再度デプロイ。今度は成功しました。ビルドは少し遅くなりましたが、動けば問題ありません。本番環境では一度ビルドしたらしばらく触らないので。
Week 3: マルチサイト構成への拡張
ここからが本番です。Vercelで動いている3つのプロジェクト、Herokuで動いている2つのAPIサーバー、すべてをCoolifyに移行する計画。
最初は不安でした。1つのVPSで5つのアプリが本当に動くのか?ポートの競合は?ドメインの設定は?SSL証明書は?
でも、Coolifyはすべて面倒を見てくれました。
新しいアプリを追加するたびに、Coolifyが自動的にポートを割り当て、Traefikというリバースプロキシがドメイン名でトラフィックを振り分ける。まるで魔法のようです。
最終的にこんな構成になりました:
graph TB subgraph "Internet" User[ユーザー] end subgraph "Xserver VPS (月額1,150円)" subgraph "Coolify Platform" Proxy[Traefik Proxy :80/:443] subgraph "Applications" Corp[コーポレートサイト<br/>Next.js :3000] API[APIサーバー<br/>Express :4000] Admin[管理画面<br/>React :5000] Blog[ブログ<br/>Astro :6000] LP[LPサイト<br/>静的HTML :7000] end subgraph "Management" CoolifyUI[Coolify UI :8000] end end end User --> Proxy Proxy --> Corp Proxy --> API Proxy --> Admin Proxy --> Blog Proxy --> LP
各アプリケーションは独立したDockerコンテナとして動作。お互いに干渉することはありません。メモリ使用量も、5つ合わせて1.5GB程度。まだ余裕があります。
運用編:3ヶ月で学んだベストプラクティス
1. 環境変数の一括管理
最初、Coolify UIで環境変数を1つずつ入力していました。NODE_ENV、DATABASE_URL、API_KEY...20個以上ある環境変数を手打ちです。案の定、タイポしました。
学習しました。.env.productionファイルを作って、まとめてコピペすればいい。
# .env.production NODE_ENV=production DATABASE_URL=postgresql://user:pass@localhost/db NEXT_PUBLIC_API_URL=https://api.aduce.co.jp REDIS_URL=redis://localhost:6379 JWT_SECRET=your-secret-key # ... 他の環境変数
これをCoolifyの環境変数設定画面にまるごとペースト。5秒で終わります。
2. デプロイ時間を50%短縮
最初のデプロイは8分かかりました。コード1行変更するたびに8分待つのは苦痛です。
Dockerfileを見直しました。マルチステージビルドにして、レイヤーキャッシュを最大限活用する構成に。
# Stage 1: 依存関係のインストール(変更が少ないのでキャッシュされやすい) FROM node:18-alpine AS deps WORKDIR /app COPY package*.json ./ RUN npm ci --only=production # Stage 2: ビルド用の依存関係も含めてインストール FROM node:18-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build # Stage 3: 本番用の軽量イメージ FROM node:18-alpine AS runner WORKDIR /app COPY /app/node_modules ./node_modules COPY /app/.next ./.next COPY /app/public ./public EXPOSE 3000 CMD ["npm", "start"]
結果:
- 初回ビルド:8分(変わらず)
- 2回目以降:2-4分(コード変更部分のみ)
- パッケージ追加時:5分
体感的にはVercelより速くなりました。なぜなら、Vercelは毎回クリーンビルドだから。Coolifyはキャッシュを賢く使ってくれます。
3. データベースのバックアップ戦略
PostgreSQLもCoolifyで動かしています。データが消えたら終わりなので、バックアップは必須です。
毎日深夜3時に自動バックアップ:
#!/bin/bash # /home/backup/backup.sh DATE=$(date +%Y%m%d) BACKUP_DIR="/home/backup/postgres" # PostgreSQLのバックアップ docker exec coolify-postgres pg_dumpall -U postgres > $BACKUP_DIR/backup_$DATE.sql # 7日以上古いバックアップは削除 find $BACKUP_DIR -name "backup_*.sql" -mtime +7 -delete # S3互換ストレージ(Wasabi)にアップロード rclone copy $BACKUP_DIR/backup_$DATE.sql wasabi:coolify-backup/
月500円のWasabiで、無限にバックアップを保存できます。安心感が違います。
4. 監視とアラート
Coolifyには監視機能がありません。なので、外部サービスを使います。
UptimeRobot(月1,000円)で、すべてのサイトを5分ごとに監視。ダウンしたらSlackに通知が来ます。
# 監視対象 - https://corporate.aduce.co.jp (5分ごと) - https://api.aduce.co.jp/health (5分ごと) - https://admin.aduce.co.jp (5分ごと)
3ヶ月運用して、ダウンタイムは合計15分程度。Vercelと比べても遜色ありません。
成果:驚きの結果
コスト削減
| 項目 | Before | After | 削減率 |
|---|---|---|---|
| 月額コスト | 40,000円 | 2,650円 | 93.4%削減 |
| 年間コスト | 480,000円 | 31,800円 | 448,200円削減 |
内訳:
- Xserver VPS 2GB: 1,150円/月
- バックアップ (Wasabi): 500円/月
- 監視 (UptimeRobot): 1,000円/月
パフォーマンス向上
予想外にパフォーマンスも改善:
| メトリクス | Vercel | Coolify | 改善 |
|---|---|---|---|
| TTFB | 450ms | 280ms | -38% |
| FCP | 1.2s | 0.9s | -25% |
| LCP | 2.5s | 1.9s | -24% |
理由:
- 東京リージョンのVPSで物理的に近い
- 専有リソースで他ユーザーの影響なし
- Nginxの細かいチューニングが可能
開発体験の向上
- デプロイ速度: Vercelと同等の速さ
- 自由度: あらゆるDockerイメージが動く
- 制限なし: ビルド時間、同時実行数、帯域幅の制限なし
SSL証明書の完全自動化
Vercelを使っていた時、SSL証明書のことなんて考えたこともありませんでした。自動でやってくれるから。
Coolifyに移行する時、一番心配だったのがこの部分です。Let's Encryptの証明書は90日で期限が切れる。更新を忘れたら、ブラウザに「安全ではありません」と表示される。それだけは避けたい。
でも、心配は杞憂でした。
Coolifyの管理画面でドメインを入力する時、http://をhttps://に変えるだけ。たったこれだけで、Let's Encryptの証明書を自動取得して、90日ごとに自動更新してくれる。
# Coolifyの設定画面で Domain: https://corporate.aduce.co.jp # httpsにするだけ!
実際の証明書取得プロセスはこんな感じです:
sequenceDiagram participant B as Browser participant T as Traefik participant L as Let's Encrypt participant A as Application B->>T: HTTPS接続要求 T-->>T: 証明書がない/期限切れ? T->>L: 証明書リクエスト L->>T: チャレンジ発行 T->>L: チャレンジ応答 L->>T: 証明書発行 T->>T: 証明書を保存 T->>A: リクエスト転送 A->>T: レスポンス T->>B: HTTPS応答
最初の証明書取得には1分もかかりません。その後は完全に自動。朝起きたら証明書が更新されている、そんな感じです。
実際に遭遇したトラブルたち
デプロイ成功なのに404エラー
最初のアプリをデプロイして、意気揚々とドメインにアクセス。404 Not Found。
Coolifyのログを見ると、デプロイは成功している。コンテナも動いている。なのに404。
原因はDNSの伝播遅延でした。ドメインの設定を変更してから、世界中のDNSサーバーに反映されるまで時間がかかる。日本のDNSサーバーには反映されていても、Coolifyが使っているDNSサーバーにはまだ、ということがあるんです。
# DNSの伝播状況を確認 dig @8.8.8.8 yourdomain.com # GoogleのDNS dig @1.1.1.1 yourdomain.com # CloudflareのDNS # すぐに反映させたい場合はプロキシを再起動 docker restart coolify-proxy
30分待ったら解決しました。DNSの変更は夜にやって、朝確認するのが精神衛生上良いです。
ディスク容量の枯渇
運用開始から1ヶ月後、突然デプロイが失敗するようになりました。
df -h # /dev/sda1 50G 49G 0.5G 99% /
ディスクがパンパンです。調べてみると、Dockerのビルドキャッシュとイメージが溜まりに溜まっていました。
docker system df # Images 42 15 28.3GB # Containers 23 5 1.2GB # Volumes 8 8 3.5GB
定期的なクリーンアップを自動化:
# 週に1回、日曜の深夜に実行 crontab -e 0 2 * * 0 docker system prune -a -f --volumes
これで解決。今では安定して30GB程度で推移しています。
GitHub Actionsとの連携でハマった
CI/CDパイプラインを作ろうとして、GitHub ActionsからCoolifyのAPIを叩く設定をしました。でも、なぜか401エラー。
調べてみると、CoolifyのAPIトークンには有効期限があり、定期的に更新される仕様でした。GitHub Secretsに保存したトークンが古くなっていたんです。
解決策は、Webhook URLを使う方法に切り替えること。Webhook URLは変わらないので、一度設定すれば放置できます。
Coolifyが向いている組織・向いていない組織
✅ 向いている組織
- スタートアップ: コスト削減が最優先
- 小〜中規模チーム: 10個程度までのアプリケーション
- 技術力あり: 基本的なLinux/Docker知識がある
- 自由度重視: 制限なくカスタマイズしたい
❌ 向いていない組織
- 大企業: 数百のアプリケーションを運用
- 技術力不足: サーバー管理経験ゼロ
- グローバル展開: 世界中にCDNが必要
- 24/7サポート必須: SLAが厳しい
導入ロードマップの提案
私たちの経験から、以下の段階的移行をお勧めします:
graph LR A[Week 1-2<br/>開発環境で検証] --> B[Week 3-4<br/>ステージング構築] B --> C[Month 2<br/>小規模プロジェクト移行] C --> D[Month 3<br/>本番環境移行]
ポイント:
- いきなり全部移行しない
- 小さく始めて徐々に拡大
- トラブル対応の経験を積む
3ヶ月使った率直な感想
Coolifyは完璧ではありません。
時々原因不明のエラーが出ます。「なんで動かないんだ」と頭を抱えることもあります。ドキュメントは英語だし、まだ情報が少ない。日本語の記事なんてほとんどない(だから今書いています)。
でも、それを補って余りあるメリットがあります。
まず、コスト。月額4万円が5千円になった。年間45万円の削減です。この金額で、ジュニアエンジニアを1人雇える。新しいMacBookが3台買える。社員旅行にも行ける。
次に、自由度。Vercelだと「このNode.jsバージョンはサポートしていません」とか「ビルド時間が制限を超えました」とか、制約が多い。Coolifyなら、Dockerが動くものなら何でも動く。Python、Ruby、Go、Rust、何でも来い。
そして、学び。インフラの勉強になりました。DockerやTraefik、Let's Encryptの仕組みを理解できた。これは、エンジニアとしての財産です。
なぜこの記事を書いたか
正直に言うと、Coolifyの情報が少なすぎて苦労したからです。
エラーが出てもググっても出てこない。公式ドキュメントを読んでも解決しない。Discordで質問しても、返事が来るまで時間がかかる。
でも、苦労した分、ノウハウが溜まりました。このノウハウを共有することで、誰かの役に立てればと思っています。
そして、もう一つの理由。
日本のスタートアップは、もっとコストを削減できるはずです。Vercelに月10万円払っている会社、Herokuに月20万円払っている会社、たくさんあると思います。
その金額、本当に適正ですか?
もちろん、大企業なら問題ないでしょう。でも、スタートアップにとって、月10万円は大金です。その10万円で、もっと価値のあることができるはずです。
最後に
Coolifyへの移行は、技術的な挑戦でした。でも、それ以上に、経営的な決断でした。
「便利だけど高い」を選ぶか、「少し手間だけど安い」を選ぶか。
私たちは後者を選びました。そして、それは正解でした。
もしあなたがインフラコストに悩んでいるなら、Coolifyを検討してみてください。最初は大変かもしれません。でも、その先に大きな節約が待っています。
浮いた予算で、新しいことに挑戦できます。それこそが、スタートアップの醍醐味ではないでしょうか。
Next Action
興味を持った方は、まず週末プロジェクトで試してみてください:
- Xserver VPSの最安プラン(月額830円)を契約
- Coolifyをインストール(5分)
- GitHubリポジトリを連携してデプロイ(10分)
たった15分で、自分だけのPaaSが手に入ります。
リソース
- 🔗 Coolify公式
- 📚 Coolifyドキュメント
- 💬 Discord コミュニティ
- 🖥️ Xserver VPS
ご質問やフィードバックは @aduce_tech まで。
この記事が、インフラコストに悩むスタートアップの助けになれば幸いです。