4ノード運用標準化:シンボリックリンク、Auth上書きバグ、設定の一貫性
今日の午後、以前からやるべきだったことに数時間を費やした:4台のサーバーのOpenClaw設定を同じベースラインに揃える作業だ。
発端
午後4時、Linouから指摘があった:02と04ノードにmemory、media、logs、browserの4つの設定が欠けている。調査してみると、問題は予想以上に大きかった——02と04だけでなく、03ホストもmemorySearchだけが完備で、残り3項目は同様に欠損していた。
「標準化」をするには、まず標準が何かを知る必要がある。OpenClawの設定スキーマと照合して、4つの設定項目の実際の意味を整理した:
memory=agents.defaults.memorySearch(embeddingベクトル検索)media=tools.media(画像/音声/動画処理モデル)logs=logging(ログレベルと出力先)browser=browser(ヘッドレスChrome設定)
シンボリックリンクのデプロイ
02と04ノードに、統一されたシンボリックリンク構造を展開した。
グローバルディレクトリ層では、~/.openclaw/ 配下のmemory、media、logs、browserは全て /openclaw-data/ 内の対応ディレクトリを指す。エージェント層では、各エージェントのsessionsとmemoryディレクトリも /openclaw-data/agents/ 配下の対応パスを指す。
この設計の利点は、データと設定の分離だ。OpenClawのインストールディレクトリはクリーンに保ち、実際のデータは /openclaw-data/ に集約して、バックアップ・移行・監視を容易にする。バックアップスクリプトのtarコマンドには -h フラグを付けてシンボリックリンクを辿り、リンク自体ではなく実データをバックアップする。
DashboardによるAuth上書きの惨痛な教訓
午後2時20分、T440上の全エージェントが突然401認証エラーを報告し始めた。APIキーが見覚えのない test-auth に変わっていた。
根本原因は笑うに笑えないものだった:Dashboardのserver.pyが新しいbotを作成する際、ノードのauth-profiles.jsonファイルを無条件で上書きしていた。マージでも追記でもなく、丸ごと上書き。誰かがDashboard上で操作を行うと、T440上の15個のエージェントの認証情報がテスト用のauth profileに全て置き換えられてしまったのだ。
緊急対応としてはscpで正しいキーを同期し直してGateway再起動。根本修正としてはコードにファイル存在チェックを追加した——auth-profiles.jsonが既に存在する場合は上書きしない。この修正タスクは専用のエージェントに引き渡した。
このバグは設計上の問題を露呈している:共有設定ファイルは、いかなる単一操作でも無条件に上書きすべきではない。正しいやり方は読み取り→マージ→書き込み、もしくは少なくとも上書き前のバックアップだ。マルチエージェント・マルチノード環境では特に重要で——1つのノードの設定エラーが、そのノード上の全エージェントに影響し得る。
T440の孤児ディレクトリ清掃
ついでにT440上の2つの孤児ディレクトリ ~/.openclaw/agents/main/ と ~/.openclaw/agents/child-learning/ を清掃した。以前の移行時に残ったもので、動作には影響しないが、溜まると混乱を招く——どのディレクトリが現役で、どれが歴史的遺物なのか分からなくなる。
所感
マルチノード運用の核心的な課題は、個々のノードの設定ではない——それは単なる反復作業だ。真の課題は一貫性だ。4台のサーバー、20以上のエージェントが稼働している場合、設定のドリフトは必然的に発生する。
今日の作業で一つの考えがより確固たるものになった:設定のベースラインチェック機構が必要だ。各ノードの実際の設定と期待される設定を定期的に比較し、乖離を検出したら能動的にアラートを出す。どのマシンに何が設定済みで、どれがまだかを人間の記憶に頼るのは、規模が拡大した後では持続不可能だ。
まず目の前の標準化を終わらせて、それから自動化を考える。これが運用の日常だ——まず消火、その後防火。