Hyper Backup Container und MariaDB sicherung

  • Ab sofort steht euch hier im Forum die neue Add-on Verwaltung zur Verfügung – eine zentrale Plattform für alles rund um Erweiterungen und Add-ons für den DSM.

    Damit haben wir einen Ort, an dem Lösungen von Nutzern mit der Community geteilt werden können. Über die Team Funktion können Projekte auch gemeinsam gepflegt werden.

    Was die Add-on Verwaltung kann und wie es funktioniert findet Ihr hier

    Hier geht es zu den Add-ons

Grischabock

Benutzer
Registriert
10. Sep. 2009
Beiträge
294
Reaktionspunkte
10
Punkte
24
Ich möchte mich nun dem (am liebsten automatisierten) Backup der docker Container und MariaDB`s widmen.

Für docker habe ich red5d/docker-autocompose auf den Weg bekommen. Nur finde ich gerade nichts schlaues zur Installation. Dazu kommt dann noch wie ich da eine Automatisierte Lösung mittels HyperBackup oder Aufgaben Manager hinbekomme.

Weiters gilt das selbe für die MariaDB dumps, wie bekomme ich die Automatisiert hin?

Beides möchte ich gerne auf meinen Backup Server spielen (sofern in einem Verzeichnis abgelegt mit HyperBackup).
Anleitungen dazu habe ich nichts wirklich gefunden oder ich war einfach blind. Es gibt viele Themen aber irgendwie keinen Abschluss oder keinen der mein Ziel verfolgt.
Wenn es geht würde ich gerne beides noch an einen USB Stick an der DS sichern wollen. Diesen kann ich dann austauschen oder im Notfall kurz schnappen und habe das wichtigste noch dabei.
 
nichts schlaues zur Installation
Ich lasse dafür folgendes Script laufen. Immer wenn ich einen Container ändere / neu installiere. Hab ich seinerzeit auch hier im Forum gefunden, weiß aber nicht mehr, wo:
Bash:
#!/bin/bash

# anzupassen:
BackUpDir="/volume1/docker/Backup"
IgnoredContainer=(jitsi_jicofo jitsi_jvb jitsi_prosody jitsi_web synology_docviewer_2 synology_docviewer_1)

#–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
for container in $(docker ps --format "{{ .Names }}"); do
    if grep -q "${container}" <<< "${IgnoredContainer[@]}" ; then
        echo "${container} is on ignore list. Skipping this container."
        continue
    else
        echo "${container} export"

    # YAML:
        # https://www.synology-forum.de/threads/docker-container-automatische-docker-compose-file-erstellen-als-backup.110444/post-897496
        docker run --rm -v /var/run/docker.sock:/var/run/docker.sock red5d/docker-autocompose "${container}" > "${BackUpDir}/${container}_$(date +%Y-%m-%d_%H-%M).yml"
    fi
done
exit
Oben das Backupdir natürlich anpassen, wenn du willst.
Hierzu habe ich folgende Aufgabe in den Aufgabenplaner geschrieben (als root):
docker exec mariadb /usr/bin/mysqldump -u USER --password=PASSWORT DBNAME > /volume1/docker/backup/DBNAME.sql
Da musst du natürlich USER, PASSWORT und DBNAME anpassen. Also pro DB einen Dump machen. Der User ist bei mir ein extra Backup User, den ich in der mariadb angelegt habe.


EDIT: Quelle des Scripts steht in dem Script selbst.
 
  • Like
Reaktionen: Monacum
Ich lasse dafür folgendes Script laufen.
Da fehlt mir aktuell noch die Installation von docker-autocompose an der es gerade noch scheitert.
Das Script läuft auch über den Aufgabenplaner als root oder?

Hierzu habe ich folgende Aufgabe in den Aufgabenplaner geschrieben (als root):
Ich habe von @geimist in einem Thema noch dieses Script gefunden aber noch nicht getestet.
https://git.geimist.eu/geimist/MariaDB_dump/src/branch/main/MariaDB_DUMP.sh

Der User ist bei mir ein extra Backup User, den ich in der mariadb angelegt habe.
Ah ja das ist ein guter Ansatz, Danke

Sofern es klappt wäre eine komplette Lösung für alle DB`s sicherer wenn man es mal vergessen sollte.
 
