Fonctionnalités principales:
- Support de plusieurs pools ZFS simultanément (ZPOOLS array)
- Isolation des erreurs: échec d'un pool n'affecte pas les autres
- Logs séparés par pool avec rotation automatique (14 jours)
- Lockfiles indépendants par pool
- Configuration Sanoid générée automatiquement pour tous les pools
- Fichiers d'état séparés par pool
- Résumé de réplication détaillé
Configuration:
- Variable ZPOOLS: liste des pools à répliquer
- LOG_DIR: répertoire des logs (/var/log/zfs-nfs-replica/)
- LOG_RETENTION_DAYS: durée de rétention des logs (14 jours)
Changements techniques:
- Nouvelle fonction replicate_pool() pour réplication isolée
- Fonction init_logging() pour setup des logs et logrotate
- configure_sanoid() génère config dynamique pour tous les pools
- Logs avec contexte de pool (CURRENT_POOL)
Rétrocompatibilité:
- Compatible v1.x avec un seul pool: ZPOOLS=("zpool1")
- Configuration automatique de sanoid.conf selon le role du noeud
- Noeud actif: autosnap=yes, autoprune=yes
- Noeud passif: autosnap=no, autoprune=yes
- Conforme a la documentation officielle Sanoid
- Documentation du mount point LXC shared=1 pour la HA
Nouvelles fonctionnalités :
- Système d'auto-update automatique depuis Forgejo
- Vérification à chaque exécution
- Sauvegarde de l'ancienne version
- Redémarrage automatique après mise à jour
- Protection contre les boucles infinies
Corrections de bugs :
- Fix bug critique: stdin consommé par syncoid dans boucle while
- Ajout de "< /dev/null" pour rediriger stdin
- Permet maintenant la réplication de tous les datasets
- Ajout d'un compteur de datasets traités pour logging
Améliorations :
- Documentation complète du système d'auto-update dans README.md
- Version incrémentée de 1.5.1 à 1.6.0
Problème:
- Les boucles while avec pipe (|) s'exécutent dans un sous-shell
- SYNCOID_OPTS n'était pas accessible dans le sous-shell (set -u)
- Erreur: "SYNCOID_OPTS: unbound variable"
Corrections:
- Remplacement des pipes par des here-strings (<<<)
- Les boucles while s'exécutent maintenant dans le shell principal
- Changement de REPLICATION_SUCCESS (string) vers REPLICATION_FAILED (int)
- Variables maintenant accessibles dans toutes les boucles
Problème identifié:
- Le script tentait de répliquer le pool racine "zpool1" (96K de métadonnées)
- Syncoid ne pouvait pas gérer le dataset racine lors de la première sync
- Message: "Removing zpool1 because no matching snapshots were found"
Solution:
- Liste et réplique les datasets de premier niveau uniquement:
* zpool1/data-nfs-share
* zpool1/pbs-backups
- Chaque dataset est répliqué récursivement (inclut tous les enfants)
- Le pool racine n'est plus répliqué explicitement
Avantages:
- Permet la création automatique des datasets sur le nœud distant
- Réplication correcte de tous les datasets et snapshots
- Gestion individuelle de chaque dataset de premier niveau
Changements:
- Retrait de --quiet des options syncoid (première sync et incrémentale)
- Permet de voir la progression détaillée de la réplication
- Utile pour le debugging et le monitoring de la première sync (7.67TB)
Options syncoid:
- Première sync: --recursive --force-delete
- Sync incrémentale: --recursive --no-sync-snap
Problème résolu:
- L'option --no-sync-snap était utilisée dans tous les cas, empêchant
la première synchronisation de fonctionner correctement
- Message d'erreur: "Removing zpool1 because no matching snapshots were found"
Corrections:
- Options syncoid maintenant conditionnelles selon le contexte:
* Première sync: --recursive --force-delete --quiet
(pas de --no-sync-snap pour permettre création snapshot initial)
* Sync incrémentale: --recursive --no-sync-snap --quiet
(utilise les snapshots Sanoid existants)
Impact:
- Permet la synchronisation initiale elitedesk → acemagician
- Conserve l'optimisation des syncs incrémentales ultérieures
- Détection automatique snapshots en commun (sync incrémentale vs première sync)
- Gestion automatique Sanoid (activation/désactivation selon nœud actif)
- Protection #1: Comparaison tailles source/destination (ratio >= 50%)
- Protection #2: Historique des tailles avec tolérance ±20%
- Prévention écrasement accidentel lors remplacement disque
- Logs explicites avec actions recommandées en cas de blocage