Files
ROMFASTSQL/proxmox/ups/docs/UPS-SHUTDOWN-README.md
Marius ab6ac77d50 Add UPS email notifications and automatic UPS shutdown
- Add email notifications via PVE::Notify for all UPS events:
  - ONBATT: when UPS switches to battery
  - ONLINE: when power is restored
  - LOWBATT: critical battery level
  - SHUTDOWN_START/NODE/PRIMARY: during cluster shutdown
  - COMMBAD: communication lost with UPS

- Add automatic UPS shutdown command after cluster shutdown
  (protects against power surge when power returns)

- Update upssched.conf with ONLINE handler and immediate ONBATT notification

- Add notification templates for HTML and text emails

- Update documentation with new features and timer configuration

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 20:11:30 +02:00

6.8 KiB

Documentație Sistem UPS Shutdown Orchestrat

Configurare Completă

Hardware

  • UPS: INNO TECH USB to Serial (ID: 0665:5161)
  • Conectat la: pvemini (10.0.20.201) - via USB
  • Cluster Proxmox:
    • pvemini (10.0.20.201) - PRIMARY (are UPS-ul conectat)
    • pve1 (10.0.20.200) - SECONDARY
    • pve2 (10.0.20.202) - SECONDARY

Software

  • NUT (Network UPS Tools) versiunea 2.8.0
  • WinNUT pe VM 201 (Windows 11) pentru monitorizare vizuală

Fișiere de Configurare

1. /etc/nut/ups.conf

Configurează driver-ul pentru UPS:

[nutdev1]
    driver = nutdrv_qx
    port = auto
    vendorid = 0665
    productid = 5161
    subdriver = cypress
    desc = "UPS Cypress via USB"

2. /etc/nut/upsd.conf

Server NUT - ascultă pe localhost și rețea:

LISTEN 127.0.0.1 3493
LISTEN 10.0.20.201 3493

3. /etc/nut/upsd.users

Utilizatori autorizați:

[admin]
    password = parola99
    actions = SET
    instcmds = ALL
    upsmon master

4. /etc/nut/upsmon.conf

Monitor local:

MONITOR nutdev1@localhost 1 admin parola99 master
NOTIFYCMD /usr/sbin/upssched
NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC
NOTIFYFLAG LOWBATT SYSLOG+WALL+EXEC

5. /etc/nut/upssched.conf

Scheduler pentru evenimente:

  • ONBATT: Notificare email imediată + așteaptă 180 secunde (3 minute) înainte de shutdown
  • LOWBATT: Shutdown imediat + notificare email
  • ONLINE: Anulează timer-ele + notificare email "curent revenit"

Scripturi Create

1. /usr/local/bin/ups-shutdown-cluster.sh

Script principal de shutdown orchestrat

Ordinea de operații:

  1. Verifică status UPS (trebuie OB sau LB)
  2. 📧 Email: "Shutdown cluster PORNIT"
  3. Oprește toate VM-urile și LXC de pe toate nodurile (paralel)
  4. Așteaptă 90 secunde pentru oprire graceful
  5. Shutdown pve1 → 📧 Email: "Shutdown pve1 trimis"
  6. Shutdown pveelite → 📧 Email: "Shutdown pveelite trimis"
  7. Așteaptă 60 secunde
  8. 📧 Email: "Shutdown pvemini (ULTIMUL NOD)"
  9. Comandă UPS shutdown (oprire completă UPS)
  10. Shutdown pvemini (primary - ultimul)

Logare: /var/log/ups-shutdown.log + journalctl -t ups-shutdown

2. /usr/local/bin/ups-shutdown-test.sh

Script de test (DRY RUN) - NU oprește nimic

Folosește-l pentru a testa:

/usr/local/bin/ups-shutdown-test.sh
tail -f /var/log/ups-shutdown-test.log

3. /usr/local/bin/upssched-cmd

Handler pentru evenimente UPS - trimite notificări email via PVE::Notify

Eveniment Acțiune Email
onbatt_start UPS trece pe baterie "Trecere pe baterie - Timer 3 min"
onbatt Timer 3 min expirat "Pe baterie 3 min - SHUTDOWN" + lansare shutdown
online Curent revenit "Curent revenit - OK"
lowbatt Baterie critică "BATERIE CRITICĂ" + shutdown imediat
commbad Comunicație pierdută "Comunicație pierdută cu UPS"

Logare: /var/log/ups-events.log

Testare și Verificare

Verificare Status UPS

# Status general
upsc nutdev1

# Doar status
upsc nutdev1 ups.status

# Baterie
upsc nutdev1 battery.charge

