afbeelding reverse proxy

Reverse Proxy voor Docker met Let’s Encrypt en Nginx

afbeelding reverse proxy
(c) linuxserver.io

Ik ben het afgelopen jaar een fan geworden van Docker. Zeker sinds ik een nieuwe Synology NAS heb die krachtig genoeg is om meerdere containers langdurig en betrouwbaar te laten draaien. Nu is het opeens heel gemakkelijk om bijvoorbeeld een Learning Locker LRS server te draaien (compleet met redis en mongo db server), om daarnaast de Xerte Online Toolkit (incl. Mysql database), Moodle (op basis van een aparte Mariadb database), de Redash dashboard server (met Progress database), rstudio server, een Nodejs server, Grafana, Jupyter Tensorflow Notebooks, kortom een scala aan online diensten te hebben draaien. Allemaal in hun eigen afgescheiden onderdeeltje, eenvoudig aan en uit te zetten, naar wens te updaten of met één druk op de knop weer te verwijderen. Met uitzondering natuurlijk van de data die ik wil bewaren en waarvan ik bij het aanmaken van de container aangegeven heb dat ze lokaal beschikbaar moeten zijn.

Toch heeft het ook wel een nadeel: ze draaien allemaal op dezelfde server.

Een standaard webserver luistert naar poort 80, via SSL gaat het om poort 443. Maar er kan maar één service tegelijkertijd van zo’n poort gebruik maken. Je kun dus niet én Moodle, én Xerte én Grafana via dezelfde 443 poort laten lopen. Dus  moet je bij het aanmaken van de containers andere poorten toewijzen: Moodle op 2443, Xerte op 4443, Grafana op 444 of zo. Het werkt, maar niet echt. En al helemaal niet als je het verkeer tussen de browser en die server wilt versleutelen/beveiligen.

De oplossing is om nóg een Docker container te starten en die container alle verkeer tussen de buitenwereld en die andere containers te laten verzorgen. Die container (een “reverse proxy”) zorgt er dan niet alleen voor dat elke 3 maanden een nieuw certificaat opgehaald wordt Let’s Encrypt, maar ook dat je bv https://moodle.mijnserver.nl/ en https://xerte.mijnserver.nl/ of https://grafana.mijnserver.nl/ kunt gebruiken in plaats van het ip-adres van de Synology machine en een moeilijk te onthouden poortnummer.

linuxserver.io letsencrypt/nginx reverse proxy

Er zijn een aantal verschillende varianten van kant en klare scripts om een reverse proxy op te zetten. Volgens de downloadgegevens van github.com is dit de meest populaire. Ik heb die niet gebruikt. 🙂
Niet uit principe, maar omdat ik eerst dit bericht tegen kwam bij linuxserver.io voordat ik eigenlijk wist wat een reverse proxy was. Het bericht legt heel goed, stap voor stap uit hoe de reverse proxy werkt en hoe je hem op moet zetten. Belangrijk voordeel ten opzichte van de populiare versie: de linuxserver.io versie kan gebruik maken van dns autorisatie bij let’s encrypt. En dat betekent dat je poort 80 niet open hoeft te zetten, maar aan poort 443 voldoende hebt als je toegang tot de servers van buiten wilt opzetten.

Grootste uitdaging bij linuxserver.io is het opzetten van meerdere domeinnamen (dus bv naast mijnserver.nl ook mijndomein.nl). Dat is niet nodig voor het Moodle/Xerte scenario maar wel bv als je zoals ik dat doe verschillende domeinen (http://ictoblog.nl, http://activegeek.nl etc) hebt waar je bv een weblog aan wilt koppelen.

Hiernaast zie je een voorbeeld van de docker-compose.yaml die daarvoor kan zorgen.

Daarnaast moest ik naast het “default” bestand in site-confs een extra bestand aanmaken (ik heb het activegeek_nl genoemd, maar je mag de naam zelf kiezen) met daarin aanvullende aanwijzingen voor het afhandelen van de activegeek.nl gerelateerde zaken. Dat bestand ziet er vergelijkbaar uit als het standaard bestand, op een paar verschillen na boven en onder aan het bestand:

Zoals je kunt zien verwijst dit bestand naar /config/nginx/proxy-confs-activegeek_nl/*.subdomain.conf en /config/nginx/proxy-confs-activegeek_nl/*.subfolder.conf;

Die folder /config/nginx/proxy-confs-activegeek_nl/ moet je dus zelf nog aanmaken zodat je daar de .conf bestanden in kunt zetten zoals die ook voor het default domein (in dit geval “ictoblog.nl”) bepalen welke subdomeinen naar welke docker containers verwijzen.

En als je dát allemaal hebt gedaan…. én je hebt er voor gezorgd dat (bv via cloudflare.com) de domeinnaam naar het juiste domein wordt doorgestuurd. Dan kun je met sudo docker-compose up -d de reverse proxy starten en je Docker containers benaderen via eenvoudig te onthouden urls.

Simpel toch? 😉

0 0 stemmen
Bericht waardering
3 Reacties
Inline Feedback
Bekijk alle reacties
trackback

Reverse Proxy voor Docker met Let’s Encrypt en Nginx https://t.co/bqNKOgDm2O

trackback

Installeren van een reverse proxy op mijn @Synology NAS met behulp van @nginx @letsencrypt @Docker @cloudflare en m… https://t.co/kE54JAl4U9

trackback

Samen wordt dat straks iets als dit: https://t.co/ZrASgj0xKX