Zum Hauptinhalt springen
S-EDV news
← Alle Anleitungen
📘 Anleitung Docker 31.05.2026 · 9 min Lesezeit

JDownloader anonym über Tor mit Portainer einrichten: Stack-Deployment Schritt für Schritt

Mit einem Portainer-Stack aus Tor-Gateway und JDownloader 2 entsteht ein anonymer Download-Server: Der Verkehr läuft über das Tor-Netzwerk, die eigene IP bleibt verborgen. Diese Anleitung zeigt das Deployment über Portainer Stacks im Browser, inklusive IP-Verifikation und Praxis-Hinweisen.

Illustration zur Installation von Immich auf einer Synology NAS

JDownloader 2 ist seit Jahren das De-facto-Standardtool, um große Dateien von Filehostern, Mediatheken oder offenen Archiven herunterzuladen. Wer den Download-Verkehr vollständig über das Tor-Netzwerk laufen lassen möchte – etwa für Privacy-Recherchen, sensible Workflows oder einfach, um die eigene IP-Adresse aus den Server-Logs der Quellen herauszuhalten – kann das mit zwei Docker-Containern lösen. Diese Anleitung deployt genau diesen Stack komfortabel über Portainer Stacks: Den Compose-Code fügst du direkt im Browser-Editor ein, Portainer übernimmt Pull, Netzwerk und Start. Das ist die plattformneutrale Variante – sie läuft auf jedem Host, auf dem Docker und Portainer installiert sind, vom Mini-PC über den Raspberry Pi bis zum vServer.

Was Tor leistet – und was nicht

Vor dem Setup ein paar ehrliche Hinweise, damit die Erwartungen passen:

  1. Tor verbirgt deine IP-Adresse gegenüber der Quelle, die die Datei ausliefert. Aus deren Sicht kommt der Download von einem Tor-Exit-Knoten irgendwo auf der Welt.
  2. Tor ist nicht für Bulk-Downloads optimiert. Realistisch sind 0,5–5 MB/s, oft weniger. Wer eine Gigabit-Leitung ausreizen will, ist mit einem klassischen VPN besser bedient.
  3. Tor.org rät von BitTorrent-Traffic ab, weil dieser das ganze Netzwerk belastet. Bei JDownloader geht es um HTTP/S-Downloads, also nicht um BitTorrent – die Belastung ist kleiner, aber jeder GB zählt. Bewusst und maßvoll nutzen.
  4. DNS-Auflösung im Blick behalten. Der hier genutzte Java-Proxy (socksProxyHost/socksProxyPort) leitet alle TCP-Verbindungen über den SOCKS5-Proxy, löst Hostnamen aber unter Umständen lokal auf dem Host auf. Der eigentliche Download-Traffic läuft über Tor; wer eine lückenlose DNS-Auflösung über Tor benötigt, sollte zusätzlich den DNS-Verkehr des Hosts absichern. Der weiter unten gezeigte Verifikations-Test mit --socks5-hostname tunnelt DNS dagegen bewusst über Tor.
  5. Tor schützt nicht vor schadhaften Quellen. Anonymität ersetzt keine Sorgfalt beim Umgang mit Downloads. Eine Antiviren-Prüfung am Endgerät bleibt Pflicht.
  6. Die rechtliche Verantwortung bleibt beim Nutzer. Anonymität ist kein Freibrief für illegale Quellen – Urheber-, Marken- und Persönlichkeitsrecht gelten unverändert.

Architektur in einem Satz

Zwei Container in einem isolierten Bridge-Netzwerk: Der Tor-Gateway-Container (dperson/torproxy) stellt einen SOCKS5-Proxy auf Port 9050 bereit, der JDownloader-Container (jlesage/jdownloader-2) ist per Java-Proxy-Variable so konfiguriert, dass jeder ausgehende Verbindungsversuch durch diesen SOCKS5-Proxy läuft. JDownloader hat damit selbst keinen direkten Internetzugang mehr – alles geht über Tor.

