1. Einleitung
Wer JDownloader auf einem Server (z. B. via Docker) betreibt, kennt das Problem: Die lokale Festplatte füllt sich schnell und manuelles Aufräumen oder Verschieben in die Cloud ist mühsam. Viele Lösungen verlassen sich auf JDownloader-interne Eventskripte, die jedoch oft instabil sind oder bei Container-Updates verloren gehen.
Dieses Tutorial stellt eine systemweite, robuste «Set-and-Forget»-Lösung vor. Wir nutzen ein Bash-Skript in Kombination mit systemd, um fertige Downloads automatisch zu Google Drive (oder anderen Cloud-Speichern) hochzuladen und alte Reste (.rar, .part) sauber zu entfernen.
[BILD 1: Schematische Darstellung: JDownloader speichert lokal, Skript verschiebt in Cloud, Reste werden gelöscht]
2. Überblick
Das Ergebnis ist ein vollautomatisierter Server, der sich selbst wartet. Die Vorteile dieser Methode sind:
- Unabhängigkeit von JDownloader-Updates.
- Schutz vor Datenverlust durch «Minimum Age»-Prüfung.
- Verhinderung doppelter Ausführung durch Lockfiles.
3. Schritt-für-Schritt Anleitung
Schritt 1: Vorbereitung und Rclone
Der Ablauf ist simpel: JDownloader speichert lokal. Ein Timer triggert alle 5 Minuten das Skript. Zunächst installieren wir rclone und richten die Verbindung zum Cloud-Speicher ein.
sudo apt update
sudo apt install -y rclone
# Konfiguration starten (folgen Sie dem Assistenten)
rclone config
# Merken Sie sich den Namen des Remotes, z.B.: "gdrive"
Schritt 2: Das Logik-Skript erstellen
Wir erstellen das Skript unter /usr/local/bin/. Es enthält Sicherheitsmechanismen wie flock (verhindert parallele Starts) und Zeitprüfungen, um sicherzustellen, dass keine aktiven Downloads verschoben werden.
Erstellen Sie die Datei:
sudo nano /usr/local/bin/jd2-gdrive-move.sh
Fügen Sie folgenden Inhalt ein und passen Sie die Variablen unter --- KONFIGURATION --- an Ihre Pfade an:
#!/usr/bin/env bash
set -euo pipefail
# --- KONFIGURATION ---
SRC="/srv/containers/jdownloader/downloads"
MIN_STABLE_DIR_MIN=15 # Dateien müssen x Minuten unverändert sein
ARCHIVE_CLEANUP_MIN=240 # Archive nach x Minuten löschen
ENABLE_UPLOAD=true
RCLONE_REMOTE="gdrive:JDownloader"
SAFE_PREFIX="/srv/containers/jdownloader"
# Sicherheitscheck: Pfad muss stimmen
[[ "$SRC" == "$SAFE_PREFIX"* ]] || exit 1
# Lockfile verhindern, dass das Skript doppelt läuft
LOCKFILE="/run/jd2-gdrive-move.lock"
exec 9>"$LOCKFILE"
flock -n 9 || exit 0
# Verzeichnis sicherstellen
mkdir -p "$SRC"
echo "START: $(date -Is)"
# 1. Upload durchführen (Verschieben)
if [[ "$ENABLE_UPLOAD" == "true" ]]; then
# rclone move löscht die Quelle nach erfolgreichem Upload
rclone move "$SRC" "$RCLONE_REMOTE" \
--min-age "${MIN_STABLE_DIR_MIN}m" \
--transfers 4 \
--checkers 8 \
--log-level INFO || true
fi
# 2. Alte Archive aufräumen
while IFS= read -r -d "" rar; do
dir="$(dirname "$rar")"
# Wenn im Ordner noch Aktivität ist (jüngere Dateien), nichts löschen
if find "$dir" -type f -mmin -"${MIN_STABLE_DIR_MIN}" -print -quit | grep -q .; then
continue
fi
# Wenn das Archiv alt genug ist -> Löschen
if find "$rar" -maxdepth 0 -mmin +"${ARCHIVE_CLEANUP_MIN}" -print -quit | grep -q .; then
echo "Lösche altes Archiv: $rar"
rm -f -- "$rar"
fi
done < <(
find "$SRC" -type f \
\( -iname "*.rar" -o -iname "*.r[0-9][0-9]" -o -iname "*.part*.rar" \) \
-print0
)
echo "END: $(date -Is)"
Machen Sie das Skript anschliessend ausführbar:
sudo chmod +x /usr/local/bin/jd2-gdrive-move.sh
Schritt 3: Automatisierung mit Systemd
Anstatt cron nutzen wir systemd-Timer für besseres Logging und Flexibilität. Wir benötigen zwei Dateien: einen Service und einen Timer.
1. Die Service-Datei:
sudo nano /etc/systemd/system/jd2-gdrive-move.service
[Unit]
Description=JDownloader Upload & Cleanup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/jd2-gdrive-move.sh
2. Die Timer-Datei:
sudo nano /etc/systemd/system/jd2-gdrive-move.timer
[Unit]
Description=Regelmässiger JDownloader Upload
[Timer]
OnBootSec=2min
OnUnitActiveSec=5min
Persistent=true
[Install]
WantedBy=timers.target
Schritt 4: Aktivierung & Test
Laden Sie den Systemd-Daemon neu und aktivieren Sie den Timer:
sudo systemctl daemon-reload
sudo systemctl enable --now jd2-gdrive-move.timer
Um zu prüfen, ob alles läuft, können Sie jederzeit die Logs einsehen:
journalctl -u jd2-gdrive-move.service -f
[BILD 2: Screenshot der Journalctl-Ausgabe mit erfolgreichem Upload]
4. Wichtige Hinweise & Stolperfallen
Achten Sie darauf, dass der User, unter dem das Skript läuft (bei systemd standardmässig root), Schreibrechte auf das Download-Verzeichnis hat und die rclone-Config lesen kann.
Der Parameter
MIN_STABLE_DIR_MINist essenziell. Er verhindert, dass Dateien hochgeladen werden, während JDownloader noch entpackt.
5. Ergebnis & Fazit
Ihr Server räumt sich nun selbst auf. Das Skript unterbricht keine laufenden Downloads und entfernt Archive erst, wenn sie wirklich nicht mehr benötigt werden. Durch die Nutzung von Systemd ist der Prozess robust gegen Neustarts und lässt sich einfach überwachen.