Files
ROMFASTSQL/proxmox/cluster/failover/pvemini-down-alert.sh
Claude Agent 8a0c557981 feat(failover): add VM 201 manual failover + recovery scripts, watchdog alert
VM 201 (Windows critical) stays out of HA by design. Added:
- failover-vm201.sh: interactive failover pvemini -> pveelite with ZFS replication state
- recover-vm201-to-pvemini.sh: interactive reverse migration with uptime + split-brain checks
- pvemini-down-alert.sh: cron watchdog on pveelite, emails full runbook after 2min DOWN

Replication RPO tightened: CT 108 + VM 201 to 5min, CT 171 to 15min.
CT 171 added to HA (ha-group-main) for continuous Claude Code access.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 12:40:49 +00:00

84 lines
3.2 KiB
Bash
Executable File

#!/bin/bash
# Alertă când pvemini e unreachable — rulează pe pveelite din cron 1 min
# Deployed la /opt/scripts/pvemini-down-alert.sh pe pveelite
# Stateful: alertează o dată după 2 minute consecutive DOWN, reset la UP
set -euo pipefail
PRIMARY_IP=10.0.20.201
STATE=/var/run/pvemini-down-alert.state
MAIL_TO=mmarius28@gmail.com
THRESHOLD=2 # min consecutive
COUNT=0
[[ -f "$STATE" ]] && COUNT=$(cat "$STATE")
if ping -c 2 -W 2 "$PRIMARY_IP" &>/dev/null; then
if [[ "$COUNT" -ge "$THRESHOLD" ]]; then
# Recovery
echo "pvemini revenit online la $(date)" | \
mail -r 'ups@romfast.ro' -s "[OK] pvemini UP" "$MAIL_TO"
fi
echo 0 > "$STATE"
exit 0
fi
COUNT=$((COUNT + 1))
echo "$COUNT" > "$STATE"
# Alertează o singură dată când atingem threshold
if [[ "$COUNT" -eq "$THRESHOLD" ]]; then
{
echo "pvemini (10.0.20.201) NU răspunde la ping de $THRESHOLD minute"
echo "Timp: $(date)"
echo
echo "Stare cluster:"
pvecm status 2>&1 | head -20 || true
echo
echo "HA status:"
ha-manager status 2>&1 || true
echo
echo "=========================================="
echo "CT-uri HA (104, 106, 108, 171): migrare AUTOMATĂ"
echo "pe pveelite în ~2 min dacă pveelite are RAM."
echo "=========================================="
echo
echo "### FAILOVER MANUAL VM 201 (Windows) ###"
echo
echo "Dacă pvemini rămâne DOWN, pentru a porni VM 201 pe pveelite:"
echo
echo " ssh root@10.0.20.202 /opt/scripts/failover-vm201.sh"
echo
echo "(tastezi 'DA' la prompt; scriptul folosește ultima replicare"
echo " ZFS — max 5 min în urmă. Verifică ping + ssh înainte)"
echo
echo "Variantă non-interactivă:"
echo " ssh root@10.0.20.202 /opt/scripts/failover-vm201.sh --yes"
echo
echo
echo "### REVENIRE PE PVEMINI (după ce pvemini e stabil) ###"
echo
echo "IMPORTANT: NU porni VM 201 pe pvemini automat — date divergente."
echo "Folosește scriptul interactiv care face toți pașii în siguranță:"
echo
echo " ssh root@10.0.20.202 /opt/scripts/recover-vm201-to-pvemini.sh"
echo
echo "Scriptul verifică:"
echo " - pvemini uptime min. 30 min + erori recente"
echo " - pvemini reachable ssh + VM 201 NU rulează deja acolo"
echo " - VM 201 running local pe pveelite"
echo
echo "Execuția face automat (cu confirmări la fiecare pas):"
echo " 1. qm shutdown 201 pe pveelite"
echo " 2. pvesr replicare inversă pveelite → pvemini + run forțat"
echo " 3. qm migrate 201 pvemini (offline)"
echo " 4. cleanup job replicare inversă"
echo " 5. qm start 201 pe pvemini"
echo
echo "Variantă non-interactivă: adaugă '--yes' la final."
echo
echo "CT-urile HA (104, 106, 108, 171) revin automat pe pvemini"
echo "conform priorității ha-group-main."
echo "=========================================="
} | mail -r 'ups@romfast.ro' -s "[CRITIC] pvemini DOWN $THRESHOLD min" "$MAIL_TO"
fi