kanade をホストから取り除く (undeploy)
本番でのロールバック経路。rollout で何かが壊れた、ホストを廃止する、再インストール用にまっさらな状態に戻したい — そんなときホストから kanade を剥がすために、deploy と対になる undeploy スクリプトをコンポーネントごとに 1 本ずつ用意しています。
| コンポーネント | Deploy | Undeploy |
|---|---|---|
| Agent | scripts/deploy/agent.ps1 | scripts/undeploy/agent.ps1 |
| Backend | scripts/deploy/backend.ps1 | scripts/undeploy/backend.ps1 |
| NATS server | scripts/deploy/nats.ps1 | scripts/undeploy/nats.ps1 |
| Client (Tauri) | configs/jobs/installers/scripts/install-kanade-client.ps1 (agent-driven) | scripts/undeploy/client.ps1 |
All four are admin-only and idempotent — safe to re-run after a partial uninstall, safe to run when the component is already gone (each step logs "not present, skipping" and moves on).
デフォルトの姿勢: 安全側
フラグなしで実行するとスクリプトは:
- Windows サービスを停止します。
- SCM からサービスを unregister します (エントリが実際に消えるまで待つので、後続の再 deploy が pending な削除と race しません)。
%ProgramFiles%\Kanade\からインストール済みバイナリを削除します。中途半端な<exe>.new/<exe>.oldの swap 残骸もまとめて削除。- deploy スクリプトが作成した inbound のファイアウォールルールを削除します (
-KeepFirewallで skip 可 — 外部の WAF / グループポリシーがルールを管理している場合に有用)。 %ProgramData%\Kanade\配下 (config、log、JetStream データ、SQLite DB、…) は 残します。フォレンジック / rollback / 再 deploy が state を失わずに進められるように。HKLM:\SOFTWARE\kanade\<role>\*のレジストリ secret も 残します。
That's enough for the common case: "this host's kanade is misbehaving, get it off without destroying state".
-Purge: 破壊的クリーンアップ
追加で:
- そのコンポーネント固有の
%ProgramData%\Kanade\配下エントリを削除します。重要なのは そのコンポーネント自身のファイルだけ — agent / backend / NATS は同じ root を共有しているので、各スクリプトは他のコンポーネントのファイルには触れません。 - 対応する
HKLM:\SOFTWARE\kanade\<role>\*キーを削除します (-KeepSecretsを併せて渡すとスキップ — 複数コンポーネントで同じ bearer を共有しているときに有用)。
| コンポーネント | -Purge が削除するもの |
|---|---|
| Agent | config\agent.toml、logs\agent.*.log、outbox\、HKLM:\SOFTWARE\kanade\agent\ |
| Backend | config\backend.toml、data\*.db* (SQLite — 過去の results / inventory が消える)、logs\backend.*.log、HKLM:\SOFTWARE\kanade\backend\ |
| NATS | config\nats-server.conf、nats\ (JetStream — KV / Object Store / streams すべて消える)、logs\nats*.log |
| Client | 追加なし (per-user な state はまだ存在しない) |
⚠️ 危険なのは
undeploy-nats.ps1 -Purgeとundeploy-backend.ps1 -Purge。前者は fleet 全体の JetStream state (agent_releases、app_packages、scripts、jobs、agent_config、results stream) を消し、後者は projector の過去の SQLite を消します。どちらも out-of-band バックアップ無しではリカバリ不能。スクリプトは実行前に目立つバナーを出します。
ロールバックの定石
canary 1 台で rollout が壊れたとき
# On the canary, as Admin:
.\scripts\undeploy\agent.ps1 # safe default
# kanade is now off the host. Re-deploy when ready:
.\scripts\deploy\agent.ps1 -SourceDir C:\path\to\prev-version
ホストを恒久的に廃止する
.\scripts\undeploy\agent.ps1 -Purge
dev box を再インストール用にまっさらにする
.\scripts\undeploy\agent.ps1 -Purge
.\scripts\undeploy\backend.ps1 -Purge # ⚠️ SQLite gone
.\scripts\undeploy\nats.ps1 -Purge # ⚠️ JetStream gone
.\scripts\undeploy\client.ps1
# Now nothing about kanade exists on the box.
state は触らず壊れたサービスだけ作り直す
.\scripts\undeploy\backend.ps1 # safe default: SQLite intact
.\scripts\deploy\backend.ps1 -Recreate # fresh service registration, same data
undeploy がやらないこと
- It doesn't notify the rest of the fleet that this host has gone away — the backend will keep listing it under "agents" until its heartbeat ages out (
/api/agentsstaleness threshold). If you want it removed from the SPA immediately, delete the row via the backend API after undeploy. - It doesn't roll back the deployed binary to a previous version. "Roll back" in this script's vocabulary means "remove entirely"; if you want to swap to an older version, re-run the matching
deploy-*.ps1against a folder containing the older binary. - agent を取り除いても NATS 側の state には触れません — agent の
target_versionエントリはagent_config.pcs.<pc>配下の KV に残ります。必要なら server 側でkanade jetstream kv del agent_config pcs.<pc>.target_versionで掃除してください。