Windmillは、スクリプトをWebhook、ワークフロー、cronジョブ、社内向けUIに変えるオープンソースの開発者向けプラットフォームです。静的サイトのホスティングではなく、RetoolやTemporalの対抗として位置づけられています。コミュニティ版のライセンスはAGPL-3.0で、エンタープライズ版はライセンスキーの先にあります。
サイジングの考え方は一般的なWebアプリとは異なります。容量の単位がアプリケーションではなくワーカーだからです。
スペックを決めるアーキテクチャ
公式のdocker-compose.ymlは7つのサービスを起動します。
| サービス | イメージ | 役割 |
|---|---|---|
db | postgres:16 | データベース兼ジョブキュー |
windmill_server | ghcr.io/windmill-labs/windmill:main | APIとWeb UI、ポート8000 |
windmill_worker | 同じイメージ、MODE=worker | ジョブを実行する |
windmill_worker_native | 同じイメージ、NATIVE_MODE=true | 軽量ジョブ専用 |
windmill_indexer | 同じイメージ、MODE=indexer | ジョブの全文検索 |
windmill_extra | ghcr.io/windmill-labs/windmill-extra:latest | エディタ用の言語サーバー |
caddy | ghcr.io/windmill-labs/caddy-l4:2.11.4-1 | ポート80のリバースプロキシ |
この表のなかで、特に重要な点が2つあります。
Redisはありません。 WindmillはPostgreSQLをキューとして使います。第三者のガイドの多くがRedisコンテナとREDIS_URLを足していますが、公式のcomposeファイルにはどちらも存在せず、そうしたガイドを写すとWindmillが一度も接続しないサービスを動かし続けることになります。
コストの中心はワーカーです。 サーバー本体は比較的暇です。実際にお金を払っている対象はワーカーの処理能力です。
RAMとCPU:ワーカー単位で決める
実務上の目安はvCPU1つにつきワーカー1つ、それぞれに1〜2GBのRAM、加えてPostgresとサーバーの分の余裕です。
| 構成 | vCPU / RAM | 得られるもの |
|---|---|---|
| 試用、ワーカー1つ | 2 / 2GB | 動くが同時に1ジョブのみ。重い依存関係のインストールには余裕がない |
| 標準構成、ワーカー1〜2 | 2〜4 / 4GB | 実用上の下限 |
| 複数ジョブを同時実行 | 4 / 8GB | 少人数チームにとって快適な目標値 |
ネイティブワーカーは知っておく価値のある例外です。軽量なジョブを約0.1 CPUと128MBで実行するため、標準構成は追加のコアを求めずに標準ワーカーの隣へ1つ置けます。
誰も予測できない変動要因が依存関係のインストールです。pandasを取り込むPythonジョブや、ロックファイルの大きいTypeScriptジョブは、定常状態の数値をかなり上回るメモリを一時的に使います。初回の実行だけ失敗して次から成功するなら、RAMが足りないなかで依存キャッシュが構築されている場面を見ているわけです。
ストレージ:増えるのは依存キャッシュ
データベースは長いあいだ小さいままです。ジョブのメタデータ、スクリプト、フロー、ログはいずれもテキストです。増えていくのはworker_dependency_cacheで、ジョブが取り込んだPythonのwheelやnpmパッケージが、次回の実行でインストールを省くために保存されます。
40GBから始めてください。リサイズの判断はデータベースではなくキャッシュのボリュームを見て行い、NVMeまたはSSDを選びます。Postgresはここでストレージ役だけでなくキュー役も担うため、I/Oのレイテンシに敏感です。
この要件を満たすVPSプラン
| プロバイダー | プラン | vCPU / RAM / ディスク | 価格 | 評価 | リンク |
|---|---|---|---|---|---|
| Contabo | Cloud VPS 4 | 4 / 8GB / 100GB SSD | 5.50 EUR/月(税別) | エントリープランの価格でワーカー4つ分の余裕 | Contabo |
| Hetzner Cloud | CX23 | 2 / 4GB / 40GB NVMe | 5.49 EUR/月(税別) | 標準のワーカー2つ構成に適する | Hetzner |
| DigitalOcean | Basic 4GB | 2 / 4GB / 80GB SSD | 24 USD/月 | CX23と同スペックで価格は4倍 | DigitalOcean |
| Vultr | Regular 4GB | 2 / 4GB / 80GB SSD | 20 USD/月 | リージョンの選択肢が最も広い | Vultr |
| Linode | Linode 4GB | 2 / 4GB / 80GB SSD | 24 USD/月 | 性能が安定し、APIが強力 | Linode |
Windmillは、1GBのプランが自動的に失格にならない数少ないセルフホストアプリの1つです。ネイティブワーカー1つなら実際に収まります。ただしそこに標準ワーカーは置けないため、依存関係を伴うPythonやTypeScriptのジョブは動かせません。つまり運用ではなくデモの位置づけになります。
スケールさせる
Windmillは1つのプロセスを大きくするのではなく、ワーカーのコンテナを増やして水平にスケールします。処理量を倍にしたいなら、同じDATABASE_URLを指す2つ目のwindmill_workerサービスを追加し、サーバーにもう1コア与えてください。
これはVPS選びに実際的な結論をもたらします。ここでは速いコアより多いコアが勝ちます。Contaboの税別5.50 EURの4 vCPUはワーカー4つ分の並列性を買え、HetznerのCX23はほぼ同じ価格で2つ分です。ワークロードが少数の重いジョブではなく多数の小さなジョブなら、この比率が判断のすべてになります。
- リサイズの前に
docker statsで、どのワーカーが飽和しているかを確認してください。 - ワーカーをタグでグループ分けし、重いジョブがそれ用にサイジングしたマシンへ届くようにしてください。
- キューを担っているのはPostgresです。メモリを足す前に、まず速いディスクを与えてください。
各社のプランをより広く見比べたい場合は、VPS比較の全体版をご覧ください。
Frequently asked questions
セルフホストしたWindmillにはどれくらいのRAMが必要ですか?
アプリ単位ではなくワーカー単位で考えてください。目安はvCPU1つにつきワーカー1つ、それぞれに1〜2GBのRAM、加えてPostgresとサーバープロセスの分です。ワーカー1つの構成なら2GBで動き、ワーカー2つの標準的なcompose構成は4GBで余裕があり、複数のジョブを同時に走らせるようになったら4 vCPUと8GBが現実的な目標になります。
WindmillにはCPUコアをいくつ割り当てるべきですか?
2 vCPUから始め、ワーカーを増やすのに合わせてコアを足してください。標準ワーカーは一度に1つのジョブしか実行せず、実質的に1コアを占有するためです。ネイティブワーカーは例外で、軽量なジョブを約0.1 CPUと128MBで処理します。標準構成が追加のコアなしにネイティブワーカーを1つ同梱できるのはこのためです。
WindmillにRedisや他のメッセージブローカーは必要ですか?
必要ありません。WindmillはPostgreSQLをデータベースとジョブキューの両方として使います。これは珍しい設計で、知っておく価値があります。第三者のガイドの多くが、公式のcomposeファイルには存在しないRedisサービスを追加しているからです。必要なデータストアはPostgreSQL 14以降だけで、Redisを足しても無駄なコンテナが増えるだけです。