Linux19 gennaio 2026 690 visualizzazioni

Rclone: Guida esperta per la sincronizzazione cloud su VPS Linux

Rclone: Guida esperta per la sincronizzazione cloud su VPS Linux

Che cos'è Rclone?

Rclone è uno strumento da riga di comando open-source che consente di gestire file su oltre 70 servizi di archiviazione cloud. Spesso definito "rsync per il cloud", offre funzionalità avanzate di sincronizzazione, trasferimento, crittografia e montaggio di file system remoti.

Architettura Interna

Rclone funziona secondo un'architettura modulare composta da diversi strati. Al centro si trova il Rclone Core che gestisce le operazioni di base. Sopra, tre strati principali interagiscono: il VFS Layer per il montaggio e la cache, il Crypt Layer per la crittografia lato client e il Chunker Layer per il frazionamento di file di grandi dimensioni.

Questi strati comunicano con un Backend Abstraction che uniforma l'accesso ai diversi provider: S3/R2, Google Drive, SFTP, Backblaze B2, WebDAV e molti altri.

Requisiti di Sistema

Componente Minimo Consigliato
RAM 512 MB 2 GB+
CPU 1 vCPU 2+ vCPU
Archiviazione 100 MB 1 GB (cache)
Kernel 3.10+ 5.4+ (FUSE3)
OS Ubuntu 18.04+ Ubuntu 22.04/24.04

Installazione Avanzata

Metodo 1: Installazione tramite Script Ufficiale (Consigliato)

# Installazione con verifica della firma
curl -fsSL https://rclone.org/install.sh | sudo bash

# Verifica dell'installazione
rclone version

Metodo 2: Installazione Manuale (Controllo Totale)

# Definire la versione desiderata
RCLONE_VERSION="v1.68.2"
ARCH="amd64"  # o arm64 per ARM

# Download ed estrazione
cd /tmp
curl -LO "https://downloads.rclone.org/${RCLONE_VERSION}/rclone-${RCLONE_VERSION}-linux-${ARCH}.zip"
unzip rclone-${RCLONE_VERSION}-linux-${ARCH}.zip
cd rclone-${RCLONE_VERSION}-linux-${ARCH}

# Installazione binaria
sudo cp rclone /usr/local/bin/
sudo chmod 755 /usr/local/bin/rclone

# Installazione delle pagine man
sudo mkdir -p /usr/local/share/man/man1
sudo cp rclone.1 /usr/local/share/man/man1/
sudo mandb

# Installazione autocompletamento (Bash)
rclone completion bash | sudo tee /etc/bash_completion.d/rclone > /dev/null

# Installazione autocompletamento (Zsh)
rclone completion zsh | sudo tee /usr/local/share/zsh/site-functions/_rclone > /dev/null

Metodo 3: Compilazione dai Sorgenti

# Requisiti Go 1.21+
sudo apt update && sudo apt install -y golang-go git

# Clonazione e compilazione
git clone https://github.com/rclone/rclone.git
cd rclone
go build -ldflags "-s -w" -o rclone

# Installazione
sudo mv rclone /usr/local/bin/

Installazione delle Dipendenze FUSE

# Ubuntu/Debian
sudo apt update
sudo apt install -y fuse3 libfuse3-dev

# Abilitare FUSE per gli utenti non root
sudo sed -i 's/#user_allow_other/user_allow_other/' /etc/fuse.conf

Configurazione Multi-Provider

Struttura del File di Configurazione

Il file di configurazione predefinito si trova in ~/.config/rclone/rclone.conf. La sua struttura INI supporta più remoti.

# ~/.config/rclone/rclone.conf

[gdrive]
type = drive
client_id = YOUR_CLIENT_ID.apps.googleusercontent.com
client_secret = YOUR_CLIENT_SECRET
scope = drive
token = {"access_token":"...","token_type":"Bearer","refresh_token":"...","expiry":"..."}
team_drive = 

[s3-aws]
type = s3
provider = AWS
access_key_id = AKIAIOSFODNN7EXAMPLE
secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
region = eu-west-1
acl = private
storage_class = STANDARD_IA