# Tensiuni
upsc nutdev1 input.voltage output.voltage

Verificare Servicii

systemctl status nut-server
systemctl status nut-monitor
journalctl -u nut-server -f
journalctl -u nut-monitor -f

Test Manual Shutdown (DRY RUN)

/usr/local/bin/ups-shutdown-test.sh

Test Simulare UPS pe Baterie

⚠️ ATENȚIE: Acest test va iniția shutdown real dacă îl lași 3 minute!

# Deconectează fizic UPS-ul de la priză pentru 30 secunde
# Monitorizează logs:
tail -f /var/log/ups-events.log

# Reconectează înainte de 3 minute pentru a anula shutdown-ul

Monitorizare din WinNUT (VM 201)

Conexiune

  • Server: 10.0.20.201
  • Port: 3493
  • UPS Name: nutdev1
  • Username: admin
  • Password: parola99
  • Polling Interval: 15 secunde

Ce Vezi în WinNUT

  • Input/Output Voltage
  • Frequency
  • Battery Charge (%)
  • Battery Voltage
  • UPS Load (%)
  • UPS Status (Online/On Battery/Low Battery)

Scenarii de Funcționare

Scenario 1: Întrerupere Scurtă (< 3 minute)

  1. Curent se întrerupe → UPS trece pe baterie
  2. 📧 Email: "Trecere pe baterie"
  3. Timer de 180 secunde pornește
  4. Curent revine → Timer anulat
  5. 📧 Email: "Curent revenit - OK"
  6. Rezultat: Niciun sistem nu se oprește

Scenario 2: Întrerupere Lungă (> 3 minute)

  1. Curent se întrerupe → UPS trece pe baterie
  2. 📧 Email: "Trecere pe baterie"
  3. Timer 180 secunde expiră
  4. 📧 Email: "Pe baterie 3 min - SHUTDOWN"
  5. Script de shutdown pornește:
    • 📧 Email: "Shutdown cluster PORNIT"
    • VM-uri/LXC se opresc pe toate nodurile
    • După 90s: pve1 se oprește → 📧 Email
    • pveelite se oprește → 📧 Email
    • După 60s: 📧 Email: "Shutdown pvemini (ULTIMUL NOD)"
    • UPS primește comandă shutdown
    • pvemini se oprește
  6. Rezultat: Shutdown orchestrat complet + UPS oprit

Scenario 3: Baterie Scăzută Imediată

  1. UPS raportează LOWBATT
  2. 📧 Email: "BATERIE CRITICĂ - SHUTDOWN IMEDIAT"
  3. Shutdown IMEDIAT (fără timer)
  4. Același flux de shutdown orchestrat
  5. Rezultat: Shutdown rapid pentru protecție + UPS oprit

Loguri și Troubleshooting

Fișiere de Log

/var/log/ups-shutdown.log       # Shutdown orchestrat real
/var/log/ups-shutdown-test.log  # Test dry-run
/var/log/ups-events.log         # Evenimente UPS (upssched)
journalctl -u nut-server        # Server NUT
journalctl -u nut-monitor       # Monitor NUT

Comenzi Utile

# Liste conexiuni active la NUT
ss -tnp | grep :3493

# Test conectivitate de pe alt nod
ssh root@10.0.20.200 'upsc nutdev1@10.0.20.201'

# Restart servicii
systemctl restart nut-server nut-monitor

Întreținere

Verificare Săptămânală

# Status UPS
upsc nutdev1 ups.status battery.charge

# Test dry-run
/usr/local/bin/ups-shutdown-test.sh

# Verificare logs
tail -20 /var/log/ups-events.log

Verificare Lunară

  • Test fizic: deconectează UPS 30 secunde
  • Verifică că WinNUT detectează schimbarea
  • Verifică că logs arată evenimentul
  • Reconectează înainte de 3 minute

⚠️ IMPORTANT

  1. Nu modifica timpul de 3 minute fără consultare - trebuie să fie suficient pentru:

    • VM-uri să se oprească graceful
    • Noduri secundare să se închidă
    • pvemini să rămână ultimul funcțional
  2. Testează periodic scriptul dry-run pentru a verifica că SSH funcționează între noduri

  3. Monitorizează statusul bateriei UPS - înlocuiește bateria când charge devine sub 80%

  4. WinNUT este doar pentru monitorizare - shutdown-ul este automat de pe Proxmox

Contact și Suport

  • Documentație NUT: https://networkupstools.org/
  • Script creat: 2025-10-06
  • Ultima modificare: 2026-01-13 (adăugat notificări email + UPS shutdown)