← Retour
#!/bin/bash
# ===========================================
# RECOVERY START - Relancer les VMs après incident
# ===========================================
# Usage: recovery-start [--force]
#
# Ce script détecte automatiquement sur quel Proxmox il tourne
# et relance les VMs dans le bon ordre.
set -e
# Couleurs
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
CYAN='\033[0;36m'
NC='\033[0m'
FORCE=false
[ "$1" = "--force" ] && FORCE=true
echo -e "${CYAN}"
echo "╔══════════════════════════════════════════════════════════════════╗"
echo "║ 🔄 RECOVERY START - Relance des VMs ║"
echo "╚══════════════════════════════════════════════════════════════════╝"
echo -e "${NC}"
# Détecter sur quel Proxmox on est
HOSTNAME=$(hostname)
MY_IP=$(hostname -I | awk '{print $1}')
echo -e "Machine: ${CYAN}$HOSTNAME${NC} ($MY_IP)"
echo ""
# === FONCTIONS ===
check_nfs_server() {
echo -e "${YELLOW}[1/4] Vérification du serveur NFS (pve)...${NC}"
if ping -c 2 -W 3 192.168.1.10 > /dev/null 2>&1; then
echo -e " ${GREEN}✅ pve (192.168.1.10) joignable${NC}"
return 0
else
echo -e " ${RED}❌ pve (192.168.1.10) INJOIGNABLE${NC}"
echo -e " ${YELLOW}→ Vérifiez que pve est démarré${NC}"
return 1
fi
}
check_nfs_export() {
echo -e "${YELLOW}[2/4] Vérification export NFS...${NC}"
# Sur pve, vérifier que NFS est exporté
if systemctl is-active nfs-server > /dev/null 2>&1; then
echo -e " ${GREEN}✅ Service NFS actif${NC}"
EXPORTS=$(exportfs -v 2>/dev/null | grep -c "stock_36to" || echo "0")
if [ "$EXPORTS" -gt 0 ]; then
echo -e " ${GREEN}✅ /stock_36to exporté${NC}"
return 0
else
echo -e " ${YELLOW}⚠️ /stock_36to non exporté, tentative...${NC}"
sudo exportfs -ra
sleep 2
return 0
fi
else
echo -e " ${RED}❌ Service NFS inactif${NC}"
echo -e " ${YELLOW}→ Démarrage du service NFS...${NC}"
sudo systemctl start nfs-server
sleep 3
return 0
fi
}
check_nfs_mount() {
echo -e "${YELLOW}[2/4] Vérification montage NFS...${NC}"
if mount | grep -q "192.168.1.10"; then
echo -e " ${GREEN}✅ NFS monté${NC}"
return 0
else
echo -e " ${YELLOW}⚠️ NFS non monté, tentative...${NC}"
sudo mount -a
sleep 3
if mount | grep -q "192.168.1.10"; then
echo -e " ${GREEN}✅ NFS monté avec succès${NC}"
return 0
else
echo -e " ${RED}❌ Échec du montage NFS${NC}"
return 1
fi
fi
}
check_zfs() {
echo -e "${YELLOW}[2/4] Vérification ZFS...${NC}"
POOL_STATE=$(sudo zpool status stock_36to 2>/dev/null | grep "state:" | awk '{print $2}')
if [ "$POOL_STATE" = "ONLINE" ]; then
echo -e " ${GREEN}✅ Pool ZFS ONLINE${NC}"
return 0
elif [ "$POOL_STATE" = "DEGRADED" ]; then
echo -e " ${YELLOW}⚠️ Pool ZFS DEGRADED (mais fonctionnel)${NC}"
return 0
else
echo -e " ${RED}❌ Pool ZFS: $POOL_STATE${NC}"
return 1
fi
}
start_vms_pve() {
echo -e "${YELLOW}[3/4] Démarrage des VMs sur pve...${NC}"
# Ordre: 206 (prod-portainer) puis 201 (Windows)
VMS_ORDER="206 201"
for VMID in $VMS_ORDER; do
VM_STATUS=$(sudo qm status $VMID 2>/dev/null | awk '{print $2}')
VM_NAME=$(sudo qm config $VMID 2>/dev/null | grep "^name:" | cut -d' ' -f2)
if [ "$VM_STATUS" = "running" ]; then
echo -e " ${GREEN}✅${NC} VM $VMID ($VM_NAME) déjà running"
else
echo -e " ${YELLOW}→${NC} Démarrage VM $VMID ($VM_NAME)..."
sudo qm start $VMID
echo -e " ${GREEN}✅${NC} VM $VMID démarrée, attente 30s..."
sleep 30
fi
done
}
start_vms_proxmox1() {
echo -e "${YELLOW}[3/4] Démarrage des VMs sur proxmox1...${NC}"
# Ordre: 100 (nginx), 101 (gitlab), 104 (jellyfin), 106 (dev-portainer), 103 (vscode), 102 (portainer)
VMS_ORDER="100 101 104 106 103 102"
for VMID in $VMS_ORDER; do
# Vérifier si la VM existe
if ! sudo qm config $VMID > /dev/null 2>&1; then
continue
fi
VM_STATUS=$(sudo qm status $VMID 2>/dev/null | awk '{print $2}')
VM_NAME=$(sudo qm config $VMID 2>/dev/null | grep "^name:" | cut -d' ' -f2)
VM_ONBOOT=$(sudo qm config $VMID 2>/dev/null | grep "^onboot:" | cut -d' ' -f2)
# Ne démarrer que les VMs avec onboot=1
if [ "$VM_ONBOOT" != "1" ] && [ "$FORCE" = false ]; then
echo -e " ${DIM}⏭️ VM $VMID ($VM_NAME) - onboot désactivé, skip${NC}"
continue
fi
if [ "$VM_STATUS" = "running" ]; then
echo -e " ${GREEN}✅${NC} VM $VMID ($VM_NAME) déjà running"
else
echo -e " ${YELLOW}→${NC} Démarrage VM $VMID ($VM_NAME)..."
sudo qm start $VMID
# Délai variable selon la VM
case $VMID in
101) DELAY=60 ;; # gitlab - plus long
*) DELAY=30 ;;
esac
echo -e " ${GREEN}✅${NC} VM $VMID démarrée, attente ${DELAY}s..."
sleep $DELAY
fi
done
}
summary() {
echo -e "${YELLOW}[4/4] Résumé...${NC}"
echo ""
sudo qm list
echo ""
echo -e "${GREEN}✅ Recovery terminé${NC}"
}
# === MAIN ===
case "$MY_IP" in
192.168.1.10)
echo -e "Mode: ${CYAN}PVE (Serveur NFS)${NC}"
echo ""
check_zfs || exit 1
check_nfs_export || exit 1
start_vms_pve
summary
;;
192.168.1.155)
echo -e "Mode: ${CYAN}PROXMOX1 (Client NFS)${NC}"
echo ""
check_nfs_server || exit 1
check_nfs_mount || exit 1
start_vms_proxmox1
summary
;;
*)
echo -e "${RED}❌ Machine non reconnue ($MY_IP)${NC}"
echo "Ce script doit être exécuté sur pve (192.168.1.10) ou proxmox1 (192.168.1.155)"
exit 1
;;
esac