JDownloader Automatisierung: Cloud-Upload & Cleanup mit Systemd

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.

Schreiben Sie einen Kommentar

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