JDownloader Automatisierung: Cloud-Upload & Cleanup mit Systemd

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_MIN ist 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.

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert