Automatisches erstellen der Export config json files via Skript

mamema

Benutzer
Mitglied seit
23. Okt 2009
Beiträge
667
Punkte für Reaktionen
132
Punkte
63
HiHo

ich suche nach einer Lösung dass meiner Docker Container configs automatisch in die passenden json Dateien geschrieben werden, OHNE das ich in der DSM Docker GUI auf Einstellungen / exportieren klicken muss. Habe zuviel Container und bastel zuviel. Zwischendurch läuft dann auch mal Watchtower aus dem Ruder..... irgendwas automatisiertes via Skript..... hat da jemand etwas?
 

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.563
Punkte für Reaktionen
1.389
Punkte
234
Es geht, wenn man synowebapi über die Shell aufruft:

Bash:
BackUpDir="/volume1/PATH/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"
        content=$(/usr/syno/bin/synowebapi --exec api=SYNO.Docker.Container.Profile method=export version=1 name="$container")
        echo "{${content#*{}" > "${BackUpDir}/${container}_$(date +%Y-%m-%d_%H-%M).json"
    fi
done
 

mamema

Benutzer
Mitglied seit
23. Okt 2009
Beiträge
667
Punkte für Reaktionen
132
Punkte
63
super, ich habe mir mittlerweile damit geholfen und 2fa an der Syno deaktiviert, weil ich den kompletten 2fa Service via Authelia umsetze. Aber gut, wenn es Alternativen gibt.
 

abrocksi

Benutzer
Mitglied seit
27. Dez 2013
Beiträge
251
Punkte für Reaktionen
82
Punkte
28
Danke an geimist alias Stephan!

Nicht nur geniales synOCR Tool, auch immer wieder sehr coole Ideen hier im Forum. Jetzt kann ich meine Container zuverlässig sichern.

cheers,
abrocksi
 

haydibe

Benutzer
Sehr erfahren
Mitglied seit
12. Apr 2016
Beiträge
1.526
Punkte für Reaktionen
413
Punkte
103
Neben der Funktionalität als solches, fand ich auch die Ästethik des Snippets ansprechend :)

