NEWS
[Vorlage] Automatisches Git-Backup für Skripte/Blockly
-
Ein verlässliches Backup der eigenen ioBroker-Skripte ist Gold wert. Wer schon einmal versehentlich einen funktionierenden Codeblock gelöscht oder überschrieben hat, weiß eine saubere Versionierung extrem zu schätzen.
Ich habe nach einer Lösung gesucht, mit der ich meine Skripte vollautomatisch, unsichtbar und kostenlos versionieren kann. Das Ziel: Ein privates Git-Repository, das bei jeder Änderung einen Snapshot macht, damit ich im Browser jederzeit ein "Vorher-Nachher" (Diff) sehen und alte Versionen zurückholen kann. Ganz ohne nerviges SSH-Schlüssel-Geraffel.
Hier ist meine Lösung, die die hauseigene Spiegel-Funktion des JS-Adapters nutzt und auf einem Host völlig ressourcenschonend im Minutentakt im Hintergrund läuft.
Schritt 1: Skripte automatisch auf die Festplatte spiegeln
Damit Git unsere Skripte sichern kann, müssen sie als echte Dateien (
.jsoder.ts) auf der Festplatte des ioBrokers liegen. Das erledigt der JavaScript-Adapter von allein.- Geht im ioBroker auf Instanzen und klickt beim JavaScript-Adapter (
javascript.0) auf das Zahnrad (Einstellungen). - Sucht die Option "Spiegeln von Skripten in den Dateipfad" (meist unter Zusätzliche Einstellungen).
- Tragt dort euren gewünschten Pfad ein, z.B.:
/opt/iobroker/scripts - Speichern und schließen.
- Wichtig: Öffnet nun kurz ein beliebiges Skript im ioBroker und klickt einmal auf "Speichern". Erst durch diesen Speicher-Vorgang legt der Adapter den neuen Ordner auf der Festplatte tatsächlich an!
Schritt 2: GitHub vorbereiten (Personal Access Token)
Wir nutzen HTTPS mit einem Token, damit wir uns nicht mit Zertifikaten oder Schlüsseln herumschlagen müssen.
- Erstellt auf GitHub ein neues Repository (z. B.
iobroker-scripts). Wählt unbedingt "Private" aus, damit niemand eure Haussteuerung sieht! - Geht bei GitHub oben rechts auf euer Profilbild -> Settings -> ganz unten links auf Developer settings -> Personal access tokens -> Tokens (classic).
- Klickt auf Generate new token (classic).
- Gebt ihm einen Namen (z. B. "ioBroker Backup"), setzt die Ablaufzeit (Expiration) z. B. auf "No expiration" und setzt einen Haken bei
repo(Full control of private repositories). - Klickt auf Generieren und kopiert euch den Token (er fängt meist mit
ghp_an).
Schritt 3: Ordner für Git initialisieren
Loggt euch per SSH (z. B. PuTTY) auf eurem ioBroker-Host ein und führt folgende Befehle nacheinander aus.
(Hinweis: Ersetzt die Platzhalter
DEIN_TOKEN,DEIN_GITHUB_NAME,DEIN_REPOund eure E-Mail-Adresse!)# 1. In den Skript-Ordner wechseln cd /opt/iobroker/scripts # 2. Den Ordner für Git als "sicher" markieren (löst Rechte-Probleme mit dem ioBroker-User) git config --global --add safe.directory /opt/iobroker/scripts # 3. Git initialisieren git init # 4. Git Benutzerdaten setzen (für die Historie auf GitHub) git config user.name "ioBroker Auto-Backup" git config user.email "deine.email@beispiel.de" # 5. Das GitHub-Repo verknüpfen (Hier Token & Namen einsetzen!) git remote add origin https://DEIN_TOKEN@github.com/DEIN_GITHUB_NAME/DEIN_REPO.git # 6. Den ersten, manuellen Upload anstoßen git add . git commit -m "Initial Backup" git branch -M main git push -u origin mainWenn der letzte Befehl fehlerfrei durchläuft, liegen eure Skripte jetzt sicher in eurem privaten GitHub-Repo.
Schritt 4:
execim ioBroker erlaubenDamit unser Automatik-Skript gleich den Git-Befehl ausführen darf, muss das im Adapter erlaubt werden:
- Geht im ioBroker auf Instanzen.
- Klickt beim JavaScript-Adapter (
javascript.0) auf das Zahnrad. - Setzt (falls noch nicht geschehen) einen Haken bei Erlaube das Kommando "exec".
Schritt 5: Das Automatik-Skript (Silent Mode)
Erstellt ein neues JavaScript im ioBroker und fügt diesen Code ein.
Das Skript läuft jede Minute, ist extrem ressourcenschonend (Git prüft rein lokal) und meldet sich im Log nur, wenn es wirklich etwas hochgeladen hat (Silent Mode). So bleibt das Logbuch sauber.// ===================================================================== // ioBroker Git Auto-Backup (SILENT MODE) v.2 // ===================================================================== const exec = require('child_process').exec; function runGitBackup() { const backupDir = '/opt/iobroker/scripts'; // 1. Prüfen, ob der Ordner schon sicher ist, falls nicht -> hinzufügen (schont SD-Karte & andere Projekte) // 2. Ins Verzeichnis wechseln und Änderungen prüfen // 3. Nur bei echten Änderungen committen und pushen const cmd = `git config --global --get-all safe.directory | grep -q "^${backupDir}$" || git config --global --add safe.directory ${backupDir}; cd ${backupDir} && git add -A && git diff-index --quiet HEAD || (git commit -m "Auto-Backup: $(date +'%d.%m.%Y %H:%M')" && git push origin main)`; exec(cmd, function (error, stdout, stderr) { if (error) { log(`[Git Backup] Fehler bei der Ausführung: ${error.message}`, 'error'); return; } const output = (stdout + " " + stderr).trim(); if (output.includes('main -> main') || output.includes('master -> master')) { // Nur loggen, wenn WIRKLICH etwas hochgeladen wurde! log(`[Git Backup] ERFOLG! Neue Skript-Versionen wurden zu GitHub hochgeladen.`, 'info'); } else if (output === "") { // SILENT MODE: Hier machen wir absichtlich NICHTS. // So bleibt das ioBroker-Log sauber, wenn sich nichts geändert hat. } else { // Für unerwartete Git-Meldungen log(`[Git Backup] Durchgelaufen mit Info: ${output}`, 'debug'); } }); } // --------------------------------------------------------- // ZEITPLAN (Alle 5 Minuten) // --------------------------------------------------------- schedule("*/5 * * * *", function () { runGitBackup(); }); // Beim Start des Skripts einmalig sofort ausführen runGitBackup();Fazit
Ab sofort müsst ihr euch um nichts mehr kümmern. Speichert ihr ein Skript im ioBroker, landet es durch die Spiegel-Funktion sofort auf der Festplatte. Spätestens 60 Sekunden später schiebt unser Backup-Skript einen neuen, sauberen Commit zu GitHub.
Pro-Tipp: Wenn ihr in dem Backup-Ordner Dateien habt, die nicht zu GitHub sollen, legt dort einfach eine Textdatei namens
.gitignorean und schreibt z.B.*.logodergeheim.jshinein.Edit:
Die Zeile mit demconst cmd = ...gegen diese ausgetauscht:
const cmd = `git config --global --replace-all safe.directory ${backupDir} && cd ${backupDir} && git add -A && git diff-index --quiet HEAD || (git commit -m "Auto-Backup: $(date +'%d.%m.%Y %H:%M')" && git push origin main)`;Edit: v.2
Git-Config optimiert: Der Pfad wird jetzt per grep geprüft und nur noch geschrieben, wenn er wirklich fehlt. Das verhindert eine endlos wachsende .gitconfig, schont die SD-Karte und zerschießt keine anderen Git-Projekte auf dem System.
Sofort-Start hinzugefügt: Das Skript führt beim (Neu-)Start jetzt direkt ein Backup aus.
Zeitplan & Kommentare korrigiert: Der Cron-Ausdruck und die Kommentare stehen nun einheitlich auf "Alle 5 Minuten" (*/5 * * * *). - Geht im ioBroker auf Instanzen und klickt beim JavaScript-Adapter (
-
Ein verlässliches Backup der eigenen ioBroker-Skripte ist Gold wert. Wer schon einmal versehentlich einen funktionierenden Codeblock gelöscht oder überschrieben hat, weiß eine saubere Versionierung extrem zu schätzen.
Ich habe nach einer Lösung gesucht, mit der ich meine Skripte vollautomatisch, unsichtbar und kostenlos versionieren kann. Das Ziel: Ein privates Git-Repository, das bei jeder Änderung einen Snapshot macht, damit ich im Browser jederzeit ein "Vorher-Nachher" (Diff) sehen und alte Versionen zurückholen kann. Ganz ohne nerviges SSH-Schlüssel-Geraffel.
Hier ist meine Lösung, die die hauseigene Spiegel-Funktion des JS-Adapters nutzt und auf einem Host völlig ressourcenschonend im Minutentakt im Hintergrund läuft.
Schritt 1: Skripte automatisch auf die Festplatte spiegeln
Damit Git unsere Skripte sichern kann, müssen sie als echte Dateien (
.jsoder.ts) auf der Festplatte des ioBrokers liegen. Das erledigt der JavaScript-Adapter von allein.- Geht im ioBroker auf Instanzen und klickt beim JavaScript-Adapter (
javascript.0) auf das Zahnrad (Einstellungen). - Sucht die Option "Spiegeln von Skripten in den Dateipfad" (meist unter Zusätzliche Einstellungen).
- Tragt dort euren gewünschten Pfad ein, z.B.:
/opt/iobroker/scripts - Speichern und schließen.
- Wichtig: Öffnet nun kurz ein beliebiges Skript im ioBroker und klickt einmal auf "Speichern". Erst durch diesen Speicher-Vorgang legt der Adapter den neuen Ordner auf der Festplatte tatsächlich an!
Schritt 2: GitHub vorbereiten (Personal Access Token)
Wir nutzen HTTPS mit einem Token, damit wir uns nicht mit Zertifikaten oder Schlüsseln herumschlagen müssen.
- Erstellt auf GitHub ein neues Repository (z. B.
iobroker-scripts). Wählt unbedingt "Private" aus, damit niemand eure Haussteuerung sieht! - Geht bei GitHub oben rechts auf euer Profilbild -> Settings -> ganz unten links auf Developer settings -> Personal access tokens -> Tokens (classic).
- Klickt auf Generate new token (classic).
- Gebt ihm einen Namen (z. B. "ioBroker Backup"), setzt die Ablaufzeit (Expiration) z. B. auf "No expiration" und setzt einen Haken bei
repo(Full control of private repositories). - Klickt auf Generieren und kopiert euch den Token (er fängt meist mit
ghp_an).
Schritt 3: Ordner für Git initialisieren
Loggt euch per SSH (z. B. PuTTY) auf eurem ioBroker-Host ein und führt folgende Befehle nacheinander aus.
(Hinweis: Ersetzt die Platzhalter
DEIN_TOKEN,DEIN_GITHUB_NAME,DEIN_REPOund eure E-Mail-Adresse!)# 1. In den Skript-Ordner wechseln cd /opt/iobroker/scripts # 2. Den Ordner für Git als "sicher" markieren (löst Rechte-Probleme mit dem ioBroker-User) git config --global --add safe.directory /opt/iobroker/scripts # 3. Git initialisieren git init # 4. Git Benutzerdaten setzen (für die Historie auf GitHub) git config user.name "ioBroker Auto-Backup" git config user.email "deine.email@beispiel.de" # 5. Das GitHub-Repo verknüpfen (Hier Token & Namen einsetzen!) git remote add origin https://DEIN_TOKEN@github.com/DEIN_GITHUB_NAME/DEIN_REPO.git # 6. Den ersten, manuellen Upload anstoßen git add . git commit -m "Initial Backup" git branch -M main git push -u origin mainWenn der letzte Befehl fehlerfrei durchläuft, liegen eure Skripte jetzt sicher in eurem privaten GitHub-Repo.
Schritt 4:
execim ioBroker erlaubenDamit unser Automatik-Skript gleich den Git-Befehl ausführen darf, muss das im Adapter erlaubt werden:
- Geht im ioBroker auf Instanzen.
- Klickt beim JavaScript-Adapter (
javascript.0) auf das Zahnrad. - Setzt (falls noch nicht geschehen) einen Haken bei Erlaube das Kommando "exec".
Schritt 5: Das Automatik-Skript (Silent Mode)
Erstellt ein neues JavaScript im ioBroker und fügt diesen Code ein.
Das Skript läuft jede Minute, ist extrem ressourcenschonend (Git prüft rein lokal) und meldet sich im Log nur, wenn es wirklich etwas hochgeladen hat (Silent Mode). So bleibt das Logbuch sauber.// ===================================================================== // ioBroker Git Auto-Backup (SILENT MODE) v.2 // ===================================================================== const exec = require('child_process').exec; function runGitBackup() { const backupDir = '/opt/iobroker/scripts'; // 1. Prüfen, ob der Ordner schon sicher ist, falls nicht -> hinzufügen (schont SD-Karte & andere Projekte) // 2. Ins Verzeichnis wechseln und Änderungen prüfen // 3. Nur bei echten Änderungen committen und pushen const cmd = `git config --global --get-all safe.directory | grep -q "^${backupDir}$" || git config --global --add safe.directory ${backupDir}; cd ${backupDir} && git add -A && git diff-index --quiet HEAD || (git commit -m "Auto-Backup: $(date +'%d.%m.%Y %H:%M')" && git push origin main)`; exec(cmd, function (error, stdout, stderr) { if (error) { log(`[Git Backup] Fehler bei der Ausführung: ${error.message}`, 'error'); return; } const output = (stdout + " " + stderr).trim(); if (output.includes('main -> main') || output.includes('master -> master')) { // Nur loggen, wenn WIRKLICH etwas hochgeladen wurde! log(`[Git Backup] ERFOLG! Neue Skript-Versionen wurden zu GitHub hochgeladen.`, 'info'); } else if (output === "") { // SILENT MODE: Hier machen wir absichtlich NICHTS. // So bleibt das ioBroker-Log sauber, wenn sich nichts geändert hat. } else { // Für unerwartete Git-Meldungen log(`[Git Backup] Durchgelaufen mit Info: ${output}`, 'debug'); } }); } // --------------------------------------------------------- // ZEITPLAN (Alle 5 Minuten) // --------------------------------------------------------- schedule("*/5 * * * *", function () { runGitBackup(); }); // Beim Start des Skripts einmalig sofort ausführen runGitBackup();Fazit
Ab sofort müsst ihr euch um nichts mehr kümmern. Speichert ihr ein Skript im ioBroker, landet es durch die Spiegel-Funktion sofort auf der Festplatte. Spätestens 60 Sekunden später schiebt unser Backup-Skript einen neuen, sauberen Commit zu GitHub.
Pro-Tipp: Wenn ihr in dem Backup-Ordner Dateien habt, die nicht zu GitHub sollen, legt dort einfach eine Textdatei namens
.gitignorean und schreibt z.B.*.logodergeheim.jshinein.Edit:
Die Zeile mit demconst cmd = ...gegen diese ausgetauscht:
const cmd = `git config --global --replace-all safe.directory ${backupDir} && cd ${backupDir} && git add -A && git diff-index --quiet HEAD || (git commit -m "Auto-Backup: $(date +'%d.%m.%Y %H:%M')" && git push origin main)`;Edit: v.2
Git-Config optimiert: Der Pfad wird jetzt per grep geprüft und nur noch geschrieben, wenn er wirklich fehlt. Das verhindert eine endlos wachsende .gitconfig, schont die SD-Karte und zerschießt keine anderen Git-Projekte auf dem System.
Sofort-Start hinzugefügt: Das Skript führt beim (Neu-)Start jetzt direkt ein Backup aus.
Zeitplan & Kommentare korrigiert: Der Cron-Ausdruck und die Kommentare stehen nun einheitlich auf "Alle 5 Minuten" (*/5 * * * *).@mrMuppet sagte in [Vorlage] Automatisches Git-Backup für Skripte/Blockly:
const cmd = `git config --global --add safe.directory ${backupDir}
Dieser Befehl dürfte minütlich das gleiche Verzeichnis in die .gitconfig schreiben (anhängen), oder?
- Geht im ioBroker auf Instanzen und klickt beim JavaScript-Adapter (
-
Stimmt: durch das --add wird die Zeile bei jedem Durchlauf stumpf unten an die .gitconfig des iobroker-Users angehängt.
Lösung: Tausch im Skript einfach die Zeile mit dem
const cmd = ...gegen diese hier aus:const cmd = `git config --global --replace-all safe.directory ${backupDir} && cd ${backupDir} && git add -A && git diff-index --quiet HEAD || (git commit -m "Auto-Backup: $(date +'%d.%m.%Y %H:%M')" && git push origin main)`;Sobald das Skript einmal mit --replace-all durchgelaufen ist, hat es seine eigene .gitconfig wieder aufgeräumt!
Edit: Ich habe oben noch eine bessere Version unter dem Namen v.2 hochgeladen.
-
git und github (microsoft company) gleichzusetzen finde ich etwas ..... hmmm .... fragwürdig ....
Ich habe auf meinen PVE eine gitea - instanz angelegt - dorthin spiegele ich händisch. Github-Repositories werde ich nur noch in Ausnahmefällen anlegen - wenn Kooperation mit anderen Contributors nötig ist z. B.
Bei den Sachen, die man da github anvertraut sollte man vorsichtig sein!
Wenn in einem Script Credentials für aus dem Web erreichbare "china-Cloud"-Devices vorkommen, kann sie jeder auslesen, der Zugang zum github Repository hat... - deshalb ist der Hinweis des Thread-Erstellers UNBEDINGT zu befolgen
Mein Wissensstand über private Repositories ist aber seit 7 Jahren veraltet ...
https://www.heise.de/news/Private-Repositories-auf-GitHub-nun-kostenlos-4267448.html
Ob mir persönlich es sicher genug wäre, den Haken bei "privat" zu setzen, um andere von meinem Repository auszusperren ...
Womöglich nutzt Microsoft die privaten Repositories für das Training von KIs und irgendwie flutscht später dann doch ein Credential in die Antwort auf einen Prompt an diese KI....