duply
duply erstellt inkrementelle verschlüsselte Backups
Beschreibung
- Duply fungiert als Wrapper für die mächtige Duplicity-Magie.
- Es vereinfacht die Ausführung von Duplicity mit Cron oder auf der Kommandozeile durch
- wiederkehrende Einstellungen in Profilen pro Sicherungsauftrag gespeichert werden
- Batch-Operationen ermöglicht, z.B. backup_verify+purge
- Ausführung von Pre-/Post-Skripten (verschiedene Aktionen möglich, abhängig vom vorherigen oder nächsten Befehl oder dessen Exit-Status)
- Vorbedingungsprüfung für fehlerfreie Duplizitätsoperationen
Für jeden Sicherungsauftrag muss ein Konfigurationsprofil erstellt werden
- Der Profilordner wird unter '~/.duply/<profile>' gespeichert (wobei ~ das Heimatverzeichnis des aktuellen Benutzers ist)
Hinweis Wenn der Ordner '/etc/duply' existiert, werden die Profile für den Superuser Benutzer root dort gesucht und erstellt werden.
- Frontend für duplicity
- Backups können lokal oder einem anderen System gespeichert werden
Unterstützte Protokolle
- ftp
- ssh
- s3
- rsync
- cifs
- webdav
- http
Installation
# apt install duply
Syntax
Parameter
Optionen
Umgebungsvariablen
Exit-Status
Konfiguration
Verschlüsselung konfigurieren
Schlüssel erstellen
siehe GPG:Schlüssel erstellen
Profil erstellen
# duply <backupname> create
Ein duply-Profil wird im Home-Verzeichnis des Benutzers unter ~/.duply/ angelegt und besteht aus den folgenden Dateien:
- gpg-key.asc (nur wenn ein gpg-key exportiert wurde)
- conf
- pre und post
- exclude
Konfiguration
Verschlüsselung einrichten
Voraussetzung
Key-ID und das Passwort des GPG-Keys müssen dafür hinterlegt werden.
GPG_KEY='_GPG_KEY_ID_' GPG_PW='_GPG_PASSWORD_'
Key-ID anzeigen lassen
- Private-Key
# gpg --list-secret-keys --keyid-format LONG gpg: "Trust-DB" wird überprüft gpg: marginals needed: 3 completes needed: 1 trust model: pgp gpg: Tiefe: 0 gültig: 1 signiert: 0 Vertrauen: 0-, 0q, 0n, 0m, 0f, 1u gpg: nächste "Trust-DB"-Pflichtüberprüfung am 2021-11-04 /root/.gnupg/pubring.kbx ------------------------ sec rsa4096/F47E1B7450082D11 2020-11-04 [SC] [verfällt: 2021-11-04] 60E3D3C9ED78CE4A40322BBAF47E1B7450082D11 uid [ ultimativ ] Robert Quies (Es grünt so grün, wenn Spaniens Blüten blühn.) <raqju@web.de> ssb rsa4096/B2E20485FF7FC772 2020-11-04 [E] [verfällt: 2021-11-04]
# gpg --list-keys --keyid-format LONG /root/.gnupg/pubring.kbx ------------------------ pub rsa4096/F47E1B7450082D11 2020-11-04 [SC] [verfällt: 2021-11-04] 60E3D3C9ED78CE4A40322BBAF47E1B7450082D11 uid [ ultimativ ] Robert Quies (Es grünt so grün, wenn Spaniens Blüten blühn.) <raqju@web.de> sub rsa4096/B2E20485FF7FC772 2020-11-04 [E] [verfällt: 2021-11-04]
Kompression und Art der Verschlüsselung festlegen
Zusätzlich können in GPG_OPTS= weitere Optionen zur Kompression und Art der Verschlüsselung gesetzt werden.
- Es soll mit dem freien Komprimierungsprogramm bzip2 komprimiert werden und dem symmetrischen Verschlüsselungsverfahren Advanced Encryption Standard, auch Rijndael-Algorithmus genannt, mit einer Schlüssellänge von 256 verschlüsselt werden.
GPG_OPTS='--compress-algo=bzip2 --personal-cipher-preferences AES256'
De-/Aktivieren der Überprüfung GPG-Key und GPG-Passphrase
- duply prüft vor jeder Aktion ob der GPG-Key gültig ist und die Passphrase korrekt ist.
- Dies kann durch die Option GPG_TEST='disabled' unterbunden werden.
Aktiviert
GPG_TEST='disabled'
Deaktiviert
# GPG_TEST='disabled'
Ziel und Quelle des Backups festlegen
Allgemeine Syntax des hosts
scheme://[user:password@]host[:port]/[/]path
Protokolle und Syntax zur Datenübertragung
- duply versteht alle gängigen Protokolle zur Datenübertragung
- In der conf-Datei befindet sich meistens eine Liste der wichtigsten unterstützten Protokolle und deren Syntax
file://[/absolute_]path ftp[s]://user[:password]@other.host[:port]/some_dir hsi://user[:password]@other.host/some_dir cf+http://container_name imap[s]://user[:password]@host.com[/from_address_prefix] rsync://user[:password]@other.host[:port]::/module/some_dir rsync over ssh (only keyauth) rsync://user@other.host[:port]/relative_path rsync://user@other.host[:port]//absolute_path for the s3 user/password are AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY s3://[user:password]@host/bucket_name[/prefix] s3+http://[user:password]@bucket_name[/prefix] scp and sftp are aliases for the ssh backend ssh://user</nowiki>[:password]@other.host[:port]/some_dir tahoe://alias/directory webdav[s]://user[:password]@other.host/some_dir
Hinweis Sonderzeichen müssen urlencoded eingetragen werden, außer bei den Parametern TARGET_USER, TARGET_PASS
Ziel des Backups festlegen
TARGET='scheme://user[:password]@host[:port]/[/]path'
- Es soll das Protokoll ssh zur Datenübertragung genutzt werden.
- Username: user
- Passwort: KohlIstKrempe969
- Host: foxtom.net
- Port: 22
- Pfad: home/user/backup_PC1
TARGET='ssh://user:KohlIstKrempe969@foxtom.net:22/home/user/backup_PC1'
Quelle des Backups festlegen
Root-Verzeichnis für das Backup setzen.
SOURCE=
Soll ein Backup aus mehreren Unterordnern von / bestehen (Bsp.: /etc /var /home sollen gesichert werden), so muss die SOURCE Variable auf / gesetzt werden.
SOURCE='/'
In der Regel wird SOURCE='/' gesetzt.
Dateien, die in die Sicherung aufgenommen oder von ihr ausgeschlossen werden, werden in der Datei exclude angegeben.
Maximales Alter eines Backups festlegen
Hier ist anzumerken, dass duply keine Backups löscht, sofern man es nicht anfordert.
Mit MAX_AGE wird das maximale Alter von Backups bestimmt. Das älteste Backup soll maximal ein Jahr alt sein.
MAX_AGE=1Y
Anzahl der vollständigen Backups festlegen
Mit MAX_FULL_BACKUPS kann bestimmt werden, wie viele Full-Backups duply maximal behält.
Es sollen fünf sein.
MAX_FULL_BACKUPS=5
Maximales Alter der vollständigen Backups festlegen
Alternativ kann mit MAX_FULLBKP_AGE spezifiert werden, wie alt ein Full-Backup sein darf, bevor ein neues Full-Backup erstellt wird.
Es soll zwei Wochen alt sein.
MAX_FULLBKP_AGE=2W DUPL_PARAMS="$DUPL_PARAMS --full-if-older-than $MAX_FULLBKP_AGE"
Größe der Backup-Pakete
Um den durch eventuelle Übertragungsfehler entstehenden Zeitverlust einzuschränken, teilt duply standardmäßig seine Backups in 25 MB große Dateien. Mit VOLSIZE kann die Größe der erstellten Backup-Pakete geändert werden.
Der gewünschte Wert hängt von verschieden Faktoren ab.
- Übertragungsgeschwindigkeit
- Systembelastung
- Netzwerkbelastung
Vor-/Nachteile
- Vorteil kleine Pakete
- Vorteil große Pakete
- Nachteil kleine Pakete
- Nachteil große Pakete
- Beispiel
Backup-Pakete sollen 10 MB groß sein
VOLSIZE=10 DUPL_PARAMS="$DUPL_PARAMS --volsize $VOLSIZE"
Asynchrone Uploads
Asynchrone Uploads erlauben das Erstellen neuer Archive, bevor bereits erstellte auf den Server geladen wurden.
- Schnelleres Backup
- Hohe System- und hohe Netzlast
Asynchrone Uploads aktivieren
DUPL_PARAMS="$DUPL_PARAMS --asynchronous-upload"
Anwendung
Anwendung
GPG_KEY='C676563899DE35FA' GPG_PW='NerzManta9' GPG_OPTS='--compress-algo=bzip2 --personal-cipher-preferences AES256' GPG_TEST='disabled' TARGET='ssh://user:KohlIstKrempe969@foxtom.net:22/home/user/backup_PC1' SOURCE='/' MAX_AGE=1Y MAX_FULL_BACKUPS=5 MAX_FULLBKP_AGE=2W DUPL_PARAMS="$DUPL_PARAMS --full-if-older-than $MAX_FULLBKP_AGE" VOLSIZE=10 DUPL_PARAMS="$DUPL_PARAMS --volsize $VOLSIZE"
Pre- und Post-Skripte
- duply erlaubt die Verwendung von Pre- und Post-Skripten.
- Das pre-Skript wird direkt vor dem Backup ausgeführt, das post-Skript direkt nach dem Backup.
- Mit diesen Skripten können beispielsweise Snapshots von LVM-Volumes oder Dumps von SQL Datenbanken gemacht und in das Backup einbezogen werden.
- Die files pre und post müssen im jeweiligen duply Verzeichnis liegen (Bsp.: /home/user/.duply/backup/) und ausführbar sein.
- Werden die pre/post Scripte nicht wie erhofft ausgeführt (z.B. bei den Sicherchungs-Methoden "full/incr"), können diese explizit angegeben werden: pre_incr_post
- Beispiel
Hier ein Beispiel für ein PRE/POST Skript welches vor dem Backup einen SQL-Dump aller Datenbanken erstellt und diesen nach dem Backup wieder löscht.
- pre-Datei
/usr/bin/mysqldump --all-databases -u root -ppw> /tmp/sqldump-$(date '+%F')
- post-Datei
/bin/rm /tmp/sqldump-$(date '+%F')
exclude
- duply arbeitet standardmäßig mit einer Whitelist.
- Um gewisse Verzeichnisse oder Dateien von einem Backup zu inkludieren muss die Datei exclude im duply Verzeichnis erstellt werden.
- Die Syntax erlaubt das Hinzufügen von Verzeichnissen und Dateien mit einem + /pfad/zur/datei.
- Um ein Verzeichnis zu exkludieren muss in der exclude ein - /pfad/zum/Verzeichnis eingefügt werden.
- Zudem erlaubt duply die Verwendung von Wildcards.
- Die hier dargestellte exclude Datei sichert die Verzeichnisse /etc/, /root/, /var/www/ und exkludiert alle anderen Verzeichnisse.
+ /etc/ + /root/ + /var/www/ - **
Parameter
- duply bietet eine Vielzahl von Kommandozeilenparametern für die Sicherung und Wiederherstellung von Daten.
- Die gesamte Liste ist in der Manpage von duply zu finden.
- Beim Einsatz von mehreren Parameter werden diese durch einen Unterstrich (_) getrennt.
- Mit /usr/bin/duply /root/.duply/test full_verify_purge --force wird ein volles Backup erstellt, verifiziert und alte Backups gelöscht.
- Backups welche die MAX_AGE überschritten haben werden mit purge angezeigt und durch die zusätzliche Option --force gelöscht.
- Der Befehl /usr/bin/duply /root/.duply/test incr führt ein inkrementelles Backup aus.
cronjob
- Bei duply handelt es sich nicht um einen Dienst (Daemon), sondern um ein Skript, das z.B. regelmäßig via Cron ausgeführt werden kann.
- Beispiel
0 0 * * 7 /usr/bin/duply /root/.duply/test full_verify_purge --force 0 0 * * 1-6 /usr/bin/duply /root/.duply/test incr
- In dieser Konfiguration wird Sonntags um 0:00 ein Full-Backup erstellt und alte Backups gelöscht.
- Montag bis Samstag wird jeden Tag ein inkrementelles Backup durchgeführt.
- Neue cronjobs können mit crontab -e erstellt werden.
- Kommandos und Konfigurationsdateien müssen mit absolutem Pfad angegeben werden.
Fehlerbehebung
Volume was signed by key X not Y
OSError: Socket is closed
ssh: Exception (client): Signature verification (ssh-rsa) failed. ssh: Traceback (most recent call last): ssh: File "/usr/local/lib/python3.10/dist-packages/paramiko/transport.py", line 2130, in run ssh: self.kex_engine.parse_next(ptype, m) ssh: File "/usr/local/lib/python3.10/dist-packages/paramiko/kex_curve25519.py", line 64, in parse_next ssh: return self._parse_kexecdh_reply(m) ssh: File "/usr/local/lib/python3.10/dist-packages/paramiko/kex_curve25519.py", line 130, in _parse_kexecdh_reply ssh: self.transport._verify_key(peer_host_key_bytes, sig) ssh: File "/usr/local/lib/python3.10/dist-packages/paramiko/transport.py", line 1942, in _verify_key ssh: raise SSHException( ssh: paramiko.ssh_exception.SSHException: Signature verification (ssh-rsa) failed. ssh: Attempt of put Nr. 1 failed. OSError: Socket is closed
Sicherheit
Dokumentation
Man-Pages
Info-Pages
Projekt-Homepage
Links
Siehe auch
Weblinks
- https://www.thomas-krenn.com/de/wiki/Backup_unter_Linux_mit_duply
- https://wiki.archlinux.org/index.php/Duply#Configuration
- https://www.gnupg.org/howtos/de/GPGMiniHowto.html
- duply.net
Einzelnachweise
Testfragen
Testfrage 1
Testfrage 2
Testfrage 3
Testfrage 4
Testfrage 5
Manpage
NUTZUNG
Erstmalige Verwendung (Profilerstellung)
duply <Profil> erstellen
allgemeine Verwendung im Einzel- oder Batch-Modus (siehe BEISPIELE)
duply <profile> <Befehl>[[_|+|-]<Befehl>[_|+|-]...] [<Optionen> ...]
Für Stapel können die bedingten Trennzeichen auch als Pseudo-Befehle geschrieben werden und(+), oder(-). Siehe SEPARATORS für Details.
Nicht duply-Optionen werden an duplicity weitergegeben (siehe OPTIONS).
Alle conf-Parameter können stattdessen auch in der Umgebung definiert werden.
PROFILE
Indicated by a path or a profile name (<profile>), which is resolved to '~/.duply/<profile>' (~ expands to environment variable $HOME).
Superuser root can place profiles under '/etc/duply'. Simply create the folder manually before running duply as superuser. Note Already existing profiles in root's home folder will cease to work unless they are moved to the new location manually.
example 1: duply humbug backup
Alternatively a _path_ might be used e.g. useful for quick testing, restoring or exotic locations. Shell expansion should work as usual. Hint The path must contain at least one path separator '/', e.g. './test' instead of only 'test'.
example 2: duply ~/.duply/humbug backup
SEPARATORS
_ (underscore) neutral separator + (plus sign), _and_ conditional AND the next command will only be executed if the previous succeeded - (minus sign), _or_ conditional OR the next command will only be executed if the previous failed [] (square brackets), _groupIn_/_groupOut_ enables grouping of commands
example 'pre+[bkp-verify]_post' translates to 'pre_and_groupIn_bkp_or_verify_groupOut_post'
COMMANDS
usage get usage help text
and/or/groupIn/groupOut pseudo commands used in batches (see SEPARATORS above)
create creates a configuration profile backup backup with pre/post script execution (batch: [pre_bkp_post]), full (if full_if_older matches or no earlier backup is found) incremental (in all other cases) pre/post execute '<profile>/pre', '<profile>/post' scripts bkp as above but without executing pre/post scripts full force full backup incr force incremental backup list [<age>] list all files in backup (as it was at <age>, default: now) status prints backup sets and chains currently in repository verify [<age>] [--compare-data] list files changed, since age if given verifyPath <rel_path_in_bkp> <local_path> [<age>] [--compare-data] list changes of a file or folder path in backup compared to a local path, since age if given restore <target_path> [<age>] restore the complete backup to <target_path> [as it was at <age>] fetch <src_path> <target_path> [<age>] fetch single file/folder from backup [as it was at <age>] purge [<max_age>] [--force] list outdated backup files (older than $MAX_AGE) [use --force to actually delete these files] purgeFull [<max_full_backups>] [--force] list outdated backup files ($MAX_FULL_BACKUPS being the number of full backups and associated incrementals to keep, counting in reverse chronological order) [use --force to actually delete these files] purgeIncr [<max_fulls_with_incrs>] [--force] list outdated incremental backups ($MAX_FULLS_WITH_INCRS being the number of full backups which associated incrementals will be kept, counting in reverse chronological order) [use --force to actually delete these files] purgeAuto [--force] convenience batch wrapper for all purge commands above. purge, purgeFull, purgeIncr are added if their conf vars were set. e.g. MAX_AGE=1Y MAX_FULL_BACKUPS=6 MAX_FULLS_WITH_INCR=3 in profile conf file would result in [purge_purgeFull_purgeIncr] cleanup [--force] list broken backup chain files archives (e.g. after unfinished run) [use --force to actually delete these files]
changelog print changelog / todo list txt2man feature for package maintainers - create a manpage based on the usage output. download txt2man from http://mvertes.free.fr/, put it in the PATH and run 'duply txt2man' to create a man page. version show version information of duply and needed programs
OPTIONS
--force passed to duplicity (see commands purge, purgeFull, purgeIncr, cleanup) --preview do nothing but print out generated duplicity command lines --disable-encryption disable encryption, overrides profile settings
TIME FORMATS
For all time related parameters like age, max_age etc. Refer to the duplicity manpage for all available formats. Here some examples 2002-01-25T07:00:00+02:00 (full date time format string) 2002/3/5 (date string YYYY/MM/DD) 12D (interval, 12 days ago) 1h78m (interval, 1 hour 78 minutes ago)
PRE/POST SCRIPTS
Some useful internal duply variables are exported to the scripts.
PROFILE, CONFDIR, SOURCE, TARGET_URL_<PROT|HOSTPATH|USER|PASS>, GPG_<KEYS_ENC|KEY_SIGN|PW>, CMD_ERR, RUN_START, CMD_<PREV|NEXT> (previous/next command), CND_<PREV|NEXT> (condition before/after)
The CMD_* variables were introduced to allow different actions according to the command the scripts were attached to e.g. 'pre_bkp_post_pre_verify_post' will call the pre script two times, with CMD_NEXT variable set to 'bkp' on the first and to 'verify' on the second run. CMD_ERR holds the exit code of the CMD_PREV .
EXAMPLES
create profile 'humbug' duply humbug create (don't forget to edit this new conf file) backup 'humbug' now duply humbug backup list available backup sets of profile 'humbug' duply humbug status list and delete outdated backups of 'humbug' duply humbug purge --force restore latest backup of 'humbug' to /mnt/restore duply humbug restore /mnt/restore restore /etc/passwd of 'humbug' from 4 days ago to /root/pw duply humbug fetch etc/passwd /root/pw 4D (see "duplicity manpage", section TIME FORMATS) a one line batch job on 'humbug' for cron execution duply humbug backup_verify_purge --force batch job to run a full backup with pre/post scripts duply humbug pre_full_post
FILES
in profile folder '~/.duply/<profile>' or '/etc/duply' conf profile configuration file pre,post pre/post scripts (see above for details) gpgkey.*.asc exported GPG key files exclude a globbing list of included or excluded files/folders (see "duplicity manpage", section FILE SELECTION)
IMPORTANT
Copy the _whole_ profile folder after the first backup to a safe place. It contains everything (duply related) needed to restore your backups.
Pay attention to (possibly later added) external files such as credentials or auth files (e.g. netrc, .megarc, ssh keys) or environment variables (e.g. DPBX_ACCESS_TOKEN). It is good policy to place those in the profile folder if possible at all. e.g. in case of 'multi://' target the config .json file Env vars should be added to duply profiles' conf file.
Keep access to these files restricted as they contain information (gpg key, passphrases etc.) to access and modify your backups.
Finally You should attempt a restore from an unrelated host to be sure you really have everything needed for restoration.
Repeat these steps after _all_ configuration changes. Some configuration options are crucial for restoration.