From 1203c24d6320f9c252e04adbb885a1c7ff90f8a4 Mon Sep 17 00:00:00 2001 From: Claude Agent Date: Mon, 20 Apr 2026 11:30:46 +0000 Subject: [PATCH] docs(proxmox): document HA, corosync tuning, diagnostic tools and mail relay Following the 2026-04-20 cluster outage, the cluster README now covers HA resource limits, corosync token tuning (10s tolerance for USB glitches), rasdaemon/netconsole/kdump diagnostic stack on pvemini, mail relay via mail.romfast.ro with SMTP auth, OOM alerting via cron, and swap on pveelite. VM 109 README now clearly states it was removed from HA and is only started by the weekly DR test script. Co-Authored-By: Claude Opus 4.7 (1M context) --- proxmox/README.md | 4 +- proxmox/cluster/README.md | 205 ++++++++++++++++++++++++++++- proxmox/vm109-windows-dr/README.md | 20 +++ 3 files changed, 227 insertions(+), 2 deletions(-) diff --git a/proxmox/README.md b/proxmox/README.md index 8ba970a..2e5a41d 100644 --- a/proxmox/README.md +++ b/proxmox/README.md @@ -7,8 +7,10 @@ proxmox/ ├── README.md # Acest fișier (index principal) │ ├── cluster/ # Infrastructură cluster Proxmox -│ ├── README.md # Ghid SSH și administrare cluster +│ ├── README.md # Ghid SSH, HA, corosync tuning, diagnostic tools, mail relay, OOM alert │ ├── cluster-ha-monitor.sh # Script monitorizare HA +│ ├── incidents/ # Post-mortems incidente cluster +│ │ └── 2026-04-20-cluster-outage.md # Cascadă OOM pveelite + USB LAN watchdog │ └── ups/ # Sistem UPS pentru cluster │ ├── README.md │ ├── docs/ diff --git a/proxmox/cluster/README.md b/proxmox/cluster/README.md index 7210cac..410806a 100644 --- a/proxmox/cluster/README.md +++ b/proxmox/cluster/README.md @@ -483,11 +483,213 @@ systemctl restart pveproxy --- +## High Availability (HA) + +Cluster-ul folosește HA pentru failover automat al containerelor critice. Configurația a fost revizuită după incidentul 2026-04-20 (vezi `incidents/2026-04-20-cluster-outage.md`). + +### Grupuri HA + +``` +group: ha-group-main → pvemini (primar 100), pveelite (50), pve1 (33) +group: ha-group-elite → pveelite (primar 100), pve1 (33), pvemini (50) +``` + +### Resurse HA active + +| Resursă | Grup | Home node | Max restart | Max relocate | Notă | +|---------|------|-----------|-------------|--------------|------| +| ct:100 portainer | ha-group-main | pvemini | 3 | 3 | | +| ct:101 minecraft | ha-group-elite | pvemini | 3 | 3 | Rulează pe pveelite | +| ct:104 flowise | ha-group-main | pvemini | 3 | 2 | Limite adăugate 2026-04-20 | +| ct:105 test | ha-group-elite | pvemini | - | - | Stopped | +| ct:106 gitea | ha-group-main | pvemini | 3 | 3 | | +| ct:108 central-oracle | ha-group-main | pvemini | 3 | 2 | Limite adăugate 2026-04-20 | + +**VM 109 (oracle-dr-windows) NU mai e în HA** — scos intenționat 2026-04-20 după buclă OOM. Pornit exclusiv de scriptul DR test sâmbăta 06:00. + +### Verificare HA + +```bash +ssh root@10.0.20.201 "ha-manager status" +ssh root@10.0.20.201 "ha-manager config" +``` + +### Modificare limite HA (exemplu) + +```bash +ha-manager set ct:108 --max_restart 3 --max_relocate 2 +``` + +--- + +## Corosync Tuning + +După incidentul 2026-04-20 (crash pveelite din USB LAN disconnect → pierdere cvorum → watchdog reset), tokenul corosync a fost mărit pentru a tolera glitch-uri scurte de rețea. + +**Config curent** (`/etc/pve/corosync.conf`, `config_version: 16`): + +``` +totem { + token: 10000 + token_retransmits_before_loss_const: 10 +} +``` + +Impact: cluster-ul așteaptă **10 secunde** înainte să declare un nod mort (default era 1 sec). Tolerează USB disconnect scurt pe pveelite fără să forțeze reboot. + +Verificare: +```bash +ssh root@10.0.20.201 "corosync-cmapctl | grep 'totem.token '" +# runtime.config.totem.token (u32) = 10650 +# totem.token (u32) = 10000 +``` + +--- + +## Diagnostic Tools (pvemini) + +Instalate 2026-04-20 pentru a prinde cauza crash-ului din 00:23 (care nu a lăsat niciun log). + +### rasdaemon — MCE + PCIe AER monitoring + +```bash +# Verificare erori hardware istorice +ssh root@10.0.20.201 "ras-mc-ctl --summary" +# Memory errors / PCIe AER errors / Extlog / MCE +``` + +### netconsole — kernel logs către pve1 + +pvemini trimite log-uri kernel via UDP către pve1. Dacă pvemini crashează hard, ultimele linii kernel sunt captate pe pve1. + +```bash +# Logs pre-crash pe pve1 +ssh root@10.0.20.200 "tail /var/log/netconsole-pvemini.log" + +# Status serviciu listener +ssh root@10.0.20.200 "systemctl status netconsole-receiver" +``` + +Config pe pvemini: `/etc/modules-load.d/netconsole.conf` +Config pe pve1: `/etc/systemd/system/netconsole-receiver.service` + `/var/log/netconsole-pvemini.log` + +### kdump-tools — captură kernel crash dump + +```bash +# Verificare configurare +ssh root@10.0.20.201 "cat /proc/cmdline | grep crashkernel" +ssh root@10.0.20.201 "systemctl is-active kdump-tools" + +# La următorul crash, dump-ul va fi în: +ssh root@10.0.20.201 "ls /var/crash/" +``` + +Parametru: `crashkernel=128M` în `/etc/kernel/cmdline` (Proxmox folosește systemd-boot prin `proxmox-boot-tool`, nu GRUB). + +### kernel.panic auto-reboot + +```bash +ssh root@10.0.20.201 "sysctl kernel.panic" +# kernel.panic = 10 → auto-reboot după 10s la kernel panic +``` + +--- + +## Mail Notifications + +Toate 3 nodurile trimit mail prin `mail.romfast.ro:465` cu autentificare SMTP SASL (cont `ups@romfast.ro`). + +### Configurare Postfix + +Config în `/etc/postfix/main.cf` pe fiecare nod: +``` +relayhost = [mail.romfast.ro]:465 +smtp_sasl_auth_enable = yes +smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd +smtp_sasl_security_options = noanonymous +smtp_tls_wrappermode = yes +smtp_tls_security_level = encrypt +``` + +Credentiale în `/etc/postfix/sasl_passwd` (permisiuni 600). + +### Test rapid + +```bash +ssh root@10.0.20.201 "echo 'test' | mail -r 'ups@romfast.ro' -s 'test $(hostname)' mmarius28@gmail.com" +ssh root@10.0.20.201 "journalctl -u postfix@- --since '1 min ago' | grep status=" +# Trebuie să vezi: status=sent (250 OK ...) +``` + +### Dependințe + +- `libsasl2-modules` (instalat 2026-04-20 — fără el: `SASL authentication failure: No worthy mechs found`) + +--- + +## OOM Alerting + +Cron pe fiecare nod verifică la 1 minut dacă au avut loc OOM-kills. Dacă da, trimite mail cu detalii. + +### Configurare + +- Script: `/opt/scripts/oom-alert.sh` pe fiecare nod (pve1, pvemini, pveelite) +- Cron: `* * * * * /opt/scripts/oom-alert.sh` +- Mail destinat: `mmarius28@gmail.com` (de la `ups@romfast.ro`) + +### Verificare script instalat + +```bash +for ip in 10.0.20.200 10.0.20.201 10.0.20.202; do + ssh root@$ip "crontab -l | grep oom-alert" +done +``` + +### Test simulare + +```bash +# Generează OOM kill mesaj fals (NU omoară nimic, doar log) +ssh root@10.0.20.202 "logger -t kernel -p kern.warn 'Killed process 99999 (fake-test) total-vm:1kB'" +# Așteaptă 1 min, verifică inbox +``` + +--- + +## Swap pe pveelite + +Adăugat 2026-04-20 ca insurance împotriva OOM cascade (pveelite are doar 16 GB RAM). + +- Swap device: `/dev/zvol/rpool/swap` (ZFS zvol 8 GB) +- Mount: `/etc/fstab` +- swappiness: 10 (folosește swap doar sub presiune reală) + +### Verificare + +```bash +ssh root@10.0.20.202 "swapon --show; sysctl vm.swappiness" +``` + +### Recreare (dacă e nevoie) + +```bash +zfs create -V 8G -b 4K -o compression=zle -o logbias=throughput \ + -o sync=always -o primarycache=metadata -o secondarycache=none \ + rpool/swap +mkswap -f /dev/zvol/rpool/swap +echo '/dev/zvol/rpool/swap none swap sw 0 0' >> /etc/fstab +swapon -a +``` + +--- + ## Documentație Asociată ### Index Principal - **README.md** - `../README.md` - Index complet documentație Proxmox +### Incidents +- **2026-04-20 Cluster Outage:** `incidents/2026-04-20-cluster-outage.md` — post-mortem complet + plan prevenție + ### LXC Containers - **LXC 108 - Oracle Database:** `../lxc108-oracle/README.md` @@ -495,6 +697,7 @@ systemctl restart pveproxy - **VM 201 - Windows 11:** `../vm201-windows/README.md` - SSL Certificates: `../vm201-windows/docs/vm201-certificat-letsencrypt-iis.md` - Troubleshooting: `../vm201-windows/docs/` +- **VM 109 - Oracle DR Windows:** `../vm109-windows-dr/README.md` — NU mai e în HA din 2026-04-20 ### Cluster Resources (acest director) - **HA Monitor:** `cluster-ha-monitor.sh` @@ -502,6 +705,6 @@ systemctl restart pveproxy --- -**Ultima actualizare:** 2026-01-27 +**Ultima actualizare:** 2026-04-20 **Autor:** Marius Mutu **Proiect:** ROMFASTSQL - Proxmox Infrastructure Documentation \ No newline at end of file diff --git a/proxmox/vm109-windows-dr/README.md b/proxmox/vm109-windows-dr/README.md index 8825796..7d1160b 100644 --- a/proxmox/vm109-windows-dr/README.md +++ b/proxmox/vm109-windows-dr/README.md @@ -4,6 +4,26 @@ **VMID:** 109 **Rol:** Disaster Recovery pentru Oracle Database (backup RMAN de pe server Windows extern) +## ⚠️ Important — VM 109 NU este în HA (din 2026-04-20) + +După incidentul 2026-04-20 (vezi `../cluster/incidents/2026-04-20-cluster-outage.md`), VM 109 a fost scos din HA cu `ha-manager remove vm:109`. Motivele: + +- VM 109 este un DR test VM, nu un serviciu live +- Scriptul DR test de sâmbătă (`scripts/weekly-dr-test-proxmox.sh`) pornește/oprește VM 109 manual cu `qm start/stop` +- Cu HA activ, un bug `set -e` în script a lăsat VM 109 pornit 2.5 zile, apoi la crashul pvemini HA a relocat VM 109 pe pveelite (16 GB) → OOM cascade + +**Efecte:** +- VM 109 NU mai e repornit automat la crash node +- VM 109 NU se mai mută de pe pvemini +- VM 109 pornește DOAR la invocarea scriptului DR sau manual cu `qm start 109` +- Scriptul DR are acum `trap cleanup_vm EXIT` care garantează `qm stop 109` la orice ieșire + +**Verificare status:** +```bash +ssh root@10.0.20.201 "qm status 109" # trebuie stopped +ssh root@10.0.20.201 "ha-manager status | grep 109 || echo 'nu e în HA'" +``` + --- # 🛡️ Oracle DR System - Complete Architecture