#!/bin/bash # ============================================================================== # SCRIPT DI MIRRORING DELLA FLOTTA AUTONOMA SU PCLOUD # Versione: 1.3 - Robusta con Esclusioni Standard # ============================================================================== # Ferma lo script se un comando fallisce set -euo pipefail # --- CONFIGURAZIONE --- # Nome del remote configurato in rclone REMOTE_NAME="pcloud_backup" # Cartella di destinazione su pCloud (dove verrà creato il mirror) REMOTE_PATH="Flotta-Mirror/ssd" # Cartella sorgente da sincronizzare (l'intero SSD) SOURCE_PATH="/mnt/ssd/" # Directory dello script (serve PRIMA di HOME_EXCLUSION_FILE sotto — con "set -u" un # riferimento a SCRIPT_DIR non ancora definito termina lo script silenziosamente, # bug reale trovato l'11/09/2026: introdotto il 05/09 insieme al mirror home, mai # eseguito con successo da allora (log fermo al 05/09, cron con stderr su /dev/null # quindi nessun errore visibile). File di log più sotto. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # Home utente (05/09/2026): vive sul disco di sistema, non su /mnt/ssd — mirror # separato, stessa logica e stesse esclusioni del backup restic in # backup_completo.sh (cache/stato applicativo rigenerabile fuori). HOME_SOURCE_PATH="/home/mauro/" HOME_REMOTE_PATH="Flotta-Mirror/home-mauro" HOME_EXCLUSION_FILE="$SCRIPT_DIR/backup_home_exclusions_rclone.txt" # File di log LOG_FILE="$SCRIPT_DIR/logs/pcloud_mirror.log" # -------------------- # Assicura che la cartella dei log esista mkdir -p "$(dirname "$LOG_FILE")" # --- FUNZIONI --- log() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE" } # ---------------- # --- ESECUZIONE --- log "--- Inizio del processo di mirroring su pCloud ---" log "Sorgente: $SOURCE_PATH" log "Destinazione: $REMOTE_NAME:$REMOTE_PATH" log "Escludendo percorsi: /.Trash-1000/, /lost+found/, /config/nextcloud/, /config/jellyfin/, /config/paperless/, /config/domotica-iot/mosquitto/data/, /config/domotica-iot/**/*.db-wal, /config/domotica-iot/**/*.db-shm, /data/Dropbox/adrian/scripts/logs/, /data/Dropbox/adrian/gemello-nave/logs/, /data/Dropbox/adrian/gemello-nave/logbook/*.log" # Il comando rclone per il mirroring puro, con esclusioni e opzioni di robustezza: # scripts/logs/, gemello-nave/logs/ e logbook/*.log esclusi apposta (11/08/2026, esteso # 11/09/2026 quando questo script e backup_completo.sh si sono spostati da scripts/ a # gemello-nave/, portando i propri log con sé): LOG_FILE di questo stesso script vive # dentro l'albero sorgente, quindi il mirror si insegue da solo (rclone rifiuta # l'upload perché la dimensione cambia mentre log() ci scrive sopra a metà sync) — stesso # problema per logbook/*.log (simlink verso gli stessi file). Nessuna di queste directory # è contenuto da backuppare offsite: già coperta dal backup restic separato (backup_completo.sh). # config/domotica-iot/mosquitto/ esclusa (30/08/2026, corretto dopo essere ricomparso # 3 sessioni di fila 28-30/08 sotto file diversi: prima data/mosquitto.db, poi anche # config/passwd): l'immagine eclipse-mosquitto scrive tutto come uid 1883, utente che # non esiste sull'host -> ogni file che crea lì è illeggibile da mauro che lancia il # cron -> "permission denied" ogni notte, che a sua volta blocca anche la pulizia dei # file vecchi lato pCloud ("not deleting files as there were IO errors"). Escluso # l'intero albero invece di un file alla volta, per non rincorrere il prossimo file # nuovo con lo stesso problema. I .db-wal/-shm sono comunque file live in scrittura # continua durante il sync -> hash mismatch occasionale, esclusi ovunque in domotica-iot. rclone sync "$SOURCE_PATH" "$REMOTE_NAME:$REMOTE_PATH" \ --exclude "/.Trash-1000/**" \ --exclude "/lost+found/**" \ --exclude "/config/nextcloud/**" \ --exclude "/config/jellyfin/**" \ --exclude "/config/paperless/**" \ --exclude "/config/domotica-iot/mosquitto/**" \ --exclude "/config/domotica-iot/**/*.db-wal" \ --exclude "/config/domotica-iot/**/*.db-shm" \ --exclude "/data/Dropbox/adrian/scripts/logs/**" \ --exclude "/data/Dropbox/adrian/gemello-nave/logs/**" \ --exclude "/data/Dropbox/adrian/gemello-nave/logbook/*.log" \ --copy-links \ --checkers=4 \ --transfers=2 \ --low-level-retries=10 \ --retries=10 \ --log-file="$LOG_FILE" \ --progress log "--- Mirroring Hub Dati completato con successo ---" # --- Secondo mirror: home utente (~/.ssh, ~/.gnupg, Documenti/Immagini/Scaricati, # trascritti Claude Code e altri CLI AI) --- log "--- Inizio mirroring home utente ---" log "Sorgente: $HOME_SOURCE_PATH" log "Destinazione: $REMOTE_NAME:$HOME_REMOTE_PATH" rclone sync "$HOME_SOURCE_PATH" "$REMOTE_NAME:$HOME_REMOTE_PATH" \ --exclude-from "$HOME_EXCLUSION_FILE" \ --copy-links \ --checkers=4 \ --transfers=2 \ --low-level-retries=10 \ --retries=10 \ --log-file="$LOG_FILE" \ --progress log "--- Processo di mirroring completato con successo ---"