Voraussetzungen

  1. Ein Linux-Host (Debian/Ubuntu, Raspberry Pi OS, ein vServer o. Ä.) mit installiertem Docker. Prüfen mit docker --version und docker compose version.
  2. Portainer CE bereits installiert und erreichbar (Standard-UI auf Port 9443 per HTTPS). Falls noch nicht vorhanden, siehe Schritt 1.
  3. Ein Portainer-Konto mit Administrator-Rechten und eine angebundene Docker-Umgebung (z. B. die lokale local-Environment).
  4. Mindestens 2 GB freier RAM, 4 GB sind komfortabler.
  5. Ein freier TCP-Port 5800 auf dem Host für das JDownloader-Web-UI.
  6. Ein Verzeichnis auf dem Host für die Downloads sowie eines für die JDownloader-Konfiguration.

Schritt 1: Portainer bereitstellen (falls nötig)

Wer Portainer noch nicht laufen hat, installiert es mit zwei Befehlen. Zuerst ein benanntes Volume für die Portainer-Daten anlegen, dann den Container starten:

docker volume create portainer_data

docker run -d -p 9443:9443 --name portainer --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest

Danach im Browser https://HOST-IP:9443 aufrufen, beim ersten Aufruf das Admin-Konto anlegen (Passwort sofort sicher vergeben) und die lokale Docker-Umgebung übernehmen. Für den Produktivbetrieb empfiehlt sich, das :latest-Tag später auf eine konkrete Version zu pinnen.

Schritt 2: Daten-Verzeichnisse auf dem Host anlegen

Portainer-Stacks legen Bind-Mount-Pfade nicht automatisch an. Lege die beiden benötigten Verzeichnisse vorab auf dem Host an, damit die Berechtigungen stimmen:

mkdir -p /opt/jdownloader-tor/config
mkdir -p /opt/jdownloader-tor/downloads

Das Verzeichnis config nimmt den persistenten JDownloader-Zustand auf, downloads ist das Zielverzeichnis für die heruntergeladenen Dateien. Wer bereits ein vorhandenes Download-Verzeichnis nutzt, setzt diesen Pfad später im Compose-Code ein.

Schritt 3: Eigene Benutzer-ID und Gruppen-ID ermitteln

Damit die Schreibrechte im Download-Verzeichnis stimmen, müssen die Container mit der richtigen User- und Group-ID laufen. Auf dem Host als der Benutzer, dem die Verzeichnisse gehören, ausführen:

id

Die Zahl hinter uid= ist die USER_ID, die hinter gid= die GROUP_ID. Auf vielen Single-User-Systemen sind das 1000 und 1000. Diese Werte trägst du im nächsten Schritt in den Compose-Code ein.

Schritt 4: Stack in Portainer anlegen

In der Portainer-Oberfläche links auf Stacks klicken und oben Add stack wählen. Folgende Felder ausfüllen:

  1. Name: jdownloader-tor (nur Kleinbuchstaben, Bindestriche erlaubt).
  2. Build method: Web editor – damit fügst du den Compose-Code direkt im Browser ein.

In das Web-Editor-Feld den folgenden Compose-Code einfügen. Vor dem Deployen USER_ID, GROUP_ID und gegebenenfalls die Pfade anpassen:

services:
  tor-gateway:
    image: dperson/torproxy:latest
    container_name: tor-gateway
    restart: unless-stopped
    environment:
      - TZ=Europe/Berlin
    networks:
      tor_net:
        ipv4_address: 10.10.200.10

  jdownloader:
    image: jlesage/jdownloader-2:latest
    container_name: jdownloader-tor
    restart: unless-stopped
    depends_on:
      - tor-gateway
    environment:
      - TZ=Europe/Berlin
      - USER_ID=1000
      - GROUP_ID=1000
      - UMASK=0022
      - KEEP_APP_RUNNING=1
      - JAVA_TOOL_OPTIONS=-DproxySet=true -DsocksProxyHost=tor-gateway -DsocksProxyPort=9050
    volumes:
      - /opt/jdownloader-tor/config:/config:rw
      - /opt/jdownloader-tor/downloads:/output:rw
    ports:
      - "5800:5800"
    shm_size: "512mb"
    networks:
      tor_net:
        ipv4_address: 10.10.200.30

networks:
  tor_net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 10.10.200.0/24
          gateway: 10.10.200.1

