restic: cos’è?

Per chi ancora non lo conoscesse, restic è una potente risorsa open-source per effettuare backup.
Come si legge sul sito ufficiale (la traduzione è nostra),

Restic è un moderno programma di backup in grado di eseguire la copia dei vostri file:

  • da Linux, BSD, Mac e Windows
  • su molti tipi diversi di storage, compresi i servizi online e self-hosted
  • facilmente, essendo un singolo eseguibile che può essere eseguito senza un server o una complessa configurazione
  • in modo efficace, trasferendo solo le parti effettivamente modificate nei file di cui si esegue il backup
  • in modo sicuro, grazie all’uso attento della crittografia in ogni parte del processo
  • in modo verificabile, consentendovi di assicurarvi che i vostri file possano essere ripristinati quando necessario
  • liberamente - restic è completamente gratuito da usare e completamente open source

La predetta descrizione di restic - sebbene sintetica - illustra in modo puntuale tutti i punti di forza del software.

Infatti:

  • è multipiattaforma (Linux, BSD, Mac e Windows);
  • consente di effettuare il backup su supporti locali o in cloud;
  • è semplice da utilizzare;
  • funziona in modo incrementale, salvando soltanto i file che sono stati modificati;
  • è sicuro per l’uso della crittografia in tutte le fasi del backup;
  • è possibile eseguire il restore in modo semplice e sicuro;
  • è open-source e quindi è possibile esaminare il codice.

Non ci dilunghiamo sulla descrizione di restic poiché sul sito di riferimento c’è ampia documentazione sia descrittiva sia operativa.

La nostra esperienza su Mac

Abbiamo provato restic su Mac M1 con macOS Sonoma (14.4.1), installandolo via homebrew con il comando:

brew install restic

Successivamente alla installazione, abbiamo provato a effettuare con successo un backup su AWS S3, seguendo la guida.

In una fase iniziale era emersa un po’ di delusione fondamentalmente perché il tentativo di backup dell’intero hard disk del Macbook Pro non era andato a buon fine presentando degli errori.

Tuttavia, l’utilissimo confronto con altri utenti sul Forum è servito da un lato per chiarire che restic probabilmente non è stato pensato e sviluppato per clonare un intero hard disk e dall’altro per effettuare altre prove che ci hanno indotto a rivalutarlo completamente in ragione dei risultati eccellenti ottenuti.

Tutto ha funzionato benissimo, in tempi relativamente rapidi e con enorme soddisfazione.

La flessibilità di restic è sia nei comandi sia nelle numerose variabili che si possono utilizzare.

autorestic

Ciò che manca a restic e la programmazione dei backup, tanto che - dopo alcune ricerche - abbiamo scelto autorestic.

autorestic

Abbiamo scelto autorestic, ma merita di essere menzionato anche resticprofile sebbene sembra il progetto sembra fermo al 2020 con l’ultima release.

Autorestic su Mac si può installare comodamente con Homebrew e precisamente:

brew install autorestic

come emerge dalla documentazione che, tuttavia, non ci sembra completa.

autorestic: la configurazione

Autorestic richiede la creazione del suo file di configurazione che va collocato in .config/autorestic/.autorestic.yml, così come indicato nella documentazione.
Tuttavia, è possibile collocare il file di configurazione anche in:

  • ./.autorestic.yml
  • ~/.autorestic.yml
  • ~/.config/autorestic/.autorestic.yml

Abbiamo scelto di collocare il file in .config/autorestic/.autorestic.yml.

In ragione del proprio assetto, il file deve essere completato con i necessari parametri.

Abbiamo utilizzato il servizio healthchecks.io per gli hooks e abbiamo voluto creare una password forte da salvare in un file che abbiamo chiamato restic.txt con il comando

openssl rand -base64 2048 > restic.txt

Comunque, la password può essere generata con qualsiasi altro software e si può scegliere di non salvarla in un file ma di inserirla nel file di configurazione del quale riportiamo un esempio di seguito:

version: 2

global:
  forget: prune
  forget:
    keep-within: 7


