🔋 みーきゅんクラウド 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: OL
  • battery.charge: 100
  • battery.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️⃣ 次にやると良いこと
  1. 実停電を模したテスト手順書作成
  2. UPSごとのバッテリー健全性確認
  3. R640再起動後のNUT自動復旧確認
  4. 復電後のノード起動順序設計
  5. Notion用の全体DC図v2へ反映