Fleetdを公開しました:Linuxサーバーとルーターを1つの管理画面に
セルフホスト型Fleetdの紹介。監視、アラート、能動接続、署名付きコマンド、ローカル権限とDocker Composeでのv0.3.0試用手順を説明します。
サーバーやルーターが数台なら、管理は簡単に見えます。状態を確認するときはSSHで接続し、サービスが落ちたらログを読み、更新するときはコマンドを実行するだけです。
面倒なのは、それぞれの作業場所が分かれていることです。サーバーとルーターでは入口が違い、アラートが出ても、対象を探し、環境を確認してから調査を始めます。
こうした日常作業をまとめたいと思いました。1つのページでオンラインの機器とアラートを把握し、詳細を開き、必要ならコマンドやターミナルへ進む。そのために作ったのが Fleetdというセルフホスト型のLinuxサーバー・ルーター管理ツールです。
コードはMITライセンスで公開し、最初の公開版はv0.3.0。英語と中国語のドキュメントも公開しました。
今回は解決したい問題、現在の機能、主要な設計判断を紹介します。実装の詳細は後の記事で扱います。
問題を見つけてから対応するまでをつなぐ
監視でディスク不足が分かっても、増えているディレクトリを調べる必要があります。サービスの失敗なら、ログと設定を確認し、再起動するかを判断します。
少数の機器を自分で管理する場合、これらは連続した作業です。同じ機器を別のツールで何度も探さずに済むよう、その流れを管理画面に残したいと考えました。
| 機能 | 現在できること |
|---|---|
| 監視 | CPU、メモリー、負荷、ディスク、通信速度と7日間の履歴 |
| 稼働状態 | 失敗したsystemdユニット、Dockerコンテナー、WireGuardピアの情報 |
| アラート | オフライン、継続的な資源超過、容量不足、関連サービス異常。メール通知も設定可能 |
| リモートコマンド | ローカル権限に従う署名付きコマンドを1台または複数台で実行 |
| Webターミナル | full権限の機器で対話セッションを開く |
| エージェント管理 | 新規機器の承認と署名付き更新パッケージの配布 |

