課題:クラウドPaaSに潜むコストとベアメタルの構成ドリフト
昨年、私たちのクラウドホスティング費用は月額840ドルを超えました。HerokuとAWS App Runner上で、小規模なステージング用API群、3つの本番Next.jsアプリ、バックグラウンドワーカー、そして2つのPostgreSQLインスタンスを運用していました。プラットフォームの利便性は申し分なかったものの、リソースに対する価格の上乗せが法外なレベルに達していたのです。わずか2GBのRAMを積んだコンテナ1つに、一般的なVPSプロバイダーが提供する同等のコンピュートリソースの5倍もの費用を支払っていました。
ベアメタルに戻る選択肢も魅力的でした。しかし、素のVPS環境には別の頭痛の種がつきまといます。手動でのDocker Composeファイル管理、cron任せの脆弱なSSL更新、壊れやすいbashデプロイスクリプトなどです。私たちが求めていたのは、月額800ドルの請求書なしに、git pushによるデプロイ、プレビュー環境の自動生成、データベースの即時プロビジョニングを実現することでした。Coolifyはその絶妙な中間地点を見事に解決してくれたのです。
コアコンセプト:Coolifyのアーキテクチャの仕組み
Coolifyは、オープンソースのセルフホスト型Platform as a Service(PaaS)です。Dockerを置き換えたり、独自のコンテナエンジンを再発明したりするわけではありません。標準的なLinuxツール、Docker API、リバースプロキシを洗練されたWebインターフェースでラップした構成になっています。
コントロールプレーンとリモートワーカー
システムは、管理機能とアプリケーションのワークロードを明確に分離しています。
- Coolifyインスタンス(コントロールプレーン): Webインターフェース、アプリケーション状態管理用の内部SQLiteまたはPostgreSQLデータベース、Redisキュー、デプロイタスクランナーを実行します。
- 接続先サーバー(ワーカー): SSH接続が可能なクリーンなUbuntuまたはDebianサーバーです。CoolifyはネイティブなSSHキーと標準のDockerソケットコマンド経由でリモートワーカーを制御します。アプリケーションノードにリソース消費の大きいサードパーティ製エージェントを導入する必要はありません。
Traefikリバースプロキシとエッジルーティングの自動化
TraefikはCoolifyのデフォルトのエッジルーターとして機能します。サービスを起動するたびに、TraefikはコンテナのDockerラベルを検査します。公開ホスト名をマッピングし、受信したHTTPリクエストをターゲットコンテナの内部ポートへルーティングし、Let’s Encryptの無料TLS証明書を自動で取得・適用します。ルーティング処理全体が設定ファイルのリロードなしで即座に実行されます。
ネイティブなマルチサーバートポロジー
単一ノード構成では、管理ダッシュボードと本番トラフィックが同じマシン上に同居することになり、大きなリスクを伴います。もしデプロイ時にメモリ消費が急増してLinuxのOut-Of-Memory(OOM)Killerが発動すると、コントロールパネルごとオフラインに追い込まれる恐れがあります。Coolifyなら、月額5ドル程度の軽量VPS(2GB RAM)をダッシュボード専用として稼働させ、本番ワークロードは月額10〜20ドルの別VPSインスタンスへ分散できるため、このリスクを回避できます。
実践演習:Ubuntu 22.04/24.04へのCoolifyデプロイ
ここでは、クリーンなUbuntu 22.04または24.04 LTS環境上で、私たちが実際に本番インフラとして運用している構成を紹介します。
ステップ1:Ubuntuホストの準備とセキュリティ強化
最低でも2 vCPU、2GBのRAM、30GBのSSDストレージを備えたUbuntuサーバーを用意します。SSHでログインし、パッケージを最新に更新した上で、UFWを用いて基本的なファイアウォールルールを設定します。
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl ufw fail2ban
# ファイアウォールルールの設定
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 8000/tcp
sudo ufw enable
ポート8000は初期セットアップ用のUIを提供します。ポート80と443はWebトラフィックおよびLet’s Encryptの検証チェックに使用されます。注意点として、Dockerはデフォルトでiptablesを介してUFWルールをバイパスすることがあります。厳密なポート公開制限が必要な場合は、機密性の高いバックエンドサービスを公開する前に、ファイアウォールテーブルを尊重するようDockerデーモンを設定してください。
ステップ2:Coolifyコントロールプレーンのインストール
Coolifyには使いやすいブートストラップスクリプトが用意されています。このスクリプトがDocker Engineやdocker-composeプラグインをインストールし、必要なすべてのコアコンテナをプルしてくれます。rootユーザーまたはsudo権限を持つユーザーで次のコマンドを実行してください。
curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash
インストールは約2分で完了します。スクリプトが完了メッセージを出力したら、ブラウザを開いて以下にアクセスします。
http://<your-server-ip>:8000
すぐに管理者アカウントを登録してください。最初に登録されたユーザーには、自動的にルート管理者権限が付与されます。
ステップ3:リモートワーカーサーバーの接続
環境を分離することで、「ノイジーネイバー(近隣ノイズ)」問題を防止できます。外部のワーカーサーバーを接続する手順は以下の通りです。
- CoolifyダッシュボードのKeys & TokensでSSHキーを生成します。
- 生成された公開鍵をコピーし、ワーカーVPSの
/root/.ssh/authorized_keysに追加します。 - リモートワーカーにDockerをインストールします。
# リモートワーカーVPS上で直接実行
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
- CoolifyダッシュボードでServers > + Add Serverへ移動します。ワーカーのパブリックIPアドレスを入力し、設定したSSHキーを選択してValidate & Saveをクリックします。Coolifyがサーバーへ接続し、Dockerデーモンのヘルスチェックを行い、ワーカー上でTraefikエッジプロキシを起動します。
ステップ4:Git Webhookを利用したマルチコンテナアプリケーションのデプロイ
サーバーの接続が完了すれば、ソースコードリポジトリから直接アプリケーションをデプロイできます。
- SourcesでGitHub、GitLab、またはセルフホストのGiteaアカウントを連携します。
- Projectsを開いてAdd New Projectをクリックし、Production環境を作成します。
- Applicationを選択し、対象のリポジトリとブランチ(例:
main)を指定します。ビルドパックとして、Nixpacks(言語の自動検出)、標準のDockerfile、またはdocker-compose.ymlファイルから適したものを選択します。 - 環境変数を入力します。Coolifyはこれらの機密情報をPostgreSQLストア内に保存時に暗号化(Encryption at Rest)します。
- 設定画面で本番ドメイン(例:
api.yourdomain.com)を設定します。DNSのAレコードがワーカーサーバーのIPアドレスを指していることを確認してください。 - Deployをクリックします。
Coolifyがビルドコンテナをトリガーし、ヘルスチェックを実行し、Traefikのルーティングを更新してSSL証明書を発行します。以降は、対象のGitブランチにプッシュするだけで、自動的にローリングデプロイが実行されます。
ステップ5:自動メンテナンスタスクとバックアップルーチン
放置されたコンテナ環境では、古いビルドキャッシュや不要な宙づり(dangling)イメージによってディスク容量が急速に圧迫されます。Server Settingsへ進み、Dockerの自動クリーンアップを有効にしてください。私たちの環境では、ディスク使用率が80%を超えた際にdanglingイメージを自動削除(prune)するように設定しています。
PostgreSQLやMariaDBなどのステートフルなデータベースについては、データベース管理画面のBackupsタブで定期的な自動ダンプを設定します。Coolifyはgzip圧縮されたSQLダンプを任意のS3互換バケット(AWS S3、Cloudflare R2、MinIOなど)へ直接アップロードできます。私たちの環境では、保持期間14日間のデータベースバックアップを毎日02:00 UTCにスケジュール実行しています。
結論:導入から6か月が経過して
このアーキテクチャに移行してから半年が経ち、現在私たちのチームは月額14ドルのHetznerワーカーノード2台と月額6ドルのコントロールプレーンインスタンス1台の上で、16のマイクロサービス、5つのバックグラウンドワーカー、3つの本番データベースを運用しています。毎月のホスティング費用は840ドルから40ドル未満へと激減しました。
コントロールプレーンのアイドル時RAM消費量はわずか約520MBです。Nixpacksによるビルド時間は平均90秒で、移行以来、手動のSSHデプロイスクリプトに触る機会は一度もありませんでした。PaaSのセルフホストには最低限のシステム管理の規律が求められますが、Coolifyは独自のクラウド価格に縛られることなく、その運用負担を取り除いてくれます。