Da fehlt mir aktuell noch die Installation von docker-autocompose
Das brauchst du nicht zu installieren. Das Script lädt den Container bei Bedarf, startet ihn, erstellt die Compose Files und schmeißt den Container danach wieder weg.
Aufgabenplaner als root
jap
noch dieses Script gefunden aber noch nicht getestet.
Das kannst du auch nehmen. Kann noch einiges mehr. Mein Script erstellt einen Dump und überschreibt dabei den alten Dump. Das verlinkte Script kann halt versionieren. Es geht aber nicht für MariaDB als Docker-Container, wenn ich den Code richtig interpretiere.
Eine Versionierung kannst du aber einfach in jedem Script nachbauen
komplette Lösung für alle DB`s sicherer
Da bin ich leider nicht fündig geworden. Ein Dump wird immer für eine DB erstellt und nicht für eine Instanz.


Nachtrag: Bei meiner Lösung oben musst du "mariadb" durch den Namen ersetzen, den der Container bei dir hat.
 
  • Like
Reaktionen: Grischabock
Das brauchst du nicht zu installieren. Das Script lädt den Container bei Bedarf, startet ihn, erstellt die Compose Files und schmeißt den Container danach wieder weg.
Hat super geklappt auch mit dem wechsel des BackupDir, Vielen Dank

Das kannst du auch nehmen.
Klappt auch perfekt da ich das MariaDB Paket von Synology einsetze. Auch ein komplettes Backup geht dabei Perfekt.


In beiden Fällen wäre eine Automatische Löschung der ältesten Daten noch schön. Also ja das man halt gewisse Versionen behalten kann. Gut bei den Containern muss es ja nicht sein, ich mache da aber dennoch ein Wöchentliches Backup falls ich vergessen sollte nach dem Anlegen eines neuen Containers ein Backup zu machen. Nun muss ich halt daran denken vielleicht einmal im Monat aufzuräumen.

Die MariaDB sichere ich mehrmals, da wäre es wünschenswert wenn es eine Autolöschung geben würde. Vielleicht hat da aber @geimist noch eine Lösung dazu wie das Umsetzbar wäre mit seinem Script.

Erstmals DANKE an euch zwei für das bereitstellen. Nun kann ich ja beruhigt sein ;-)
 
Du kannst einfach in einem Verzeichnis Daten älter als 5 Tage (hier bezogen auf Dateieindung) löschen lassen:
find "$backup_dir" -name "*.yml" -mtime +5 -exec rm {} \;
Das kannst du ans Autocompose-Script mit ranklatschen.
5 kannst du auch durch eine andere Anzahl an Tagen ersetzen. Das Gleiche kannst du auch für die MariaDB Backups machen. Musst du die variable "backup_dir" weglassen und durch den Pfad für die DB-Backups ersetzen.
 
  • Like
Reaktionen: Grischabock
oh klasse Vielen Dank
 
Also müsste es so passen?

Code:
#!/bin/bash

# anzupassen:
BackUpDir="/volume1/backup/docker"
IgnoredContainer=(jitsi_jicofo jitsi_jvb jitsi_prosody jitsi_web synology_docviewer_2 synology_docviewer_1)

#–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
for container in $(docker ps --format "{{ .Names }}"); do
    if grep -q "${container}" <<< "${IgnoredContainer[@]}" ; then
        echo "${container} is on ignore list. Skipping this container."
        continue
    else
        echo "${container} export"

    # YAML:
        # https://www.synology-forum.de/threads/docker-container-automatische-docker-compose-file-erstellen-als-backup.110444/post-897496
        docker run --rm -v /var/run/docker.sock:/var/run/docker.sock red5d/docker-autocompose "${container}" > "${BackUpDir}/${container}_$(date +%Y-%m-%d_%H-%M).yml"
    find "$backup_dir" -name "*.yml" -mtime +5 -exec rm {} \;
    fi
done
exit
 
Ich würde es eher so machen:
Bash:
#!/bin/bash

# anzupassen:
BackUpDir="/volume1/backup/docker"
IgnoredContainer=(jitsi_jicofo jitsi_jvb jitsi_prosody jitsi_web synology_docviewer_2 synology_docviewer_1)

#–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
for container in $(docker ps --format "{{ .Names }}"); do
    if grep -q "${container}" <<< "${IgnoredContainer[@]}" ; then
        echo "${container} is on ignore list. Skipping this container."
        continue
    else
        echo "${container} export"

    # YAML:
        # https://www.synology-forum.de/threads/docker-container-automatische-docker-compose-file-erstellen-als-backup.110444/post-897496
        docker run --rm -v /var/run/docker.sock:/var/run/docker.sock red5d/docker-autocompose "${container}" > "${BackUpDir}/${container}_$(date +%Y-%m-%d_%H-%M).yml"
    fi
done
find "$backup_dir" -name "*.yml" -mtime +5 -exec rm {} \;
exit
 
Ah okay als extra Part darunter.

Vielen Dank
 
In deiner Version hätte er es jedem Durchlauf der Container ausgeführt. Bei 10 Containern hätte er es 9 mal umsonst gemacht. Nachdem ersten löschen wäre ja nichts mehr da :)
 
Ich exportiere mittels Script als*.json, ist das besser, schlechter oder beinhalten json und yml die selben Infos?
 
Das JSON ist soweit ich weiß nur Synology Kompatibel. Die YML kannst du überall verwenden. Da spielt das OS keine Rolle.
 
  • Like
Reaktionen: ctrlaltdelete
Danke, dann lasse ich einfach beide Scripts laufen :cool:
 
Ich nutze momentan wieder die Nextcloud per Docker. Da sollte es ja reichen, wenn ich die ausgelagerten Ordner sichere. Wenn ich den mariadb-Ordner sichere, sollte ja da auch die Datenbank gesichert sein. Ich habe in den jeweiligen Docker-Ordnern auch gleich die docker-compose.yml, so dass ich die Container nach einem Restore per Terminal oder Portainer neu anlegen kann (mit dem Container-Manager geht das ja auch mittlerweile über die Projekte) und somit quasi sofort an dem Backup-Zeitpunkt bin.

In meinem Fall wäre doch ein Dump der MariaDB Datenbank doppelt gemoppelt, oder? Denn durch das regelmäßige Backup (und zusätzlich Snapshots) sollte die Datenbank ja mit gesichert sein.
 
Die MariaDB sichere ich mehrmals, da wäre es wünschenswert wenn es eine Autolöschung geben würde. Vielleicht hat da aber @geimist noch eine Lösung dazu wie das Umsetzbar wäre mit seinem Script.
Habe ich doch mit im Skript beschrieben, aber jeweils auskommentiert. Einmal für die einzelnen DBs und für das Gesamtbackup. Für diesen Zweck hatte ich das Skript archive_rotate.sh geschrieben. Man muss es nur lokal speichern, dessen Pfad angeben und die gewünschten Parameter für die gewünschte Rotation anpassen.
 
Oh das ist super, Danke.

Ja muss gestehen hab zwar gelesen wegen dem Einsatz von Rotate aber habe es nicht angeschaut ob ich das benötige 🙈

Klasse Arbeit Vielen Dank
 
Wenn ich den mariadb-Ordner sichere, sollte ja da auch die Datenbank gesichert sein
Ja. Aber ob diese Sicherung konsistent ist, weißt du erst, wenn du sie getestet hast. Mehr Sicherheit hast du mit einem Dump.
 
  • Like
Reaktionen: MattCB
Danke, habe die Zeile mit dem SQL-Dump jetzt einfach in das oben angeführte Script zum Erstellen der Docker-Compose-Files reingeschrieben. Somit werden die Einstellungen der Container und gleich die Datenbank der nextcloud gesichert. Von jedem Backupfile werden 7 Versionen aufbewahrt, das Script läuft jeden Tag einmal.

EDIT: Eigentlich macht das ja keinen Sinn, das komplette Script jeden Tag laufen zu lassen. Denn an den Container ändert sich ja in der Regel nicht wirklich was. Wichtiger ist da tatsächlich die Sicherung der Datenbank. Das werde ich dann doch in ein extra Script packen, dass dann regelmässig läuft.

Code:
#!/bin/bash

# anzupassen:
BackUpDir="/volume1/backup/docker"
# IgnoredContainer=()

#–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
for container in $(docker ps --format "{{ .Names }}"); do
    if grep -q "${container}" <<< "${IgnoredContainer[@]}" ; then
        echo "${container} is on ignore list. Skipping this container."
        continue
    else
        echo "${container} export"

    # YAML:
        # https://www.synology-forum.de/threads/docker-container-automatische-docker-compose-file-erstellen-als-backup.110444/post-897496
        docker run --rm -v /var/run/docker.sock:/var/run/docker.sock red5d/docker-autocompose "${container}" > "${BackUpDir}/${container}_$(date +%Y-%m-%d_%H-%M).yml"
    fi
done
find "$BackUpDir" -name "*.yml" -mtime +7 -exec rm {} \;

docker exec nextcloud-db /usr/bin/mysqldump -u root --password=<MySQL-Rootpasswort> nextcloud > /volume1/backup/docker/sql/nextcloud_$(date +%Y-%m-%d_%H-%M).sql
find "/volume1/backup/docker/sql" -name "*.sql" -mtime +7 -exec rm {} \;
exit
 
Zuletzt bearbeitet:
Du kannst es ja auch einfach nur einmal in der Woche oder alle zwei Tage laufen lassen, der Aufgabenplaner gibt dir da ja genügend Möglichkeiten
 

Additional post fields

 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat