Add complete UPS monitoring system with monthly battery testing

This commit adds a comprehensive UPS monitoring and management system for
the Proxmox cluster with automated shutdown orchestration and monthly
battery health testing.

Features:
- NUT (Network UPS Tools) configuration for INNO TECH USB UPS
- Automated cluster shutdown on power failure (3-minute grace period)
- Monthly automated battery testing with health evaluation
- Email notifications via PVE::Notify system
- WinNUT monitoring client for Windows VM 201

Components added:
- config/: NUT configuration files (ups.conf, upsd.conf, upsmon.conf, etc.)
- scripts/ups-shutdown-cluster.sh: Orchestrated cluster shutdown
- scripts/ups-monthly-test.sh: Monthly battery test with email reports
- scripts/upssched-cmd: Event handler for UPS state changes
- docs/: Complete installation and usage documentation

Key findings:
- UPS battery.charge reporting has 10-40 second delay after test start
- Test must monitor voltage drop (1.5-2V) and charge drop (9-27%)
- Battery health evaluation: EXCELLENT/GOOD/FAIR/POOR based on discharge rate
- Email notifications use Handlebars templates without Unicode emojis for compatibility

Configuration:
- UPS: INNO TECH (Voltronic protocol, vendor 0665:5161)
- Primary node: pvemini (10.0.20.201) with USB connection
- Monthly test: cron 0 0 1 * * /opt/scripts/ups-monthly-test.sh
- Shutdown timer: 180 seconds on battery before cluster shutdown

Documentation includes complete installation guides for NUT server,
WinNUT client, and troubleshooting procedures.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Marius
2025-10-06 21:39:46 +03:00
parent 238c02fdf0
commit 87b9709a0d
14 changed files with 3292 additions and 0 deletions

View File

