Backup

Entwickelt: 2022 ... 2024

Natürlich mache ich nicht erst seit 2 Jahren Backups - irgendwann habe ich aber mal beschlossen, dass es Zeit für ein Teilchen ist, das ich auf allen Rechnern nutzen und mit dem ich die unterschiedlichen Backup-Anforderungen auf Clients und Servern möglichst einfach abdecken kann.

Was und wie will ich sichern?

  • Diverse Verzeichnisse (nein, ich mag keine kompletten System-Backups - wenn die SSD den Geist aufgibt, dann installiere ich lieber neu)
  • Lokale PostgreSQL- und MySQL-Datenbanken
  • Docker- und Docker-Compose-Installationen
  • Verschlüsselte Dateisysteme (nutze ich, um vertrauliche Daten zu schützen, z. B. im Job)
  • Gitlab
  • Außerdem will ich vor und / oder nach dem Backup vielleicht noch andere Aktionen ausführen (z. B. Aufräumen, Dienste stoppen oder starten ...)
  • Das Backup soll direkt auf der Kommandozeile (Clients) und per crontab (Server) laufen können
  • Die Sicherung der 1. Generation erfolgt auf ein NAS, es soll eine 2. + 3. Generation auf externe USB-Festplatten möglich sein (die nach dem Backup abgeschaltet und z. T. auch woanders geparkt werden)

Das Backup-Script

  • Liest zuerst die im 1. Argument angegebene Environment-Datei ein, die die rechnerspezifischen Backup-Parameter enthält (siehe nächster Abschnitt). Wenn der Parameter fehlt oder die Datei nicht gelesen werden kann, steigt das Script mit einem Usage-Error aus.
  • Prüft dann, ob es mit root-Rechten läuft (ist für einige Backup-Operationen erforderlich), sonst bricht es mit einer Fehlermeldung ab
  • Checkt dann den optionalen 2. Parameter, ist der gleich -c, dann läuft es im crontab-Modus und schreibt alle Meldungen in ein Logfile. Im interaktiven Modus erscheinen die auf der Konsole
  • Führt die Backup-Steps in folgender Reihenfolge aus (wenn im Environment definiert):
    • PreBackup-Scripts
    • Gitlab-Backup über das definierte Kommando
    • DB-Backups per pg_dump bzw. mysqldump für alle vorhandenen Datenbanken
    • Verzeichnisse per rsync auf das NAS
    • Verschlüsselte Dateisysteme per cp auf das NAS - nur, wenn sie nicht gemountet sind!
    • NAS auf USB-Devices (Gen2 + Gen3) per rsync - nur, wenn diese gemountet sind!
    • Crontab-Logs, die älter als 7 Tage sind, werden gelöscht
    • PostBackup-Scripts

Das rechnerspezifische Environment
besteht für jeden Rechner aus einer Datei mit fest definierter Struktur, ist am besten mit ein paar Beispielen zu erklären. Ich habe bei Mehrfach-Attributen (z. B. für zu sichernde Verzeichnis-Strukturen) Arrays definiert, deren Elemente teilweise über Trennzeichen Ausnahmen oder zusätzliche Optionen definieren.
Sieht auf den ersten Blick etwas unübersichtlich aus, ich wollte das so kompakt wie möglich halten.

Beispiel für einen Client, an dem auch die USB-Laufwerke für die 2. + 3. Generation hängen (Zeilen umgebrochen zur Übersicht):

jan@jake:~/bin$ cat -n backup_env.sh
 1  # environment for system backup
 2  ### TODO customize for each system!
 3  # 2nd + 3rd gen backup to usb? leave empty if not
 4  export BKP_USB_2GEN=/media/jan/Backup_2TB
 5  export BKP_USB_3GEN=/media/jan/Backup2_4TB
 6  # directories and excludes: /dir/:[excl[#excl]] - 
      /etc should be included for every system
 7  declare -a directories=( "/etc/:" "/home/jan/:.cache"
      "/datadisk/:/audio#/devel/macros/.data" )
 8  # databases: type; types = postgres|mariadb - leave empty
      if there are no databases
 9  declare -a db_types=( "postgres" )
10  # gitlab backup command - leave empty if no gitlab is present
11  export GITLAB_BKP_CMD=
12  # encrypted devices: device#mount_point - leave empty if no devices exist
13  declare -a enc_fs=( "/datadisk/devel/macros/.data/data_dev#data_mount" )
14  # pre and post backup scripts (i. e. stop / start services): user|-:command
15  declare -a pre_bkp_scripts=( "jan:/home/jan/bin/bkp_git_repos.sh"
      "jan:/home/jan/bin/upd_docs_sites.sh" )
16  declare -a post_bkp_scripts=(  )
  • Zeilen 4 + 5: Pfade zu den USB-Disks, wenn sie gemountet sind
  • Zeile 7: Die zu sichernden Verzeichnisse, nach dem Doppelpunkt optional eine Liste auszuschließender Subdirectories, wenn es mehrere sind, durch # getrennt
  • Zeile 9: zu sichernde DBMS - es werden alle vorhandenen Datenbanken gesichert
  • Zeile 11: Kein Gitlab zu sichern
  • Zeile 13: verschlüsselte FS - Pfad zum Device, hinter dem # der Mountpunkt parallel zum Device
  • Zeile 15: PreBackup-Scripts, vor dem Doppelpunkt ein abweichender User oder -, wenn es root sein soll
  • Zeile 16: Keine PostBackup-Scripts
Hinweis zu den PreBackup-Scripts: Diese sind in Git-Repos und Site-Build erklärt.

Beispiel für den Server, der Gitlab und eine docker-compose-Anwendung beherbergt (Zeilen umgebrochen zur Übersicht), unten nur die Neuerungen im Vergleich zum 1. Beispiel:

jan@jack:~/bin$ cat -n backup_env.sh 
 1  # environment for system backup
 2  ### TODO customize for each system!
 3  # 2nd + 3rd gen backup to usb? leave empty if not
 4  export BKP_USB_2GEN=
 5  export BKP_USB_3GEN=
 6  # directories and excludes: /dir/:[excl[#excl]]
      - /etc should be included for every system
 7  declare -a directories=( "/etc/:" "/home/jan/:" "/srv/:/gitlab-data" )
 8  # databases: type; types = postgres|mariadb - leave empty
      if there are no databases
 9  declare -a db_types=( )
10  # gitlab backup command - leave empty if no gitlab is present
11  export GITLAB_BKP_CMD=/opt/gitlab/bin/gitlab-backup
12  # encrypted devices: device#mount_point - leave empty if no devices exist
13  declare -a enc_fs=( )
14  # pre and post backup scripts (i. e. stop / start services): user|-:command
15  declare -a pre_bkp_scripts=( "git:/home/jan/bin/cleanup_gitlab-bkp.sh"
      "jan:/home/jan/bin/dump_pg-db.sh" "jan:/home/jan/bin/dc_down.sh" )
16  declare -a post_bkp_scripts=( "jan:/home/jan/bin/dc_upd.sh" )
  • Zeilen 4 + 5: keine USB-Disks 2. + 3. Gen.
  • Zeile 9: keine zu sichernden DBMS
  • Zeile 11: Gitlab-Backup-Kommando
  • Zeile 15: PreBackup-Scripts
  • Zeile 16: PostBackup-Scripts
Hinweis zu den Pre- + PostBackup-Scripts: siehe auch Container.

Installation: Ganz einfach - Entpacken (am besten in $HOME/bin, geht aber überall da, wo Du Ausführungsrecht hast), Environment-Datei anhand der o. g. Beispiele zusammenbauen - fertig.

Download: bkp_system.tgz
sha256: 7d564e53eddf402b63de85dc2a31da937a9ec4d741baa241867fdbe90c978909