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.
Vorteile dieser Methode:
- Unabhängig von JDownloader-Updates
- Schutz vor Datenverlust durch «Minimum Age»-Prüfung
- Verhindert doppelte Ausführung durch Lockfiles
Architektur & Voraussetzungen
Der Ablauf ist simpel: JDownloader speichert lokal. Ein Timer triggert alle 5 Minuten das Skript. Dieses prüft, ob Dateien alt genug sind (um sicherzugehen, dass JD nicht mehr darauf schreibt), lädt sie hoch und löscht danach die lokalen Archive.
- OS: Ubuntu Server (oder Debian-basiert)
- Software: rclone (für den Cloud-Upload)
- Zugriff: Root/Sudo
Schritt 1: Vorbereitung
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
# Name des Remotes z.B.: "gdrive"
Schritt 2: Das Logik-Skript
Wir erstellen das Skript unter /usr/local/bin/. Es enthält Sicherheitsmechanismen wie flock (verhindert parallele Starts) und Zeitprüfungen.
sudo nano /usr/local/bin/jd2-gdrive-move.sh
Fügen Sie folgenden Inhalt ein:
#!/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 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.
Der Service
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
Der Timer
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
Starten Sie den Timer und aktivieren Sie ihn für den Autostart:
sudo systemctl daemon-reload
sudo systemctl enable --now jd2-gdrive-move.timer
Um zu prüfen, ob alles läuft, können Sie die Logs einsehen:
journalctl -u jd2-gdrive-move.service -f
Fazit
Ihr Server räumt sich nun selbst auf. Das Skript ist so konzipiert, dass es keine laufenden Downloads unterbricht (durch MIN_STABLE_DIR_MIN) und Archive erst entfernt, wenn sie wirklich nicht mehr benötigt werden.



