[TUT] JDownloader2 mit Gluetun (VPN) auf dem Ugreen NAS im Docker laufen lassen

  • hub.docker.com/r/jlesage/jdownloader-2]Docker Hub: jlesage/jdownloader-2
    hub.docker.com/r/qmcgaw/gluetun]Docker Hub: qmcgaw/gluetun
    github.com/qdm12/gluetun]Gluetun GitHub Repo
    github.com/jlesage/docker-jdownloader-2]JDownloader Docker GitHub Repo
    Yes

    JDownloader2 mit Gluetun (VPN) auf dem Ugreen NAS im Docker laufen lassen

    Hallo zusammen,
    ich habe in den letzten Tagen ein bisschen gebastelt und möchte euch zeigen, wie man den JDownloader in Kombination mit Gluetun (VPN) sauber im Docker zum Laufen bekommt – speziell auf einem Ugreen NAS.
    Es gibt ein paar Stolperfallen, deswegen habe ich die wichtigsten Punkte gleich mit aufgeschrieben.

    Warum Gluetun?


    Gluetun ist ein VPN-Client für Docker. Damit lässt sich der gesamte Traffic von Containern (in unserem Fall JDownloader) durch einen VPN leiten.
    Vorteile:
    – Anonymere Downloads
    – Geo-Blocking umgehen
    – Kill-Switch: Wenn der VPN weg ist, geht auch kein Traffic mehr nach draußen

    Voraussetzungen

    • Docker & Portainer laufen bereits auf dem NAS.
    • Ihr habt ein Verzeichnis für JDownloader, z. B. `/volume1/docker/jdownloader`.
    • Ein VPN-Account, der von Gluetun unterstützt wird (OpenVPN oder WireGuard).
    • Das NAS muss `NET_ADMIN` und Zugriff auf `/dev/net/tun` erlauben (ist wichtig für den VPN).

    docker-compose.yml
    Hier mein funktionierendes Beispiel. Ich habe es bei mir in Portainer als Stack angelegt:

    bluejets
    October 1, 2025 at 4:25 PM

    Besonderheiten / Stolperfallen

    • Das Wichtigste: JDownloader hängt komplett im Netzwerk von Gluetun (`network_mode: service:gluetun`). Ohne das funktioniert’s nicht.
    • Die Ports müssen beim Gluetun-Container freigegeben werden, sonst kommt ihr nicht mehr auf die WebUI.
    • Mit `FIREWALL=on` sorgt ihr dafür, dass der Traffic auch wirklich nur über den VPN geht. Sehr praktisch, falls die Verbindung mal abbricht.
    • DNS-Auflösung innerhalb von Gluetun ist ein bisschen eingeschränkt – am besten feste IPs oder `extra_hosts` verwenden, falls es klemmt.
    • Wenn der VPN-Anbieter Port-Forwarding erlaubt, könnt ihr das in Gluetun aktivieren. Für JDownloader ist das meistens nicht zwingend, aber z. B. für Remote-Features praktisch.

    Troubleshooting
    Ein paar Sachen, über die ich gestolpert bin:

    Quote


    – Wenn die JDownloader-WebUI nicht lädt: Prüfen, ob ihr den Port bei Gluetun freigegeben habt.
    – „No TUN device available“: Dann fehlt `devices: /dev/net/tun` oder `cap_add: NET_ADMIN`.
    – Wenn nix mehr rausgeht, evtl. Firewall-Subnetze anpassen (`FIREWALL_OUTBOUND_SUBNETS`).
    – Manche VPN-Anbieter erfordern spezielle Configs – schaut in die Gluetun-Doku, da gibt’s viele Beispiele. Ich nutze ein Wireguard VPN, die Einrichtung war unkompliziert
    - Nach dem Setup testen ob beide Container auf einen Curl (wget -qO- http://ipecho.net/plain) die selbe IP zurückgeben. Bei Nutzung eines VPN Providers, sollte diese sich von der eigenen IP unterscheiden, wenn man die URL im Browser abfragt.

    Quellen & weiterführende Links

    Fazit
    Mit diesem Setup läuft JDownloader bei mir stabil und komplett über den VPN. Das Ugreen NAS packt die Container ohne Probleme, man muss nur auf die Besonderheiten beim Netzwerk und den Ports achten.
    Ich hoffe, die kleine Anleitung hilft euch beim Einrichten! 🙂

  • Herzlichen Dank für das Tutorial.

    Kannst Du ggf zu folgenden Punkten noch etwas mehr Details geben, was man da machen muss oder wie man den "richtigen" Zustand feststellen kann?

    Quote

    Das NAS muss `NET_ADMIN` und Zugriff auf `/dev/net/tun` erlauben (ist wichtig für den VPN).

    Quote

    DNS-Auflösung innerhalb von Gluetun ist ein bisschen eingeschränkt – am besten feste IPs oder `extra_hosts` verwenden, falls es klemmt.

    Ergänzung noch zu den Einstellungen von Gluetun je nach VPN Provider:

    Im Gluetun GitHub gibt es entsprechende Anleitungen für viele VPN Provider, wo man sich ggf. Einlesen möchte.

    Gluetun Anleitungen VPN Provider

  • johnmclane
    Klar hier ein paar ergänzungen zu deinen Fragen:

    • Das Wichtigste vorneweg: JDownloader läuft bei der ganzen Nummer immer im Netzwerk von Gluetun (`network_mode: service:gluetun`). Das ist Absicht, damit alles schön über den VPN geht. Also nicht wundern, wenn man den Container „einzeln“ nicht mehr direkt erreicht.
    • TUN-Device & NET_ADMIN:
      Damit der VPN überhaupt ins Rollen kommt, braucht Gluetun das kleine virtuelle Netzwerkgerät namens `tun`.
      – In der `docker-compose.yml` sorgt das hier dafür:
       
      Code
      cap_add:
          - NET_ADMIN
        devices:
          - /dev/net/tun:/dev/net/tun


      Ob das auf deinem NAS vorhanden ist, kannst du easy mit einem Befehl prüfen:

      Code
      ls -l /dev/net/tun


      Wenn da eine Zeile mit irgendwas wie `crw------- ... /dev/net/tun` zurückkommt → alles gut 👍.
      Wenn da nix kommt, dann unterstützt dein NAS das evtl. nicht oder es ist deaktiviert. Auf den Ugreen-Kisten klappt’s aber normalerweise.
      Wenn das fehlt, startet Gluetun zwar, aber der Container wirft sofort „No TUN device available“ – dann weißt du sofort, woran’s liegt.

    • DNS-Auflösung in Gluetun:
      Kleiner Stolperstein: Gluetun ist ziemlich strikt, was DNS angeht. Heißt, manchmal können Container darin keine Hostnamen wie `meinserver.local` auflösen, sondern nur direkte IPs.
      → Wenn JDownloader also im Log „unknown host“ schreit, liegt’s ziemlich sicher daran.
      Fixen kannst du das z. B. so:
      – Einfach feste IP-Adressen eintragen, wenn’s geht.
      – Oder in der Compose extra Hosts mitschmuggeln:
       
      Code
      extra_hosts:
          - "meinserver.local:192.168.178.50"


      Damit lügst du Gluetun quasi eine kleine „Hosts-Datei“ rein. Funktioniert super, wenn man nur 1–2 Geräte braucht.
      Wer es schicker haben will, kann in Gluetun auch die DNS-Server setzen (`DOT_PROVIDERS=cloudflare` oder so). Für den Heimgebrauch reicht das extra_hosts-Ding aber locker.

    • Die Option `FIREWALL=on` ist Gold wert: dann geht wirklich alles nur über den VPN. Wenn die VPN-Verbindung mal weg ist, blockt Gluetun den Traffic → keine bösen Überraschungen.
    • Port-Forwarding: nicht zwingend nötig für JDownloader, aber falls euer VPN-Anbieter es anbietet, könnt ihr’s einschalten. Praktisch für manche Remote-Features.



    Danke für die Ergänzung der Gluetun Anleitungen der VPN Provider. Hatte ich vergessen zu erwähnen.

  • Ich hab’s anfangs auch so eingerichtet, mich dann aber dafür entschieden, Gluetun und jDownloader getrennt zu installieren, damit mehrere Container parallel über Gluetun laufen können.

    Statt

    network_mode: service:gluetun

    Steht bei mir eben

    network_mode: container:gluetun


    Einziger Nachteil, watchtower funktioniert damit nicht, es kommt offenbar nicht mit Containern klar, die von anderen Containern abhängig sind.

  • Ich stecke hier gerade fest und kämpfe (vermutlich) mit einem Konfig-Denkfehler (PS: musste auf WireGuard umschwenken, weil Glutetun hide.me nur als WireGuard Custom akzeptiert)

    Mein Problem: Verbindung steht, aber ich komme über den Port nicht auf WebUI von JD.


    Meine yaml:

    PS: den "bridge mode" bei Gluetun habe ich bewusst gesetzt, damit er mir kein zusätzliches Subnet aufmacht und das vorhandene nutzt.

    UGREEN DXP2800 | UGOS 1.41.1.0107 - 16GB RAM - 2x Lexar NM790 1TB Btrfs RAID1 - 2x Seagate IronWolf 4TB Btrfs RAID1
    Raspberry Pi 4B/4 | DietPi 10.2.3 (Trixie) - AGH - NPM - Unbound
     MacBook Air M4 | macOS 26.4.1 |  mobile devices only | FRITZ!Box 7690 (OS 8.24 Beta) | Eaton Ellipse ECO 650 DIN USB USV

  • Ich stecke hier gerade fest und kämpfe (vermutlich) mit einem Konfig-Denkfehler (PS: musste auf WireGuard umschwenken, weil Glutetun hide.me nur als WireGuard Custom akzeptiert)

    Mein Problem: Verbindung steht, aber ich komme über den Port nicht auf WebUI von JD.


    Meine yaml:

    PS: den "bridge mode" bei Gluetun habe ich bewusst gesetzt, damit er mir kein zusätzliches Subnet aufmacht und das vorhandene nutzt.

    Das Hauptproblem ist folgendes:

    Wenn du bei JDownloader
    network_mode: service:gluetun
    benutzt, dann hängt JDownloader komplett am Netzwerk von Gluetun.

    Heißt:

    • JDownloader hat keine eigenen Ports
    • JDownloader benutzt die IP von Gluetun
    • und – ganz wichtig – die Firewall von Gluetun entscheidet, was rein darf

    Wenn Gluetun sagt „Nö, lass ich nicht rein“,
    dann kannst du drücken wie du willst – der Port bleibt dicht.
    Und genau das ist bei dir passiert.

    ALSO:
    Alle Ports, die du für JDownloader brauchst → müssen bei Gluetun freigegeben werden.
    Und Gluetun muss zusätzlich sagen: „Okay, ich lasse den Verkehr rein“.
    Das passiert über:

    Code
    FIREWALL_INBOUND_SUBNETS=0.0.0.0/0

    Ohne das → kommst du NIE auf die Weboberfläche.

    Dazu hast du noch ein kleines Problem in der Konfiguration:

    DNS=10.252.0.1 → das ist falsch.
    Richtig heißt es bei Gluetun:
    DNS_ADDRESS=10.252.0.1


    Hier eine korrgierte Version:


    Vielleicht hilft es ja :)

  • bluejets Erstmal vielen Dank für die ausführliche Rückmeldung und den "Gegenentwurf". Ich hab mir den Spaß für heute Morgen aufgehoben. 🥴

    Erster Anlauf: ❌

    • vermutlich copy'n'paste Fehler, die WIREGUARD_ENDPOINT_IP hatte gefehlt. ;)
    • hab noch fehlende Schreib- und Besitzrechte gesetzt
    • jdownloader startet (exited 0), aber Gluetun zickt
    • Code
      2025-11-18T08:20:57+01:00 ERROR firewall settings: outbound subnet has an unspecified address: 0.0.0.0/0
      2025-11-18T08:20:57+01:00 INFO Shutdown successful


    UGREEN DXP2800 | UGOS 1.41.1.0107 - 16GB RAM - 2x Lexar NM790 1TB Btrfs RAID1 - 2x Seagate IronWolf 4TB Btrfs RAID1
    Raspberry Pi 4B/4 | DietPi 10.2.3 (Trixie) - AGH - NPM - Unbound
     MacBook Air M4 | macOS 26.4.1 |  mobile devices only | FRITZ!Box 7690 (OS 8.24 Beta) | Eaton Ellipse ECO 650 DIN USB USV

  • Kennt ihr das Gefühlt, wenn am Ende feststellt, dass man eigentlich nach "fünf Minuten" fertig gewesen wäre... ;)

    • Fehlermeldung: Glutetun mag keine Subnets mit 0.0.0.0/0, Container wird gestopt
    • Nach viel lesen habe ich das angepasst gelöst:
      • FIREWALL_OUTBOUND_SUBNETS=192.168.7.0/24,172.7.0.0/16
      • FIREWALL_INBOUND_SUBNETS=192.168.7.0/24
    • Lese-/Schreibrechte gesetzt
      • chown -R 1000:1000 /volume2/docker/jdownloader/config
      • chmod -R 755 /volume2/docker/jdownloader/config

    Kurz danach waren die Logs fehlerfrei, nur ich kam immer noch nicht auf die Weboberfläche. "connecting..."

    Das Thema Browser angegangen:

    • Safari: keine Verbindung
    • Mullvad Browser: keine Verbindung (weil "werkseitig" gewollt geblockt)
    • MinBrowser (nur macOS): tataaa...WebUI
    • PS: ...ggf. dann doch mal Firefox zum Testen

    Zu guter letzt die vollständige yaml:


    Ergänzung:

    Ich habe meine vorhandene cfg reinkopiert und den myjdownloader Account aktiviert. Das klappt auch fehlerfrei mit dem Safari und ist wesentlich bequemer als die GUI. ;)

    UGREEN DXP2800 | UGOS 1.41.1.0107 - 16GB RAM - 2x Lexar NM790 1TB Btrfs RAID1 - 2x Seagate IronWolf 4TB Btrfs RAID1
    Raspberry Pi 4B/4 | DietPi 10.2.3 (Trixie) - AGH - NPM - Unbound
     MacBook Air M4 | macOS 26.4.1 |  mobile devices only | FRITZ!Box 7690 (OS 8.24 Beta) | Eaton Ellipse ECO 650 DIN USB USV

    Edited once, last by *kw*: Ein Beitrag von *kw* mit diesem Beitrag zusammengefügt. (November 18, 2025 at 1:41 PM).

  • Noch als kleine Ergänzung

    • yaml: damit meine NVME auch mal was zu tun haben, habe ich die Volumes effektiver gemapped und somit den Download und das Entpacken (Ablage) getrennt. Dann kann ich dem Entpacker ein separates Ziel angeben.

      Code
           - /volume2/temp:/output:rw 		#temporäres Downloadverzeichnis (NVME)
           - /volume1/downloads:/downloads	#finale Ablage HDD


    • VPN-Tunnel: in den Verbindungseinstellungen einen Socks5 Proxy Eintrag für hide.me hinzugefügt und "ohne Proxy" deaktiviert. So läuft wirklich nur ein Download, wenn eine Verbindung zum VPN-Anbieter besteht.

    UGREEN DXP2800 | UGOS 1.41.1.0107 - 16GB RAM - 2x Lexar NM790 1TB Btrfs RAID1 - 2x Seagate IronWolf 4TB Btrfs RAID1
    Raspberry Pi 4B/4 | DietPi 10.2.3 (Trixie) - AGH - NPM - Unbound
     MacBook Air M4 | macOS 26.4.1 |  mobile devices only | FRITZ!Box 7690 (OS 8.24 Beta) | Eaton Ellipse ECO 650 DIN USB USV

  • Im Nachgang habe ich mich etwas weiter mit der yaml-Datei und den Environments auseinandergesetzt. Nachdem das Problem auf den Browser zurückzuführen war, funktionierte "plötzlich" der Zugriff auf die WebUI auch ohne die Parameter FIREWALL_OUTBOUND_SUBNETS und FIREWALL_INBOUND_SUBNETS. ;)

    Da Jdownloader recht speicherhungrig ist, hier eine Empfehlung für Speicher-Settings bei 16GB RAM (mehr sollte es aber auch sonst nicht brauchen).

    Code
    jdownloader:
       mem_limit: 2g #Maximaler RAM
       memswap_limit: 4g #SWAP
       environment:
         - JAVA_OPTS=-Xmx1500m #Limitierung Speicher JAVA Engine innerhalb Container

    UGREEN DXP2800 | UGOS 1.41.1.0107 - 16GB RAM - 2x Lexar NM790 1TB Btrfs RAID1 - 2x Seagate IronWolf 4TB Btrfs RAID1
    Raspberry Pi 4B/4 | DietPi 10.2.3 (Trixie) - AGH - NPM - Unbound
     MacBook Air M4 | macOS 26.4.1 |  mobile devices only | FRITZ!Box 7690 (OS 8.24 Beta) | Eaton Ellipse ECO 650 DIN USB USV

  • This threads contains 37 more posts that have been hidden for guests.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!