Date : 18-12-2025 14:11 Status : IMPLEMENTEE Machines concernées : nginx.local, gitlab.local Objectif : Éviter le blocage des VMs quand PVE est down, avec sync automatique au retour
Les VMs sur Proxmox 1 (nginx, gitlab) ont un montage NFS hard vers PVE (192.168.1.10). Quand PVE est coupé → le montage bloque → les VMs peuvent freezer.
Remplace le montage permanent par un montage automatique :
Un dossier local /var/spool/nfs-queue/ pour stocker les fichiers en attente :
sudo apt update && sudo apt install -y autofs
# Démonter
sudo umount /mnt/raidz2 # (ou /mnt/zfs pour gitlab)
# Commenter la ligne dans /etc/fstab
sudo sed -i 's|^192.168.1.10:/stock_36to|#192.168.1.10:/stock_36to|' /etc/fstab
/etc/auto.master (ajouter) :
/mnt/nfs /etc/auto.nfs --timeout=60 --ghost
/etc/auto.nfs (créer) :
raidz2 -fstype=nfs4,soft,timeo=30,retrans=2 192.168.1.10:/stock_36to/data
Note pour gitlab : remplacer
raidz2parzfs
sudo mkdir -p /var/spool/nfs-queue
sudo chown gouroubleu:gouroubleu /var/spool/nfs-queue
/usr/local/bin/nfs-sync.sh :
#!/bin/bash
# NFS Sync avec Queuing
# Transfère les fichiers en attente vers le NFS quand disponible
QUEUE_DIR="/var/spool/nfs-queue"
NFS_TARGET="/mnt/nfs/raidz2" # ou /mnt/nfs/zfs pour gitlab
LOG_FILE="/var/log/nfs-sync.log"
LOCK_FILE="/tmp/nfs-sync.lock"
# Éviter les exécutions simultanées
exec 200>"$LOCK_FILE"
flock -n 200 || { echo "$(date): Déjà en cours" >> "$LOG_FILE"; exit 1; }
# Vérifier s'il y a des fichiers en attente
if [ -z "$(ls -A $QUEUE_DIR 2>/dev/null)" ]; then
exit 0
fi
# Tester si NFS accessible (avec timeout)
if timeout 5 ls "$NFS_TARGET" &>/dev/null; then
echo "$(date): NFS accessible, transfert en cours..." >> "$LOG_FILE"
# Transférer tous les fichiers en attente
for file in "$QUEUE_DIR"/*; do
if [ -f "$file" ]; then
# Lire la destination depuis le fichier .meta associé
meta_file="${file}.meta"
if [ -f "$meta_file" ]; then
dest=$(cat "$meta_file")
mkdir -p "$(dirname "$dest")"
if cp "$file" "$dest"; then
echo "$(date): OK - $(basename "$file") -> $dest" >> "$LOG_FILE"
rm -f "$file" "$meta_file"
else
echo "$(date): ERREUR - $(basename "$file")" >> "$LOG_FILE"
fi
fi
fi
done
echo "$(date): Transfert terminé" >> "$LOG_FILE"
else
echo "$(date): NFS inaccessible, retry plus tard" >> "$LOG_FILE"
fi
/usr/local/bin/send-to-nfs :
#!/bin/bash
# Usage: send-to-nfs <fichier_local> <chemin_destination_nfs>
# Exemple: send-to-nfs backup.tar.gz /mnt/nfs/raidz2/backups/
SOURCE="$1"
DEST="$2"
QUEUE_DIR="/var/spool/nfs-queue"
NFS_BASE="/mnt/nfs/raidz2" # ou /mnt/nfs/zfs
if [ -z "$SOURCE" ] || [ -z "$DEST" ]; then
echo "Usage: send-to-nfs <fichier> <destination>"
exit 1
fi
if [ ! -f "$SOURCE" ]; then
echo "Erreur: $SOURCE n'existe pas"
exit 1
fi
# Tester si NFS accessible
if timeout 5 ls "$NFS_BASE" &>/dev/null; then
# NFS OK → transfert direct
mkdir -p "$(dirname "$DEST")"
cp "$SOURCE" "$DEST" && echo "Transféré: $SOURCE -> $DEST"
else
# NFS down → queue
filename=$(basename "$SOURCE")
queue_file="$QUEUE_DIR/${filename}_$(date +%s)"
cp "$SOURCE" "$queue_file"
echo "$DEST" > "${queue_file}.meta"
echo "NFS indisponible - En queue: $filename (sera envoyé automatiquement)"
fi
/etc/systemd/system/nfs-sync.service :
[Unit]
Description=NFS Queue Sync
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/nfs-sync.sh
User=root
/etc/systemd/system/nfs-sync.timer :
[Unit]
Description=Retry NFS sync every 5 minutes
[Timer]
OnBootSec=2min
OnUnitActiveSec=5min
Persistent=true
[Install]
WantedBy=timers.target
sudo chmod +x /usr/local/bin/nfs-sync.sh /usr/local/bin/send-to-nfs
sudo systemctl daemon-reload
sudo systemctl enable --now autofs
sudo systemctl enable --now nfs-sync.timer
| Élément | Chemin | Description |
|---|---|---|
| Montage NFS | /mnt/nfs/raidz2 |
Monte auto à l'accès, timeout 60s |
| Queue locale | /var/spool/nfs-queue/ |
Fichiers en attente |
| Commande | send-to-nfs |
Envoie avec fallback queue |
| Logs | /var/log/nfs-sync.log |
Historique des transferts |
| Timer | nfs-sync.timer |
Retry toutes les 5 min |
# Accès direct au NFS (monte automatiquement)
ls /mnt/nfs/raidz2
# Envoyer un fichier (avec queue si NFS down)
send-to-nfs /tmp/backup.tar.gz /mnt/nfs/raidz2/backups/backup.tar.gz
# Voir la queue
ls /var/spool/nfs-queue/
# Forcer un sync maintenant
sudo systemctl start nfs-sync.service
# Voir les logs
tail -f /var/log/nfs-sync.log