Wir haben ein Array, einen "Here string" mit der Ausgabe der Array-Element und ne hübsche Variable-Substitution und sauber Quoting. Schöner geht's nicht ^^
 

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.563
Punkte für Reaktionen
1.389
Punkte
234
Die Ausgabe des JSON ist leider nicht ganz sauber. Daher musste ich noch die zusätzliche Ausgabe bis zum einleitenden { entfernen. Außerdem wird am Schluss noch ein zusätzlicher JSON-Block angehangen, der von der synowebapi stammt und nicht zur Containerbeschreibung gehört. Das hat aber beim Import (über die Docker-GUI) nicht gestört und daher habe ich den jetzt nicht rausgefiltert.

Leider habe ich null Ahnung von Python - sonst könnte man sich das evtl. aus dem verlinkten Skript etwas ableiten.

Es ist schade, dass ich noch keine Dokumentation für die Docker-API finden konnte und, dass Funktionen im DSM bereitgestellt werden, die man nicht nutzen kann, weil man sie nicht kennt / finden kann.
 

Adama

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
05. Mrz 2013
Beiträge
2.188
Punkte für Reaktionen
766
Punkte
154

Adama

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
05. Mrz 2013
Beiträge
2.188
Punkte für Reaktionen
766
Punkte
154
Jetzt weiß ich auch wieder, wo ich das her hatte... Ich mach mir langsam Sorgen um mein Gedächtnis... :rolleyes:
 

Ruddi

Benutzer
Mitglied seit
13. Dez 2011
Beiträge
44
Punkte für Reaktionen
14
Punkte
14
Und Frage -> wie kann ich mit einem Script den "Containerinhalt und -einstellungen exportieren" für alle Container ?
lg, Ruddi
 

haydibe

Benutzer
Sehr erfahren
Mitglied seit
12. Apr 2016
Beiträge
1.526
Punkte für Reaktionen
413
Punkte
103
Ich hab das Skript von @geimist mal minimal überarbeitet. Jetzt wird die Konfiguration direkt als json durch synowebapi geschrieben:
Code:
#!/bin/bash
BACKUP_DIR="/volume1/docker/Docker_BackUps"
IGNORE_CONTAINERS=(jitsi_jicofo jitsi_jvb jitsi_prosody jitsi_web synology_docviewer_2 synology_docviewer_1)
EXPORT_DATE="$(date +%Y-%m-%d_%H-%M)"

[ ! -d "${BACKUP_DIR}" ] && mkdir -p "${BACKUP_DIR}"
echo "exporting container settings to ${BACKUP_DIR}"

for container in $(docker ps --format "{{ .Names }}"); do
    if grep -q "$container" <<< "${IGNORE_CONTAINERS[@]}" ; then
        echo "${container} is on ignore list. Skipping this container."
        continue
    else
        echo "${container} export"
        /usr/syno/bin/synowebapi --exec api=SYNO.Docker.Container.Profile method=export version=1 outfile="${BACKUP_DIR}/${container}_${EXPORT_DATE}.json" name="${container}"  2> /dev/null
    fi
done
 

haydibe

Benutzer
Sehr erfahren
Mitglied seit
12. Apr 2016
Beiträge
1.526
Punkte für Reaktionen
413
Punkte
103
Und Frage -> wie kann ich mit einem Script den "Containerinhalt und -einstellungen exportieren" für alle Container ?
Leider scheint keine offiziele API-Dokumentation für die SYNO.Docker.Container.* API zu existieren - zumindest konnte ich sie nirgendwo finden. Einiges kann man sich bei diversen Github-Projekten abschauen, die einen Wrapper für die API geschrieben haben, doch leider habe ich bei Keinem die Parametrisierung für den Export einschließlich Container-Daten gefunden..

Da die UI es in irgendeiner Form selbst nutzt, MUSS es dafür einen entsprechenden Befehl bzw. eine Parametrisierung geben. Ich hab es nicht geschafft ihn herauszufinden. Vermutlich muss entweder eine andere method verwendet werden oder eine weiterer Parameter als key=value rangehängt werden.
 
  • Like
Reaktionen: Monacum

EDvonSchleck

Gesperrt
Mitglied seit
06. Mrz 2018
Beiträge
4.703
Punkte für Reaktionen
1.120
Punkte
214
Würde es eine Möglichkeit geben, das Skript so zu gestalten, um exportierte Container wieder zu importieren? Also ein weiteres für den Import?
Ich wollte das schon eine ganze Zeit fragen und bin heute durch einen anderen Thread wieder darauf gestoßen.
 

haydibe

Benutzer
Sehr erfahren
Mitglied seit
12. Apr 2016
Beiträge
1.526
Punkte für Reaktionen
413
Punkte
103
Dafür gibt es bestimmt auch einen entsprechenden API-Call und Parameter.

Ansonsten erlaubt `docker export` das Speichern von Container (inkl. Zustand) und `docker import` würde das exportieren Archiv wieder einlesen. Wobei natürlich der Inhalt von Volumes nicht mitgespeichert wird.

Ich hab die Funktion nie verwendet, da ich nichts von Zustand in Container speichern halte. Wenn man auf den Zustand im Container angewiesen ist, dann hat man an einer anderen Stelle etwas Grundsätzliches nicht richtig gemacht. Ich sichere eher compose files und Inhalt von Volumes.
 
  • Like
Reaktionen: EDvonSchleck

EDvonSchleck

Gesperrt
Mitglied seit
06. Mrz 2018
Beiträge
4.703
Punkte für Reaktionen
1.120
Punkte
214
Ich speicher die compose auch direkt in einer Text-Datei weg. Trotzdem wäre es ja nicht schlecht, wenn man die gesicherten Einstellungen hat, auch alle am Stück einspielen kann. Also in einem Rutsch unter der Berücksichtigung der Volumes.
 

haydibe

Benutzer
Sehr erfahren
Mitglied seit
12. Apr 2016
Beiträge
1.526
Punkte für Reaktionen
413
Punkte
103
Ich hab mal ein wenig rumgespielt (in mit den Browser Developer Tool geschaut was die Syno-UI verwendet)

Hiermit kann man Container wieder aus dem exportierten json wiederherstellen:
Code:
/usr/syno/bin/synowebapi --exec api=SYNO.Docker.Container.Profile method=import version=1 path="${BACKUP_DIR}/${container}.syno.json" container=${container}

Hiermit kann man einen Container samt Zustand speichern:
Code:
/usr/syno/bin/synowebapi --exec api=SYNO.Docker.Container method=export version=1 path="${BACKUP_DIR}" name="${container}"

Die erzeugte Datei ist dann unter dem Pfad ${BACKUP_DIR}/${container}.syno.txz zu finden.

Importieren könnte man so einen Export dann mit:
Code:
/usr/syno/bin/synowebapi --exec api=SYNO.Docker.Container method=import version=1 path="${BACKUP_DIR}/${container}.syno.txz" container=${container} repository=${container} tag=$( date'+%Y%m%d')

Die UI belegt beim Import den Wert für container und repository mit dem Container-Namen vor und tag mit YYYYMMDD vor. Das habe ich in dem Import-Befehl mal nachgebildet (obwohl es völliger quatsch ist). Ich hätte mir eigentlich gewünscht das die Information aus dem Backup wiederhergestellt wird....
 
Zuletzt bearbeitet:

EDvonSchleck

Gesperrt
Mitglied seit
06. Mrz 2018
Beiträge
4.703
Punkte für Reaktionen
1.120
Punkte
214
Mir ist heute aufgefallen, dass nur gestartete Container mit deinem Script exportiert werden. Besteht die Möglichkeit, das Script auf alle Container auszuweiten? Bedeutet version=1 das nur die laufenden Container gesichert werden?
 

haydibe

Benutzer
Sehr erfahren
Mitglied seit
12. Apr 2016
Beiträge
1.526
Punkte für Reaktionen
413
Punkte
103
Mir erscheint es so, als wenn version=1 für die API-Version steht.

Kann man den über die UI ausgeschaltete Container exportieren? Wenn das geht, sollte es auch über die CLI gehen.

Man muss "nur" über die Developer-Tools des Browsers herausfinden wie der Name der API, der Methode und die benutzen Parameter aussehen, die bei der Aktion vom Browser an die Syno übertragen werden.
 


 

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