@@ -0,0 +1,435 @@
# Instalare și Configurare NUT (Network UPS Tools) pe Proxmox
## Despre
Acest ghid descrie instalarea și configurarea NUT (Network UPS Tools) pe un cluster Proxmox pentru monitorizare UPS și shutdown orchestrat automat.
## Arhitectură
- **Nod PRIMARY (pvemini - 10.0.20.201):** Are UPS-ul conectat fizic via USB, rulează NUT server și driver
- **Noduri SECONDARY (pve1, pve2):** Pot monitoriza UPS-ul prin rețea (opțional)
- **VM 201 (Windows 11):** Monitorizare vizuală prin WinNUT client
## Prerequisite
- Proxmox VE instalat
- UPS conectat via USB la nodul primary
- Acces root la noduri
## 1. Instalare NUT pe Nodul PRIMARY
### 1.1. Instalare pachete
```bash
apt update
apt install -y nut nut-client nut-server
```
### 1.2. Detectare UPS
```bash
# Listează dispozitive USB
lsusb
# Exemple output:
# Bus 001 Device 002: ID 0665:5161 Cypress Semiconductor USB to Serial
# Verifică dacă kernel-ul a detectat UPS-ul
dmesg | grep -i ups
dmesg | grep -i hid
```
### 1.3. Testare driver NUT
```bash
# Caută driver potrivit pentru UPS-ul tău
nut-scanner -U
# sau
nut-scanner --usb_scan
```
## 2. Configurare NUT
### 2.1. Configurare Driver UPS (`/etc/nut/ups.conf`)
Creează configurația pentru UPS:
```bash
cat > /etc/nut/ups.conf << 'EOF'
[nutdev1]
driver = nutdrv_qx
port = auto
vendorid = 0665
productid = 5161
subdriver = cypress
desc = "UPS Cypress via USB"
EOF
```
**Note:**
- Înlocuiește `vendorid` și `productid` cu valorile de la `lsusb`
- Driver-ul `nutdrv_qx` funcționează pentru majoritatea UPS-urilor Voltronic/Megatec/Q1
- Alte drivere comune: `usbhid-ups`, `blazer_usb`, `nutdrv_qx`
### 2.2. Configurare Server NUT (`/etc/nut/upsd.conf`)
```bash
cat >> /etc/nut/upsd.conf << 'EOF'
# Ascultă pe localhost pentru monitorul local
LISTEN 127.0.0.1 3493
# Ascultă pe IP-ul nodului pentru clienți din rețea
LISTEN 10.0.20.201 3493
EOF
```
**Note:**
- Înlocuiește `10.0.20.201` cu IP-ul nodului tău PRIMARY
- Portul default NUT este 3493
### 2.3. Configurare Utilizatori (`/etc/nut/upsd.users`)
```bash
cat > /etc/nut/upsd.users << 'EOF'
[admin]
password = parola99
actions = SET
instcmds = ALL
upsmon master
EOF
```
**IMPORTANT:** Schimbă parola `parola99` cu ceva sigur!
### 2.4. Configurare Monitor Local (`/etc/nut/upsmon.conf`)
Editează `/etc/nut/upsmon.conf` și adaugă:
```bash
# Monitorizare UPS local
MONITOR nutdev1@localhost 1 admin parola99 master
# Folosește upssched pentru notificări
NOTIFYCMD /usr/sbin/upssched
# Activează notificările cu EXEC pentru evenimente
NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC
NOTIFYFLAG LOWBATT SYSLOG+WALL+EXEC
NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC
NOTIFYFLAG COMMOK SYSLOG+WALL+EXEC
NOTIFYFLAG COMMBAD SYSLOG+WALL+EXEC
```
**Note:**
- `master` = acest nod controlează UPS-ul (va fi ultimul care se închide)
- `1` = powervalue (câte surse de alimentare alimentează acest UPS)
### 2.5. Configurare NUT Mode (`/etc/nut/nut.conf`)
```bash
cat > /etc/nut/nut.conf << 'EOF'
MODE=netserver
EOF
```
Moduri disponibile:
- `none` - NUT dezactivat
- `standalone` - Doar local, fără rețea
- `netserver` - Server + local (recomandat pentru PRIMARY)
- `netclient` - Doar client (pentru noduri SECONDARY)
## 3. Pornire Servicii
### 3.1. Pornire driver UPS
```bash
upsdrvctl start
```
Ar trebui să vezi:
```
Network UPS Tools - UPS driver controller 2.8.0
Network UPS Tools - Megatec/Q1 protocol USB driver 0.32 (2.8.0)
Using subdriver: Cypress 0.10
```
### 3.2. Pornire server NUT
```bash
systemctl enable nut-server
systemctl start nut-server
systemctl status nut-server
```
### 3.3. Pornire monitor NUT
```bash
systemctl enable nut-monitor
systemctl start nut-monitor
systemctl status nut-monitor
```
## 4. Verificare Funcționare
### 4.1. Test status UPS
```bash
# Listează UPS-uri disponibile
upsc -l
# Afișează toate informațiile despre UPS
upsc nutdev1
# Doar status
upsc nutdev1 ups.status
# Baterie
upsc nutdev1 battery.charge
upsc nutdev1 battery.voltage
# Tensiuni
upsc nutdev1 input.voltage
upsc nutdev1 output.voltage
```
### 4.2. Verificare conexiuni
```bash
# Verifică dacă upsd ascultă pe portul 3493
ss -tulpn | grep 3493
# Ar trebui să vezi:
# tcp LISTEN 0 16 127.0.0.1:3493 0.0.0.0:*
# tcp LISTEN 0 16 10.0.20.201:3493 0.0.0.0:*
```
### 4.3. Test de pe alt sistem
```bash
# De pe un alt nod sau sistem:
upsc nutdev1@10.0.20.201
```
## 5. Configurare Scheduler Evenimente (upssched)
### 5.1. Creare `/etc/nut/upssched.conf`
```bash
cat > /etc/nut/upssched.conf << 'EOF'
CMDSCRIPT /usr/local/bin/upssched-cmd
PIPEFN /run/nut/upssched.pipe
LOCKFN /run/nut/upssched.lock
# UPS pe baterie - așteaptă 180 secunde (3 minute)
AT ONBATT * START-TIMER onbatt 180
# Baterie scăzută - acțiune imediată
AT LOWBATT * EXECUTE lowbatt
# Curent revenit - anulează timer
AT ONLINE * CANCEL-TIMER onbatt
# Comunicație pierdută - așteaptă 30 secunde
AT COMMBAD * START-TIMER commbad 30
# Comunicație restabilită
AT COMMOK * CANCEL-TIMER commbad
EOF
```
### 5.2. Creare handler script
Copiază scriptul `upssched-cmd` din directorul `scripts/` în `/usr/local/bin/`:
```bash
cp scripts/upssched-cmd /usr/local/bin/
chmod +x /usr/local/bin/upssched-cmd
```
### 5.3. Creare director runtime
```bash
mkdir -p /run/nut
chown nut:nut /run/nut
chmod 770 /run/nut
```
## 6. Instalare Scripturi Shutdown Orchestrat
### 6.1. Copiere scripturi
```bash
# Script principal de shutdown
cp scripts/ups-shutdown-cluster.sh /usr/local/bin/
chmod +x /usr/local/bin/ups-shutdown-cluster.sh
# Script de test (dry-run)
cp scripts/ups-shutdown-test.sh /usr/local/bin/
chmod +x /usr/local/bin/ups-shutdown-test.sh
```
### 6.2. Editare noduri în script
Editează `/usr/local/bin/ups-shutdown-cluster.sh` și verifică:
```bash
NODES=("10.0.20.200" "10.0.20.202") # IP-urile nodurilor SECONDARY
```
### 6.3. Configurare SSH între noduri
Pentru ca scriptul să funcționeze, trebuie ca nodul PRIMARY să poată face SSH pe nodurile SECONDARY fără parolă:
```bash
# Generează SSH key dacă nu există
ssh-keygen -t ed25519 -N "" -f /root/.ssh/id_ed25519
# Copiază cheia pe nodurile SECONDARY
ssh-copy-id root@10.0.20.200
ssh-copy-id root@10.0.20.202
# Test conexiune
ssh root@10.0.20.200 "hostname"
ssh root@10.0.20.202 "hostname"
```
## 7. Testare
### 7.1. Test dry-run
```bash
/usr/local/bin/ups-shutdown-test.sh
cat /var/log/ups-shutdown-test.log
```
### 7.2. Test simulare UPS pe baterie (ATENȚIE!)
**⚠️ PERICOL:** Acest test va iniția shutdown real dacă îl lași să ruleze 3 minute!
```bash
# Monitorizează logs
tail -f /var/log/ups-events.log &
# Deconectează fizic UPS-ul de la priză
# Așteaptă 10-30 secunde
# Verifică că logs-urile arată "ONBATT"
# RECONECTEAZĂ UPS-ul înainte de 3 minute!
# Verifică că timer-ul a fost anulat
journalctl -u nut-monitor -f
```
## 8. Troubleshooting
### 8.1. Driver-ul nu pornește
```bash
# Verifică permisiuni USB
ls -la /dev/bus/usb/*/*
# Driver manual cu debug
/lib/nut/nutdrv_qx -a nutdev1 -DDDDD
# Verifică logs
journalctl -u nut-driver@nutdev1 -f
```
### 8.2. Server nu pornește
```bash
# Verifică configurația
upsd -c reload
# Debug mode
upsd -D
# Logs
journalctl -u nut-server -f
```
### 8.3. Monitor nu se conectează
```bash
# Verifică parola în upsd.users
cat /etc/nut/upsd.users
# Verifică MONITOR line în upsmon.conf
grep "^MONITOR" /etc/nut/upsmon.conf
# Test manual
upsmon -D
```
### 8.4. UPS nu răspunde
```bash
# Reload driver
upsdrvctl stop
upsdrvctl start
# Verifică comunicația USB
lsusb -v -d 0665:5161
```
## 9. Logs și Monitorizare
### Logs importante:
```bash
/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
journalctl -u nut-driver@nutdev1 # Driver UPS
```
### Comenzi utile:
```bash
# Status complet UPS
upsc nutdev1
# Comenzi disponibile
upscmd -l nutdev1
# Variabile disponibile
upsc nutdev1 | grep -E "battery|input|output|ups.status"
# Monitorizare în timp real
watch -n 2 'upsc nutdev1 ups.status battery.charge input.voltage'
```
## 10. Întreținere
### Zilnic/Săptămânal:
```bash
# Verifică status UPS
upsc nutdev1 ups.status battery.charge
# Verifică servicii
systemctl status nut-server nut-monitor
```
### Lunar:
```bash
# Test dry-run
/usr/local/bin/ups-shutdown-test.sh
# Test fizic (deconectare scurtă < 1 min)
```
### Anual:
```bash
# Test complet de baterie pe UPS
# Backup înainte de test!
```
## Referințe
- Documentație oficială NUT: https://networkupstools.org/
- Lista drivere compatibile: https://networkupstools.org/stable-hcl.html
- NUT Users Manual: https://networkupstools.org/docs/user-manual.chunked/index.html
- Troubleshooting Guide: https://networkupstools.org/docs/user-manual.chunked/ar01s07.html

