Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
| Beide Seiten, vorherige ÜberarbeitungVorherige ÜberarbeitungNächste Überarbeitung | Vorherige Überarbeitung | ||
| nextcloud:backup_skript [2026/05/29 18:28] – gelöscht - Externe Bearbeitung (Datum unbekannt) 127.0.0.1 | nextcloud:backup_skript [2026/05/29 18:32] (aktuell) – wikiadmin | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====== Nextcloud-Backup-Skript ====== | ||
| + | ===== Was macht dieses Skript? ===== | ||
| + | |||
| + | Das Skript erstellt automatisch eine **Sicherung (Backup)** Ihrer Nextcloud-Instanz. Es werden sowohl alle hochgeladenen Dateien (Dokumente, Fotos usw.) als auch die dazugehörige Datenbank (Benutzer, Teilungen, Einstellungen) gesichert. Das Ergebnis ist eine einzige komprimierte '' | ||
| + | |||
| + | ===== Wann wird das Skript eingesetzt? ===== | ||
| + | |||
| + | * **Manuell** – Ein Administrator führt es bei Bedarf aus. | ||
| + | * **Automatisch** – Es kann z. B. täglich über einen Cron-Job (geplante Aufgabe) gestartet werden, um regelmäßige Backups zu gewährleisten. | ||
| + | |||
| + | ===== Was wird genau gesichert? ===== | ||
| + | |||
| + | * Das gesamte Nextcloud-Installationsverzeichnis (Programmdateien, | ||
| + | * Das '' | ||
| + | * Ein vollständiger Export der Nextcloud-Datenbank (MySQL/ | ||
| + | |||
| + | ===== Welche Einstellungen sind wichtig? ===== | ||
| + | |||
| + | Vor der ersten Nutzung müssen in der Skriptdatei zwei Pfade angepasst werden: | ||
| + | |||
| + | ^ Variable | ||
| + | | '' | ||
| + | | '' | ||
| + | |||
| + | ===== Benötigte Berechtigungen ===== | ||
| + | |||
| + | Das Skript muss mit **Administratorrechten (root)** ausgeführt werden, da es auf geschützte Verzeichnisse und Dienste zugreift. | ||
| + | |||
| + | ===== Was passiert während des Backups? ===== | ||
| + | |||
| + | - Nextcloud wird in den **Wartungsmodus** versetzt – Benutzer können sich dann nicht einloggen und keine Änderungen vornehmen. Das stellt sicher, dass das Backup konsistent ist. | ||
| + | - Ein Dump der Datenbank wird erstellt. | ||
| + | - Alle Dateien und der Datenbank-Dump werden in ein '' | ||
| + | - Ältere Backups über der eingestellten Anzahl werden gelöscht. | ||
| + | - Der Wartungsmodus wird deaktiviert – Nextcloud ist wieder normal erreichbar. | ||
| + | |||
| + | ===== Wo finde ich Fehlermeldungen? | ||
| + | |||
| + | Alle Fehler werden in einer Logdatei festgehalten. Diese liegt im selben Ordner wie die Backups und heißt '' | ||
| + | |||
| + | ===== Wichtige Hinweise ===== | ||
| + | |||
| + | * **Backup-Medium: | ||
| + | * **Plattenplatz: | ||
| + | * **Debug-Modus: | ||
| + | |||
| + | ===== Kurzanleitung zur Einrichtung ===== | ||
| + | |||
| + | - Skriptdatei auf dem Server speichern (z. B. ''/ | ||
| + | - Ausführbar machen: < | ||
| + | - Die vier Hilfsskripte ('' | ||
| + | - '' | ||
| + | - Testlauf als root: < | ||
| + | - Bei Erfolg kann ein Cron-Job eingerichtet werden, z. B. täglich um 2 Uhr nachts: | ||
| + | < | ||
| + | 0 2 * * * root / | ||
| + | </ | ||
| + | |||
| + | ===== Wiederherstellung ===== | ||
| + | |||
| + | Die erstellte '' | ||
| + | |||
| + | |||
| + | ===== das Skript ===== | ||
| + | ++++ backup_nextcloud.sh | | ||
| + | <code bash> | ||
| + | #!/bin/bash | ||
| + | |||
| + | # ==================================================== | ||
| + | # Nextcloud Backup Script | ||
| + | # ==================================================== | ||
| + | # Beschreibung: | ||
| + | # | ||
| + | # inkl. Datenbank-Dump und verpackt alles in eine TGZ-Datei. | ||
| + | # | ||
| + | # https:// | ||
| + | # | ||
| + | # es gib ein logfile für alle Fehler die auftreten | ||
| + | # die Meldungen kommen nur wenn debug eingeschaltet ist (debug > 0) | ||
| + | # | ||
| + | # | ||
| + | ####### Speicherplatz berechnen !!!!!!!!!! | ||
| + | ### benoetigter_Speicherplatz=$(tar -czf - datei " | ||
| + | ### echo -e " | ||
| + | ### exit | ||
| + | # | ||
| + | ####### eigentlich sollte die Sicherung auf einem anderen Gerät erfolgen | ||
| + | ### wenn das Laufwerk defekt ist, ist auch die Sicherung futsch | ||
| + | ### Frage: Netzlaufwerk, | ||
| + | # | ||
| + | ####### die Funktion limit_backups sollte vor dem Anlegen der Backups | ||
| + | ### aufgerufen werden damit bei grossen Backups beurteil werden kann | ||
| + | ### wieviel Speicherplatz wahrscheinlich benötigt werden wird | ||
| + | ### -- wenn schon ein Backup vorhanden ist | ||
| + | ### -- steht die wahrscheinlich ja fest | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | ######################################################## | ||
| + | debug=0 | ||
| + | backup_start=$(date +%s) | ||
| + | |||
| + | ###### Pfade anpassen: ####################### | ||
| + | |||
| + | ## wird in Zukunft durch die Funktion web_app_type ermittelt | ||
| + | #~ NC_PATH="/ | ||
| + | BACKUP_BASE="/ | ||
| + | MAX_BACKUPS=2 | ||
| + | SKRIPTEVERZEICHNIS=/ | ||
| + | |||
| + | |||
| + | ###### abgeleitete Variable ################## | ||
| + | |||
| + | ## sourcen der Funktionsdateien --------------------- | ||
| + | function funktionen_nachladen(){ | ||
| + | |||
| + | if [[ -e " | ||
| + | source | ||
| + | if [[ $? -ne 0 ]]; then echo " | ||
| + | else | ||
| + | echo -e "die Datei $1 Funktionen wurde nicht gefunden" | ||
| + | echo -e "das Programm wird beendet!\n\n" | ||
| + | exit | ||
| + | fi | ||
| + | } | ||
| + | |||
| + | |||
| + | funktionen_nachladen " | ||
| + | funktionen_nachladen " | ||
| + | funktionen_nachladen " | ||
| + | funktionen_nachladen " | ||
| + | |||
| + | nc_path=$(web_app_type ' | ||
| + | |||
| + | |||
| + | |||
| + | # timestamp für den Archivnamen (Format: Jahr-Monat-Tag_Stunde-Minute-Sekunde) | ||
| + | timestamp=$(date +" | ||
| + | backup_name=" | ||
| + | backup_file=" | ||
| + | |||
| + | |||
| + | LOG_FILE=" | ||
| + | |||
| + | # Temporärer Speicherort für den Datenbank-Dump | ||
| + | tmp_dump=" | ||
| + | |||
| + | |||
| + | ## du_muss_root_sein | ||
| + | if [[ $(id -u) -ne 0 ]];then | ||
| + | [[ $debug -ne 0 ]] && echo -e "root Privilegien erforderlich!\n --> ${BASH_SOURCE## | ||
| + | echo -e " | ||
| + | exit; | ||
| + | fi | ||
| + | |||
| + | |||
| + | #~ if [[ debug -eq 9 ]];then | ||
| + | if [[ debug -gt 0 ]];then | ||
| + | |||
| + | echo -e "" | ||
| + | echo -e " | ||
| + | echo -e " | ||
| + | echo -e " | ||
| + | echo -e " | ||
| + | echo -e "" | ||
| + | | ||
| + | echo -e " | ||
| + | echo -e " | ||
| + | echo -e "" | ||
| + | |||
| + | fi | ||
| + | |||
| + | |||
| + | |||
| + | # | ||
| + | function linie { for ((i = 1 ; i < $(tput cols) ; i++));do echo -n " | ||
| + | |||
| + | |||
| + | ## gib die aktelle Fehlermeldung aus | ||
| + | fehler_meldung() { | ||
| + | if [[ $# -eq 0 ]];then | ||
| + | echo -e " | ||
| + | cleanup | ||
| + | fi | ||
| + | | ||
| + | if [[ $debug -ne 0 ]]; | ||
| + | echo -e " | ||
| + | fi | ||
| + | echo -e " | ||
| + | cleanup | ||
| + | } | ||
| + | |||
| + | |||
| + | # Funktion: Fehlerbehandlung und Wartungsmodus ausschalten | ||
| + | cleanup() { | ||
| + | if [ -f " | ||
| + | rm -f " | ||
| + | fi | ||
| + | # Wartungsmodus deaktivieren (falls aktiv) | ||
| + | if [ -f " | ||
| + | sudo -u www-data php " | ||
| + | fi | ||
| + | echo " | ||
| + | if [[ $debug -ne 0 ]];then | ||
| + | echo -e "\ndas Logfile ($LOG_FILE)" | ||
| + | linie | ||
| + | tail $LOG_FILE; | ||
| + | linie | ||
| + | fi | ||
| + | exit 1 | ||
| + | } | ||
| + | # Trap für Abbruchsignale (Ctrl+C, Fehler) | ||
| + | ## ruft die cleanup-Funktion auf ## | ||
| + | trap cleanup ERR INT TERM | ||
| + | |||
| + | # | ||
| + | |||
| + | |||
| + | echo -e " | ||
| + | in_arbeit " | ||
| + | |||
| + | # Prüfen, ob Nextcloud-Pfad existiert | ||
| + | if [ ! -d " | ||
| + | fehler_meldung " | ||
| + | cleanup | ||
| + | fi | ||
| + | |||
| + | # Backup-Zielverzeichnis erstellen, falls nicht vorhanden | ||
| + | mkdir -p " | ||
| + | fehler_meldung " | ||
| + | cleanup | ||
| + | } | ||
| + | |||
| + | |||
| + | [[ $debug -ne 0 ]] && echo -e "===== Nextcloud Backup gestartet: $(date) ====="; | ||
| + | |||
| + | # 1. Nextcloud in den Wartungsmodus versetzen | ||
| + | [[ $debug -ne 0 ]] && echo -e " | ||
| + | sudo -u www-data php " | ||
| + | if [ $? -ne 0 ]; then | ||
| + | fehler_meldung " | ||
| + | cleanup | ||
| + | fi | ||
| + | |||
| + | # 2. Datenbank-Zugangsdaten aus config.php extrahieren | ||
| + | CONFIG_FILE=" | ||
| + | if [ ! -f " | ||
| + | fehler_meldung " | ||
| + | cleanup | ||
| + | fi | ||
| + | |||
| + | datadirectory=$(cat $CONFIG_FILE |grep datadirectory |sed 's/ //g' |cut -d"'" | ||
| + | if [[ ! -e " | ||
| + | fehler_meldung " | ||
| + | cleanup | ||
| + | fi | ||
| + | |||
| + | # Absolute, aufgelöste Pfade (keine relativen, keine Symlinks) | ||
| + | abs_nc=$(realpath " | ||
| + | abs_data=$(realpath " | ||
| + | |||
| + | # Prüfen, ob data_dir innerhalb von nextcloud_dir liegt | ||
| + | if [[ " | ||
| + | [[ $debug -ne 0 ]] && echo -e " | ||
| + | datadirectory="" | ||
| + | else | ||
| + | [[ $debug -ne 0 ]] && echo -e "OK: data-Verzeichnis liegt außerhalb der Installation."; | ||
| + | fi | ||
| + | |||
| + | |||
| + | |||
| + | # Extrahiere ' | ||
| + | DB_NAME=$(grep "' | ||
| + | DB_USER=$(grep "' | ||
| + | DB_PASS=$(grep "' | ||
| + | |||
| + | |||
| + | if [ -z " | ||
| + | fehler_meldung " | ||
| + | cleanup | ||
| + | fi | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | if [[ -z "noch nicht fertig" | ||
| + | | ||
| + | |||
| + | ## Überprfen ob das zu erwartende Backup-file noch auf des Medium passt | ||
| + | MIN_FREIER_PLATZ=.80 | ||
| + | |||
| + | prefix=" | ||
| + | SIZE=$(stat -c%s "$(ls -t ${prefix}*.tar.gz |head -n1)") | ||
| + | freier_platz=$(df --block-size=1 --output=avail " | ||
| + | prozent_frei=$(echo " | ||
| + | |||
| + | echo "$SIZE Bytes" | ||
| + | echo " | ||
| + | echo "Das entspricht $prozent_frei des aktuell freien Platzes." | ||
| + | echo -e " | ||
| + | |||
| + | |||
| + | |||
| + | # Verfügbarer und gesamter Speicherplatz im Zielverzeichnis (Medium) | ||
| + | #~ freier_platz=$(df --block-size=1 --output=avail " | ||
| + | |||
| + | |||
| + | exit | ||
| + | fi | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | # 3. MySQL-Dump erstellen | ||
| + | [[ $debug -ne 0 ]] && echo -e " | ||
| + | mysqldump --single-transaction --quick --skip-lock-tables \ | ||
| + | -u " | ||
| + | |||
| + | if [ $? -ne 0 ] || [ ! -s " | ||
| + | fehler_meldung " | ||
| + | cleanup | ||
| + | fi | ||
| + | |||
| + | [[ $debug -ne 0 ]] && echo -e " | ||
| + | |||
| + | # 4. Alle Dateien (inkl. Dump) in ein TGZ-Archiv packen | ||
| + | [[ $debug -ne 0 ]] && echo -e " | ||
| + | # Wechsle ins übergeordnete Verzeichnis von nc_path, damit der Pfad relativ wird | ||
| + | # (Beim Entpacken entsteht wieder das Verzeichnis nc.dcb-charlot.de) | ||
| + | cd " | ||
| + | #~ tar -czf " | ||
| + | tar -czf " | ||
| + | |||
| + | if [ $? -ne 0 ]; then | ||
| + | fehler_meldung " | ||
| + | cleanup | ||
| + | fi | ||
| + | |||
| + | [[ $debug -ne 0 ]] && echo -e " | ||
| + | [[ $debug -ne 0 ]] && echo -e " | ||
| + | |||
| + | # 5. Temporären Dump löschen | ||
| + | rm -f " | ||
| + | |||
| + | |||
| + | ## Anzahl der Backups begranzen | ||
| + | limit_backups " | ||
| + | |||
| + | |||
| + | # 6. Wartungsmodus deaktivieren | ||
| + | [[ $debug -ne 0 ]] && echo -e " | ||
| + | sudo -u www-data php " | ||
| + | |||
| + | |||
| + | backup_ende=$(date +%s) | ||
| + | backupdauer=$(zeitdifferenz " | ||
| + | echo -e " | ||
| + | |||
| + | in_arbeit " | ||
| + | [[ $debug -ne 0 ]] && echo -e "===== Backup erfolgreich abgeschlossen: | ||
| + | exit 0 | ||
| + | |||
| + | </ | ||
| + | ++++ | ||