Per la sincronizzazione dei file tra due o più dispositivi molti si affidano ad un servizio cloud, sia esso preconfigurato nel dispositivo (come Google Drive, OneDrive, iCloud, ...) o esterno. Ma poiché il cloud altro non è che "il computer di qualcun altro", alcuni file potrebbe essere meglio tenerli privati, inoltre anche se lo standard di questi servizi è piuttosto alto, dovremo subire temporanei disservizi che di solito si presentano nel momento peggiore. Fortunatamente c'è Syncthing che ci consente facilmente di creare un nostro cloud personale, efficace, privato e sicuro e su una incredibile quantità di dispositivi!
Infatti Syncthing può essere installato, oltre naturalmente su tutti i principali sistemi operativi (Windows, Linux, MacOS ma non solo: FreeBSD, OpenBSD, NetBSD, DragonflyBSD, ...) anche su RaspberryPi o NAS di diverse marche! Non manca naturalmente una versione per Android (disponibile sul PlayStore e su F-Droid) di cui esiste anche una versione derivata e ottimizzata per questo sistema; mentre non esiste un client ufficiale per iOS (e non è nemmeno in programma!) ma possiamo comunque sincronizzare i nostri file tramite un app di terze parti compatibile, Mobius Sync, naturalmente con tutte le limitazioni imposte da questa piattaforma estremamente chiusa.
Come funziona Syncthing?
Prima di vedere in dettaglio come installare e configurare Syncthing, vediamo un po' come funziona, quali sono le sue particolarità, i suoi punti di forza e, perché no, anche i suoi limiti.
Syncthing è un programma server che una volta avviato (solitamente da riga di comando) mette a disposizione una semplice interfaccia web, raggiungibile tramite browser sul computer dov'è in esecuzione, direttamente a questo link: http://127.0.0.1:8384
Come vedremo più avanti, da questa pagina è possibile configurare quasi ogni aspetto di Syncthing tra cui la sincronizzazione delle cartelle locali e il comportamento (mirror, versioning, ...) con altri dispositivi associati dove è installato Syncthing: per sincronizzare i file tra più dispositivi è infatti necessario che il programma sia installato e attivo su ognuno di questi.
Una volta installato Syncthing, questo genera un ID unico che sarà utilizzato per associare i dispositivi da sincronizzare. Questo è anche l'unico dato sufficiente per individuare dispositivi, non solo nella LAN ma anche attraverso internet, senza necessità di avere un IP fisso o un dominio assegnato! Ciò è possibile grazie a dei server (detti Discovery Server) mantenuta dallo sviluppatore (ma chiunque può mettere su un Discovery server): per impostazione predefinita, Syncthing è configurato per sincronizzare i file anche attraverso internet, si annuncia (ovviamente tramite connessione sicura TLS) con il proprio ID e l'IP attuale a questi server ogni 30 minuti e richiede informazioni riguardo la "posizione" degli altri dispositivi associati. Chi vede un punto debole in questo sistema, sbaglia: l'autenticazione e la sincronizzazione dei file avvengono in maniera criptata con chiavi che due o più client si sono precedentemente scambiati, durante la procedura di associazione; conoscere l'ID e l'IP del dispositivo non consente di connettersi a questo in alcun modo.
C'è poi un'altra rete di server (detti Relay Server) anche questi mantenuti dallo sviluppatore e da volontari che intendono così sostenere il progetto, che consente, qualora non sia possibile la comunicazione diretta tra dispositivi, di veicolare il traffico dato dalla sincronizzazione dei file attraverso internet. Anche in questo caso, nessun problema di sicurezza o privacy perché i dati scambiati non sono mai salvati su questi server e comunque sono crittografati end-to-end, da un capo all'altro ovvero dal dispositivo di origine al dispositivo di destinazione; i relay non possono quindi vedere il contenuto dei blocchi scambiati né possono manometterli (fallirebbe il controllo dell'integrità e il pacchetto corrotto verrebbe scartato e scaricato di nuovo).
La sincronizzazione dei file tramite Syncthing è anche estremamente efficiente perché ogni file condiviso è diviso in blocchi di dimensione variabile a secondo della dimensione del file di partenza e per ogni blocco viene calcolato un hash, creando così una lista di blocchi che comprende tutti i dati necessari (dimensione, posizione, hash, nome del file, ...). Quando avviene un cambiamento in un file, Syncthing se ne accorge e lo segnala, al momento giusto, agli altri dispositivi comunicandogli la lista dei nuovi blocchi. In caso di un blocco con hash diverso da quello corrente, Syncthing scaricherà il nuovo blocco, verificherà che l'hash corrisponda a quello desiderato e scriverà una copia temporanea del file. Questo consente di avere anche più versioni dello stesso file; dall'altro lato però, in caso di molti file condivisi tutti in una volta (come nel caso di una prima configurazione), l'operazione di hash di tutti i blocchi, può portare momentaneamente l'utilizzo della CPU al massimo.
È possibile che un file venga modificato su più dispositivi contemporaneamente; in questo caso Syncthing si trova di fronte ad un conflitto: sa quali sono i blocchi cambiati ma potrebbero avere hash diversi su dispositivi diversi. In questa caso Syncthing ha una procedura piuttosto rigida: sincronizza tutti i file "marcando" il file modificato per primo secondo questo schema <nomefile>.sync-conflict-<data>-<ora>-<modificatadaldispositivo>.<ext>
; se i file sono modificati esattamente nello stesso momento, il file rinominato sarà quello proveniente dal dispositivo aggiunto per ultimo alla condivisione. I file rinominati in questo modo verranno propagati su tutti i dispositivi come normali file fino a che l'utente non ne cancellerà una versione su un dispositivo. Se un file viene cancellato su un dispositivo e modificato su un altro, il file modificato "vince" per così dire e verrà ridistribuito anche al dispositivo che dove è stato cancellato.
Insieme al contenuto e al nome del file (è utile ricordare, soprattutto agli utenti Windows, che Syncthing è case sensitive), vengono anche sincronizzati alcuni dati di contorno come permessi dei file, link simbolici, proprietari e gruppi di file e cartelle e alcuni attributi estesi ma molto dipende dal sistema in uso e dal filesystem dove vengono salvati i dati.
A questo punto, molti staranno pensando a Syncthing come un ottimo sistema per fare il backup di foto o documenti ma sappiate che, se pur possibile utilizzarlo per tal fine, per ammissione dello stesso autore, non è pensato per questo scopo.
Dopo questa lunga introduzione, assolutamente dovuta per svelare almeno un po' della "magia" che si nasconde dietro a Syncthing, veniamo alla pratica!
Installazione e avvio automatico
Ci limiteremo a segnalare il metodo più pratico per l'installazione sulle principali piattaforme, trascurando quelle meno comuni e vedremo anche come è possibile avviare Syncthing in maniera automatica in modo da sfruttarlo al massimo del suo potenziale.
Per tutti i sistemi supportati è possibile scaricare il pacchetto compresso relativo dal Github ufficiale, scompattarlo ed eseguire Syncthing; l'installazione tramite questo sistema prevede anche l'aggiornamento automatico.
Per Linux: quasi tutte le distro hanno una versione di Syncthing nei loro repository (se questa fosse datata possiamo sempre provare a scaricare il pacchetto .tar.gz dal Github), facilmente installabile nei modi di uso.
» Leggi: Come si installa un programma su Linux?
Entrambi i metodi di installazione includono un comodo servizio (che può essere abilitato per ogni utente presente sul sistema) in modo da avviare Syncthing al login del nostro utente, basta digitare:
sudo systemctl enable --now syncthing@nomeutente
Se la nostra distro non utilizza systemd, niente paura: lo sviluppatore ha aggiunto anche script per altri sistemi di init!
In alcune distro sono presenti anche pacchetti dal nome syncthing-gtk
o qsyncthingtray
che offrono un integrazione minima con il sistema, presentando un icona per il controllo dello stato di Syncthing.
ATTENZIONE: alcune distro possono cambiare l'indirizzo predefinito dell'interfaccia grafica Web (ad esempio, su Linux Mint risulta http://127.0.0.1:8080).
Per quanto riguardo Windows è presente un pacchetto ufficiale .zip che può essere scompattato dove ci torna meglio e da lì eseguito ma può essere installato anche tramite il mio gestore pacchetti preferito su questa piattaforma, scoop
, con il semplice comando
scoop install syncthing
Per l'avvio automatico su questa piattaforma lo sviluppatore consiglia diversi metodi, alcuni prevedono l'utilizzo di programmi terzi mentre altri prevedono di sfruttare gli strumenti già presenti in Windows come la cartella di Avvio automatico
o l'opzione che personalmente preferisco perché consente un controllo più preciso per l'avvio e l'arresto: le Operazioni pianificate
.
Per migliorare l'integrazione con il sistema è possibile installare anche SyncTrayzor
, sempre disponibile tramite scoop
(dopo aver abilitato il bucket extras con il comando scoop bucket add extras
), che offre anche un pratico sistema per la configurazione dell'avvio automatico
scoop install synctrayzor
» Leggi: Scoop: il package manager per Windows!
Per MacOS, oltre ai metodi già indicati, possiamo utilizzare il gestore pacchetti brew
, attenzione solo che Syncthing è presente sia come Formulae che come Cask ed è meglio utilizzare la seconda versione (perché scaricata direttamente dal Github ed in grado di autoaggiornarsi!); il comando sarà quindi
brew install --cask syncthing
» Leggi: Guida a Homebrew: il gestore pacchetti mancanti per MacOS
La versione per MacOS è un po' "anomala" rispetto alle altre, perché, senza installare app aggiuntive, si presente come normale applicazione nel Finder
e se avviata, mostra un'icona nella barra per il controllo dello stato di Syncthing; cliccando su questa icona e scegliendo Preference
, avremo la possibilità di attivare anche l'avvio automatico al login
Per quanto riguarda Android come detto le app disponibili sono almeno 2: quella ufficiale e Syncthing-fork. Se cercate sul PlayStore (o anche in F-Droid) potrete trovare anche Syncthing-Lite ma questa app non è più sviluppata dal 2019 ed è quindi da lasciar perdere. Personalmente prediligo le app ufficiali e per questo mostrerò l'installazione di questa nella guida.
» Leggi: Guida a F-Droid: il miglior market alternativo per Android
Installiamo l'app e avviamola: una rapida configurazione guidata ci consentirà di concedere i permessi necessari ed escludere l'app di Syncthing dall'ottimizzazione della batteria (pena il non corretto funzionamento dell'app!).
Oltre all'ovvio permesso di accesso a tutti i file della memoria, Syncthing richiede opzionalmente anche il permesso di accesso alla posizione, necessario solo se vogliamo limitare la sincronizzazione solo su determinati reti Wi-Fi.
Impostazioni di base
Una volta installato e avviato Syncthing sul nostro computer possiamo aprire un browser e andare all'indirizzo dell'interfaccia web (che ricordo essere http://127.0.0.1:8384); ci apparirà la seguente schermata
Ignoriamo per adesso il messaggio di avviso e andiamo ad impostare la lingua italiana per l'interfaccia cliccando in alto a destra su English
e scegliendo poi Italian
.
Con un rapido sguardo a questa pagina possiamo già notare che non ci sono cartelle condivise né dispositivi remoti associati mentre nel riquadro Questo dispositivo
possiamo vedere che non c'è e non c'è stato (ovviamente) trasferimento di dati né limiti impostati, che Syncthing è in ascolto su tutte e 3 le interfacce disponibili (oltre al Discovery Server utilizza una connessione TCP e una QUIC) e cerca dispositivi su 4 dei 5 possibili canali (l'unico escluso è la connessione internet IPv6 perché non disponibile). Vediamo poi il tempo di funzionamento, il codice di identificazione (vedremo poi come cliccandolo, si riesca ad associare facilmente un dispositivo...) e la versione installata.
Torniamo adesso al messaggio di avviso che ci dice di prendere in considerazione la possibilità di impostare un username e una password per l'autenticazione, in modo da evitare che gli altri utenti del computer in uso, possano accedere a questa interfaccia. Se siamo gli unici utenti del computer possiamo anche ignorarlo cliccando su OK
altrimenti, cliccando su Impostazioni
, possiamo impostare facilmente un nome utente e una password dalla tab Interfaccia grafica utente
Come si vede in questa tab, avremo anche la possibilità di impostare una connessione sicura HTTPS
per l'accesso a questa interfaccia, indispensabile soprattutto se decidiamo di rendere accessibile questa pagina anche attraverso internet (modificando l'Indirizzo dell'interfaccia grafica da quello preimpostato, ad esempio, a 0.0.0.0:8384) o su reti locali non sicure. In questa tab avremo infine la possibilità di scegliere il tema dell'interfaccia (Tema GUI
). Dato che abbiamo aperto queste Impostazioni
(sempre raggiungibili dalla pagina iniziale, cliccando prima su Azioni
), diamo una rapida occhiata anche alle altre tab; partiamo da Connessioni
Qui troviamo la possibilità di limitare la banda per il traffico in entrata o in uscita e di personalizzare il protocollo per la sincronizzazione. Possiamo anche indicare un diverso server per la ricerca dei dispositivi su internet (di solito da non modificare a meno che non si intenda mettere su un Discovery Server personale) o disattivare questa funzione (lasciando la possibilità di sincronizzare solo su rete locale) togliendo la spunta a Individuazione Globale
.
Nelle ultime due tab abbiamo la possibilità di vedere i dispositivi o cartelle esclusi dalla sincronizzazione.
Torniamo adesso alla prima tab, Generale
: abbiamo la possibilità di personalizzare il Nome dispositivo
, utile in caso di più dispositivi per individuare subito quello interessato. Subito sotto possiamo personalizzare la percentuale minima di spazio libero su disco sotto il quale Syncthing smetterà di sincronizzare i file; accanto troviamo la Chiave API
che consente l'autenticazione per altri processi (come ad esempio SyncTrayzor) che intendono controllare Syncthing. Ancora sotto possiamo scegliere se inviare statiche di utilizzo anonime e gestire l'auto aggiornamento. Infine abbiamo due link che consentono di modificare le impostazioni predefinite per le cartelle condivise e per i dispositivi associati.
Approfondiamo anche queste ultime due impostazioni, cliccando prima su Modifica impostazioni predefinite cartella
ci troveremo di nuovo di fronte ad una finestra con più schede; partiamo da Generale
Avremo la possibilità di inserire una descrizione per la cartella predefinita di condivisione e anche specificare in quale percorso la vogliamo. Saltiamo la scheda Condivisione
perché ancora non abbiamo associato nessun altro dispositivo e passiamo alla interessantissima tab Controllo versione
Il controllo versione è una funzione che consente di conservare in locale le vecchie versioni dei file che vengono modificati su dispositivi remoti e poi sincronizzati e possiamo specificare 4 diversi modi di effettuare tale controllo (oltre a escludere del tutto tale funzione): con Cestino
, Semplice
, Cadenzato
ed Esterno
.
con Cestino
: consente di spostare i vecchi file modificati in una apposita cartella (di cui possiamo personalizzare il percorso); se il file spostato ha lo stesso nome di uno già presente in questa speciale cartella, quello più vecchio viene sovrascritto dal nuovo ed è anche possibile programmare lo svuotamento di questa cartella dopo un tot di giorni;Semplice
: differisce dal primo per la possibilità di specificare quante versioni di un file modificato vogliamo tenere (di default 5) in modo che, quando abbiamo già 5 versioni dello stesso file, una nuova modifica, farà cancellare il file più vecchio;Cadenzato
: consente di conservare più versioni di uno stesso file in un determinato periodo di tempo, nello specifico viene conservata una versione ogni 30 secondi per la prima ora, una versione ogni ora per il primo giorno, una versione ogni giorno per i primi 30 giorni e infine una versione alla settimana per il restante tempo. Ovviamente tutte queste versioni vengono salvate solo se il file viene modificato e sincronizzato in questi lassi di tempo e possiamo anche impostare un periodo massimo dopo il quale tutte le versioni verranno cancellate;Esterno
: delega ad un comando esterno (ad esempio, uno script che sposta nel Cestino del sistema operativo i file più vecchi) il controllo della versione; questo comando viene eseguito ogni volta che un file modificato viene sincronizzato.
Nella scheda Schemi esclusione
file è possibile specificare degli schemi per l'esclusione di alcuni file dalla sincronizzazione, utile ad esempio per evitare di sincronizzare i file delle anteprime delle foto o alcuni file nascosti.
Nell'ultima scheda Avanzate
possiamo decidere se sincronizzare anche alcuni metadati dei file come permessi, proprietà e attributi estesi, attivare o meno il controllo dei cambiamenti dei file da sincronizzare (specificando anche un intervallo di tempo) e anche se impostare il dispositivo corrente per ricevere soltanto o inviare soltanto i file modificati (modificando il metodo predefinito che è quello di inviare e ricevere). Infine troviamo di nuovo il controllo dello spazio minimo del disco.
Chiudiamo questa finestra e torniamo ad Impostazioni
, Generale
per andare a vedere le due schede che si presentano cliccando su Modifica impostazioni predefinite dispositivo
. Saltiamo la prima scheda Generale
dove abbiamo ancora una volta la possibilità di impostare un Nome dispositivo
e andiamo a vedere subito la scheda Avanzate
Abbiamo ancora la possibilità di limitare la velocità di trasferimento dei dati in entrata e in uscita, di attivare la Compressione
per i dati da sincronizzare e impostare il dispositivo come Non attendibile
in modo che ogni cartella condivisa con questa dispositivo sia protetta da una password senza la quale risulta impossibile accedere ai dati sincronizzati. Infine abbiamo la possibilità di modificare l'indirizzo del dispositivo utile soprattutto se abbiamo un IP statico o un dominio associato altrimenti conviene lasciare l'impostazione predefinita dynamic
per il rilevamento automatico.
Adesso che abbiamo curiosato un po' nelle impostazioni procediamo all'associazione di un dispositivo!
Associazione dispositivi
Per questa guida simulerò un caso che ritengo molto comune, un computer con Windows e un telefono Android. Sul dispositivo Android, come detto, ho preferito installare la versione ufficiale di Syncthing.
Su Windows, apriamo l'interfaccia web di Syncthing, clicchiamo sul codice presente alla riga Identificazione
, nel riquadro Questo dispositivo
; si aprirà così una finestra con l'intero codice di identificazione e un comodissimo codice QR che potremo scansionare con la fotocamera del nostro smartphone.
Per fare questa operazione, sul nostro dispositivo Android, dovremo aprire Syncthing, selezionare la pagina Dispositivi
e tappare il +
in alto a destra e ancora il simbolo del codice QR
; apparirà così l'avviso per concedere il permesso all'utilizzo della fotocamera, lascio a voi scegliere se Solo questa volta
o Mentre usi l'app
.
Appena inquadrato il QR il dispositivo verrà riconosciuto e prima di aggiungerlo tappando il segno di spunta
sarà possibile assegnargli un nome.
Torniamo al nostro computer dove la pagina di gestione di Syncthing in breve tempo dovrebbe mostrare la richiesta per aggiungere il nuovo dispositivo associato (se così non fosse, provate ad aggiornare manualmente la pagina); confermiamo cliccando su Aggiungi dispositivo
. Da notare che nessun dispositivo viene aggiunto in automatico ma richiede sempre una conferma!
A questo punto inizierà subito la sincronizzazione tra i due dispositivi ma dato che al momento non stanno condividendo nessuna cartella, la sincronizzazione sarà quasi istantanea.
Per impostazione predefinita, la versione di Syncthing per Android ha in condivisione una cartella nominata Camera
, il cui percorso è /storage/emulated/0/DCIM
, che contiene di solito tutte le foto scattate con la fotocamera, ma questa non sarà subito condivisa con il nuovo dispositivo (un altra bella sicurezza!), dovremo abilitare la condivisione tappando su detta cartella nell'app di Syncthing e commutando lo switch relativo al nome del dispositivo appena associato; possiamo anche notare che il tipo di condivisione di questa cartella è Invia soltanto
in modo che nessuna operazione fatta sul dispositivo remoto possa modificare i file in locale (sul dispositivo Android!). Potremo anche scegliere se abilitare il Controllo versione
per questa cartella (inutile se abbiamo selezionato Invia soltanto
!), selezionare l'Ordine di prelievo
dei file (salvo particolari esigenze consigli di lasciare Casuale
) e configurare uno Schema di esclusione
.
In maniera analoga all'aggiunta del dispositivo, nell'interfaccia web di Syncthing sul nostro computer, apparirà in breve tempo un avviso per confermare l'aggiunta della cartella condivisa che potremo confermare con Aggiungi
. I dispositivi verranno nuovamente sincronizzati e questa volta la durata dell'operazione dipenderà dalla quantità di foto!
Se andremo ad associare un terzo dispositivo, effettuando l'operazione da questo, avremo la possibilità di marcare uno dei dispositivi già associati come Introduttore
, in modo che le cartelle già condivise dai primi due vengano condivise subito con il nuovo dispositivo, altrimenti dovremo condividere manualmente ogni cartella anche con l'ultimo dispositivo associato.
Aggiungere un altra cartella da condividere
Per condividere una nuova cartella, su Android, una volta nella tab Cartelle
, dovremo tappare il +
in alto a destra; nella nuova schermata potremo scegliere un nome per la cartella da condividere e poi tappare sulla riga Cartella
per aprire il gestore dei file proprio di Android. Adesso dovremo entrare nella cartella che vogliamo condividere e tappare su Usa questa cartella
; infine potremo selezionare il dispositivo con il quale condividere, il tipo di condivisione che ci interessa e tutte le altre opzioni già viste prima di concludere l'operazione con un tap sul segno di spunta
in alto a destra. Anche questa volta dovremo accettare la nuova condivisione sul dispositivo con il quale abbiamo scelto di condividere la nuova cartella.
Su computer (sia esso Windows, Linux o MacOS) possiamo condividere una nuova cartella sempre dall'interfaccia Web, cliccando su Aggiungi cartella
, scegliendo un Nome
e il percorso alla cartella utilizzata.
ATTENZIONE: su Windows il percorso potrebbe non essere quello che vediamo abitualmente; ad esempio la cartella C:\Utenti\nomeutente\Documenti
, in realtà è vista dal sistema come C:\Users\nomeutente\Documents
!
Dovremo anche qui scegliere con quale dispositivo vogliamo condividere la nuova cartella e impostare come preferiamo tutte le opzioni viste. Terminiamo la procedura con Salva
e controlliamo il nostro dispositivo Android dove una notifica dovrebbe avvertirci di una nuova condivisione che, anche in questo caso, dovremo confermare con Accettare
. Mentre sugli altri sistemi la nuova cartella condivisa viene automaticamente creata, su Android dovremo crearla manualmente e infine concedere il permesso a Syncthing di accedervi.