Files
ROMFASTSQL/proxmox/ups/docs/UPS-MONTHLY-TEST.md
Marius 87b9709a0d 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>
2025-10-06 21:39:46 +03:00

471 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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