Die wichtigsten Stellen erklärt:

  1. JAVA_TOOL_OPTIONS setzt JDownloaders eigene Java-Laufzeitumgebung dauerhaft auf den SOCKS5-Proxy tor-gateway:9050. Damit ist jeder Download und jede Captcha-Anfrage automatisch durch Tor getunnelt – ohne dass in der JDownloader-Oberfläche manuell ein Proxy konfiguriert werden muss.
  2. depends_on sorgt dafür, dass der Tor-Container zuerst startet.
  3. Das eigene Bridge-Netz tor_net trennt den Stack sauber vom Standard-Docker-Netz. Die Container erreichen sich über die Namensauflösung (tor-gateway), die festen IPs dienen nur der Übersicht.
  4. Der Tor-Gateway veröffentlicht bewusst keinen Host-Port: Der SOCKS5-Proxy 9050 ist nur containerintern erreichbar. Nach außen offen ist allein der Port 5800 für das JDownloader-Web-UI.

Wer Werte wie USER_ID nicht direkt im YAML pflegen möchte, kann unter dem Editor im Abschnitt Environment variables eigene Variablen definieren und im Compose mit ${USER_ID} referenzieren.

Schritt 5: Stack deployen

Ganz unten auf Deploy the stack klicken. Portainer zieht die beiden Images, legt das Netzwerk tor_net an und startet beide Container. Der erste Pull kann je nach Leitung ein bis zwei Minuten dauern. Anschließend erscheint der Stack in der Liste, und unter Containers sollten tor-gateway und jdownloader-tor mit dem Status running auftauchen.

Schritt 6: Tor-Verbindung testen – direkt in Portainer

Der große Vorteil von Portainer: Du brauchst keinen SSH-Zugang, um in einen Container zu schauen. Öffne unter Containers den Container jdownloader-tor, klicke oben auf Console, wähle als Command /bin/sh und verbinde dich. Im Terminal den folgenden Befehl ausführen:

curl -s --socks5-hostname tor-gateway:9050 https://check.torproject.org/api/ip

Die Antwort sollte ein JSON-Objekt mit dem Feld IsTor:true liefern. Damit ist gesichert, dass der Container den Tor-Tunnel verwendet. Sollte curl im JDownloader-Container nicht verfügbar sein, lässt sich derselbe Test auch im Container tor-gateway selbst ausführen – das Ergebnis ist identisch, weil beide über denselben SOCKS5-Endpunkt gehen.

Schritt 7: JDownloader-Web-UI öffnen

Im Browser folgende Adresse aufrufen – HOST-IP durch die IP-Adresse deines Docker-Hosts ersetzen:

http://HOST-IP:5800

Die noVNC-basierte Web-Oberfläche zeigt nach wenigen Sekunden die gewohnte JDownloader-Oberfläche. Beim ersten Start läuft der initiale JDownloader-Setup-Assistent – Sprache wählen, Lizenzbedingungen akzeptieren, fertig. Das Image liefert das Web-UI unter Port 5800 standardmäßig per HTTP aus. Soll die Web-Verbindung verschlüsselt sein, lässt sich beim jlesage/jdownloader-2-Image die Umgebungsvariable SECURE_CONNECTION=1 setzen – die Oberfläche ist dann per HTTPS über denselben Port 5800 erreichbar (ein zusätzlicher Port wird dafür nicht benötigt).

Schritt 8: JDownloader konfigurieren

Zwei Einstellungen sind vor dem ersten Download empfehlenswert:

  1. Download-Verzeichnis: Unter Einstellungen → Allgemeine Einstellungen → Standard-Download-Ordner auf /output setzen. Das ist im Container der Pfad, der auf /opt/jdownloader-tor/downloads des Hosts zeigt.
  2. MyJDownloader (optional): Wer JDownloader von unterwegs steuern möchte, kann sich kostenlos bei my.jdownloader.org registrieren und das Konto in den JDownloader-Einstellungen verknüpfen. Wichtig: MyJDownloader läuft über die JDownloader-Cloud und macht die Fernsteuerung von außen sichtbar – die Downloads selbst bleiben anonym über Tor.

Schritt 9: Anonymität final verifizieren

Die zuverlässigste Verifikation läuft über das offizielle Check-API des Tor-Projekts. Öffne erneut die Container-Console von jdownloader-tor in Portainer und führe aus:

curl -s --socks5-hostname tor-gateway:9050 https://check.torproject.org/api/ip

Die Antwort ist ein kompaktes JSON-Objekt:

{"IsTor":true,"IP":"185.220.101.34"}

Zwei Werte sind entscheidend:

  1. IsTor:true – damit bestätigt der Tor-Projekt-Server direkt, dass die Anfrage über einen Tor-Exit-Knoten reinkam.
  2. IP ist die aktuelle Exit-Node-Adresse, auf keinen Fall die eigene öffentliche IP des Anschlusses.

Führst du den Befehl mehrfach in kurzer Folge aus, bekommst du unterschiedliche Exit-Node-IPs zu sehen. Das zeigt die normale Tor-Circuit-Rotation und ist zugleich ein guter Indikator, dass der Tunnel sauber durchschaltet. Hinweis: check.torproject.org liefert gelegentlich ein IsTor:false als Fehlmeldung – wiederhole den Test in diesem Fall einige Male. Bleibt die Antwort IsTor:false oder erscheint eine IP aus dem eigenen Provider-Range, ist der SOCKS5-Tunnel nicht aktiv – dann den Compose-Code prüfen und den Stack in Portainer über Update the stack neu deployen.

Updates und Wartung

Beide Images werden regelmäßig aktualisiert. Update-Routine in Portainer:

  1. Unter Stacks den Stack jdownloader-tor öffnen.
  2. Auf Update the stack klicken und die Option Re-pull image and redeploy aktivieren – Portainer zieht neue Images und ersetzt die laufenden Container.
  3. Anschließend mit Schritt 6 erneut prüfen, ob der Tor-Tunnel noch funktioniert.

Für den Produktivbetrieb empfiehlt es sich, die :latest-Tags auf konkrete Versionen zu pinnen, damit Updates kontrolliert ablaufen. Den persistenten Ordner /opt/jdownloader-tor/config in den Backup-Job aufnehmen – damit lässt sich der gesamte JDownloader-Zustand inklusive Account-Manager und Kontingenten im Notfall wiederherstellen.

Troubleshooting

  1. JDownloader öffnet sich, aber Downloads laufen nicht an: Der Tor-Gateway hat noch keine stabile Circuit-Verbindung. Container tor-gateway in Portainer kurz neu starten und eine Minute warten.
  2. Captchas funktionieren nicht: Manche Captcha-Provider blockieren Tor-Exit-Nodes komplett. In diesem Fall hilft nur, einen anderen Filehoster zu wählen oder den Download manuell zu starten.
  3. IsTor:false bei der Verifikation: Zunächst den Test einige Male wiederholen (mögliche Fehlmeldung des Check-Servers). Bleibt es bei IsTor:false, ist die Variable JAVA_TOOL_OPTIONS nicht korrekt gesetzt – Compose-Code prüfen, Stack neu deployen.
  4. Permission denied im Download-Ordner: USER_ID/GROUP_ID stimmen nicht. Mit id die echten Werte ermitteln und im Compose einsetzen.
  5. Bind-Mount-Pfad fehlt: Portainer legt Verzeichnisse nicht selbst an. Wenn der Stack mit einem Mount-Fehler stoppt, die Pfade aus Schritt 2 mit mkdir -p nachträglich anlegen.
  6. Sehr langsame Downloads: Das ist erwartbares Verhalten von Tor. Mehr dazu in den Praxis-Hinweisen oben.

Fazit

Mit zwei Containern und einem einzigen Compose-Block im Portainer-Web-Editor lässt sich JDownloader plattformunabhängig durch das Tor-Netzwerk tunneln. Die grafische Oberfläche von Portainer macht dabei das Deployen, das Prüfen per Container-Console und die Updates komfortabel – ganz ohne SSH. Die Lösung ist persistent, überlebt Reboots und braucht im Alltag keine weitere Pflege außer regelmäßigen Updates. Wer maximale Anonymität ohne Cloud-VPN-Abo braucht und mit der reduzierten Geschwindigkeit leben kann, hat hier ein robustes Setup.

Denselben Stack gibt es auch in den Anleitungen JDownloader anonym über Tor auf der Synology und JDownloader anonym über Tor auf Linux mit Docker.

Weitere Container- und Server-Anleitungen in den Kategorien Docker und Synology / NAS.

Quellen: The Tor Project, jlesage/jdownloader-2 auf Docker Hub, dperson/torproxy auf Docker Hub