View File

@@ -0,0 +1,376 @@
# Instalare și Configurare WinNUT pe Windows 11 (VM 201)
## Despre
WinNUT este un client NUT (Network UPS Tools) pentru Windows care permite monitorizarea vizuală a unui UPS conectat la un server NUT remote (în cazul nostru, pvemini).
**IMPORTANT:** WinNUT este folosit DOAR pentru monitorizare vizuală. Shutdown-ul automat este gestionat de scripturile de pe Proxmox.
## Prerequisite
- Windows 11 (VM 201 pe pvemini)
- Server NUT funcțional pe pvemini (10.0.20.201)
- Conectivitate rețea către serverul NUT (port 3493)
## 1. Descărcare WinNUT
### Opțiunea 1: GitHub Releases (Recomandat)
1. Deschide browser în VM 201
2. Accesează: https://github.com/gawindx/WinNUT-V2/releases
3. Descarcă ultima versiune (ex: `WinNUT-v2.x.x-Setup.exe`)
### Opțiunea 2: Build from source (Opțional)
```powershell
# Clonează repository
git clone https://github.com/gawindx/WinNUT-V2.git
cd WinNUT-V2
# Urmează instrucțiunile de build din README
```
## 2. Instalare WinNUT
### 2.1. Rulare instalator
1. Rulează `WinNUT-v2.x.x-Setup.exe` ca Administrator
2. Acceptă UAC prompt
3. Alege directorul de instalare (implicit: `C:\Program Files\WinNUT`)
4. Finalizează instalarea
### 2.2. Verificare instalare
WinNUT ar trebui să pornească automat după instalare. Icon-ul va apărea în system tray.
## 3. Configurare WinNUT
### 3.1. Deschidere fereastră Options
- Click dreapta pe icon-ul WinNUT din system tray
- Selectează **"Options"** sau dublu-click pe icon
### 3.2. Tab Connection
Configurează următoarele:
| Câmp | Valoare | Descriere |
|------|---------|-----------|
| **NUT host** | `10.0.20.201` | IP-ul serverului NUT (pvemini) |
| **NUT Port** | `3493` | Portul default NUT |
| **UPS Name** | `nutdev1` | Numele UPS-ului (din ups.conf) |
| **Polling Interval** | `15` | Interval de polling în secunde (NU pune 0!) |
| **Login** | `admin` | Username (din upsd.users) |
| **Password** | `parola99` | Parola (din upsd.users) |
| **Re-establish connection** | ☑ Checked | Reconectare automată |
**IMPORTANT:**
- **Polling Interval** trebuie să fie > 0 (recomandat: 15)
- Dacă Polling Interval = 0, WinNUT nu se va conecta!
### 3.3. Tab Calibration
Lasă valorile default sau ajustează după preferințe pentru afișarea gauge-urilor.
### 3.4. Tab Miscellaneous
Configurări opționale:
-**Start with Windows** - Pornire automată
-**Minimize to tray** - Minimizare în system tray
-**Sound alerts** - Alerte sonore (opțional)
### 3.5. Tab Shutdown Options
**⚠️ IMPORTANT:** NU configura shutdown options în WinNUT!
Shutdown-ul este gestionat automat de scripturile de pe Proxmox. WinNUT este doar pentru monitorizare.
Lasă toate opțiunile de shutdown dezactivate:
- ☐ Shutdown on battery
- ☐ Shutdown on low battery
- ☐ Force shutdown
### 3.6. Salvare configurație
1. Click **OK** pentru a salva
2. WinNUT se va reconecta automat la serverul NUT
3. În câteva secunde, ar trebui să vezi datele UPS-ului
## 4. Verificare Funcționare
### 4.1. Fereastră principală
După conectare cu succes, ar trebui să vezi:
**Gauge-uri (indicatoare circulare):**
- **Input Voltage** (Tensiune intrare): ~230V
- **Output Voltage** (Tensiune ieșire): ~230V
- **Frequency** (Frecvență): ~50Hz
- **Battery Charge** (Încărcare baterie): 0-100%
- **Battery Voltage** (Tensiune baterie): ~24V (depinde de UPS)
- **UPS Load** (Sarcină UPS): 0-100%
**Status checkboxes:**
-**UPS On Line** - UPS pe curent electric (normal)
-**UPS On Battery** - UPS pe baterie (întrerupere curent)
-**UPS Overload** - UPS supraîncărcat
-**UPS Battery Low** - Baterie scăzută
**Informații suplimentare:**
- **Manufacturer:** (producător UPS)
- **Name:** nutdev1
- **Serial:** (număr serie)
- **Firmware:** (versiune firmware)
### 4.2. System tray icon
- **Verde:** UPS On Line (normal)
- **Galben:** UPS On Battery (atenție)
- **Roșu:** UPS Battery Low (critic)
### 4.3. Mesaj reconectare
În partea de jos a ferestrei vezi:
```
[id 4: 10/6/2025 7:56:48 PM] Try Reconnect 1 / 30
```
Dacă vezi acest mesaj constant:
1. Verifică configurația Connection (mai ales Polling Interval)
2. Verifică conectivitatea rețea (ping 10.0.20.201)
3. Verifică că serverul NUT rulează pe pvemini
## 5. Testare
### 5.1. Test conectivitate din PowerShell
```powershell
# Test ping
Test-NetConnection -ComputerName 10.0.20.201 -Port 3493
# Ar trebui să vezi:
# TcpTestSucceeded : True
```
### 5.2. Test simulare UPS pe baterie
1. Deconectează fizic UPS-ul de la priză (pe pvemini)
2. Observă în WinNUT:
- Checkbox **"UPS On Battery"** devine ☑
- Icon în system tray devine galben
- Input voltage scade
- Battery charge începe să scadă
3. Reconectează UPS-ul
4. Observă că status revine la **"UPS On Line"**
**NU lăsa UPS-ul pe baterie mai mult de 3 minute** - se va declanșa shutdown automat!
## 6. Troubleshooting
### 6.1. WinNUT nu se conectează
**Verificări:**
1. **Polling Interval = 0?**
- Schimbă la 15 secunde
- Click OK și așteaptă 10-20 secunde
2. **Firewall blochează portul 3493?**
```powershell
# Test port
Test-NetConnection -ComputerName 10.0.20.201 -Port 3493
```
3. **Server NUT nu rulează?**
- SSH pe pvemini:
```bash
systemctl status nut-server
ss -tulpn | grep 3493
```
4. **Date de autentificare greșite?**
- Verifică username/password din Options
- Compară cu `/etc/nut/upsd.users` de pe pvemini
5. **Nume UPS greșit?**
- Verifică că UPS Name = `nutdev1`
- Listează UPS-uri disponibile:
```bash
ssh root@10.0.20.201 "upsc -l"
```
### 6.2. WinNUT se conectează dar nu afișează date
1. **Restart WinNUT:**
- Click dreapta → Exit
- Pornește WinNUT din nou
2. **Verifică permisiuni:**
- Username `admin` trebuie să existe în `/etc/nut/upsd.users`
3. **Verifică logs pe server:**
```bash
ssh root@10.0.20.201 "journalctl -u nut-server -n 50"
```
### 6.3. Icon-ul lipsește din system tray
1. Deschide **Settings → Personalization → Taskbar**
2. Click pe **"Taskbar corner overflow"**
3. Activează **WinNUT**
### 6.4. Eroare "Connection refused"
**Pe pvemini, verifică:**
```bash
# Server ascultă pe IP-ul corect?
ss -tulpn | grep 3493
# Firewall permite trafic?
iptables -L INPUT -n | grep 3493
# Restart server
systemctl restart nut-server
```
## 7. Configurare Avansată
### 7.1. Monitorizare multiple UPS-uri
WinNUT poate monitoriza un singur UPS. Pentru multiple UPS-uri:
- Rulează multiple instanțe WinNUT (necesită build custom)
- Folosește alte tool-uri (NUT-Monitor, upsc via SSH)
### 7.2. Export date UPS
WinNUT nu are funcție de export built-in. Pentru logging:
**Opțiunea 1: PowerShell script**
```powershell
# Script simplu de logging UPS via SSH
while ($true) {
$status = ssh root@10.0.20.201 "upsc nutdev1 ups.status battery.charge input.voltage"
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
"$timestamp - $status" | Out-File -Append C:\UPS-Logs\ups-log.txt
Start-Sleep -Seconds 60
}
```
**Opțiunea 2: Monitoring tools**
- Prometheus + NUT Exporter
- Grafana + InfluxDB
- Zabbix
### 7.3. Notificări personalizate
Pentru notificări Windows când UPS trece pe baterie:
**PowerShell monitoring script:**
```powershell
# Rulează continuu, verifică status UPS
$lastStatus = "OL"
while ($true) {
try {
$currentStatus = ssh root@10.0.20.201 "upsc nutdev1 ups.status"
if ($currentStatus -match "OB" -and $lastStatus -eq "OL") {
# Notificare Windows
[System.Windows.Forms.MessageBox]::Show(
"UPS a trecut pe baterie!",
"ALERT UPS",
[System.Windows.Forms.MessageBoxButtons]::OK,
[System.Windows.Forms.MessageBoxIcon]::Warning
)
}
$lastStatus = $currentStatus
} catch {
Write-Host "Error: $_"
}
Start-Sleep -Seconds 10
}
```
## 8. Alternative la WinNUT
Dacă WinNUT nu funcționează satisfăcător:
### 8.1. NUT-Monitor (Java)
- Cross-platform (Windows, Linux, macOS)
- Interfață mai modernă
- Download: https://github.com/networkupstools/nut/wiki/NUT-Monitor
### 8.2. upsc via SSH
Folosește direct comanda `upsc` prin SSH:
```powershell
# PowerShell - Status UPS
ssh root@10.0.20.201 "upsc nutdev1"
# Doar câmpuri specifice
ssh root@10.0.20.201 "upsc nutdev1 ups.status battery.charge input.voltage"
# Monitoring continuu
while ($true) {
Clear-Host
ssh root@10.0.20.201 "upsc nutdev1 ups.status battery.charge input.voltage"
Start-Sleep -Seconds 5
}
```
### 8.3. Web UI pe server
Instalează web UI pe pvemini:
```bash
# Instalare NUT CGI scripts
apt install -y nut-cgi apache2
# Configurare
# Accesează: http://10.0.20.201/cgi-bin/nut/upsstats.cgi
```
## 9. Pornire Automată WinNUT
### 9.1. Via Task Scheduler
1. Deschide **Task Scheduler**
2. Create Task:
- **General:**
- Name: WinNUT Auto Start
- Run whether user is logged on or not
- **Triggers:**
- At startup
- **Actions:**
- Start a program: `C:\Program Files\WinNUT\WinNUT.exe`
- **Conditions:**
- Start only if network available
### 9.2. Via Startup Folder
1. `Win + R` → `shell:startup`
2. Crează shortcut către `WinNUT.exe`
## 10. Documentație și Suport
- **WinNUT GitHub:** https://github.com/gawindx/WinNUT-V2
- **NUT Documentation:** https://networkupstools.org/
- **Issues:** Raportează probleme pe GitHub Issues
## Rezumat Configurare Rapidă
```
NUT host: 10.0.20.201
NUT Port: 3493
UPS Name: nutdev1
Polling Interval: 15
Login: admin
Password: parola99
Re-establish conn: ✓ Checked
```
**Click OK → Așteaptă 10-20 secunde → Vezi date UPS!**

