33800 Docs

← 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