🔋 みーきゅんクラウド UPS連動シャットダウン構成(完成版 v2)
1️⃣ 構成概要
みーきゅんクラウドDCでは、APC Smart-UPS 1200 × 3台を用いて2-of-3判定による安全停止を行う構成とした。
監視ノードはR640。R640がNUT(Network UPS Tools)で3台のUPSを監視し、停電条件成立時にSupermicro → hirame → DarkHero → R640の順で停止する。
2️⃣ UPS一覧
| UPS | IP | NMC | 用途 |
|---|---|---|---|
| UPS-A | 192.168.10.50 | AP9630 | 通信・Switch系 + DarkHero + hirame |
| UPS-B | 192.168.10.51 | AP9630 | Server系 |
| UPS-C | 192.168.10.52 | AP9630 | Server系 |
注記: DarkHeroとhirameはコンセント口数都合でUPS-Aに接続
3️⃣ 電源系統の考え方
UPS-A
- 通信・Switch系
- DarkHero(Windows PC)
- hirame(Collabora CODE) ← 新規追加
UPS-B
- Server系(R640・Supermicro電源系統の一部)
UPS-C
- Server系(R640・Supermicro電源系統の一部)
4️⃣ 採用した停止ロジック
方式
2-of-3
条件
3台のUPSのうち、2台以上がOB(On Battery)になった場合のみ停電扱いとする。
停止条件
- 2台以上OBを検知
- 5分連続継続
- 途中で復電した場合は停止キャンセル
5️⃣ 停止順序
停電時は以下の順で安全停止する。
停電検知(2-of-3判定) ↓ 5分待機 1. Supermicro(ストレージノード) ↓ 20秒待機 2. hirame(Collabora CODE)← 新規追加 ↓ 20秒待機 3. DarkHero(Windowsノード) ↓ 40秒待機 4. R640(管理ノード)
停止順序の理由
- Supermicro最優先: ストレージを先に止めてデータ破損リスクを下げる
- hirame次: Collaboraサービスを安全に停止(Nextcloud本体はR640)
- DarkHero: クライアント/計算ノードを停止
- R640最後: 管理ノードは最後まで生かして制御を担当
6️⃣ NUT構成
監視ノード
R640
役割
- UPS 3台の状態監視
- 2-of-3判定
- 停止シーケンス実行
通信方式
SNMP (APC AP9630)
7️⃣ UPS通信確認結果
R640から以下の通信確認済み。
ping 192.168.10.50 # UPS-A ping 192.168.10.51 # UPS-B ping 192.168.10.52 # UPS-C
すべて疎通OK。
8️⃣ SNMP確認結果
以下のコマンドで3台とも取得成功。
snmpwalk -v1 -c public 192.168.10.50 | head snmpwalk -v1 -c public 192.168.10.51 | head snmpwalk -v1 -c public 192.168.10.52 | head
R640からAPC NMC (AP9630)情報取得済み。
9️⃣ NUT設定ファイル(R640)
/etc/nut/nut.conf
MODE=netserver
/etc/nut/ups.conf
[ups-a] driver = snmp-ups port = 192.168.10.50 community = public desc = "UPS-A" [ups-b] driver = snmp-ups port = 192.168.10.51 community = public desc = "UPS-B" [ups-c] driver = snmp-ups port = 192.168.10.52 community = public desc = "UPS-C"
/etc/nut/upsd.conf
LISTEN 127.0.0.1 3493 LISTEN 192.168.10.21 3493
※ 192.168.10.21 = R640 管理IP
/etc/nut/upsd.users
[upsmon] password = (設定済みパスワード) upsmon master
/etc/nut/upsmon.conf
MONITOR ups-a@localhost 1 upsmon (設定済みパスワード) master MONITOR ups-b@localhost 1 upsmon (設定済みパスワード) master MONITOR ups-c@localhost 1 upsmon (設定済みパスワード) master
🔟 NUT確認結果
以下で取得成功。
upsc ups-a@localhost upsc ups-b@localhost upsc ups-c@localhost
確認済みステータス例
ups.status: OLbattery.charge: 100battery.runtime: 正常
1️⃣1️⃣ SSH停止経路
Supermicro
| 項目 | 内容 |
|---|---|
| 接続 | R640 → Supermicro へSSH接続可 |
| 接続エイリアス | ssh supermicro |
| 実行ユーザー | upsctl |
| 停止権限 | visudoにてupsctl ALL=(ALL) NOPASSWD: /usr/sbin/shutdown追加済み |
| 安全テスト | ssh supermicro 'sudo shutdown -k now' 成功済み |
hirame(新規追加)
| 項目 | 内容 |
|---|---|
| 接続 | R640 → hirame へSSH接続可 |
| 管理IP | 192.168.10.40 (VLAN10) |
| 接続エイリアス | ssh hirame |
| 実行ユーザー | hirame |
| 停止権限 | visudoにてhirame ALL=(ALL) NOPASSWD: /usr/sbin/shutdown追加済み |
| 役割 | Collabora CODE (office.k2-o.net) |
| 電源接続 | UPS-A (192.168.10.50) |
| 安全テスト | ssh hirame 'sudo shutdown -k now' 成功済み |
DarkHero
| 項目 | 内容 |
|---|---|
| 接続 | R640 → DarkHero へSSH接続可 |
| 接続エイリアス | ssh darkhero |
| 実行ユーザー | neowa |
| 動作確認 | ssh darkhero "hostname" → WAN-PC |
| 停止コマンド | shutdown /s /t 30 /c "メッセージ" |
1️⃣2️⃣ SSH鍵構成
UPS自動停止専用にパスフレーズ無し鍵を作成。
鍵
~/.ssh/id_ed25519_ups_auto ~/.ssh/id_ed25519_ups_auto.pub
SSH config
Host supermicro
HostName 192.168.10.31
User upsctl
IdentityFile ~/.ssh/id_ed25519_ups_auto
IdentitiesOnly yes
Host hirame
HostName 192.168.10.40
User hirame
IdentityFile ~/.ssh/id_ed25519_ups_auto
IdentitiesOnly yes
Host darkhero
HostName 192.168.10.10
User neowa
IdentityFile ~/.ssh/id_ed25519_ups_auto
IdentitiesOnly yes
1️⃣3️⃣ 停電判定スクリプト
ファイル
/usr/local/bin/ups-check.sh
動作
- UPS-A/B/Cの
ups.statusを取得 OBを含む台数をカウント- 2台以上ならstatefileを作成
- 5分継続した場合のみ停止シーケンス実行
- 復電したらstatefile削除 → 停止キャンセル
1️⃣4️⃣ cron設定
root crontabに以下設定済み。
* * * * * /usr/local/bin/ups-check.sh >/dev/null 2>&1
意味
1分ごとにUPS状態確認を行う。
1️⃣5️⃣ 実際の停止シーケンス
停電条件成立時、以下を実行。
# 1) Supermicro ssh -o BatchMode=yes supermicro 'sudo /usr/sbin/shutdown -h now' sleep 20 # 2) hirame ssh -o BatchMode=yes hirame 'sudo /usr/sbin/shutdown -h now' sleep 20 # 3) DarkHero ssh -o BatchMode=yes darkhero 'shutdown /s /t 30 /c "UPS 2-of-3 battery event: controlled shutdown from R640"' sleep 40 # 4) R640 shutdown -h now
1️⃣6️⃣ 復電キャンセル仕様
完成版スクリプトでは、5分待機中に2-of-3条件が解除された場合は停止をキャンセルする。
例
- UPS-A/Bが OB
- 3分後に商用電源復帰
- statefile削除
- 停止しない
1️⃣7️⃣ 現在の完成度
✅ 完了済み
- UPS 3台の固定IP設定
- SNMP有効化
- R640でNUT監視
- 2-of-3判定スクリプト
- 復電キャンセル仕様
- Supermicro SSH停止
- hirame SSH停止(2026-03-31追加)
- DarkHero SSH停止
- cron自動監視
状態: UPS連動自動停止システム 完成(v2)
1️⃣8️⃣ 運用上の注意
① cron実行なので手動ssh-agentは不要
UPS自動停止専用鍵id_ed25519_ups_autoはパスフレーズ無しで作成済み前提。
② Windows側 authorized_keys
DarkHeroは管理者権限ユーザーのため、以下を使用。
C:\ProgramData\ssh\administrators_authorized_keys
③ Supermicro側 authorized_keys
SupermicroはSFTP系設定のため、通常の/home/.../.sshではなく以下を使用。
/data/sftp/upsctl/.ssh/authorized_keys
④ hirame側 authorized_keys
hirameは通常のLinux構成。
/home/hirame/.ssh/authorized_keys
1️⃣9️⃣ みーきゅんクラウド UPS運用設計の評価
この構成は単純な家庭UPS運用ではなく、以下を満たす。
- 複数UPS監視
- 2-of-3停電判定
- 復電キャンセル
- ストレージ優先停止
- サービス階層別停止(Collabora → Client → Management)
- Windows/Linux混在停止
- 管理ノード最終停止
評価: 家庭ラボというより、小規模DC設計レベル
2️⃣0️⃣ 変更履歴
| 日付 | 変更内容 |
|---|---|
| 2026-03-xx | 初版作成(Supermicro + DarkHero + R640) |
| 2026-03-31 | hirame追加(Collabora CODE自動停止対応) |
2️⃣1️⃣ 次にやると良いこと
- 実停電を模したテスト手順書作成
- UPSごとのバッテリー健全性確認
- R640再起動後のNUT自動復旧確認
- 復電後のノード起動順序設計
- Notion用の全体DC図v2へ反映