View File

@@ -0,0 +1,470 @@
# Test Lunar Automat Baterie UPS
## Despre
Script automat pentru testarea lunară a bateriei UPS care rulează pe data de 1 a fiecărei luni la ora 00:00. Testul verifică capacitatea reală a bateriei prin comutare pe baterie și monitorizare descărcare/recuperare.
## Funcționalitate
### Ce face scriptul:
1. **Verificare status UPS** înainte de test
- Battery charge, voltage
- Input/output voltage
- Load %
- Verifică că UPS este Online
2. **Rulare test baterie automat**
- Comandă: `upscmd nutdev1 test.battery.start.quick`
- UPS comută pe baterie pentru ~10 secunde
- Descarcă efectiv bateria pentru testare reală
3. **Monitorizare în timp real** (30 secunde)
- Status UPS
- Battery charge %
- Battery voltage
- Detectare anomalii
4. **Analiză rezultate**
- Calculează scăderea încărcării (%)
- Calculează scăderea tensiunii (V)
- Evaluează sănătatea bateriei
5. **Monitorizare recuperare** (5 minute)
- Urmărește reîncărcarea bateriei
- Calculează rata de recuperare
- Oprește când bateria > 95%
6. **Generare rapoarte**
- Raport HTML detaliat cu grafice
- Raport text pentru email
- Log detaliat în `/var/log/ups-monthly-test.log`
7. **Notificare email**
- Trimite raport prin sistemul de notificări Proxmox
- Include sănătatea bateriei în subject
- Rapoarte salvate în `/tmp/ups-test-YYYYMM/`
## Evaluare Sănătate Baterie
Scriptul evaluează sănătatea bateriei bazat pe scăderea încărcării în timpul testului:
| Scădere Încărcare | Sănătate | Status | Acțiune Necesară |
|-------------------|----------|--------|------------------|
| < 10% | **EXCELLENT** | Verde | Nicio acțiune necesară |
| 10-30% | **GOOD** | Verde | Continuă monitorizarea |
| 30-50% | **FAIR** | Galben | Planifică înlocuire în 3-6 luni |
| > 50% | **POOR** | 🔴 Roșu | **URGENT: Înlocuiește bateria!** |
### Exemple de rezultate reale:
**Test 1 (2025-10-06 20:45):**
- Scădere încărcare: 0% (charge reporting delay)
- Scădere tensiune: 1.64V (27.88V → 26.24V)
- Evaluare: **EXCELLENT**
- Recuperare: 30 secunde la 100%
**Notă:** UPS-ul raportează uneori încărcarea cu întârziere. Scăderea tensiunii este un indicator mai precis al capacității bateriei.
## Instalare
### 1. Copiere script pe server
```bash
scp scripts/ups-monthly-test.sh root@10.0.20.201:/opt/scripts/
ssh root@10.0.20.201 "chmod +x /opt/scripts/ups-monthly-test.sh"
```
### 2. Configurare cron
Script-ul se adaugă automat în cron la instalare, dar poți verifica:
```bash
ssh root@10.0.20.201 "crontab -l | grep ups-monthly-test"
```
Ar trebui să vezi:
```
# UPS Monthly Battery Test - Rulează pe 1 ale lunii la 00:00
0 0 1 * * /opt/scripts/ups-monthly-test.sh
```
### 3. Test manual (recomandat înainte de prima rulare lunară)
```bash
ssh root@10.0.20.201 "/opt/scripts/ups-monthly-test.sh"
```
**ATENȚIE:** Testul va comuta UPS-ul pe baterie pentru ~10 secunde!
## Configurare
### Parametri editabili în script:
```bash
UPS_NAME="nutdev1" # Numele UPS-ului din NUT
UPS_USER="admin" # Username pentru comenzi NUT
UPS_PASS="parola99" # Parola pentru comenzi NUT
MAIL_TO="root@pam" # Destinatar email rapoarte
```
### Personalizare cron:
Pentru a schimba data/ora de rulare, editează cron:
```bash
ssh root@10.0.20.201
crontab -e
```
Exemple:
```bash
# Rulează pe 1 ale lunii la 02:00 (noapte)
0 2 1 * * /opt/scripts/ups-monthly-test.sh
# Rulează în fiecare Duminică la 00:00 (săptămânal)
0 0 * * 0 /opt/scripts/ups-monthly-test.sh
# Rulează pe 15 ale lunii la 00:00 (mijloc de lună)
0 0 15 * * /opt/scripts/ups-monthly-test.sh
```
## Rapoarte Generate
### 1. Raport HTML
**Locație:** `/tmp/ups-test-YYYYMM/ups-test-report.html`
Conține:
- Header cu data, UPS, nod
- Status sănătate baterie (color-coded)
- Metrici în grid layout:
- Încărcare înainte/după
- Tensiune înainte/după
- Scădere încărcare
- Recuperare în 5 min
- Tabel detalii tehnice
- Recomandări bazate pe sănătate
- Footer cu timestamp și paths
### 2. Raport Text
**Locație:** `/tmp/ups-test-YYYYMM/ups-test-report.txt`
Versiune text simplă pentru email.
### 3. Log Detaliat
**Locație:** `/var/log/ups-monthly-test.log`
Log complet cu toate măsurătorile:
- Timestamp pentru fiecare pas
- Status UPS în timp real
- Toate valorile măsurate
- Erori sau warnings
**Păstrare:** Log-ul este append-only, conține istoric complet al tuturor testelor.
## Logs și Monitorizare
### Vizualizare log în timp real:
```bash
ssh root@10.0.20.201 "tail -f /var/log/ups-monthly-test.log"
```
### Verificare ultimul test:
```bash
ssh root@10.0.20.201 "tail -50 /var/log/ups-monthly-test.log"
```
### Căutare teste anterioare:
```bash
# Caută toate testele din 2025
ssh root@10.0.20.201 "grep 'UPS MONTHLY BATTERY TEST - START' /var/log/ups-monthly-test.log | grep 2025"
# Vezi rezultatul ultimului test
ssh root@10.0.20.201 "grep 'Sănătate baterie:' /var/log/ups-monthly-test.log | tail -1"
```
### Verificare cron execution:
```bash
# Verifică că cron a rulat scriptul
ssh root@10.0.20.201 "grep ups-monthly-test /var/log/syslog"
```
## Email Notifications
### Configurare sistem de mail
Scriptul încearcă să trimită email prin:
1. **mail command** (recomandat)
2. **logger** (fallback - doar în syslog)
#### Instalare mail command (dacă nu există):
```bash
ssh root@10.0.20.201 "apt update && apt install -y mailutils"
```
#### Configurare SMTP pentru Proxmox:
Editează `/etc/postfix/main.cf`:
```bash
relayhost = smtp.gmail.com:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = encrypt
```
Creează `/etc/postfix/sasl_passwd`:
```
smtp.gmail.com:587 your-email@gmail.com:your-app-password
```
Apoi:
```bash
postmap /etc/postfix/sasl_passwd
chmod 600 /etc/postfix/sasl_passwd*
systemctl restart postfix
```
#### Test email:
```bash
echo "Test email from UPS monitoring" | mail -s "Test" root@pam
```
### Verificare email trimis:
```bash
# Verifică mail queue
ssh root@10.0.20.201 "mailq"
# Verifică mail logs
ssh root@10.0.20.201 "grep 'UPS' /var/log/mail.log"
```
## Troubleshooting
### Testul nu pornește
**Verificare:**
```bash
# UPS online?
upsc nutdev1 ups.status
# Comenzi disponibile?
upscmd -l nutdev1 | grep battery
# Autentificare corectă?
upscmd -u admin -p parola99 nutdev1 test.battery.start.quick
```
### Bateria nu se descarcă în test
**Cauze posibile:**
- UPS-ul nu suportă test real (unele modele low-end)
- Test prea scurt pentru a fi detectat
- Baterie foarte sănătoasă (scădere < 1%)
**Verificare:**
```bash
# Monitorizează tensiune în loc de charge
watch -n 1 'upsc nutdev1 battery.voltage'
# Apoi rulează test manual și observă scăderea
upscmd -u admin -p parola99 nutdev1 test.battery.start.quick
```
### Email nu ajunge
**Verificări:**
```bash
# Mail command instalat?
which mail
# Postfix rulează?
systemctl status postfix
# Verifică logs
tail -50 /var/log/mail.log
# Test manual
echo "Test" | mail -s "Test Subject" root@pam
```
### Script blochează sau timeout
**Cauze:**
- Testul baterie durează prea mult
- UPS nu răspunde
- Probleme rețea
**Soluție:**
Editează scriptul și reduce timeout-urile:
```bash
# Reduce monitorizare de la 15 la 5 iterații
for i in {1..5}; do
```
## Întreținere
### Lunar (După Rulare Automată)
```bash
# Verifică că testul a rulat
ssh root@10.0.20.201 "tail -100 /var/log/ups-monthly-test.log | grep 'COMPLETE'"
# Vezi rezultatul
ssh root@10.0.20.201 "grep 'Sănătate baterie' /var/log/ups-monthly-test.log | tail -1"
# Verifică raportul HTML
ssh root@10.0.20.201 "ls -lh /tmp/ups-test-*/ups-test-report.html"
```
### Anual
```bash
# Cleanup rapoarte vechi (> 12 luni)
ssh root@10.0.20.201 "find /tmp/ups-test-* -type d -mtime +365 -exec rm -rf {} +"
# Rotare log dacă devine prea mare (> 100MB)
ssh root@10.0.20.201 "
if [ \$(stat -f%z /var/log/ups-monthly-test.log) -gt 104857600 ]; then
mv /var/log/ups-monthly-test.log /var/log/ups-monthly-test.log.old
gzip /var/log/ups-monthly-test.log.old
fi
"
```
### La Înlocuire Baterie
După înlocuirea bateriei UPS:
```bash
# Rulează test manual pentru baseline
ssh root@10.0.20.201 "/opt/scripts/ups-monthly-test.sh"
# Verifică că rezultatul este EXCELLENT
ssh root@10.0.20.201 "tail -20 /var/log/ups-monthly-test.log"
# Notează data înlocuirii în log
ssh root@10.0.20.201 "echo '[$(date)] Baterie UPS înlocuită - baseline test executat' >> /var/log/ups-monthly-test.log"
```
## Interpretare Rezultate
### Exemplu rezultat bun:
```
Sănătate baterie: EXCELLENT
Scădere încărcare: 5%
Scădere tensiune: 1.64V
Recuperare: 5% în 30 secunde
```
**Interpretare:** Baterie în stare excelentă, poate susține sarcina, se reîncarcă rapid.
### Exemplu rezultat acceptabil:
```
Sănătate baterie: FAIR
Scădere încărcare: 35%
Scădere tensiune: 4.2V
Recuperare: 15% în 120 secunde
```
**Interpretare:** Baterie uzată, planifică înlocuire în 3-6 luni.
### Exemplu rezultat critic:
```
Sănătate baterie: POOR
Scădere încărcare: 65%
Scădere tensiune: 8.5V
Recuperare: 25% în 300 secunde
```
**Interpretare:** **URGENT!** Baterie critică, înlocuiește imediat! Risc mare de shutdown neplanificat.
## Recomandări Baterie
### Când să înlocuiești bateria:
| Indicator | Bun | Acceptabil | Critic |
|-----------|-----|------------|--------|
| **Vârstă baterie** | < 2 ani | 2-4 ani | > 4 ani |
| **Scădere încărcare** | < 10% | 10-50% | > 50% |
| **Scădere tensiune** | < 2V | 2-5V | > 5V |
| **Timp recuperare** | < 1 min | 1-5 min | > 5 min |
| **Teste failed** | 0 | 1-2 | > 3 |
### Factori care afectează durata de viață:
- **Temperatură:** Ideal 20-25°C (fiecare +10°C reduce durata cu 50%)
- **Cicluri descărcare:** < 20 cicluri/an = bun
- **Profunzime descărcare:** Descărcări până la 50% = OK, sub 20% = deteriorare
- **Calitate baterie:** Baterii branded (APC, Eaton) vs. generice
## Automatizare Avansată
### Alertare automată când bateria devine POOR:
Adaugă în script (după evaluarea sănătății):
```bash
if [ "$BATTERY_HEALTH" == "POOR" ]; then
# Trimite alert urgent
echo "URGENT: Bateria UPS necesită înlocuire!" | \
mail -s "🔴 ALERT UPS: Baterie CRITICĂ!" admin@company.com
# Notificare SMS (dacă ai configurat)
curl -X POST "https://api.service.com/sms" \
-d "to=+40xxxxxxxxx&message=ALERT: Baterie UPS critica!"
fi
```
### Integrare cu Prometheus/Grafana:
Exportă metrici pentru monitorizare long-term:
```bash
# La final de script, exportă metrici
cat >> /var/lib/node_exporter/textfile_collector/ups_battery.prom << EOF
# HELP ups_battery_health Battery health score (0-100)
# TYPE ups_battery_health gauge
ups_battery_health{ups="nutdev1"} $(( 100 - CHARGE_DROP ))
# HELP ups_battery_charge_drop Battery charge drop during test
# TYPE ups_battery_charge_drop gauge
ups_battery_charge_drop{ups="nutdev1"} $CHARGE_DROP
# HELP ups_battery_test_timestamp Last battery test timestamp
# TYPE ups_battery_test_timestamp gauge
ups_battery_test_timestamp{ups="nutdev1"} $(date +%s)
EOF
```
## Referințe
- **NUT Commands:** https://networkupstools.org/docs/user-manual.chunked/ar01s07.html
- **Battery Testing Best Practices:** https://www.apc.com/us/en/faqs/FAQ000267818/
- **Proxmox Notifications:** https://pve.proxmox.com/wiki/Notifications
## Istoric Versiuni
- **v1.0** (2025-10-06)
- Release inițial
- Test automat baterie cu `test.battery.start.quick`
- Rapoarte HTML și text
- Email notifications
- Cron lunar (1 ale lunii)
- Evaluare sănătate baterie (4 nivele)
- Monitorizare recuperare 5 minute
---
**Autor:** Claude Code
**Ultima actualizare:** 2025-10-06

