Lantul de pornire nou: JuiceSSH -> 10.0.20.36 -> C:\wolcluster.bat. Cheia moltbot in docs/chei-publice. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KddsXCqEbKMhdFJDYbAsx8
21 KiB
Oprire planificată a clusterului (lucrări la rețeaua electrică)
Procedura de oprire controlată a tuturor celor 3 noduri Proxmox fără ca HA să relocheze resursele și fără ca watchdog-ul să reseteze hard vreun nod.
Se aplică oricărei opriri planificate a întregului cluster: lucrări electrice, mutare rack, mentenanță UPS, intervenții la switch.
Autor: Claude Code · Ultima verificare pe cluster live: 2026-08-29
Varianta cea mai rapidă — din dashboard sau Discord /infra
De preferat variantei de mai jos (stație de admin), pentru o oprire/pornire
simplă, fără lucrări la insula 10.10.10.0/24 sau la switch:
- Oprire: tab Infrastructură → Oprește (sau Discord
/infra actiune:oprire, confirmare). Ruleazăcluster-shutdown.sh --allow-on-node --yespe pvemini, lansat detașat prinsystemd-run(vezi dashboard/README.md § Tab Infrastructură). CT 171 (claude-agent) rămâne pornit — moare odată cu pvemini la poweroff, iarha: shutdown_policy=freezeîl repornește la revenirea nodului. La final se postează (și se încearcă fixarea) în Discord un mesaj cu instrucțiunile de pornire de mai jos + un email cătremmarius28@gmail.com. - Pornire, când revine curentul:
- JuiceSSH (prin Tailscale) →
10.0.20.36:22122→ ruleazăC:\wolcluster.bat(vezi docs/acces-agenti-windows-birou-server36.md pentru accesul pe .36 și alias-ul sshoracle-prod-adminfolosit și de acțiuneawoldin dashboard). - Așteaptă mesajul „Cluster sus" în Discord (postat automat de
infra_boot_checkcând clusterul are iar cvorum, dar crontab-ul e încă în mentenanță). - Apasă Pornește guest-urile (buton pe mesajul din Discord, sau tab
Infrastructură → Pornește) — rulează
cluster-startup.sh --allow-on-node --yespe pvemini.
- JuiceSSH (prin Tailscale) →
- Dacă CT 171 nu revine (dashboard/bot nu mai răspund după poweroff):
ssh root@10.0.20.201 /opt/scripts/cluster-startup.sh --allow-on-node --yes - Fallback dacă WoL nu merge:
wolmarius.bat(de pe .36) trezește stația de birou, apoiwake-cluster.ps1de acolo.
cluster-shutdown.sh/cluster-startup.sh au acum flag-ul --allow-on-node,
care le permite să ruleze pe un nod (pvemini) în loc de pe stația de admin —
guard-ul care le blochează pe un nod Proxmox e condiționat de acest flag; CT
171 rămâne exclus din lista de oprire explicită (KEEP_RUNNING=171) și din
verificările de la pasul 7/8. Restul procedurii (varianta de pe stația de
admin, PowerShell/Bash, fără --allow-on-node) rămâne valabilă neschimbată —
vezi mai jos.
tmux e acum instalat pe toate cele 3 noduri, pentru rulări manuale lungi din
consolă (nu e folosit de --allow-on-node, care lansează prin systemd-run).
Atenție, s-a schimbat ceva important pe 2026-08-29. Clusterul are acum o rețea dedicată,
10.10.10.0/24(„insula"), pe un switch separat — vezi switch 2.5G dedicat nodurilor. De ea atârnă toată replicarea ZFS (migration: network=10.10.10.0/24îndatacenter.cfg) și storage-ul NFSbackup-pvemini-nfs(server10.10.10.201). Pe pve1 și pveelite IP-ul de insulă stă pe dongle-ul USB, deci la revenire trebuie verificat că a urcat — vezi Repornirea, pasul 3.
Varianta automată
Toată procedura de mai jos e implementată în două scripturi, de rulat de pe stația de admin (nu de pe un nod). Există în două variante echivalente — folosește-o pe cea potrivită shell-ului tău.
PowerShell (Windows, varianta obișnuită aici):
cd E:\proiecte\ROMFASTSQL\proxmox\cluster\scripts
.\cluster-shutdown.ps1 -DryRun # arată exact ce ar face, nu atinge nimic
.\cluster-shutdown.ps1 # oprire completă, cu confirmări
# ... după revenirea curentului ...
.\wake-cluster.ps1 # trezește nodurile prin Wake-on-LAN
.\cluster-startup.ps1 # repornire completă
Wake-on-LAN merge pe toate trei nodurile — verificat pe 2026-08-29, trezire în ~15 secunde.
E posibil abia de la mutarea lui vmbr0 pe interfețele onboard: dongle-urile USB nu suportă WoL
și pierd alimentarea la oprire. Dacă lucrarea e la rețeaua electrică și nodurile sunt oprite
de tine, wake-cluster.ps1 te scutește de drumul până la ele. Stația de admin trebuie să fie
pe același segment L2 (10.0.20.0/24) — magic packet-ul e broadcast, nu trece prin router.
Cere doar clientul OpenSSH din Windows (C:\Windows\System32\OpenSSH\ssh.exe),
deja prezent, și cheia SSH pentru root pe noduri. Testate pe PowerShell 5.1.
Dacă politica de execuție blochează scriptul:
powershell -ExecutionPolicy Bypass -File .\cluster-shutdown.ps1 -DryRun
Bash (Git Bash, WSL sau de pe CT 171 claude-agent):
cd proxmox/cluster/scripts
./cluster-shutdown.sh --dry-run
./cluster-shutdown.sh
./cluster-startup.sh
Cele două variante scriu același fișier de stare, deci poți opri cu una și porni cu cealaltă.
cluster-shutdown.sh salvează local ce guest-uri rulau, iar cluster-startup.sh
pornește exact ce era pornit — nu repornește VM-uri oprite intenționat.
Rulează întâi cu --dry-run. Restul documentului explică de ce fiecare pas e
necesar și cum se face manual din GUI, dacă preferi.
TL;DR (procedura manuală)
- Shutdown Policy =
Freeze← fără asta, HA mută resursele. Din 2026-08-29 e deja setat permanent — doar verifică (Pas 0), nu adăuga o linie nouă îndatacenter.cfg - Dezactivează cron-urile de alertă (
pvemini-down-alert,vm109-watchdog,pveelite-down-alert,oom-alert) - Oprește guest-urile manual — Oracle CT 108 primul, cu
shutdown immediateîn DB ha-manager status→ toate serviciile trebuie să fiestopped- Oprește nodurile: pveelite → pve1 → pvemini
La revenire: pornești toate trei nodurile aproape simultan (altfel nu ai quorum),
apoi verifici că insula 10.10.10.0/24 a urcat pe pve1 și pveelite înainte de a
porni guest-urile.
De ce nu poți pur și simplu să apeși „Shutdown"
Capcana 1 — politica implicită de shutdown este conditional
Fără o linie ha: în /etc/pve/datacenter.cfg, PVE folosește default-ul
shutdown_policy=conditional:
| Acțiune pe nod | Comportament HA cu conditional |
|---|---|
| Reboot | freeze — serviciile rămân pe nod |
| Shutdown (poweroff) | failover — serviciile se relochează pe alt nod |
Adică exact ce vrei să eviți: un „Shutdown" pe pvemini trimite CT 108 Oracle, VM 201 și restul resurselor HA pe pve1/pveelite — pe noduri care oricum urmează să fie și ele oprite, cu 16 GB RAM pe pveelite și riscul din incidentul 2026-04-20.
Din 2026-08-29 capcana asta e deja dezamorsată permanent. Fișierul
/etc/pve/datacenter.cfgexistă și conțineha: shutdown_policy=freeze. Pasul 0 de mai jos e, în mod normal, doar o verificare. Nu presupune că fișierul lipsește — mai conține și liniamigration:, care nu trebuie pierdută.
Capcana 2 — watchdog-ul se auto-fence la pierderea quorumului
Cu 3 noduri, quorum = 2. Dacă oprești două noduri și al treilea încă are servicii HA active, LRM-ul pierde agent lock-ul și watchdog-ul face reset hard după ~60 s. Nu shutdown curat — reset brutal, peste Oracle pornit.
Soluția e la Pasul 3: cu toate resursele HA în state stopped, LRM-ul nu mai
are nimic activ, watchdog-ul nu mai e armat, iar pierderea quorumului devine
inofensivă.
Ce să NU faci
- ❌ Nu folosi node maintenance mode (
ha-manager crm-command node-maintenance enable <nod>) — acela migrează intenționat resursele, exact opusul scopului. - ❌ Nu opri două noduri și nu lăsa unul pornit cu servicii HA active — vezi capcana 2.
- ❌ Nu lăsa nodul să oprească el guest-urile — Oracle și Windows au nevoie de shutdown curat, nu de timeout.
Pas 0 — Shutdown Policy = Freeze
De obicei nu ai nimic de făcut aici — politica e freeze din 2026-08-29.
Verifică întâi:
ssh root@10.0.20.201 "cat /etc/pve/datacenter.cfg"
Așteptat (ambele linii):
ha: shutdown_policy=freeze
migration: network=10.10.10.0/24,type=insecure
Dacă shutdown_policy nu e freeze, nu adăuga o linie nouă cu >> —
fișierul are deja o linie ha:, iar a doua e o duplicare. Comanda corectă
înlocuiește linia existentă și lasă migration: neatinsă:
ssh root@10.0.20.201 "cp /etc/pve/datacenter.cfg /root/datacenter.cfg.backup-mentenanta && \
sed -i '/^ha:/d' /etc/pve/datacenter.cfg && \
printf 'ha: shutdown_policy=freeze\n' >> /etc/pve/datacenter.cfg && \
cat /etc/pve/datacenter.cfg"
GUI (echivalent): Datacenter → Options → HA Settings → Edit → Shutdown Policy: Freeze
Nu șterge linia
migration:. Fără ea replicarea ZFS se întoarce tăcut pe rețeaua de producție — merge, dar pe altă cale decât cea proiectată, iar traficul de replicare ajunge peste producție.
Freeze = la oprirea nodului serviciile HA sunt înghețate, nu relocate;
repornesc pe același nod când nodul revine.
Recomandare permanentă: lasă
freezeși după intervenție. Docul de failover descrie deja un incident în care VM 201 a migrat nedorit în timpul unei mentenanțe —freezee politica potrivită pentru acest cluster.
Pas 1 — dezactivează alertele automate
Altfel primești zeci de mailuri, iar vm109-watchdog.sh conține un qm start 109
care poate porni VM 109 fix când nu trebuie.
Ce trebuie dezactivat pe fiecare nod:
| Nod | Script | De ce |
|---|---|---|
| pveelite | pvemini-down-alert.sh |
mail la fiecare minut cât pvemini e jos |
| pveelite | vm109-watchdog.sh |
conține qm start 109 |
| pveelite | oom-alert.sh |
zgomot |
| pvemini | vm109-watchdog.sh |
rulează și aici, nu doar pe pveelite |
| pvemini | pveelite-down-alert.sh |
zgomot |
| pvemini | oom-alert.sh |
zgomot |
| pve1 | oom-alert.sh |
zgomot |
Comandă unică, rulată pe fiecare nod — face backup și comentează exact liniile astea, lăsând restul crontab-ului neatins:
for h in 10.0.20.200 10.0.20.201 10.0.20.202; do
ssh root@$h 'crontab -l > /root/crontab.backup-mentenanta.txt; \
crontab -l | sed -E "/^[^#]/ s%^(.*(oom-alert|pvemini-down-alert|pveelite-down-alert|vm109-watchdog)\.sh.*)$%#MENTENANTA \1%" | crontab -'
done
Restaurare după intervenție:
for h in 10.0.20.200 10.0.20.201 10.0.20.202; do
ssh root@$h 'crontab /root/crontab.backup-mentenanta.txt && crontab -l | grep -c MENTENANTA'
done # trebuie sa intoarca 0 pe fiecare nod
pvemini-down-alert.shdoar trimite mail cu comanda de failover, nu o execută singur — verificat în cod.vm109-watchdog.shînsă chiar pornește VM 109, și rulează pe ambele noduri (pvemini și pveelite).
⚠️ Dacă fereastra de lucrări prinde sâmbătă dimineața
weekly-dr-test-proxmox.sh rulează sâmbătă la 06:00, pe pvemini ȘI pe pveelite,
și pornește VM 109. Conform incidentului 2026-04-20,
scriptul are istoric de a lăsa VM 109 pornit după un eșec (bug set -e) — exact
declanșatorul buclei OOM de atunci.
Dacă intervenția atinge sâmbătă 06:00, comentează-l pe ambele noduri.
La fel vm109-patch-window.sh (zilele 1-7 ale lunii, ora 03:00) dacă fereastra
prinde începutul de lună.
Job-uri de backup
Verifică dacă fereastra de lucrări prinde un job vzdump. Dacă da, dezactivează-l
din Datacenter → Backup înainte:
| Job | Program |
|---|---|
backup-impare-oracle (CT 108) |
zile impare 02:00 |
backup-impare-rest (100, 103, 106, 171) |
zile impare 03:00 |
backup-pare-flowise (CT 104) |
zile pare 02:00 |
backup-pare-windows (VM 201) |
zile pare 03:30 |
backup-pve1-minecraft (CT 101) |
zile impare 22:00 |
backup-f1c87584 (VM 109) |
sâmbătă 15:00, prima săptămână |
Replicarea ZFS (pvesr) nu trebuie dezactivată — job-urile ratate se recuperează
singure la primul tick după revenire.
Pas 2 — oprește guest-urile manual
Ordinea corectă e cea de dependențe: consumatorii întâi, Oracle ULTIMUL. VM 201 (IIS) și CT 104 (flowise) folosesc baza din CT 108.
| # | Nod | Guest | În HA | Cum |
|---|---|---|---|---|
| 1 | pvemini | VM 303 Win11-Adina | Nu | Shutdown |
| 2 | pvemini | VM 304 Win11-Marius | Nu | Shutdown |
| 3 | pvemini | VM 302 oracle-test | Nu | Shutdown |
| 4 | pvemini | VM 201 roacentral | Da | Shutdown (guest agent) |
| 5 | pve1 | CT 101 minecraft | Da | Shutdown |
| 6 | pve1 | CT 110 moltbot | Da | Shutdown |
| 7 | pvemini | CT 104 flowise | Da | Shutdown |
| 8 | pvemini | CT 106 gitea | Da | Shutdown |
| 9 | pvemini | CT 103 dokploy | Da | Shutdown |
| 10 | pvemini | CT 102 docker.romfast.ro | Nu | Shutdown |
| 11 | pvemini | CT 100 portainer | Da | Shutdown |
| 12 | pvemini | CT 171 claude-agent | Da | Shutdown |
| 13 | pvemini | CT 108 central-oracle | Da | shutdown immediate în DB, apoi Shutdown CT |
pveelite nu are nimic pornit în mod normal (CT 301 e template, nepornibil; VM 109 e stopped).
Din CLI, folosește
ha-manager set <sid> --state stoppedpentru guest-urile din HA, nupct shutdown/qm shutdown. Din linia de comandă acestea nu actualizează state-ul HA, iar CRM-ul poate reporni guest-ul în mijlocul opririi. Din GUI nu e o problemă — butonul Shutdown trece oricum prin HA.
Oracle CT 108 — shutdown curat al bazei
ssh root@10.0.20.201 "pct exec 108 -- docker exec oracle-xe bash -lc \
\"printf 'shutdown immediate\nexit\n' | sqlplus -s / as sysdba\""
Abia după ce comanda întoarce Database closed / Database dismounted / ORACLE instance shut down, oprești containerul din GUI.
Restul
După ce Oracle e jos, poți folosi Bulk Actions → Bulk Shutdown pe fiecare nod.
Oprirea unui guest HA din GUI îi setează automat state-ul HA pe
stopped— CRM-ul nu îl va reporni. Consecință: la revenire trebuie să le pornești tu manual (pornirea îi pune state-ul înapoi pestarted).
Pas 3 — verificare obligatorie înainte de oprirea nodurilor
ssh root@10.0.20.201 "ha-manager status"
Toate liniile service ... trebuie să arate (nod, stopped).
Dacă vreuna arată started, migrate, relocate sau fence — oprește-te.
Nu opri niciun nod până nu se stabilizează, altfel intri fix în scenariul de la
capcana 2.
Verificare rapidă că nu a mai rămas nimic pornit:
for h in 10.0.20.200 10.0.20.201 10.0.20.202; do
echo "=== $h ==="
ssh root@$h "pct list; qm list"
done
Pas 4 — oprirea nodurilor
Ordine: pveelite (.202) → pve1 (.200) → pvemini (.201)
pvemini ultimul: e nodul principal și serverul NFS.
GUI: selectezi nodul în arbore → Shutdown (dreapta sus). Așteaptă ca nodul să nu mai răspundă la ping înainte de a-l opri pe următorul.
Repornirea
-
Pornește toate trei nodurile aproximativ simultan — fizic, sau cu
.\wake-cluster.ps1(Wake-on-LAN, verificat pe 2026-08-29). Un singur nod pornit nu are quorum →/etc/pverămâne read-only → nu poți porni niciun guest și nu poți modifica nimic în GUI. -
Așteaptă quorum complet:
ssh root@10.0.20.201 "pvecm status" # Quorate: Yes, Total votes: 3 ssh root@10.0.20.201 "ha-manager status" -
Verifică rețeaua de cluster
10.10.10.0/24— pasul cel mai ușor de uitat.Pe pve1 și pveelite IP-ul de insulă stă pe dongle-ul USB, adus la boot de un
auto enx...din/etc/network/interfaces. Dacă nucleul enumerează adaptorul USB după cenetworking.servicea terminat, interfața rămâne fără IP. Nodul pornește perfect normal pe producție — dar replicarea ZFS și storage-ul NFSbackup-pveminitac, fără nicio alertă.ssh root@10.0.20.200 "ip -br a | grep -E 'vmbr0|enx'" # 10.10.10.200 pe dongle ssh root@10.0.20.202 "ip -br a | grep -E 'vmbr0|enx'" # 10.10.10.202 pe dongle ssh root@10.0.20.201 "ip -br a | grep -E 'vmbr0|enp87s0'" # 10.10.10.201 pe enp87s0 ssh root@10.0.20.201 "ping -c1 -W2 10.10.10.200; ping -c1 -W2 10.10.10.202" ssh root@10.0.20.200 "findmnt -no SOURCE /mnt/pve/backup-pvemini" # 10.10.10.201:/mnt/backupDacă un IP lipsește, reparația e
ifreload -ape nodul respectiv:ssh root@10.0.20.202 "PATH=/usr/sbin:/sbin:/usr/bin:/bin ifreload -a"pvemini are interfața de insulă onboard (Intel
enp87s0) — el nu are problema asta.Testat pe 2026-08-29, la o oprire completă reală: insula a urcat singură pe toate trei nodurile. Ipoteza enumerării târzii nu s-a materializat. Pe pve1 s-a declanșat în plus și regula udev
usb-lan-hotplug@la boot, care oricum ar fi reparat-o. Verificarea rămâne totuși în procedură — un singur test reușit nu exclude o cursă de sincronizare care depinde de temporizări.Ce a găsit totuși testul: o linie rămasă în
/etc/fstabpe pve1 și pveelite monta storage-ul NFS de pe10.0.20.201(producție) înainte capvestatdsă apuce, deci backup-ul mergea tăcut pe rețeaua greșită, custorage.cfgarătând corect. Liniile au fost comentate (backup:/root/fstab.bak-2026-08-29). Dacă vezi vreodată NFS-ul montat de pe alt server decât10.10.10.201, acolo să te uiți întâi.cluster-startupverifică asta automat. -
Pornește guest-urile în ordine inversă: CT 108 Oracle întâi, apoi VM 201, apoi restul. Pornirea unui guest HA îi repune state-ul pe
started. -
Verifică Oracle:
ssh root@10.0.20.201 "pct exec 108 -- docker exec oracle-xe bash -lc \ \"printf 'select status from v\\\$instance;\nexit\n' | sqlplus -s / as sysdba\"" -
Re-activează cron-urile dezactivate la Pasul 1 și job-urile de backup.
-
Verifică replicarea:
ssh root@10.0.20.201 "pvesr status"Job-urile
*/15(108, 171, 201) au ratat rulări; recuperează la primul tick. -
Decide ce faci cu Shutdown Policy — vezi recomandarea de la Pasul 0. În mod normal rămâne
freeze, deci nu ai ce face.
Capcane de mediu
BIOS „Power On After AC Loss"
Dacă setarea e pe Power On, nodurile pornesc singure în secunda în care revine curentul — posibil eșalonat, posibil înainte să fii tu pregătit. Primul nod care pornește nu are quorum. Incidentul 2026-04-20 conține exact acest simptom („pvemini revine SINGUR — BIOS auto-power-on sau watchdog reset").
Verifică setarea înainte de intervenție sau fii lângă servere la revenirea curentului.
UPS
Dacă lucrarea implică și UPS-ul, vezi ../ups/README.md și
../ups/docs/UPS-SHUTDOWN-README.md — NUT are propria logică de shutdown
orchestrat care poate intra peste procedura de aici.
Stare de referință a clusterului (2026-08-29)
Resurse HA configurate — 10 în total:
| Serviciu | Nod | Grup | Comentariu |
|---|---|---|---|
| ct:100 | pvemini | ha-prefer-pvemini | portainer |
| ct:101 | pve1 | ha-prefer-pve1 | minecraft |
| ct:103 | pvemini | ha-prefer-pvemini | dokploy |
| ct:104 | pvemini | ha-prefer-pvemini | flowise |
| ct:106 | pvemini | ha-prefer-pvemini | gitea |
| ct:108 | pvemini | ha-prefer-pvemini | central-oracle |
| ct:110 | pve1 | ha-prefer-pve1 | moltbot |
| ct:171 | pvemini | ha-prefer-pvemini | claude-agent |
| vm:109 | pveelite | ha-prefer-pveelite | oracle-dr-windows (stopped) |
| vm:201 | pvemini | ha-prefer-pvemini | roacentral |
Guest-uri în afara HA: CT 102, CT 301, VM 302, VM 303, VM 304, VM 310.
nofailback este 1 doar pe ha-prefer-pveelite; celelalte două grupuri au
nofailback 0, deci resursele se întorc automat pe nodul preferat când acesta revine.
Rețea și storage de care depinde procedura, verificate pe 2026-08-29:
| Ce | Valoare |
|---|---|
datacenter.cfg |
ha: shutdown_policy=freeze + migration: network=10.10.10.0/24,type=insecure |
| insulă pve1 / pvemini / pveelite | 10.10.10.200 (USB) / 10.10.10.201 (enp87s0) / 10.10.10.202 (USB) |
NFS backup-pvemini-nfs |
server 10.10.10.201, montat pe pve1 și pveelite |
| corosync | două linkuri: LINK ID 0 pe 10.0.20.20x, LINK ID 1 pe 10.10.10.20x, config_version: 17 |
| Wake-on-LAN | merge pe toate 3 (ethtool <if> → Wake-on: g); unealta: ../scripts/wake-cluster.ps1 |