#!/bin/sh # Trouve-KA — réplication croisée des sauvegardes (modèle pull) # Author: Simon-Pierre Boucher # Contact: contact@spboucher.ai # # Chaque node de données TIRE les sauvegardes de l'autre via une clé ssh à # commande forcée (le détenteur de la clé ne peut QUE recevoir le tar du # dossier de backups distant — aucun shell, aucun autre accès). # hub (M2M32) : tire les snapshots OpenSearch de M2M32b # search (M2M32b) : tire les dumps Postgres de M2M32 # Ainsi la perte totale d'un node laisse toujours une copie ≤ 24 h sur l'autre. PATH="$HOME/.local/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin" export PATH ROLE=$(cat "$HOME/.trouveka-role" 2>/dev/null || echo crawler) LOG="$HOME/trouveka-backups/backup.log" KEY="$HOME/.ssh/trouveka_pull" mkdir -p "$HOME/trouveka-backups" log() { echo "$(date '+%F %T') [pull-$ROLE] $*" >> "$LOG"; } pull() { # $1 = hôte distant, $2 = dossier local de destination mkdir -p "$2" if /usr/bin/ssh -i "$KEY" -o ControlMaster=no -o ControlPath=none -o IdentitiesOnly=yes -o IdentityAgent=none -o ForwardAgent=no -o ConnectTimeout=10 -o StrictHostKeyChecking=accept-new \ "simon-pierreboucher@$1" pull 2>>"$LOG" | tar -xf - -C "$2" 2>>"$LOG"; then log "réplication depuis $1 OK ($(ls "$2" | wc -l | tr -d ' ') fichiers)" else log "ÉCHEC réplication depuis $1" fi # Rotation locale du miroir (garder 14 jours de fichiers) find "$2" -type f -mtime +14 -delete 2>/dev/null } case "$ROLE" in hub) pull 192.168.2.77 "$HOME/trouveka-backups/os-mirror" ;; search) pull 192.168.2.90 "$HOME/trouveka-backups/pg-mirror" ;; *) log "aucun rôle de réplication" ;; esac exit 0