View File

@@ -0,0 +1,237 @@
# 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:** Așteaptă 180 secunde (3 minute) înainte de shutdown
- **LOWBATT:** Shutdown imediat
- **ONLINE:** Anulează toate timer-ele
### 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. Oprește toate VM-urile de pe toate nodurile (paralel)
3. Așteaptă 90 secunde
4. Shutdown pve1 și pve2 (secundare)
5. Așteaptă 30 secunde
6. Shutdown pvemini (primary - ultimul)
Logare: `/var/log/ups-shutdown.log`
#### 2. /usr/local/bin/ups-shutdown-test.sh
**Script de test (DRY RUN) - NU oprește nimic**
Folosește-l pentru a testa:
```bash
/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**
Apelat automat de upssched când:
- UPS pe baterie 3 minute → lansează shutdown orchestrat
- Baterie scăzută → shutdown imediat
- Pierdere comunicație → doar logging
Logare: `/var/log/ups-events.log`
## Testare și Verificare
### Verificare Status UPS
```bash
# Status general
upsc nutdev1
# Doar status
upsc nutdev1 ups.status
# Baterie
upsc nutdev1 battery.charge
# Tensiuni
upsc nutdev1 input.voltage output.voltage
```
### Verificare Servicii
```bash
systemctl status nut-server
systemctl status nut-monitor
journalctl -u nut-server -f
journalctl -u nut-monitor -f
```
### Test Manual Shutdown (DRY RUN)
```bash
/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!**
```bash
# 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. Timer de 180 secunde pornește
3. Curent revine → Timer anulat
4. **Rezultat:** Niciun sistem nu se oprește
### Scenario 2: Întrerupere Lungă (> 3 minute)
1. Curent se întrerupe → UPS trece pe baterie
2. Timer 180 secunde expiră
3. Scriptu de shutdown pornește:
- VM-uri se opresc pe toate nodurile
- După 90s: pve1, pve2 se opresc
- După încă 30s: pvemini se oprește
4. **Rezultat:** Shutdown orchestrat complet
### Scenario 3: Baterie Scăzută Imediată
1. UPS raportează LOWBATT
2. Shutdown **IMEDIAT** (fără timer)
3. Același flux de shutdown orchestrat
4. **Rezultat:** Shutdown rapid pentru protecție
## Loguri și Troubleshooting
### Fișiere de Log
```bash
/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
```bash
# 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ă
```bash
# 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: 2025-10-06