locations:
  locationname01:
    forget: prune
    from: yourpathfrom
    to: nameofthebackend
    cron: '0 1 * * *' # Every day at 1am
    hooks:
      prevalidate:
        - echo "Checks"
      before:
        - 'curl -m 10 --retry 5 -X POST -H "Content-Type: text/plain" --data "Starting backup for location: ${AUTORESTIC_LOCATION}" https://hc-ping.com/<code>/start'
      after:
        - 'curl -m 10 --retry 5 -X POST -H "Content-Type: text/plain" --data "Executed backup for location: ${AUTORESTIC_LOCATION}" https://hc-ping.com/<code>'
      failure:
        - 'curl -m 10 --retry 5 -X POST -H "Content-Type: text/plain" --data "Backup failed for location: ${AUTORESTIC_LOCATION}" https://hc-ping.com/<code>/fail'
      success:
        - 'curl -m 10 --retry 5 -X POST -H "Content-Type: text/plain" --data "Backup successful for location: ${AUTORESTIC_LOCATION}" https://hc-ping.com/<code>'
    options:
      forget:
        keep-within: 7
      backup:
        tag: yourtag

  locationname02:
    forget: prune
    from: yourpathfrom
    to: yourbackend
    cron: '0 1 * * *' # Every day at 1am
    hooks:
      prevalidate:
        - echo "Checks"
      before:
        - 'curl -m 10 --retry 5 -X POST -H "Content-Type: text/plain" --data "Starting backup for location: ${AUTORESTIC_LOCATION}" https://hc-ping.com/<code>/start'
      after:
        - 'curl -m 10 --retry 5 -X POST -H "Content-Type: text/plain" --data "Executed backup for location: ${AUTORESTIC_LOCATION}" https://hc-ping.com/<code>'
      failure:
        - 'curl -m 10 --retry 5 -X POST -H "Content-Type: text/plain" --data "Backup failed for location: ${AUTORESTIC_LOCATION}" https://hc-ping.com/<code>/fail'
      success:
        - 'curl -m 10 --retry 5 -X POST -H "Content-Type: text/plain" --data "Backup successful for location: ${AUTORESTIC_LOCATION}" https://hc-ping.com/<code>/start'
    options:
      forget:
        keep-within: 7
      backup:
        tag: yourtag

  locationname03:
    forget: prune
    from: yourpathfrom
    to: yourbackend
    cron: '0 1 * * *' # Every day at 1am
    hooks:
      prevalidate:
        - echo "Checks"
      before:
        - 'curl -m 10 --retry 5 -X POST -H "Content-Type: text/plain" --data "Starting backup for location: ${AUTORESTIC_LOCATION}" https://hc-ping.com/<code>/start'
      after:
        - 'curl -m 10 --retry 5 -X POST -H "Content-Type: text/plain" --data "Executed backup for location: ${AUTORESTIC_LOCATION}" https://hc-ping.com/<code>'
      failure:
        - 'curl -m 10 --retry 5 -X POST -H "Content-Type: text/plain" --data "Backup failed for location: ${AUTORESTIC_LOCATION}" https://hc-ping.com/<code>/fail'
      success:
        - 'curl -m 10 --retry 5 -X POST -H "Content-Type: text/plain" --data "Backup successful for location: ${AUTORESTIC_LOCATION}" https://hc-ping.com/<code>'
    options:
      forget:
        keep-within: 7
      backup:
        tag: yourtag

  locationname04:
    forget: prune
    from: yourpathfrom
    to: aws
    cron: '0 1 * * *' # Every day at 1am
    hooks:
      prevalidate:
        - echo "Checks"
      before:
        - 'curl -m 10 --retry 5 -X POST -H "Content-Type: text/plain" --data "Starting backup for location: ${AUTORESTIC_LOCATION}" https://hc-ping.com/<code>/start'
      after:
        - 'curl -m 10 --retry 5 -X POST -H "Content-Type: text/plain" --data "Executed backup for location: ${AUTORESTIC_LOCATION}" https://hc-ping.com/<code>'
      failure:
        - 'curl -m 10 --retry 5 -X POST -H "Content-Type: text/plain" --data "Backup failed for location: ${AUTORESTIC_LOCATION}" https://hc-ping.com/<code>/fail'
      success:
        - 'curl -m 10 --retry 5 -X POST -H "Content-Type: text/plain" --data "Backup successful for location: ${AUTORESTIC_LOCATION}" https://hc-ping.com/<code>'
    options:
      forget:
        keep-within: 7
      backup:
        tag: yourtag

backends:
  yourbackendname:
    type: s3
    path: s3.amazonaws.com/yourbacket
    key: pathofyourkeyfile
    env:
      AWS_ACCESS_KEY_ID: "account_id"
      AWS_SECRET_ACCESS_KEY: "account_key"

Poiché nel file di configurazione di autorestic abbiamo aggiunto il parametro cron è necessario impostare su Mac il cron mediante il comando

crontab -e

e inserire le seguenti linee (per il PATH bisogna verificare che sia corretto in funzione della configurazione):

# This is required, as it otherwise cannot find restic as a command.
PATH="/usr/bin:/opt/homebrew/bin/"

# Example running every day at 1am
0 1 * * * autorestic -c yourpath/.config/autorestic/.autorestic.yml --ci cron > /tmp/autorestic.log 2>&1

I valori 0 1 * * * indicano che il comando verrà eseguito ogni giorno alle ore 1:00.

Per verificare che il cron sia correttamente impostato si può lanciare il comando

crontab -l

che dovrebbe restituire la configurazione inserita.

A questo punto, si deve inizializzare il backend con il comando:

autorestic init

e quando il processo è terminato, eseguire il backup con il comando:

autorestic backup -a

che esegue il backup per tutte le location inserite nel file di configurazione.

Successivamente, va lanciato il comando

autorestic cron

A questo punto, autorestic dovrebbe provvedere autonomamente a eseguire il backup secondo la configurazione impostata.


Se questa risorsa è stata utile, puoi contribuire con

Buy me a coffee

o donare via

Liberapay


Seguici su Mastodon

Stay tuned!