And why we replaced n8n with Laravel along the way
社内向けの自動化プラットフォームの構築を始めたとき、私たちは正しい技術スタックを選んだと思っていました。ワークフローのオーケストレーションには n8n、Ansible プレイブックの実行には Semaphore UI、そしてホスティング運用を完全に自動化するというビジョンがありました。数か月後、私が目にしていたのは、まさに「クモの巣」としか表現しようのないものでした。そして、最初からやり直すしかないと悟りました。
私はオランダを拠点とするマネージドホスティング企業 Savvii の CTO です。私たちは PHP ベースのウェブサイト(e コマース、WordPress、それに類するワークロード)を専門としており、3 つの顧客セグメント、すなわち小規模顧客、リセラー、エージェンシーにサービスを提供しています。それぞれ異なるニーズ、異なる規模、異なる期待を持っています。
エージェンシーのセグメントで、私たちは最もプレッシャーを感じていました。エージェンシーは高度な顧客ですが、その社内チームは技術者と非技術者が混在していることが多いのです。彼らには GUI が必要です。コマンドラインの中で生きていくことはできません。そして、オンボーディングするエージェンシーが増えるほど、ますます明白になっていきました。 私たちには、本物の自動化に支えられたきちんとしたコントロールパネルが必要でした。
Ansible Tower や類似のツールも検討の対象でしたが、それらはセットアップが複雑すぎるか、ドキュメントに一貫性がないか、あるいはパフォーマンスやデータ主権に関する懸念を伴っていました。 私たちが求めていたのは、自社でホスティングでき、面倒なくアップグレードでき、 そして 1 週間のトレーニングなしでサポートチームに引き渡せるものでした。
何かに踏み切る前に、私たちは徹底的な比較を行いました。2 つの要素によって、候補は素早く絞り込まれました。
データ主権。 状態や認証情報をサードパーティのクラウドに保存するツールは対象外でした。セルフホスティングは譲れない条件でした。
非エンジニアにとっての UX。 一次サポートチームは優れたコミュニケーターであって、システム管理者ではありません。私たちが選ぶものは、あらゆるインシデントを DevOps にエスカレーションせずに使いこなせるものでなければなりませんでした。私たちが評価したツールは以下のとおりです。
| 評価基準 | Semaphore UI | n8n | AWX / Tower | Rundeck |
|---|---|---|---|---|
| デフォルトでセルフホスト | はい — 単一バイナリ / 馴染みのあるデプロイ | はい — セルフホスト版あり | はい(AWX)/ 混在(AAP のクラウドオプション) | はい |
| 一次サポートの UX | タスク & インベントリの明快さが高い | 作成者には良いが、運用への引き渡しには弱い | 重厚な RBAC の概念。サポートには急峻 | ジョブ中心。Ansible のエルゴノミクスはより急峻 |
| Ansible のインベントリ & 実行の UX | プロジェクト & テンプレートを中心に構築 | Ansible のコントロールプレーンではない | ネイティブだがアップグレード経路が複雑 | 可能だが Ansible ファーストではない |
| カスタムミドルウェア向け API | 一貫したタスク & プロジェクト API | 広範。運用モデルが異なる | Tower の API は バージョンによって異なる | 成熟したジョブ API。プリミティブが異なる |
| アップグレード & 運用の負担 | 実運用では摩擦の少ないアップグレード | ワークフローの肥大化に依存 | 重くなりがち(K8s / 同梱の依存関係) | 中程度。JVM のフットプリント |
Semaphore UI は両方の観点で勝りました。インストールは簡単でした。アップグレードは苦痛がありませんでした。UI は十分に整っていて、非エンジニアでも何が起きているかを理解できました。既存の Ansible インベントリの接続はほぼ摩擦がなく、唯一サポートが必要だったのはインベントリを接続させる部分でしたが、それもサポートにより素早く解決しました。Semaphore のドキュメントはしっかりしており、それが私たちに自信を与えてくれました。
最初のアーキテクチャでは、HostBill(請求)、Semaphore UI、CMDB の間のオーケストレーション層として n8n を使用していました。紙の上では、すっきりして見えました。ローコードで、視覚的で、メンテナンスに開発者が不要でした。
n8n のビジュアルインターフェースは、シンプルな直線的フローには優れています。しかし、条件分岐、エラー処理、複数ステップのコールバック、状態管理が絡んでくると、全体像が見えなくなりました。すっきりした図として始まったものが、シュールレアリスムの回路基板へと姿を変えました。
安全な状態保存ができない
私たちが使用していたバージョンには、ステップ間の中間状態を安全に保存する方法がありませんでした。
セキュリティ上の懸念
ログ内でパスワードを確実にマスクする手段がありませんでした。Ansible のコールバックには生成された認証情報が含まれるため、これは深刻な懸念でした。
脆いコールバック
n8n、Semaphore、CMDB の間のコールバック処理には過剰なやり取りが必要で、それがフローを脆弱にしていました。
私たちは n8n を Laravel アプリケーションに置き換えました。これは本物のミドルウェアであり、ノーコードツールではなく、私たちのチームが完全に所有し理解しているものです。
セキュリティモデル
すべてのサーバーには authorized_keys ファイルがあり、Semaphore の SSH キーが実際に実行できる操作を制限しています。authorized_keys の command ディレクティブを使用して、Semaphore が実行を許可されるコマンドを正確に定義しています。初期セットアップの後、Semaphore は root アクセスも失い、ユーザーアカウントにしか接続できなくなります。
これにより、万が一何かが侵害された場合でも、その影響範囲が大幅に限定されます。
私たちが出発点としたエージェンシーのセグメントでは、このアーキテクチャを通じて約 600 台のサーバーを運用しています。3 つのセグメント全体の総台数は、最終的に 3,000 から 4,000 台になる見込みで、私たちはこのプラットフォームを段階的に展開しています。
次に控えているのは、サーバー更新のための Semaphore のスケジューラーです。現在は外部ツールで処理していますが、スケジューラーが駆動する Ansible へ移行していきます。
サポートの自立
サポートは、あらゆるインシデントに DevOps を巻き込むことなく、Semaphore を独立して使用できます。
リアルタイムのアラート
Slack 連携により、プレイブックが失敗したときにエンジニアリングへ即座にアラートが届きます。
すっきりしたテンプレート
API 経由で変数を渡すことでテンプレート数を少なく抑え、肥大化を回避しました。
正確な CMDB
CMDB は自動的に正確さを保ち、手動メンテナンスはもう不要です。
私たちが何より変えたいと思う最大のこと。 自動化のコードを 1 行も書く前に、アーキテクチャ設計にもっと時間をかけること。 私たちは、どのフローがスケールし、どのフローが障害を適切に処理するかを十分に慎重に考えていなかったため、一度ならずやり直すことになりました。
アーキテクチャを最優先に
自動化のコードを 1 行も書く前に、アーキテクチャ設計にもっと時間をかけましょう。どのフローがスケールし、障害を適切に処理するかを慎重に考えましょう。
機能だけでなく UX で評価する
サポートチームが深夜 2 時に上級エンジニアを呼ばずに使えないなら、それは間違ったツールです。
データ主権は重要
本番運用に入る前に、認証情報と状態がどこに保存されているかを把握しましょう。
良いドキュメントは 1 つのシグナル
ツールのドキュメントがめちゃくちゃなら、そのツールもおそらくめちゃくちゃです。
Start with OSS, upgrade to Pro when your team grows. Enterprise support and SLA are available — including for hosting providers running thousands of servers.