README.md aktualisiert
This commit is contained in:
166
README.md
166
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:
|
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`.
|
1. **Validierung** — Prüft Parameter, Modus-Angabe, Remote-Syntax von ZIEL und dessen Erreichbarkeit per `rclone lsd`.
|
||||||
2. **Archivierung** — Dateien, die am Ziel überschrieben oder gelöscht werden, landen vorher automatisch in einem stündlich benannten Archivordner (`JJ-MM-TT-HH`).
|
2. **rclone.ignore laden** — Sucht in QUELLE nach einer `rclone.ignore`-Datei und übergibt sie als `--exclude-from`, falls vorhanden.
|
||||||
3. **ZIP-Erstellung** — Das Archivverzeichnis wird als `.zip` gepackt.
|
3. **Synchronisation / Kopieren** — Überträgt Dateien von `QUELLE` nach `ZIEL` per `rclone sync` oder `rclone copy`.
|
||||||
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.
|
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 |
|
| Anforderung | Hinweis |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `rclone` | Muss installiert und konfiguriert sein |
|
| `rclone` | Installiert und konfiguriert (`~/.config/rclone/rclone.conf`) |
|
||||||
| `logger.sh` | Eigenes Logging-Modul, Pfad über `GIT_PFAD` |
|
| `logger.sh` | Eigenes Logging-Modul aus dem selben Gitea-Repository |
|
||||||
| `GIT_PFAD` | Umgebungsvariable, in `.bashrc` gesetzt (z. B. `~/Dokumente/Gitea`) |
|
| `GIT_PFAD` | Umgebungsvariable in `.bashrc` gesetzt (z. B. `export GIT_PFAD="$HOME/Dokumente/Gitea"`) |
|
||||||
| Konfigurierte Remotes | `ptv-nextcloud` und `spzssh` müssen in `~/.config/rclone/rclone.conf` vorhanden sein |
|
| 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 <QUELLE> <ZIEL> [sync|copy]
|
||||||
|
```
|
||||||
|
|
||||||
| Variable | Beschreibung | Beispielwert |
|
| Parameter | Pflicht | Beschreibung |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `IST_TEST` | Testlauf ohne Übertragung (`--dry-run`) | `ja` / `nein` |
|
| `QUELLE` | ✓ | rclone-Remote **oder** lokaler Pfad |
|
||||||
| `QUELLE` | Quell-Remote und -Pfad | `ptv-nextcloud:/DPV` |
|
| `ZIEL` | ✓ | rclone-Remote (zwingend, wegen `--backup-dir`) |
|
||||||
| `ZIEL` | Ziel-Remote und -Pfad | `spzssh:/srv/.../DPVonNextcloud/` |
|
| `Modus` | – | `sync` (Standard) oder `copy` |
|
||||||
| `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/` |
|
|
||||||
|
|
||||||
> **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
|
$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:
|
||||||
|
|
||||||
```
|
- `QUELLE` oder `ZIEL` fehlen
|
||||||
Archiv/
|
- der Modus weder `sync` noch `copy` ist
|
||||||
└── 25-03-26-14/ ← Verzeichnis (temporär)
|
- `ZIEL` nicht dem Format `remotename:/pfad` entspricht
|
||||||
└── ...
|
- `ZIEL` per `rclone lsd` nicht erreichbar ist
|
||||||
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 |
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Verwendung
|
## Als Cronjob
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Direkter Aufruf
|
# Täglich um 02:00 Uhr
|
||||||
bash rcloning.sh
|
0 2 * * * /bin/bash /pfad/zu/rcloning_param.sh ptv-nextcloud:/DPV spzssh:/srv/.../Ziel/
|
||||||
|
|
||||||
# Als Cronjob (täglich um 02:00 Uhr)
|
|
||||||
0 2 * * * /bin/bash /pfad/zu/rcloning.sh
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Für einen Testlauf ohne tatsächliche Übertragung `IST_TEST="ja"` setzen.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Bekannte Einschränkungen
|
## 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.
|
||||||
Reference in New Issue
Block a user