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.

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:
- 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.
- 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.
- 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.
- 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-hostnametunnelt DNS dagegen bewusst über Tor. - 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.
- 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
- Ein Linux-Host (Debian/Ubuntu, Raspberry Pi OS, ein vServer o. Ä.) mit installiertem Docker. Prüfen mit
docker --versionunddocker compose version. - Portainer CE bereits installiert und erreichbar (Standard-UI auf Port
9443per HTTPS). Falls noch nicht vorhanden, siehe Schritt 1. - Ein Portainer-Konto mit Administrator-Rechten und eine angebundene Docker-Umgebung (z. B. die lokale local-Environment).
- Mindestens 2 GB freier RAM, 4 GB sind komfortabler.
- Ein freier TCP-Port
5800auf dem Host für das JDownloader-Web-UI. - 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:latestDanach 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/downloadsDas 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:
idDie 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:
- Name:
jdownloader-tor(nur Kleinbuchstaben, Bindestriche erlaubt). - 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.1Die wichtigsten Stellen erklärt:
JAVA_TOOL_OPTIONSsetzt JDownloaders eigene Java-Laufzeitumgebung dauerhaft auf den SOCKS5-Proxytor-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.depends_onsorgt dafür, dass der Tor-Container zuerst startet.- Das eigene Bridge-Netz
tor_nettrennt den Stack sauber vom Standard-Docker-Netz. Die Container erreichen sich über die Namensauflösung (tor-gateway), die festen IPs dienen nur der Übersicht. - Der Tor-Gateway veröffentlicht bewusst keinen Host-Port: Der SOCKS5-Proxy
9050ist nur containerintern erreichbar. Nach außen offen ist allein der Port5800fü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/ipDie 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:5800Die 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:
- Download-Verzeichnis: Unter Einstellungen → Allgemeine Einstellungen → Standard-Download-Ordner auf
/outputsetzen. Das ist im Container der Pfad, der auf/opt/jdownloader-tor/downloadsdes Hosts zeigt. - 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/ipDie Antwort ist ein kompaktes JSON-Objekt:
{"IsTor":true,"IP":"185.220.101.34"}Zwei Werte sind entscheidend:
IsTor:true– damit bestätigt der Tor-Projekt-Server direkt, dass die Anfrage über einen Tor-Exit-Knoten reinkam.IPist 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:
- Unter Stacks den Stack
jdownloader-toröffnen. - Auf Update the stack klicken und die Option Re-pull image and redeploy aktivieren – Portainer zieht neue Images und ersetzt die laufenden Container.
- 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
- JDownloader öffnet sich, aber Downloads laufen nicht an: Der Tor-Gateway hat noch keine stabile Circuit-Verbindung. Container
tor-gatewayin Portainer kurz neu starten und eine Minute warten. - 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.
- 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 VariableJAVA_TOOL_OPTIONSnicht korrekt gesetzt – Compose-Code prüfen, Stack neu deployen. - Permission denied im Download-Ordner:
USER_ID/GROUP_IDstimmen nicht. Mitiddie echten Werte ermitteln und im Compose einsetzen. - 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 -pnachträglich anlegen. - 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