Webhook 要約は配信成否を示しますが、本番を持つスキル切片は示しません。clustervps の Mac 網関で比率カナリアと一本の readiness に寄せるのが最小規律です。

マルチ AZ 網関と Webhookは通知と輪換が主役です。本稿は比率・切片・昇格ゲートです。テナント分割稿のディレクトリ約束と揃えます。

多ノード公開の流れ(比率前)

openclaw.lock、テナントskills.d、semver ツリー、合算 readiness の四点が全 Mac で一致してから動きます。順序はshadow合算緑LB 微調整ピア同期監査一行です。

  • 正本:タグ昇格、汚れたツリーは再読込しない。
  • 並列網関:カナリアが先、安定はゲート後のみ。
  • 通知系:網関より先へ進めない。
観点 Webhook ブロードキャスト本編 本稿(カナリア・切片)
主信号 失敗要約・配信再試行 LB 比率と semver 一致
昇格トリガ 通知健全性に寄りがち 合算 JSON のゲート
切片 任意 テナント skills.d が必須
#!/usr/bin/env bash
set -euo pipefail
cd /usr/local/share/openclaw-infra
/usr/bin/git fetch --tags origin
/usr/bin/git checkout "refs/tags/${PROMOTE_TAG}"
/usr/bin/shasum -a 256 openclaw.lock | /usr/bin/tee /tmp/lock.sha
/usr/local/bin/openclaw version --json | /usr/bin/tee /tmp/version.json
/usr/bin/diff -q openclaw.lock <(ssh canary-gw "cat /usr/local/share/openclaw-infra/openclaw.lock")

差分が空のときだけ重み変更。空でないと脳分裂です。

トラフィック比率

新規セッションの約五パーセントskills/next載せの網関へ。合算探針を二回分以上キープし、p95 とキューと予算を見ます。Doctor 緑と digest の無害化が揃ったら十〜二十ポイント刻みで広げます。表に時刻・重み・semver・チケットを一行ずつ残し、LB API は関数化して貼れる形にします。

設定フラグメント分テナント

skills.dの順序を全網関で一致させ、/etc/openclaw/tenants/<tenant>/skills.d/を揃えてからnextを semver へ。境界だけをフラグメントに書き、秘密はsecrets/<tenant>へ ACL 分離します。

# タグ取得後、各網関で
sudo install -d -o root -g wheel /etc/openclaw/tenants/acme/skills.d
sudo /usr/local/bin/openclaw config lint --tenant acme
sudo /bin/ln -sfn "/var/db/openclaw/skills/1.4.2" /var/db/openclaw/skills/next
sudo launchctl kickstart -k system/com.openclaw.gateway

カナリアだけnext指し、本番はcurrentで最小切片です。

探針の合算

一本の URL でsemver と lock の一致、Doctor、キュー SLO を返します。digest は内包フィールドに留め、昇格の主因にしないのが Webhook 本編との違いです。

#!/usr/bin/env bash
set -euo pipefail
TENANT_CANARY="${TENANT_CANARY:-acme}"
SKILL_PATH="/var/db/openclaw/skills/current"
/usr/bin/readlink "${SKILL_PATH}" | /usr/bin/tee /tmp/skill_path.txt
/usr/local/bin/openclaw doctor --tenant "${TENANT_CANARY}" --json >/tmp/doctor.json
/usr/bin/curl -fsS --max-time 3 "http://127.0.0.1:9099/v1/webhook-digest" -o /tmp/digest.json
/usr/bin/python3 - <<'PY'
import hashlib, json, pathlib
blob = pathlib.Path("/tmp/doctor.json").read_bytes() + pathlib.Path("/tmp/digest.json").read_bytes()
print(json.dumps({"probe_sha256": hashlib.sha256(blob).hexdigest(),"skill_resolved": pathlib.Path("/tmp/skill_path.txt").read_text().strip()}))
PY

黄はdegradedで流し続け、semver 不一致は即失敗。digest だけでは広げません。

ロールバック

LB 重みのスナップショット戻しskills/currentの symlink 戻しを同時に。片側だけ禁止。kick 後に合算 JSON を良い行と突き合わせます。

#!/usr/bin/env bash
set -euo pipefail
/usr/bin/scp stable-gw:/var/db/openclaw/audit/last_good_weights.json /tmp/weights.json
./lb_restore_weights.sh /tmp/weights.json
sudo /bin/ln -sfn "/var/db/openclaw/skills/${ROLLBACK_SEMVER}" /var/db/openclaw/skills/current
sudo launchctl kickstart -k system/com.openclaw.gateway
/usr/bin/curl -fsS http://127.0.0.1:8088/readyz | /usr/bin jq .

訓練は成果物マトリクスと併せ、誤 AZ 指向中に rsync と競走させない。

監査

promotions.jsonlへ一行追記。actorticket・semver 前後・重み・probe_sha256。人の承認証跡は Webhook よりここです。

/usr/bin/printf '%s\n' \
  "{"ts":"$(date -u +%Y-%m-%dT%H:%M:%SZ)","actor":"${USER}","ticket":"${TICKET}","from":"1.4.1","to":"1.4.2","weights":"${WEIGHT_BLOB}","probe_sha256":"${PROBE_SHA}"}" \
  | /usr/bin/tee -a /var/db/openclaw/audit/promotions.jsonl

問い合わせはjqで答える。

FAQ

digest は。合算内に載せるが比率拡大の唯一理由にしない。semver と Doctor が先。

一テナントだけ。フラグメントをカナリア網関に置きスティッキーでコホートを寄せる。

台数。安定二系とカナリア一台の三ホストが最小演習。

免責:指針のたたき台。実装のフラグは製品版で確認し、シェルはパターンとして扱う。
並列クラスタ

AZ ごとに網関用 Mac を足す

shadow と合算に余白が要る。料金で並列ノードを選び、ヘルプブログ一覧をランブック横に置く。購入で実機に載せ替える。

並列網関用 Mac を追加する プラン比較へ