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:
435
proxmox/ups/docs/INSTALARE-NUT.md
Normal file
435
proxmox/ups/docs/INSTALARE-NUT.md
Normal 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
|
||||
Reference in New Issue
Block a user