[s3-r2]
type = s3
provider = Cloudflare
access_key_id = YOUR_R2_ACCESS_KEY
secret_access_key = YOUR_R2_SECRET_KEY
endpoint = https://YOUR_ACCOUNT_ID.r2.cloudflarestorage.com
acl = private

[b2]
type = b2
account = YOUR_APPLICATION_KEY_ID
key = YOUR_APPLICATION_KEY
hard_delete = true

[sftp-backup]
type = sftp
host = backup.example.com
user = backupuser
port = 22
key_file = ~/.ssh/backup_key
shell_type = unix
md5sum_command = md5sum
sha1sum_command = sha1sum

Configurazione Interattiva

# Avviare l'assistente di configurazione
rclone config

# Comandi del menu interattivo
# n) Nuovo remoto
# d) Elimina remoto
# r) Rinomina remoto
# c) Copia remoto
# s) Imposta password di configurazione
# q) Esci dalla configurazione

Configurazione Google Drive (VPS Headless)

Per configurare Google Drive su un VPS senza interfaccia grafica:

# Sulla tua macchina locale con browser
rclone authorize "drive"

# Copia il token generato, poi sul VPS
rclone config

# Selezionare: n (nuovo remoto)
# Nome: gdrive
# Archiviazione: drive
# client_id: (lasciare vuoto o utilizzare il tuo)
# client_secret: (lasciare vuoto o utilizzare il tuo)
# scope: drive
# service_account_file: (lasciare vuoto)
# Modifica configurazione avanzata: n
# Usa configurazione automatica: n
# Incolla il token ottenuto sulla macchina locale

Configurazione con Account di Servizio (Google Workspace)

# Creare la directory per le credenziali
mkdir -p ~/.config/rclone/sa

# Posizionare il file JSON dell'account di servizio
# ~/.config/rclone/sa/service-account.json
[gdrive-sa]
type = drive
scope = drive
service_account_file = /home/user/.config/rclone/sa/service-account.json
team_drive = 0ABCdefGHIjklMNOpqr

Configurazione S3 Compatibile (MinIO, Wasabi, ecc.)

[minio]
type = s3
provider = Minio
access_key_id = minioadmin
secret_access_key = minioadmin
endpoint = http://localhost:9000
acl = private

[wasabi]
type = s3
provider = Wasabi
access_key_id = YOUR_WASABI_KEY
secret_access_key = YOUR_WASABI_SECRET
region = eu-central-1
endpoint = s3.eu-central-1.wasabisys.com

Comandi Fondamentali

Sintassi Generale

rclone [options] subcommand <source> [<destination>] [flags]

Comandi di Base

Elenco e Navigazione

# Elencare i remoti configurati
rclone listremotes

# Elencare il contenuto di un remoto
rclone ls gdrive:
rclone ls gdrive:Documents/

# Elenco dettagliato con dimensione e data
rclone lsl gdrive:

# Elenco in formato JSON (per scripting)
rclone lsjson gdrive: --recursive

# Visualizzare solo le directory
rclone lsd gdrive:

# Struttura completa
rclone tree gdrive:Projects/ --level 3

# Cercare file
rclone ls gdrive: --include "*.pdf" --recursive

Copia e Spostamento

# Copia locale verso remoto
rclone copy /local/path gdrive:backup/ -P

# Copia remoto verso locale
rclone copy gdrive:Documents/ /local/documents/ -P

# Copia tra due remoti (server-side se supportato)
rclone copy gdrive:source/ s3-aws:destination/ -P

# Spostamento (copia + cancellazione sorgente)
rclone move /local/temp/ gdrive:archive/ -P

# Copia di un singolo file
rclone copyto /local/file.txt gdrive:backup/file.txt

Sincronizzazione

# Sincronizzazione unidirezionale (sorgente → destinazione)
# ATTENZIONE: elimina i file nella destinazione non presenti nella sorgente
rclone sync /local/data/ gdrive:data/ -P

