diff --git a/README.md b/README.md index a68b53e..623f43a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# rcloning.sh +# rcloning_param.sh -Ein Bash-Script zum automatisierten Synchronisieren von Dateien zwischen zwei rclone-Remotes mit integrierter Archivierung und strukturiertem Logging. +Ein Bash-Script zum flexiblen Synchronisieren oder Kopieren von Dateien zwischen rclone-Remotes — mit Quelle und Ziel als Aufrufparameter, automatischer Archivierung geänderter Dateien, dynamischem Exclude-Handling und strukturiertem Logging. --- @@ -8,10 +8,12 @@ Ein Bash-Script zum automatisierten Synchronisieren von Dateien zwischen zwei rc Das Script führt folgende Schritte in Sequenz aus: -1. **Synchronisation / Kopieren** — Überträgt Dateien von `QUELLE` nach `ZIEL` per `rclone sync` oder `rclone copy`. -2. **Archivierung** — Dateien, die am Ziel überschrieben oder gelöscht werden, landen vorher automatisch in einem stündlich benannten Archivordner (`JJ-MM-TT-HH`). -3. **ZIP-Erstellung** — Das Archivverzeichnis wird als `.zip` gepackt. -4. **Aufräumen** — Das Archivverzeichnis wird nach erfolgreichem Packen gelöscht; bei Fehlercode `3` (kein Archiv nötig, da keine Änderungen) wird eine entsprechende Info geloggt. +1. **Validierung** — Prüft Parameter, Modus-Angabe, Remote-Syntax von ZIEL und dessen Erreichbarkeit per `rclone lsd`. +2. **rclone.ignore laden** — Sucht in QUELLE nach einer `rclone.ignore`-Datei und übergibt sie als `--exclude-from`, falls vorhanden. +3. **Synchronisation / Kopieren** — Überträgt Dateien von `QUELLE` nach `ZIEL` per `rclone sync` oder `rclone copy`. +4. **Archivierung** — Dateien, die am Ziel überschrieben oder gelöscht werden, landen vorher automatisch in einem stündlich benannten Archivordner neben dem Zielverzeichnis. +5. **ZIP-Erstellung** — Das Archivverzeichnis wird als `.zip` gepackt. +6. **Aufräumen** — Das Archivverzeichnis wird nach erfolgreichem Packen gelöscht. --- @@ -19,29 +21,112 @@ Das Script führt folgende Schritte in Sequenz aus: | Anforderung | Hinweis | |---|---| -| `rclone` | Muss installiert und konfiguriert sein | -| `logger.sh` | Eigenes Logging-Modul, Pfad über `GIT_PFAD` | -| `GIT_PFAD` | Umgebungsvariable, in `.bashrc` gesetzt (z. B. `~/Dokumente/Gitea`) | -| Konfigurierte Remotes | `ptv-nextcloud` und `spzssh` müssen in `~/.config/rclone/rclone.conf` vorhanden sein | +| `rclone` | Installiert und konfiguriert (`~/.config/rclone/rclone.conf`) | +| `logger.sh` | Eigenes Logging-Modul aus dem selben Gitea-Repository | +| `GIT_PFAD` | Umgebungsvariable in `.bashrc` gesetzt (z. B. `export GIT_PFAD="$HOME/Dokumente/Gitea"`) | +| ZIEL-Remote | Muss in rclone konfiguriert und erreichbar sein | --- -## Konfiguration +## Verwendung -Alle Einstellungen befinden sich im Abschnitt `# Einstellungen #` am Anfang des Scripts: +```bash +bash rcloning_param.sh [sync|copy] +``` -| Variable | Beschreibung | Beispielwert | +| Parameter | Pflicht | Beschreibung | |---|---|---| -| `IST_TEST` | Testlauf ohne Übertragung (`--dry-run`) | `ja` / `nein` | -| `QUELLE` | Quell-Remote und -Pfad | `ptv-nextcloud:/DPV` | -| `ZIEL` | Ziel-Remote und -Pfad | `spzssh:/srv/.../DPVonNextcloud/` | -| `ARCHIV` | Zielort für archivierte (überschriebene/gelöschte) Dateien | `spzssh:/srv/.../Archiv/JJ-MM-TT-HH` | -| `MODUS` | Übertragungsmodus | `sync` oder `copy` | -| `LOGLVL` | Detailgrad des rclone-Logs | `DEBUG`, `INFO`, `NOTICE`, `ERROR` | -| `IGNORE` | Optionaler rclone-Parameter zum Überspringen vorhandener Dateien | leer lassen, wenn nicht benötigt | -| `EXCLUDE` | Auszuschließende Pfade/Dateien | `.git/` | +| `QUELLE` | ✓ | rclone-Remote **oder** lokaler Pfad | +| `ZIEL` | ✓ | rclone-Remote (zwingend, wegen `--backup-dir`) | +| `Modus` | – | `sync` (Standard) oder `copy` | -> **Hinweis:** Bei `MODUS=sync` werden am Ziel Dateien gelöscht, die in der Quelle nicht mehr existieren. Gelöschte/überschriebene Dateien werden vorher in `ARCHIV` gesichert. +### Beispiele + +```bash +# Remote nach Remote, sync (Standard) +bash rcloning_param.sh ptv-nextcloud:/DPV spzssh:/srv/.../Ziel/ + +# Lokales Verzeichnis nach Remote +bash rcloning_param.sh /home/richard/Dokumente spzssh:/srv/.../Backup/ + +# Aktuelles Verzeichnis nach Remote +bash rcloning_param.sh . spzssh:/srv/.../Backup/ + +# Explizit copy statt sync +bash rcloning_param.sh ptv-nextcloud:/DPV spzssh:/srv/.../Ziel/ copy +``` + +> **Hinweis:** Als ZIEL ist ausschließlich ein rclone-Remote erlaubt, da `--backup-dir` zwingend auf demselben Remote wie ZIEL liegen muss. Für rein lokale Transfers (Quelle und Ziel lokal) ist `rsync` die bessere Wahl. + +> **Hinweis zu `sync`:** Im Sync-Modus werden Dateien am Ziel gelöscht, die in der Quelle nicht mehr existieren. Alle betroffenen Dateien werden vorher ins Archiv verschoben. + +--- + +## Archiv-Logik + +Der Archivpfad wird automatisch aus dem Zielpfad abgeleitet — kein zusätzlicher Parameter nötig: + +``` +ZIEL → spzssh:/srv/.../DPVonNextcloud/ +ARCHIV → spzssh:/srv/.../DPVonNextcloud_Archiv/25-03-26-14/ +ZIP → spzssh:/srv/.../DPVonNextcloud_Archiv/25-03-26-14.zip +``` + +Der Ordnername entspricht dem Startzeitpunkt des Transfers im Format `JJ-MM-TT-HH`. + +| Exit-Code `rclone archive create` | Verhalten | +|---|---| +| `0` | Erfolg → temporäres Verzeichnis wird gelöscht | +| `3` | Kein Archiv erstellt (keine geänderten/gelöschten Dateien) → Info-Meldung | +| Sonstige | Fehler → Fehlermeldung im Log, Verzeichnis bleibt erhalten | + +--- + +## Exclude-Handling + +Das Script kombiniert zwei Mechanismen zum Ausschließen von Dateien: + +**1. Fest im Script kodiert:** +``` +.git/ +``` + +**2. Dynamisch per `rclone.ignore`:** +Liegt in der QUELLE eine Datei namens `rclone.ignore`, wird sie automatisch als `--exclude-from` übergeben. Das Script erkennt dabei selbstständig, ob QUELLE lokal oder ein Remote ist: + +| QUELLE-Typ | Vorgehen | +|---|---| +| Lokal | Direkter Zugriff auf `$QUELLE/rclone.ignore` | +| Remote | Temporärer Download per `rclone copyto`, Datei wird nach Transfer gelöscht | + +Ist keine `rclone.ignore` vorhanden, läuft das Script ohne `--exclude-from` weiter — kein Abbruch. + +### Format der `rclone.ignore` + +Die Datei folgt dem rclone-Filterformat, ein Muster pro Zeile: + +``` +# Kommentare sind erlaubt +.DS_Store +Thumbs.db +tmp/ +*.log +``` + +Weitere Informationen: [rclone filtering](https://rclone.org/filtering/) + +--- + +## Interne Einstellungen + +Folgende Variablen können direkt im Script angepasst werden: + +| Variable | Beschreibung | Standard | +|---|---|---| +| `IST_TEST` | Testlauf ohne Übertragung (`--dry-run`) | `nein` | +| `LOGLVL` | Detailgrad des rclone-Logs | `INFO` | +| `IGNORE` | Optionaler rclone-Parameter (z. B. `--ignore-existing`) | leer | +| `EXCLUDE` | Fest ausgeschlossene Pfade | `--exclude=.git/` | --- @@ -53,43 +138,32 @@ Das Script nutzt `logger.sh` für strukturiertes Logging. Die Logdatei liegt unt $GIT_PFAD/logger/Logs/rcloning.log ``` -Zusätzlich schreibt `rclone` direkt in dieselbe Datei (`--log-file`). Log-Level für rclone und das interne Logger-Modul werden separat über `LOGLVL` gesteuert. +rclone schreibt ebenfalls direkt in diese Datei (`--log-file`). Vor dem Transfer werden alle relevanten Parameter ins Log geschrieben. --- -## Archiv-Logik +## Validierungen beim Start -Der Archivordner wird nach Datum und Stunde benannt: +Das Script bricht mit einer Fehlermeldung ab, wenn: -``` -Archiv/ -└── 25-03-26-14/ ← Verzeichnis (temporär) - └── ... -25-03-26-14.zip ← Gepacktes Archiv (dauerhaft) -``` - -| Exit-Code `rclone archive create` | Verhalten | -|---|---| -| `0` | Erfolg → temporäres Verzeichnis wird gelöscht | -| `3` | Kein Archiv erstellt (keine überschriebenen/gelöschten Dateien) → Info-Meldung | -| Sonstige | Fehler → Fehlermeldung im Log, Verzeichnis bleibt erhalten | +- `QUELLE` oder `ZIEL` fehlen +- der Modus weder `sync` noch `copy` ist +- `ZIEL` nicht dem Format `remotename:/pfad` entspricht +- `ZIEL` per `rclone lsd` nicht erreichbar ist --- -## Verwendung +## Als Cronjob ```bash -# Direkter Aufruf -bash rcloning.sh - -# Als Cronjob (täglich um 02:00 Uhr) -0 2 * * * /bin/bash /pfad/zu/rcloning.sh +# Täglich um 02:00 Uhr +0 2 * * * /bin/bash /pfad/zu/rcloning_param.sh ptv-nextcloud:/DPV spzssh:/srv/.../Ziel/ ``` -Für einen Testlauf ohne tatsächliche Übertragung `IST_TEST="ja"` setzen. - --- ## Bekannte Einschränkungen -- `rclone archive` ist ein experimentelles Plugin/Subcommand — nicht in allen rclone-Versionen standardmäßig verfügbar. +- `rclone archive` ist ein experimenteller Subcommand — nicht in allen rclone-Versionen standardmäßig verfügbar. +- ZIEL muss zwingend ein Remote sein. Ein lokales Verzeichnis als ZIEL wird vom Script abgelehnt. +- Bei Remote-QUELLE wird `rclone.ignore` temporär nach `/tmp` heruntergeladen und danach automatisch gelöscht. \ No newline at end of file