Metainformationen zur Seite
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| magicmirror:magicmirror_tipps:backup [07.10.2026] – angelegt kolja | magicmirror:magicmirror_tipps:backup [08.10.2026] (aktuell) – kolja | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | ====== Backup auf ein NAS ====== | + | ====== |
| ===== Ziel ===== | ===== Ziel ===== | ||
| - | Der komplette relevante | + | Der MagicMirror-Ordner wird auf ein NAS gesichert. |
| - | Jedes Backup wird als komprimiertes TAR.GZ-Archiv gespeichert. | + | Es gibt zwei Varianten: |
| - | Das Backup: | + | * **Manuelles |
| + | * **Automatisches Backup:** jeden Sonntag um 01:00 Uhr | ||
| - | * wird ausschließlich manuell gestartet | + | Eigenschaften: |
| - | * läuft nach dem Start im Hintergrund weiter | + | |
| - | * erhält einen Ordner mit Datum und Uhrzeit | + | |
| - | * wird komprimiert gespeichert | + | |
| - | * wird nach Erstellung vollständig geprüft | + | |
| - | * erhält zusätzlich eine SHA-256-Prüfsumme | + | |
| - | * wird nur gestartet, wenn das richtige NAS tatsächlich gemountet ist | + | |
| - | * bleibt bei einem Fehler als '' | + | |
| - | * verhindert zwei gleichzeitig laufende Backups | + | |
| - | Nicht gesichert | + | * Backup als komprimiertes '' |
| + | * '' | ||
| + | * SHA-256-Prüfsumme zur Integritätskontrolle | ||
| + | * NAS muss tatsächlich erreichbar und gemountet sein | ||
| + | * unvollständige Backups bleiben als '' | ||
| + | * automatische Backups: maximal **4 Stück** | ||
| + | * Erfolg/ | ||
| - | < | + | ===== Verwendete Pfade ===== |
| - | node_modules | + | |
| - | </ | + | |
| - | '' | ||
| - | Diese sollten insbesondere nach einem Wechsel auf einen neuen Raspberry Pi, eine andere Node.js-Version oder ein neues Betriebssystem neu installiert werden. | + | ^ Funktion ^ Pfad / Ort ^ |
| + | | Manuelles Backup-Script | ''/ | ||
| + | | Wöchentliches Backup-Script | ''/ | ||
| + | | ioBroker-Zugangsdaten | ''/ | ||
| + | | Backup-Logs | ''/ | ||
| + | | systemd-Service | ''/ | ||
| + | | systemd-Timer | ''/ | ||
| + | | NAS-Zugangsdaten | ''/ | ||
| + | | NAS-Mount-Konfiguration | ''/ | ||
| + | | NAS-Mountpunkt | ''/ | ||
| + | | Manuelle Backups | ''/ | ||
| + | | Automatische Backups | ''/ | ||
| + | | ioBroker Telegram-Script | '' | ||
| + | | ioBroker Backup-Datenpunkte | '' | ||
| - | ====== | + | ====== |
| - | Beispiel: | + | ===== Pakete installieren ===== |
| - | < | + | < |
| - | NAS | + | sudo apt update |
| - | └── Backup-Freigabe | + | sudo apt install cifs-utils |
| - | └── Manuelle_Backups | + | |
| - | ├── MagicMirror_2026-10-07_12-30-00 | + | |
| - | │ | + | |
| - | │ | + | |
| - | │ | + | |
| - | └── MagicMirror_2026-11-01_18-42-10 | + | |
| - | ├── MagicMirror.tar.gz | + | |
| - | └── MagicMirror.tar.gz.sha256 | + | |
| </ | </ | ||
| - | ====== Platzhalter dieser Anleitung ====== | + | ===== Gruppe anlegen |
| - | ^ Platzhalter ^ Bedeutung ^ | + | <code bash> |
| - | | '' | + | sudo groupadd nasusers |
| - | | ''< | + | sudo usermod |
| - | | ''< | + | </code> |
| - | | '' | + | |
| - | | '' | + | |
| - | | ''< | + | |
| - | | ''< | + | |
| - | + | ||
| - | + | ||
| - | ====== Vorbereitung auf einem neuen Raspberry Pi ====== | + | |
| - | + | ||
| - | ===== 1. Benutzer einrichten ===== | + | |
| - | Bei Raspberry Pi OS wird normalerweise bereits bei der Installation ein Benutzer angelegt. | + | Danach neu anmelden oder neu starten. |
| - | Falls ein zusätzlicher Benutzer benötigt wird: | + | UID und GID ermitteln: |
| <code bash> | <code bash> | ||
| - | sudo adduser | + | id -u < |
| + | getent group nasusers | ||
| </ | </ | ||
| - | Optional sudo-Rechte vergeben: | + | |
| + | ===== Mountpunkt anlegen ===== | ||
| <code bash> | <code bash> | ||
| - | sudo usermod | + | sudo mkdir -p / |
| </ | </ | ||
| - | Kontrolle: | + | |
| + | ===== NAS-Zugangsdaten speichern ===== | ||
| <code bash> | <code bash> | ||
| - | id < | + | sudo mkdir -p / |
| + | sudo nano / | ||
| </ | </ | ||
| + | Inhalt: | ||
| - | ===== 2. NAS-Gruppe anlegen ===== | + | < |
| - | + | username=< | |
| - | <code bash> | + | password=<NAS_PASSWORT> |
| - | sudo groupadd nasusers | + | |
| </ | </ | ||
| - | Benutzer hinzufügen: | + | Datei schützen: |
| <code bash> | <code bash> | ||
| - | sudo usermod | + | sudo chown root:root / |
| + | sudo chmod 600 / | ||
| </ | </ | ||
| - | Anschließend neu anmelden oder den Raspberry Pi neu starten. | ||
| - | Kontrolle: | + | ===== /etc/fstab ===== |
| + | |||
| + | Vorher sichern: | ||
| <code bash> | <code bash> | ||
| - | getent group nasusers | + | sudo cp /etc/fstab / |
| - | id < | + | sudo nano /etc/fstab |
| </ | </ | ||
| + | Eintrag: | ||
| - | ===== 3. UID und GID ermitteln | + | < |
| + | //< | ||
| + | </ | ||
| - | UID: | + | systemd neu laden: |
| <code bash> | <code bash> | ||
| - | id -u < | + | sudo systemctl daemon-reload |
| + | sudo systemctl start mnt-nasbackup.automount | ||
| </ | </ | ||
| - | GID: | + | Status: |
| <code bash> | <code bash> | ||
| - | getent group nasusers | + | systemctl status mnt-nasbackup.automount --no-pager |
| </ | </ | ||
| - | Beispiel: | + | Erwartet: |
| < | < | ||
| - | nasusers:x: | + | Active: active (waiting) |
| </ | </ | ||
| - | In diesem Beispiel wäre: | ||
| - | < | + | ===== NAS testen ===== |
| - | GID = 1003 | + | |
| - | </ | + | |
| - | + | Mount auslösen: | |
| - | ===== 4. CIFS-Unterstützung installieren ===== | + | |
| <code bash> | <code bash> | ||
| - | sudo apt update | + | ls -la / |
| - | sudo apt install cifs-utils | + | |
| </ | </ | ||
| - | Ein Samba-Server wird nicht benötigt. | + | Prüfen: |
| - | Der Raspberry Pi greift lediglich als SMB/CIFS-Client auf das NAS zu. | + | <code bash> |
| + | findmnt | ||
| + | df -h / | ||
| + | </ | ||
| - | + | Schreibtest: | |
| - | ===== 5. Mountpunkt erstellen ===== | + | |
| <code bash> | <code bash> | ||
| - | sudo mkdir -p / | + | touch / |
| + | rm / | ||
| </ | </ | ||
| - | ===== 6. Zugangsdaten zum NAS speichern | + | ====== 2. Manuelles MagicMirror-Backup ====== |
| - | Verzeichnis anlegen: | + | Das manuelle Backup: |
| - | <code bash> | + | * wird per Befehl gestartet |
| - | sudo mkdir -p /etc/samba | + | * läuft danach im Hintergrund |
| - | </code> | + | * erzeugt ein geprüftes TAR.GZ-Archiv |
| + | * erzeugt zusätzlich eine SHA-256-Prüfsumme | ||
| + | * sichert keine '' | ||
| + | * bricht ab, wenn das NAS nicht korrekt gemountet ist | ||
| + | * meldet Erfolg oder Fehler über ioBroker | ||
| - | Datei erstellen: | + | Die ioBroker-Zugangsdaten werden aus |
| - | < | + | < |
| - | sudo nano /etc/samba/ | + | ~/.config/magicmirror-backup/ |
| </ | </ | ||
| - | Inhalt: | + | gelesen. |
| - | < | ||
| - | username=< | ||
| - | password=< | ||
| - | </ | ||
| - | Optional: | + | ===== Script ===== |
| + | |||
| + | Das Script liegt unter: | ||
| < | < | ||
| - | domain=WORKGROUP | + | ~/ |
| </ | </ | ||
| - | Datei absichern: | + | Bearbeiten: |
| <code bash> | <code bash> | ||
| - | sudo chown root: | + | nano ~/bin/backup_magicmirror.sh |
| - | sudo chmod 600 / | + | |
| </ | </ | ||
| - | Kontrolle: | + | Das Script besitzt intern zwei wichtige Betriebsarten: |
| - | <code bash> | + | ^ Modus ^ Verwendung ^ |
| - | ls -l / | + | | '' |
| - | </ | + | | '' |
| - | Erwartet: | + | Dadurch erzeugt das automatische Backup keine doppelte Telegram-Nachricht. |
| - | < | + | |
| - | -rw------- 1 root root ... | + | ===== Backup starten ===== |
| + | |||
| + | < | ||
| + | ~/ | ||
| </ | </ | ||
| + | Das Backup läuft anschließend im Hintergrund. | ||
| - | ===== 7. NAS in /etc/fstab eintragen ===== | ||
| - | Vorher Sicherung: | + | ===== Status / Log ansehen ===== |
| <code bash> | <code bash> | ||
| - | sudo cp /etc/fstab /etc/fstab.backup | + | tail -f "$(ls -t ~/magicmirror-backup-logs/*.log | head -1)" |
| </ | </ | ||
| - | Bearbeiten: | + | Mit '' |
| - | < | + | Das Backup selbst läuft weiter. |
| - | sudo nano /etc/fstab | + | |
| + | |||
| + | ===== Erfolgreiches Backup ===== | ||
| + | |||
| + | Ein erfolgreiches Backup enthält: | ||
| + | |||
| + | < | ||
| + | MagicMirror.tar.gz | ||
| + | MagicMirror.tar.gz.sha256 | ||
| </ | </ | ||
| - | Eintrag: | + | Das Log enthält: |
| < | < | ||
| - | //< | + | BACKUP ERFOLGREICH |
| </ | </ | ||
| + | Zusätzlich wird über ioBroker eine Telegram-Nachricht gesendet. | ||
| - | ===== Bedeutung der Mount-Optionen ===== | ||
| - | ^ Option ^ Bedeutung ^ | + | ===== Speicherort ===== |
| - | | '' | + | |
| - | | '' | + | |
| - | | '' | + | |
| - | | '' | + | |
| - | | '' | + | |
| - | | '' | + | |
| - | | '' | + | |
| - | | '' | + | |
| - | | '' | + | |
| - | | '' | + | |
| + | < | ||
| + | / | ||
| + | </ | ||
| - | ===== 8. Automount aktivieren ===== | + | Beispiel: |
| - | < | + | < |
| - | sudo systemctl daemon-reload | + | MagicMirror_2026-10-08_21-30-00/ |
| - | sudo systemctl start mnt-nasbackup.automount | + | ├── MagicMirror.tar.gz |
| + | └── MagicMirror.tar.gz.sha256 | ||
| </ | </ | ||
| - | Status: | + | |
| + | ===== Backup prüfen ===== | ||
| <code bash> | <code bash> | ||
| - | systemctl status | + | cd /mnt/nasbackup/ |
| + | |||
| + | sha256sum -c MagicMirror.tar.gz.sha256 | ||
| </ | </ | ||
| - | Korrekt: | + | Erwartet: |
| < | < | ||
| - | Active: active (waiting) | + | MagicMirror.tar.gz: OK |
| </ | </ | ||
| - | ===== 9. NAS-Verbindung testen | + | ====== 3. ioBroker für Backup-Meldungen ====== |
| - | Mount durch Zugriff auslösen: | + | ===== REST-API ===== |
| - | <code bash> | + | In ioBroker den Adapter **REST API** installieren. |
| - | ls -la / | + | |
| - | </ | + | |
| - | Prüfen: | + | Empfohlene Einstellungen: |
| - | <code bash> | + | * Authentifizierung: |
| - | findmnt / | + | * Keine GUI: **Ein** |
| - | </ | + | * Commands erlauben: **Aus** |
| + | * Admin-Commands erlauben: **Aus** | ||
| + | * API nur im internen Netzwerk erreichbar machen | ||
| + | * kein Port-Forwarding ins Internet | ||
| - | Es muss ein CIFS-Eintrag für den erwarteten Share vorhanden sein. | ||
| + | ===== Benutzer und Gruppe ===== | ||
| - | ===== 10. Speicherplatz prüfen ===== | + | ioBroker-Benutzer anlegen: |
| - | < | + | < |
| - | df -h / | + | magicmirror |
| </ | </ | ||
| + | Gruppe anlegen: | ||
| - | ===== 11. Schreibzugriff prüfen ===== | + | < |
| - | + | magicmirror_backup | |
| - | < | + | |
| - | touch / | + | |
| - | ls -l / | + | |
| - | rm / | + | |
| </ | </ | ||
| - | Erst wenn dieser Test funktioniert, | + | Benutzer der Gruppe hinzufügen. |
| + | Benötigte Gruppenrechte: | ||
| - | ====== Backup-Script einrichten ====== | + | * Objekte: Auflisten + Lesen |
| + | * Zustände: Auflisten + Lesen + Schreiben | ||
| + | * HTTP: Ein | ||
| + | * Execute/ | ||
| - | ===== 1. Script-Verzeichnis anlegen ===== | ||
| - | < | + | ===== Datenpunkte ===== |
| - | mkdir -p ~/bin | + | |
| + | Folgende Datenpunkte werden benötigt: | ||
| + | |||
| + | < | ||
| + | 0_userdata.0.MagicMirror.Backup.Status | ||
| + | 0_userdata.0.MagicMirror.Backup.Message | ||
| + | 0_userdata.0.MagicMirror.Backup.LastRun | ||
| + | 0_userdata.0.MagicMirror.Backup.BackupPath | ||
| </ | </ | ||
| + | Wichtig: | ||
| - | ===== 2. Script erstellen ===== | + | Der Benutzer '' |
| + | |||
| + | Beispiel auf dem ioBroker-Host: | ||
| <code bash> | <code bash> | ||
| - | nano ~/ | + | iobroker object chown magicmirror magicmirror_backup 0_userdata.0.MagicMirror.Backup.Status |
| + | iobroker object chown magicmirror magicmirror_backup 0_userdata.0.MagicMirror.Backup.Message | ||
| + | iobroker object chown magicmirror magicmirror_backup 0_userdata.0.MagicMirror.Backup.LastRun | ||
| + | iobroker object chown magicmirror magicmirror_backup 0_userdata.0.MagicMirror.Backup.BackupPath | ||
| </ | </ | ||
| - | Inhalt: | ||
| - | <code bash> | + | ===== Telegram-JavaScript ===== |
| - | # | + | |
| - | SOURCE=" | + | Im ioBroker-JavaScript-Adapter: |
| - | NAS="/ | + | |
| - | BACKUP_BASE=" | + | |
| - | LOGDIR=" | + | |
| - | # An eigenes NAS anpassen: | + | <code javascript> |
| - | EXPECTED_SOURCE="//< | + | const BASE = ' |
| + | createState(`${BASE}.Status`, | ||
| + | type: ' | ||
| + | role: ' | ||
| + | read: true, | ||
| + | write: true | ||
| + | }); | ||
| - | check_nas() { | + | createState(`${BASE}.Message`, |
| + | type: ' | ||
| + | role: ' | ||
| + | read: true, | ||
| + | write: true | ||
| + | }); | ||
| - | if ! timeout 15s stat "$NAS" >/ | + | createState(`${BASE}.LastRun`, |
| - | echo " | + | type: ' |
| - | | + | role: ' |
| - | | + | |
| + | write: true | ||
| + | }); | ||
| - | MOUNT_INFO=" | + | createState(`${BASE}.BackupPath`, |
| + | type: ' | ||
| + | role: ' | ||
| + | read: true, | ||
| + | write: true | ||
| + | }); | ||
| - | FSTYPE=" | ||
| - | MOUNT_SOURCE=" | ||
| - | if [[ " | + | on({ |
| - | echo " | + | id: `${BASE}.Status`, |
| - | echo " | + | |
| - | | + | }, obj => { |
| - | fi | + | |
| - | | + | |
| - | } | + | |
| + | if (status !== ' | ||
| - | if [[ "${1:-}" | + | const message = String(getState(`${BASE}.Message`).val || '' |
| + | const lastRun | ||
| + | const backupPath | ||
| - | | + | |
| - | TEMP_DEST=" | + | |
| - | | + | |
| - | | + | text = `✅ MagicMirror |
| + | | ||
| + | text = `❌ MagicMirror | ||
| + | } | ||
| + | text += `\n\nZeit: ${lastRun}`; | ||
| - | | + | |
| - | | + | text += `\nBackup: ${backupPath}`; |
| + | | ||
| - | | + | |
| - | echo " | + | }); |
| - | exit 1 | + | </ |
| - | fi | + | |
| - | echo | + | ====== |
| - | echo "==================================================" | + | |
| - | echo " | + | |
| - | echo " | + | |
| - | echo " | + | |
| - | echo " | + | |
| - | echo " | + | |
| - | echo | + | |
| + | <code bash> | ||
| + | mkdir -p ~/ | ||
| + | nano ~/ | ||
| + | </ | ||
| - | if ! check_nas; then | + | Inhalt: |
| - | echo " | + | |
| - | exit 2 | + | |
| - | fi | + | |
| + | <code bash> | ||
| + | IOBROKER_URL=' | ||
| + | IOBROKER_USER=' | ||
| + | IOBROKER_PASSWORD='< | ||
| + | </ | ||
| - | mkdir -p " | + | Datei schützen: |
| + | <code bash> | ||
| + | chmod 600 ~/ | ||
| + | </ | ||
| - | echo " | ||
| - | echo " | ||
| - | echo | ||
| + | ====== 5. Automatisches wöchentliches Backup ====== | ||
| - | tar \ | + | ===== Script ===== |
| - | --create \ | + | |
| - | --gzip \ | + | |
| - | --dereference \ | + | |
| - | --exclude=' | + | |
| - | --exclude=' | + | |
| - | --exclude=' | + | |
| - | --exclude=' | + | |
| - | --file=" | + | |
| - | --directory=" | + | |
| - | MagicMirror | + | |
| - | RESULT=$? | + | <code bash> |
| + | nano ~/ | ||
| + | </ | ||
| + | Inhalt: | ||
| - | if [[ $RESULT -ne 0 ]]; then | + | <code bash> |
| + | # | ||
| - | echo | + | BACKUP_SCRIPT="$HOME/ |
| - | echo " | + | |
| - | echo "tar Fehlercode: $RESULT" | + | |
| - | echo " | + | |
| - | echo "$TEMP_DEST" | + | |
| - | exit "$RESULT" | + | NAS="/ |
| - | fi | + | AUTO_BASE=" |
| + | LOGDIR=" | ||
| - | echo | + | CONFIG="$HOME/.config/ |
| - | echo "Prüfe gzip ..." | + | |
| - | if ! gzip -t " | + | KEEP_BACKUPS=4 |
| - | echo " | + | |
| - | exit 4 | + | |
| - | fi | + | |
| - | echo "gzip: OK" | + | STATE_BASE="0_userdata.0.MagicMirror.Backup" |
| - | echo | + | if [[ ! -r " |
| - | echo "Prüfe TAR ..." | + | echo "FEHLER: $CONFIG fehlt." |
| + | exit 1 | ||
| + | fi | ||
| - | if ! tar -tzf "$ARCHIVE" | + | source |
| - | echo " | + | |
| - | exit 5 | + | |
| - | fi | + | |
| - | echo "tar: OK" | ||
| + | set_iobroker_state() { | ||
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | --silent \ |
| - | ) || exit 6 | + | --show-error \ |
| + | --max-time 10 \ | ||
| + | --user | ||
| + | --get \ | ||
| + | --data-urlencode " | ||
| + | " | ||
| + | >/dev/null | ||
| + | } | ||
| - | | + | notify_iobroker() { |
| - | cd " | + | |
| - | sha256sum -c MagicMirror.tar.gz.sha256 | + | |
| - | | + | |
| + | local STATUS=" | ||
| + | local MESSAGE=" | ||
| + | local BACKUP_PATH=" | ||
| - | | + | |
| + | set_iobroker_state " | ||
| + | set_iobroker_state " | ||
| + | # Status zuletzt setzen: dieser löst Telegram aus. | ||
| + | set_iobroker_state " | ||
| + | } | ||
| - | mv " | ||
| + | mkdir -p " | ||
| - | echo | + | STAMP=" |
| - | echo " | + | |
| - | echo " | + | |
| - | echo " | + | |
| - | echo | + | |
| - | echo " | + | |
| - | echo " | + | |
| - | echo | + | |
| - | echo " | + | |
| - | echo " | + | |
| - | echo | + | |
| - | echo " | + | |
| - | du -h " | + | |
| - | echo " | + | |
| - | exit 0 | + | DEST=" |
| - | fi | + | |
| + | LOG=" | ||
| - | if [[ ! -d " | ||
| - | echo "FEHLER: MagicMirror-Ordner wurde nicht gefunden:" | + | set_iobroker_state |
| - | echo "$SOURCE" | + | |
| - | exit 1 | ||
| - | fi | ||
| + | " | ||
| - | echo " | + | RESULT=$? |
| - | if ! check_nas; then | + | if [[ $RESULT -eq 0 ]]; then |
| - | | + | |
| - | echo "BACKUP NICHT GESTARTET" | + | |
| - | echo "Das NAS ist offline oder der Share nicht gemountet." | + | |
| - | echo "Es wurden KEINE Daten lokal nach / | + | |
| - | | + | |
| - | fi | + | find " |
| + | -mindepth | ||
| + | -maxdepth 1 \ | ||
| + | -type d \ | ||
| + | -name ' | ||
| + | ! -name ' | ||
| + | -printf ' | ||
| + | | sort -r | ||
| + | ) | ||
| + | if (( ${# | ||
| - | mkdir -p "$BACKUP_BASE" | + | for ((i=KEEP_BACKUPS; |
| - | mkdir -p "$LOGDIR" | + | rm -rf -- "$AUTO_BASE/ |
| + | done | ||
| + | fi | ||
| - | STAMP=" | ||
| - | DEST="$BACKUP_BASE/ | + | MESSAGE="Automatisches MagicMirror-Backup erfolgreich. Größe: |
| - | LOG="$LOGDIR/ | + | notify_iobroker " |
| + | exit 0 | ||
| + | fi | ||
| - | echo "NAS ist erreichbar." | ||
| - | echo | ||
| - | echo " | ||
| - | echo " | ||
| - | echo " | ||
| - | echo " | ||
| - | echo | ||
| + | MESSAGE=" | ||
| - | nohup "$0" | + | notify_iobroker |
| - | PID=$! | + | exit "$RESULT" |
| - | + | ||
| - | + | ||
| - | echo "Backup-Prozess gestartet." | + | |
| - | echo " | + | |
| - | echo | + | |
| - | echo " | + | |
| - | echo "tail -f \" | + | |
| </ | </ | ||
| - | + | Ausführbar | |
| - | ===== 3. Script ausführbar | + | |
| <code bash> | <code bash> | ||
| - | chmod +x ~/bin/backup_magicmirror.sh | + | chmod +x ~/bin/backup_magicmirror_weekly.sh |
| </ | </ | ||
| - | + | Manueller Test: | |
| - | ====== Backup verwenden ====== | + | |
| - | + | ||
| - | ===== Backup starten ===== | + | |
| <code bash> | <code bash> | ||
| - | ~/bin/backup_magicmirror.sh | + | ~/bin/backup_magicmirror_weekly.sh |
| </ | </ | ||
| - | Danach läuft die Sicherung im Hintergrund. | + | Bei Erfolg: |
| - | Das Terminal bzw. die SSH-Verbindung kann geschlossen werden. | + | * Backup liegt unter '' |
| + | * Telegram-Meldung wird gesendet | ||
| + | * Exit-Code ist '' | ||
| - | ===== Status ansehen | + | ====== 6. systemd-Timer ====== |
| - | Neuestes Log: | + | ===== Service ===== |
| <code bash> | <code bash> | ||
| - | tail -f "$(ls -t ~/ | + | sudo nano / |
| </ | </ | ||
| - | '' | + | <code ini> |
| + | [Unit] | ||
| + | Description=Wöchentliches MagicMirror Backup auf NAS | ||
| + | Wants=network-online.target | ||
| + | After=network-online.target | ||
| - | Das Backup läuft unabhängig davon weiter. | + | [Service] |
| + | Type=oneshot | ||
| + | User=< | ||
| + | Group=< | ||
| + | Environment=HOME=/ | ||
| + | WorkingDirectory=/ | ||
| + | ExecStart=/ | ||
| - | ===== Prüfen, ob ein Backup läuft ===== | + | TimeoutStartSec=infinity |
| - | + | ||
| - | <code bash> | + | |
| - | pgrep -af ' | + | |
| </ | </ | ||
| - | Keine Ausgabe bedeutet, dass aktuell kein Backup-Prozess läuft. | ||
| + | ===== Timer ===== | ||
| - | ===== Erfolgreiches Backup ===== | + | <code bash> |
| + | sudo nano / | ||
| + | </ | ||
| - | Im Log muss am Ende erscheinen: | + | <code ini> |
| + | [Unit] | ||
| + | Description=MagicMirror Backup jeden Sonntag um 01:00 Uhr | ||
| - | < | + | [Timer] |
| - | gzip: OK | + | OnCalendar=Sun *-*-* 01:00:00 |
| - | tar: OK | + | Persistent=true |
| - | MagicMirror.tar.gz: | + | AccuracySec=1min |
| - | SHA-256: OK | + | |
| - | BACKUP ERFOLGREICH | + | [Install] |
| + | WantedBy=timers.target | ||
| </ | </ | ||
| - | Ein fertiges Backup trägt keinen Zusatz '' | ||
| + | ===== Aktivieren ===== | ||
| - | ====== Backup überprüfen ====== | + | <code bash> |
| + | sudo systemctl daemon-reload | ||
| + | sudo systemctl enable --now magicmirror-backup-weekly.timer | ||
| + | </ | ||
| - | ===== SHA-256 prüfen ===== | + | Kontrolle: |
| - | + | ||
| - | In das Backup-Verzeichnis wechseln: | + | |
| <code bash> | <code bash> | ||
| - | cd / | + | systemctl list-timers |
| </ | </ | ||
| - | Prüfen: | + | Timer-Status: |
| <code bash> | <code bash> | ||
| - | sha256sum | + | systemctl status magicmirror-backup-weekly.timer --no-pager |
| </ | </ | ||
| Zeile 606: | Zeile 632: | ||
| < | < | ||
| - | MagicMirror.tar.gz: OK | + | Active: active (waiting) |
| </ | </ | ||
| - | ===== gzip prüfen | + | ===== Service manuell testen |
| <code bash> | <code bash> | ||
| - | gzip -t MagicMirror.tar.gz | + | sudo systemctl start magicmirror-backup-weekly.service |
| </ | </ | ||
| - | Keine Ausgabe bedeutet Erfolg. | + | Danach: |
| - | + | ||
| - | + | ||
| - | ===== Inhalt des Archivs ansehen ===== | + | |
| <code bash> | <code bash> | ||
| - | tar -tzf MagicMirror.tar.gz | less | + | systemctl status magicmirror-backup-weekly.service --no-pager |
| </ | </ | ||
| - | ====== | + | ====== |
| - | Falls das Archiv lediglich angesehen werden soll, kann es in einen separaten Ordner entpackt werden. | + | ===== SHA-256 ===== |
| - | + | ||
| - | Beispiel: | + | |
| <code bash> | <code bash> | ||
| - | mkdir MagicMirror_ENTPACKT | + | cd / |
| - | + | sha256sum | |
| - | tar -xzf MagicMirror.tar.gz | + | |
| </ | </ | ||
| - | Da Symlinks beim Backup dereferenziert werden und '' | + | Erwartet: |
| + | < | ||
| + | MagicMirror.tar.gz: | ||
| + | </ | ||
| - | ====== Wiederherstellung auf einem neuen Raspberry Pi ====== | ||
| - | ===== 1. Grundsystem installieren | + | ===== Archivinhalt ansehen |
| - | Auf dem neuen Raspberry Pi zuerst: | + | <code bash> |
| + | tar -tzf MagicMirror.tar.gz | less | ||
| + | </ | ||
| - | * Raspberry Pi OS installieren | ||
| - | * Benutzer einrichten | ||
| - | * Netzwerk konfigurieren | ||
| - | * NAS-Mount nach dieser Anleitung einrichten | ||
| - | * passende Node.js-Version installieren | ||
| - | * MagicMirror-Grundvoraussetzungen installieren | ||
| + | ====== 8. Wiederherstellung ====== | ||
| - | ===== 2. Backup prüfen | + | ===== Auf gleichem System |
| - | <code bash> | + | Archiv prüfen: |
| - | cd / | + | |
| + | <code bash> | ||
| sha256sum -c MagicMirror.tar.gz.sha256 | sha256sum -c MagicMirror.tar.gz.sha256 | ||
| </ | </ | ||
| - | Nur bei: | + | Dann: |
| - | < | + | < |
| - | MagicMirror.tar.gz: OK | + | tar -xzf MagicMirror.tar.gz |
| </ | </ | ||
| - | weiterarbeiten. | ||
| + | ===== Auf einem neuen Raspberry Pi ===== | ||
| - | ===== 3. Vorhandenen | + | Bei einem neuen Pi sollte |
| - | Falls bereits ein Ordner existiert: | + | Aus dem Backup werden anschließend insbesondere übernommen: |
| - | <code bash> | + | * '' |
| - | mv ~/MagicMirror ~/ | + | * '' |
| - | </code> | + | * Drittmodule und deren Konfiguration |
| + | * eigene Bilder, Skripte und Dateien | ||
| + | '' | ||
| - | ===== 4. Backup wiederherstellen ===== | + | Die Abhängigkeiten werden auf dem neuen System neu installiert. |
| - | <code bash> | ||
| - | tar -xzf / | ||
| - | </ | ||
| - | Danach existiert wieder: | + | ====== 9. Alltag ====== |
| - | < | + | ===== Manuelles Backup starten ===== |
| - | ~/MagicMirror | + | |
| + | < | ||
| + | ~/bin/ | ||
| </ | </ | ||
| + | Bei Erfolg oder Fehler wird automatisch eine Telegram-Nachricht über ioBroker gesendet. | ||
| - | ===== 5. Node.js-Abhängigkeiten neu installieren ===== | ||
| - | '' | + | ===== Aktuelles |
| - | Deshalb müssen die Abhängigkeiten passend zur neuen Umgebung neu installiert werden. | + | <code bash> |
| + | tail -f "$(ls -t ~/ | ||
| + | </ | ||
| - | Für den MagicMirror-Hauptordner und installierte Drittmodule ist die jeweils aktuelle Installationsanleitung zu verwenden. | ||
| - | Das ist insbesondere bei einem Wechsel auf einen neuen Pi oder eine neue Node.js-/ | + | ===== Automatisches Backup ===== |
| + | Das automatische Backup läuft: | ||
| - | ====== Verhalten bei nicht erreichbarem NAS ====== | + | < |
| - | + | jeden Sonntag um 01:00 Uhr | |
| - | Das Script prüft vor dem Start: | + | </ |
| - | + | ||
| - | * ob der Mountpunkt erreichbar ist | + | |
| - | * ob dort tatsächlich CIFS verwendet wird | + | |
| - | * ob genau der konfigurierte NAS-Share gemountet ist | + | |
| - | Ist das NAS offline, wird das Backup nicht gestartet. | + | Es werden maximal: |
| - | + | ||
| - | Dadurch kann nicht versehentlich auf die lokale SSD unter | + | |
| < | < | ||
| - | / | + | 4 automatische Backups |
| </ | </ | ||
| - | geschrieben werden. | + | aufbewahrt. |
| + | Manuelle Backups werden dadurch nicht gelöscht. | ||
| - | ====== Wichtige Dateien ====== | ||
| - | ^ Pfad ^ Funktion ^ | + | ===== Timer prüfen ===== |
| - | | '' | + | |
| - | | '' | + | |
| - | | '' | + | |
| - | | ''/ | + | |
| - | | ''/ | + | |
| - | | ''/ | + | |
| - | | ''/ | + | |
| + | <code bash> | ||
| + | systemctl list-timers --all | grep magicmirror | ||
| + | </ | ||
| - | ====== Kurzfassung ====== | ||
| - | Backup starten: | + | ===== NAS prüfen ===== |
| <code bash> | <code bash> | ||
| - | ~/bin/backup_magicmirror.sh | + | findmnt |
| + | df -h / | ||
| </ | </ | ||
| - | Status ansehen: | ||
| - | <code bash> | + | ===== Backup prüfen ===== |
| - | tail -f "$(ls -t ~/ | + | |
| - | </ | + | |
| - | Backup | + | Im jeweiligen |
| <code bash> | <code bash> | ||
| - | cd / | ||
| - | |||
| sha256sum -c MagicMirror.tar.gz.sha256 | sha256sum -c MagicMirror.tar.gz.sha256 | ||
| </ | </ | ||
| - | Ein Backup gilt als gültig, wenn: | + | Erwartet: |
| - | * im Log '' | + | < |
| - | * der Ordner keinen Zusatz '' | + | MagicMirror.tar.gz: |
| - | * die SHA-256-Prüfung '' | + | </ |