# Sincronizzazione con dry-run (simulazione)
rclone sync /local/data/ gdrive:data/ --dry-run

# Sincronizzazione bidirezionale (sperimentale)
rclone bisync /local/data/ gdrive:data/ --resync

Cancellazione

# Eliminare un file
rclone deletefile gdrive:path/to/file.txt

# Eliminare una directory e il suo contenuto
rclone purge gdrive:old-backup/

# Eliminare solo i file (mantiene la struttura)
rclone delete gdrive:temp/

# Eliminare i file vuoti
rclone rmdirs gdrive: --leave-root

Flag Essenziali

Flag Descrizione
-P, --progress Mostra il progresso
-v, --verbose Modalità verbosa
-n, --dry-run Simulazione senza modifica
--transfers N Numero di trasferimenti paralleli
--checkers N Numero di verificatori paralleli
--bwlimit RATE Limite di larghezza di banda
--exclude PATTERN Escludere file
--include PATTERN Includere solo questi file
--min-size SIZE Dimensione minima
--max-size SIZE Dimensione massima
--min-age DURATION Età minima
--max-age DURATION Età massima

Operazioni Avanzate

Filtraggio Avanzato

# File di filtri
cat > /etc/rclone/filters.txt << 'EOF'
# Inclusioni
+ **.pdf
+ **.docx
+ Documents/**

# Esclusioni
- *.tmp
- *.log
- .git/**
- node_modules/**
- __pycache__/**
- .DS_Store
- Thumbs.db

# Escludere i file di oltre 1GB
- *
EOF

# Utilizzo del file di filtri
rclone sync /data/ gdrive:backup/ --filter-from /etc/rclone/filters.txt -P

Operazioni Server-Side

# Copia server-side (evita il download locale)
rclone copy gdrive:source/ gdrive:destination/ --drive-server-side-across-configs

# Verificare se il server-side è disponibile
rclone backend features gdrive:

# Deduplicazione (Google Drive)
rclone dedupe gdrive:folder/ --dedupe-mode newest

Gestione dei File di Grandi Dimensioni

# Upload a chunk per file > 5GB (S3)
rclone copy largefile.tar gdrive:backup/ \
  --s3-chunk-size 100M \
  --s3-upload-concurrency 4

# Verifica di integrità
rclone check /local/data/ gdrive:data/ --one-way
rclone hashsum MD5 gdrive:file.zip

Operazioni sulle Metadati

# Copiare con preservazione dei timestamp
rclone copy /local/ gdrive:backup/ --metadata

# Visualizzare i metadati
rclone lsjson gdrive:file.txt --metadata

# Modificare i metadati (backends supportati)
rclone settier gdrive:file.txt ARCHIVE

Montaggio FUSE e Cache

Montaggio di Base

# Creare il punto di montaggio
sudo mkdir -p /mnt/gdrive
sudo chown $USER:$USER /mnt/gdrive

# Montaggio semplice
rclone mount gdrive: /mnt/gdrive --daemon

# Montaggio con opzioni avanzate
rclone mount gdrive: /mnt/gdrive \
  --daemon \
  --allow-other \
  --vfs-cache-mode full \
  --vfs-cache-max-size 10G \
  --vfs-cache-max-age 24h \
  --vfs-read-chunk-size 64M \
  --vfs-read-chunk-size-limit 1G \
  --buffer-size 256M \
  --dir-cache-time 72h \
  --poll-interval 15s \
  --log-file /var/log/rclone/gdrive.log \
  --log-level INFO

Modalità di Cache VFS

Modalità Descrizione Utilizzo
off Nessuna cache Streaming solo
minimal Cache in scrittura solo Uploads
writes Cache le scritture fino all'upload Modifica di file
full Cache completa lettura/scrittura Uso intensivo, applicazioni

Configurazione Cache Avanzata

# Cache con backend dedicato
rclone mount gdrive: /mnt/gdrive \
  --vfs-cache-mode full \
  --cache-dir /var/cache/rclone \
  --vfs-cache-max-size 50G \
  --vfs-cache-max-age 168h \
  --vfs-write-back 5s \
  --vfs-read-ahead 128M \
  --attr-timeout 1h \
  --daemon

Servizio Systemd per Montaggio Persistente

# Creare il file di servizio
sudo tee /etc/systemd/system/rclone-gdrive.service << 'EOF'
[Unit]
Description=Rclone Mount - Google Drive
Documentation=https://rclone.org/docs/
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
User=rclone
Group=rclone
ExecStartPre=/bin/mkdir -p /mnt/gdrive
ExecStart=/usr/local/bin/rclone mount gdrive: /mnt/gdrive \
  --config /home/rclone/.config/rclone/rclone.conf \
  --allow-other \
  --vfs-cache-mode full \
  --vfs-cache-max-size 20G \
  --vfs-cache-max-age 72h \
  --vfs-read-chunk-size 32M \
  --vfs-read-chunk-size-limit 256M \
  --buffer-size 128M \
  --dir-cache-time 48h \
  --poll-interval 30s \
  --log-level INFO \
  --log-file /var/log/rclone/gdrive.log \
  --cache-dir /var/cache/rclone/gdrive
ExecStop=/bin/fusermount -uz /mnt/gdrive
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF

# Creare l'utente dedicato
sudo useradd -r -s /usr/sbin/nologin rclone
sudo mkdir -p /var/log/rclone /var/cache/rclone
sudo chown rclone:rclone /var/log/rclone /var/cache/rclone

# Abilitare e avviare il servizio
sudo systemctl daemon-reload
sudo systemctl enable rclone-gdrive.service
sudo systemctl start rclone-gdrive.service

# Verificare lo stato
sudo systemctl status rclone-gdrive.service

Smontaggio

# Smontaggio pulito
fusermount -u /mnt/gdrive

# Smontaggio forzato (se bloccato)
fusermount -uz /mnt/gdrive

# Tramite systemd
sudo systemctl stop rclone-gdrive.service

Crittografia e Sicurezza

Configurazione di un Remote Crittografato

Il backend crypt fornisce una crittografia lato client trasparente.

# Configurazione tramite assistente
rclone config

# Selezionare: n (nuovo remoto)
# Nome: gdrive-crypt
# Archiviazione: crypt
# remoto: gdrive:encrypted/  (remoto sottostante)
# filename_encryption: standard
# directory_name_encryption: true
# password: (generato o scelto)
# password2: (sale, opzionale ma consigliato)

Configurazione risultante:

[gdrive-crypt]
type = crypt
remote = gdrive:encrypted/
password = ENCRYPTED_PASSWORD_HASH
password2 = ENCRYPTED_SALT_HASH
filename_encryption = standard
directory_name_encryption = true

Modalità di Crittografia dei Nomi

Modalità Descrizione Esempio
off Nessuna crittografia dei nomi document.pdf
standard Crittografia completa q4kp2q8fj3m2...
obfuscate Offuscamento semplice yqkpzqFfj3m2...

Utilizzo del Remote Crittografato

# Le operazioni sono trasparenti
rclone copy /sensitive/data/ gdrive-crypt: -P

# I file appaiono crittografati lato cloud
rclone ls gdrive:encrypted/
# Output: crittografato e illeggibile

# Ma leggibili tramite il remote crypt
rclone ls gdrive-crypt:
# Output: nomi originali

Sicurezza della Configurazione

# Crittografare il file di configurazione
rclone config password

# La configurazione utilizza ora una password
# Definire tramite variabile d'ambiente
export RCLONE_CONFIG_PASS="la_tua_password_forte"

# Oppure utilizzare un gestore di segreti
export RCLONE_CONFIG_PASS=$(cat /run/secrets/rclone_pass)

Variabili d'Ambiente Sensibili

# Configurazione tramite variabili (evita il file di configurazione)
export RCLONE_CONFIG_GDRIVE_TYPE=drive
export RCLONE_CONFIG_GDRIVE_TOKEN='{"access_token":"..."}'

# Per S3
export RCLONE_CONFIG_S3_TYPE=s3
export RCLONE_CONFIG_S3_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
export RCLONE_CONFIG_S3_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG

Automazione e Scripting

Script di Backup Completo

#!/usr/bin/env bash
#
# rclone-backup.sh - Script di backup automatizzato
# Usage: ./rclone-backup.sh [daily|weekly|monthly]
#

set -euo pipefail
IFS=$'\n\t'

# Configurazione
readonly SCRIPT_NAME=$(basename "$0")
readonly LOG_DIR="/var/log/rclone"
readonly LOG_FILE="${LOG_DIR}/backup-$(date +%Y%m%d-%H%M%S).log"
readonly LOCK_FILE="/var/run/rclone-backup.lock"
readonly CONFIG_FILE="${HOME}/.config/rclone/rclone.conf"

# Parametri
readonly LOCAL_SOURCE="/data"
readonly REMOTE_DEST="gdrive-crypt:backups"
readonly RETENTION_DAYS=30
readonly BANDWIDTH_LIMIT="50M"
readonly MAX_TRANSFERS=4

# Colori
readonly RED='\033[0;31m'
readonly GREEN='\033[0;32m'
readonly YELLOW='\033[1;33m'
readonly NC='\033[0m'

# Funzioni
log() {
    local level="$1"
    shift
    local message="$*"
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    echo -e "${timestamp} [${level}] ${message}" | tee -a "${LOG_FILE}"
}

cleanup() {
    rm -f "${LOCK_FILE}"
    log "INFO" "Pulizia completata, lock rilasciato"
}

check_dependencies() {
    local deps=("rclone" "flock")
    for dep in "${deps[@]}"; do
        if ! command -v "$dep" &> /dev/null; then
            log "ERROR" "Dipendenza mancante: $dep"
            exit 1
        fi
    done
}

acquire_lock() {
    exec 200>"${LOCK_FILE}"
    if ! flock -n 200; then
        log "ERROR" "Un'altra istanza è in esecuzione"
        exit 1
    fi
}

perform_backup() {
    local backup_type="${1:-daily}"
    local timestamp=$(date +%Y%m%d-%H%M%S)
    local dest_path="${REMOTE_DEST}/${backup_type}/${timestamp}"
    
    log "INFO" "Avvio backup ${backup_type} verso ${dest_path}"
    
    rclone sync "${LOCAL_SOURCE}" "${dest_path}" \
        --config "${CONFIG_FILE}" \
        --transfers "${MAX_TRANSFERS}" \
        --checkers 8 \
        --bwlimit "${BANDWIDTH_LIMIT}" \
        --log-file "${LOG_FILE}" \
        --log-level INFO \
        --stats 1m \
        --stats-log-level NOTICE \
        --exclude-from /etc/rclone/exclude.txt \
        --backup-dir "${REMOTE_DEST}/.versions/${timestamp}" \
        --suffix ".bak" \
        --fast-list \
        --retries 3 \
        --retries-sleep 10s \
        --ignore-errors
        
    local exit_code=$?
    
    if [ $exit_code -eq 0 ]; then
        log "INFO" "${GREEN}Backup ${backup_type} completato con successo${NC}"
    else
        log "ERROR" "${RED}Backup ${backup_type} fallito (codice: ${exit_code})${NC}"
    fi
    
    return $exit_code
}

cleanup_old_backups() {
    log "INFO" "Pulizia dei backup di oltre ${RETENTION_DAYS} giorni"
    
    rclone delete "${REMOTE_DEST}" \
        --config "${CONFIG_FILE}" \
        --min-age "${RETENTION_DAYS}d" \
        --rmdirs \
        --log-file "${LOG_FILE}" \
        --log-level INFO
        
    log "INFO" "Pulizia completata"
}

send_notification() {
    local status="$1"
    local message="$2"
    
    # Esempio con webhook Discord/Slack
    if [ -n "${WEBHOOK_URL:-}" ]; then
        curl -s -X POST "${WEBHOOK_URL}" \
            -H "Content-Type: application/json" \
            -d "{\"content\": \"[Rclone Backup] ${status}: ${message}\"}"
    fi
}

main() {
    local backup_type="${1:-daily}"
    
    # Inizializzazione
    mkdir -p "${LOG_DIR}"
    trap cleanup EXIT
    
    log "INFO" "=== Avvio ${SCRIPT_NAME} (${backup_type}) ==="
    
    check_dependencies
    acquire_lock
    
    # Esecuzione
    if perform_backup "${backup_type}"; then
        cleanup_old_backups
        send_notification "SUCCESS" "Backup ${backup_type} completato"
    else
        send_notification "FAILURE" "Backup ${backup_type} fallito"
        exit 1
    fi
    
    log "INFO" "=== Fine ${SCRIPT_NAME} ==="
}

main "$@"

Configurazione Cron

# Modifica la crontab
crontab -e

# Backup automatizzati
# Giornaliero alle 2:00
0 2 * * * /usr/local/bin/rclone-backup.sh daily >> /var/log/rclone/cron.log 2>&1

# Settimanale la domenica alle 3:00
0 3 * * 0 /usr/local/bin/rclone-backup.sh weekly >> /var/log/rclone/cron.log 2>&1

# Mensile il 1° del mese alle 4:00
0 4 1 * * /usr/local/bin/rclone-backup.sh monthly >> /var/log/rclone/cron.log 2>&1

# Pulizia della cache ogni giorno alle 5:00
0 5 * * * /usr/local/bin/rclone cleanup gdrive: --config /home/user/.config/rclone/rclone.conf

Timer Systemd (Alternativa a Cron)

# Servizio
sudo tee /etc/systemd/system/rclone-backup.service << 'EOF'
[Unit]
Description=Servizio di Backup Rclone
After=network-online.target

[Service]
Type=oneshot
User=rclone
ExecStart=/usr/local/bin/rclone-backup.sh daily
StandardOutput=journal
StandardError=journal
EOF

# Timer
sudo tee /etc/systemd/system/rclone-backup.timer << 'EOF'
[Unit]
Description=Esegui Backup Rclone Giornaliero

[Timer]
OnCalendar=*-*-* 02:00:00
RandomizedDelaySec=300
Persistent=true

[Install]
WantedBy=timers.target
EOF

# Attivazione
sudo systemctl daemon-reload
sudo systemctl enable --now rclone-backup.timer

# Verifica
systemctl list-timers | grep rclone

Ottimizzazione delle Prestazioni

Tuning dei Trasferimenti

# Configurazione ad alte prestazioni
rclone sync /source/ remote:dest/ \
  --transfers 16 \
  --checkers 32 \
  --buffer-size 512M \
  --drive-chunk-size 256M \
  --fast-list \
  --tpslimit 10 \
  --tpslimit-burst 20 \
  -P

Parametri per Provider

Google Drive

# Ottimizzazione Google Drive
rclone copy /data/ gdrive:backup/ \
  --drive-chunk-size 256M \
  --drive-upload-cutoff 256M \
  --drive-acknowledge-abuse \
  --drive-keep-revision-forever=false \
  --fast-list \
  -P

Amazon S3

# Ottimizzazione S3
rclone copy /data/ s3:bucket/path/ \
  --s3-chunk-size 100M \
  --s3-upload-cutoff 200M \
  --s3-upload-concurrency 8 \
  --s3-copy-cutoff 4G \
  --fast-list \
  -P

Backblaze B2

# Ottimizzazione B2
rclone copy /data/ b2:bucket/path/ \
  --b2-chunk-size 96M \
  --b2-upload-cutoff 200M \
  --b2-hard-delete \
  --fast-list \
  -P

Benchmarking

# Test di velocità
rclone test makefile /tmp/rclone_test_file --size 1G

# Benchmark completo
rclone test memory remote:path/
rclone test bandwidth remote:path/ --time 30s

# Misurare i trasferimenti
time rclone copy /test/1GB.bin remote:test/ -P --stats 1s

Gestione della Larghezza di Banda

# Limite fisso
--bwlimit 10M

# Limite variabile in base all'ora
--bwlimit "08:00,512K 18:00,10M 23:00,off"

# Limite separato upload/download
--bwlimit "10M:5M"  # 10M up, 5M down

Monitoraggio e Logging

Configurazione dei Log

# Livelli di log
--log-level DEBUG    # Molto verboso
--log-level INFO     # Standard
--log-level NOTICE   # Solo importante
--log-level ERROR    # Solo errori

# Uscita su file
--log-file /var/log/rclone/operation.log

# Formato JSON (per parsing)
--use-json-log

Statistiche Dettagliate

# Statistiche periodiche
rclone sync /source/ remote:dest/ \
  --stats 30s \
  --stats-file-name-length 0 \
  --stats-log-level NOTICE \
  --stats-one-line \
  -P

Monitoraggio con Prometheus

# Abilitare le metriche
rclone serve restic remote:path/ \
  --rc \
  --rc-addr :5572 \
  --rc-enable-metrics

# Endpoint Prometheus
curl http://localhost:5572/metrics

Script di Monitoraggio

#!/usr/bin/env bash
# rclone-health-check.sh

REMOTE="gdrive:"
LOG_FILE="/var/log/rclone/health.log"

check_remote() {
    if rclone lsd "${REMOTE}" --max-depth 1 &> /dev/null; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') [OK] ${REMOTE} accessibile" >> "${LOG_FILE}"
        return 0
    else
        echo "$(date '+%Y-%m-%d %H:%M:%S') [FAIL] ${REMOTE} inaccessibile" >> "${LOG_FILE}"
        return 1
    fi
}

check_mount() {
    local mount_point="/mnt/gdrive"
    if mountpoint -q "${mount_point}"; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') [OK] ${mount_point} montato" >> "${LOG_FILE}"
        return 0
    else
        echo "$(date '+%Y-%m-%d %H:%M:%S') [FAIL] ${mount_point} non montato" >> "${LOG_FILE}"
        return 1
    fi
}

check_remote
check_mount

Configurazione Logrotate

sudo tee /etc/logrotate.d/rclone << 'EOF'
/var/log/rclone/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 rclone rclone
    sharedscripts
    postrotate
        systemctl reload rclone-gdrive.service > /dev/null 2>&1 || true
    endscript
}
EOF

Risoluzione dei Problemi Esperti

Problemi Comuni e Soluzioni

Errore 403 - Limite di Velocità (Google Drive)

# Sintomo
ERROR : Failed to copy: googleapi: Error 403: User Rate Limit Exceeded

# Soluzioni
# 1. Ridurre il parallelismo
--transfers 2 --checkers 4

# 2. Aggiungere ritardi
--tpslimit 2 --tpslimit-burst 0

# 3. Utilizzare il proprio Client ID
# In rclone config, impostare client_id e client_secret personalizzati

Errore di Token Scaduto

# Rigenerare il token
rclone config reconnect gdrive:

# O manualmente
rclone authorize drive

Montaggio FUSE - Permesso Negato

# Controllare /etc/fuse.conf
grep user_allow_other /etc/fuse.conf

# Se commentato, decommentare
sudo sed -i 's/#user_allow_other/user_allow_other/' /etc/fuse.conf

# Utilizzare --allow-other
rclone mount remote: /mnt/point --allow-other

File Mancanti dopo Sync

# Eseguire sempre un dry-run prima
rclone sync source: dest: --dry-run

# Controllare le esclusioni
rclone ls source: --include "*.ext" -v

# Utilizzare check per confrontare
rclone check source: dest: --one-way --combined report.txt

Diagnostica Avanzata

# Modalità debug completa
rclone copy source: dest: -vv --dump headers --dump bodies

# Testare la connessione
rclone lsd remote: --timeout 30s

# Controllare la configurazione
rclone config show remote

# Elencare i backend e le funzionalità
rclone backend features remote:

# Test di prestazione rete
rclone test bandwidth remote: --time 30s

Recupero di Errori

# Riprendere un trasferimento interrotto
rclone copy source: dest: \
  --retries 10 \
  --retries-sleep 30s \
  --low-level-retries 20 \
  --ignore-errors

# Trattare i file in errore separatamente
rclone copy source: dest: \
  --error-on-no-transfer \
  2>&1 | tee transfer.log

# Ripetere solo gli errori
grep "ERROR" transfer.log | while read line; do
    # Estrarre e ritrasmettere
done

Casi d'Uso Produzione

Backup Server Web Completo

#!/usr/bin/env bash
# backup-webserver.sh

# Variabili
MYSQL_USER="backup"
MYSQL_PASS="secret"
BACKUP_DIR="/var/backups/web"
REMOTE="b2:webserver-backups"
DATE=$(date +%Y%m%d)

# Creare la directory di backup
mkdir -p "${BACKUP_DIR}/${DATE}"

# 1. Backup MySQL
mysqldump -u${MYSQL_USER} -p${MYSQL_PASS} --all-databases \
    | gzip > "${BACKUP_DIR}/${DATE}/mysql-all.sql.gz"

# 2. Backup file web
tar -czf "${BACKUP_DIR}/${DATE}/www.tar.gz" -C /var/www .

# 3. Backup configurazione
tar -czf "${BACKUP_DIR}/${DATE}/etc.tar.gz" \
    /etc/nginx /etc/php /etc/mysql /etc/letsencrypt

# 4. Caricare su cloud
rclone copy "${BACKUP_DIR}/${DATE}" "${REMOTE}/${DATE}/" \
    --transfers 4 \
    --b2-hard-delete \
    -P

# 5. Pulizia locale (mantenere 7 giorni)
find "${BACKUP_DIR}" -type d -mtime +7 -exec rm -rf {} +

# 6. Pulizia remota (mantenere 30 giorni)
rclone delete "${REMOTE}" --min-age 30d --rmdirs

Sincronizzazione Multi-Cloud

#!/usr/bin/env bash
# multi-cloud-sync.sh - Replicazione su più provider

SOURCES=("gdrive:important" "s3:bucket/important")
DESTINATIONS=("b2:redundancy" "wasabi:redundancy")

for src in "${SOURCES[@]}"; do
    for dst in "${DESTINATIONS[@]}"; do
        echo "Sincronizzazione ${src} -> ${dst}"
        rclone sync "${src}" "${dst}" \
            --transfers 8 \
            --fast-list \
            --checksum \
            -P
    done
done

Media Server con Rclone Mount

# Configurazione per Plex/Jellyfin
rclone mount gdrive:Media /mnt/media \
    --daemon \
    --allow-other \
    --uid $(id -u plex) \
    --gid $(id -g plex) \
    --umask 002 \
    --vfs-cache-mode full \
    --vfs-cache-max-size 100G \
    --vfs-cache-max-age 168h \
    --vfs-read-chunk-size 128M \
    --vfs-read-chunk-size-limit 1G \
    --buffer-size 512M \
    --dir-cache-time 168h \
    --poll-interval 1m \
    --log-file /var/log/rclone/media.log \
    --log-level NOTICE \
    --cache-dir /var/cache/rclone/media

Archiviazione con Versioning

# Sync con conservazione delle versioni
rclone sync /data/ remote:current/ \
    --backup-dir remote:versions/$(date +%Y%m%d) \
    --suffix .bak \
    --suffix-keep-extension \
    -P

# Ripristino di una versione
rclone copy remote:versions/20240115/file.txt.bak /restore/file.txt

Risorse e Riferimenti

Documentazione Ufficiale

Comandi Utili Rapidi

# Controllare lo spazio utilizzato
rclone size remote:path/

# Pulire i file temporanei
rclone cleanup remote:

# Montare con interfaccia web
rclone rcd --rc-web-gui --rc-addr :5572

# Esportare la config (senza segreti)
rclone config dump | jq 'del(..|.token?, .password?, .secret_access_key?)'