プロジェクト文書にある一覧画面の一部です。数値は画面構成を示すもので、性能測定結果ではありません。
情報は機器の環境と併せて読む必要があります。systemdの状態はsystemdを使う環境が対象で、OpenWrtに同じサービス一覧を求めるものではありません。WireGuardのハンドシェイク時刻も、通信や設定を考慮して判断する手掛かりです。
まずは異常から調査へ進める入口を作ります。複雑な監視ルール、長期分析、全面的な構成管理には、それぞれを得意とするツールを使えます。
サーバー1台と各機器のエージェント
サーバーは管理画面、機器情報、監視データ、操作履歴を扱い、PostgreSQLに保存します。管理対象のLinux機器ではエージェントが状態を集め、要求を受け取り、実行可否を判断します。
Vue 3の管理画面はビルド後にGoのサーバーバイナリーへ組み込みます。エージェントもGo製で、Linux amd64とarm64の版を公開しています。導入前には機器のアーキテクチャを確認してください。OpenWrt搭載というだけでは公開バイナリーが動くとは限りません。
サーバー、データベース、各機器のエージェントと設定という境界が明確です。調査でも、接続できたか、データが上がったか、要求が届いたか、なぜ受理または拒否したかを順に追えます。
ルーターでは接続方向から考える
クラウドサーバーに公開アドレスがあっても、家庭のルーターはNATの内側かもしれません。管理のために新たな外向け入口を設けると、設定と保守が増えます。
Fleetdではエージェント側からサーバーへ接続します。設定されたサーバーに到達できれば、管理対象側に専用の着信管理ポートを開ける必要はありません。
異なるネットワーク上のLinux、OpenWrt、iStoreOS機器をまとめるのに向いています。ただしサーバーはエージェントから到達できる必要があり、本運用では文書に従ってHTTPSとWebSocket転送を設定します。
新規機器は接続直後から操作できるわけではなく、承認待ちになります。管理者はインストーラーと管理画面のフィンガープリントを比較し、承認または拒否します。今つながったのは、自分が追加しようとした機器なのか。 ホスト名や一覧への追加だけでは、その確認を代替できません。
次回は登録、フィンガープリント、再接続を詳しく扱います。
見える機器をすべて自由に操作できる必要はない
監視だけの機器もあれば、決まった保守操作だけを許す機器もあります。任意コマンドや完全なターミナルが必要なのは一部です。
Fleetdではエージェントのローカル設定で権限を決めます。
| 権限 | 許可する操作 |
|---|---|
| monitor | 監視のみ。リモートコマンドは実行しない |
| allowlist | ローカルで定義した操作だけ |
| full | 任意コマンドとWebターミナル |
コマンドは管理者のブラウザーで署名し、エージェントが信頼する公開鍵で検証します。対象、有効期限、ローカル権限も確認します。サーバーは要求を転送しますが、署名のない通常の要求だけで実行させることはできません。
この設計はサーバーからの指示を無条件で信じる範囲を減らします。ただし、ブラウザーとそこで動くフロントエンドコードが信頼できることも前提です。
管理画面はサーバーから配信されるため、サーバーが侵害されれば、後から開くページが差し替えられる可能性があります。秘密鍵がエクスポート不可でも、悪意あるコードによる署名呼び出しの試みまで防ぐわけではありません。署名だけを理由に、サーバー侵害後も完全に安全とは言えません。
この信頼関係は別の記事で詳しく説明します。導入時は監視だけならmonitor、固定操作ならallowlistを優先し、ターミナルが必要な機器だけfullにするのが出発点です。
更新にも独自の信頼の仕組みを持たせる
機器ごとに新しいプログラムを手作業でコピーするのは手間です。一方、ダウンロードしたファイルを無条件で実行しても、正当な更新なのかという問題が残ります。
Fleetdは署名付きリリースパッケージを使います。公開者が自分の環境で署名し、エージェントは設定済みのリリース公開鍵で検証します。コマンド用の署名とリリース用の署名は目的が異なります。
GitHub Releasesの通常バイナリーは対応アーキテクチャへの手動導入用です。.releaseパッケージは、対応する公開鍵を信頼するエージェントだけが利用できます。
独自に運用する人は文書に従って自分の鍵と更新手順を整えます。作者のパッケージをアップロードすれば、どの環境でも受け入れられるわけではありません。版の判定、検証失敗、更新時の復旧は後で説明します。
Docker Composeでサーバーを試す
DockerとComposeプラグインを用意し、手元のコンピューターで実行します。
git clone https://github.com/weiyi0/fleetd
cd fleetd
git checkout v0.3.0
docker compose up -d
docker compose run --rm fleetd admin-add admin
指示に従って管理者パスワードを設定し、http://localhost:8480を開きます。画面は英語と中国語に対応します。
記事と条件をそろえるためv0.3.0に固定しています。Composeはソースからサーバーをビルドし、PostgreSQLも起動します。初回は依存関係の取得とコンパイルがあるため、所要時間は環境によります。
ここで起動するのは管理画面までで、管理対象はまだ登録されていません。 Dockerイメージが署名付きエージェントを自動生成することもありません。
最初はクイックスタートに沿ってエージェントをビルドし、手動起動して登録を試せます。長期運用では自分のリリース鍵を設定し、署名付きパッケージをアップロードして管理画面の導入手順を使います。
Composeのサンプルには例示用のDB認証情報があり、8480番ポートもループバック限定ではありません。ローカル試用中は接続元を制限し、ネットワークで使う前に導入文書に沿って認証情報とHTTPSを設定し、DBと鍵をバックアップします。
復旧しやすいテスト機から始め、指紋、状態表示、許可された操作を確認してから台数を増やすと、環境差を見つけやすくなります。
最初の公開版がv0.3.0の理由
既存環境のエージェントはすでに0.2.0でした。更新先は現在より新しい版である必要があるため、公開版もその順序を引き継ぎました。
版番号は開発の順序を示します。成熟度は利用と検証を積み重ねて得るものです。現在のFleetdは、少数のLinuxサーバーやルーターを自分で管理し、データを手元に置き、基本的な導入と権限を理解したい人に向いています。
コード、バイナリー、文書を公開することで、導入前に動作を確認できます。機能表だけで既存のあらゆる運用ツールを置き換えるとは言えません。まずは状態、アラート、必要な保守をつなぎ、機器ごとの権限を明確にすることに集中します。
この後の連載
能動接続と承認、ブラウザー署名、ローカル権限、OpenWrt対応、アラート、更新を順に扱います。AIを使った開発過程も振り返る予定です。
どんな問題を解決し、どんな制約が増えたのか、具体的な判断を残したいと思います。実際の問題と検証記録も開発に合わせて追加します。
コードと文書をぜひ見てください。通常の質問はIssueへ、脆弱性はGitHubの非公開報告窓口へお願いします。日常保守の切り替えを減らし、この連載が似た開発の参考になればうれしいです。
コメント・議論
質問や実践の経験をお寄せください。コメントは承認後に表示されます。メールアドレスは公開されません。 コメントのプライバシー
コメントを読み込み中…