Alte Version ersetzt und durch sicherere Version geupdatet am 25.06.2018
Bei meinen verschiedenen Ansätzen gab es immer wieder Dinge die mich gestört haben wie:
• Umständlich für jeden Container einrichten
• kein automatisches Verlängern von Zertifikaten
• Nginx von Hand anpassen für jeden Container
Mit meiner jetzigen Lösung ist all das überflüssig und es lässt sich ganz einfach mit jedem Container umsetzen.
Voraussetzungen mit SSL über LetsEncrypt:
- IPv4 – Ich habe das ganze mit DSLite und einer reinen IPv6 versucht, leider war es mir nicht möglich das LetsEncrypt Zertifikat zu genieren.
- Domain die Wildcards erlaubt (Namecheap hat zum Teil sehr günstige Domains und auch gleich DynDNS mit im Angebot) alternativ sollten auch diverse DynDNS Dienste funktionieren.
Wofür das Ganze?
Um mir nicht jeden Port merken müssen und Anwendungen direkt im Browser ansprechen zu können gefällt es mir deutlich besser meinen Programme mit ihrem Namen aufzurufen.
So wird mein Emby Server nicht mehr mit http://meinedomain.com:8096aufgerufen sondern mit http://emby.meinedomain.comoder mit Verschlüsselungen halt mit https://emby.meinedomain.com.Wenn man es nur Lokal betreibt wäre es dann etwa http://emby.nasoder http://filebot.nas wobei NAS hier der Netzwerkname meines NAS ist.
Domain aufs eigene Netzwerk schalten
Grundvoraussetzung damit der ganze Spaß hier funktioniert ist: Eure Domain muss bereits auf euer Netzwerk (eure externe IP) geschaltet sein. Im besten Fall gleich mit eine DynDNS damit ihr die IP nicht manuell neu konfigurieren müsst.
Die nötigen Container installieren:
Wir installieren uns als erstes den Nginx Proxy Container. Ich würde empfehlen dies übers Terminal zu machen das geht in der Regel schneller als den Container über das Web UI unseres Dockers zu installieren.
Wichtig! Es darf kein anderer Dienst auf Port 80 oder 443 laufen. Wenn ihr also OMV nutzt müsst ihr zuerst den Standard Port eures OMV ändern.
[h1]Seperate Container [/h1]
Um das Ganze etwas sicherer zu gewährleisten kann man Nginx auch in 2 seperarten Container arbeiten lassen...das ganze hat @SLiX vorgeschlagen und bedarf kaum mehr Arbeit...so würde es dann so aussehen:
1) Es muss die Datei nginx.tmpl in einen Docker Container gemountet werden.
Diese findet kopiert ihr mit Hilfe der Terminals an die Gewünschte stelle eures Systems :
curl https://raw.githubusercontent.com/jwilder/nginx-proxy/master/nginx.tmpl > /path/to/nginx.tmpl
/path/to/nginx.tmpl ersetzt ihr durch euren Systempfad. In meinem alten Beispiel wäre da etwa /data/nginx.tmpl
Als nächstes holen wir uns den offiziellen Nginx Container
$ docker run -d -p 80:80 -p 443:443 \
--name nginx \
-v /etc/nginx/conf.d \
-v /etc/nginx/vhost.d \
-v /usr/share/nginx/html \
-v /path/to/certs:/etc/nginx/certs:ro \
--label com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy \
nginx
Auch hier sollte der Eintrag der Zertifikate zu eurem Systempfad angepasst werden /path/to/certs
Als zweites starten wir den Proxy Container
$ docker run -d \
--name nginx-gen \
--volumes-from nginx \
-v /path/to/nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro \
-v /var/run/docker.sock:/tmp/docker.sock:ro \
--label com.github.jrcs.letsencrypt_nginx_proxy_companion.docker_gen \
jwilder/docker-gen \
-notify-sighup nginx -watch -wait 5s:30s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf
Auch hier müssen wir nun den Pfad zu unserer nginx.tmpl angeben in dem wir path/to/nginx.tmpl ersetzen.
Zuguterletzt der Letsencrypt Containert
$ docker run -d \
--name nginx-letsencrypt \
--volumes-from nginx \
-v /path/to/certs:/etc/nginx/certs:rw \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
jrcs/letsencrypt-nginx-proxy-companion
Hier wird nun ein letzes Mal der /path/to/certs durch den vorgegebenen Pfad ersetzt.
Container die nun mit Letsencrypt gesichert werden sollen, müssen um folgendes ergänzt werden :
Die Ergänzungen:
VIRTUAL_PORT (Der Port den die Anwendung über den Proxy leiten soll, bei Containern die mehrere Ports nutzen zwingend notwendig).
VIRTUAL_HOST (Der virtuelle Host des Proxy, zB. emby.meinedomain.com, dieser Eintrag ist immer notwendig auch wenn wir keine SSL Verschlüsselung nutzen)
LETSENCRYPT_EMAIL (Die Email Adresse die für das Lets Encrypt Zertifikat genutzt werden soll, zwingend notwendig zum generieren)
LETSENCRYPT_HOST (Die URL die für die SSL Verschlüsselung genutzt werden soll, zum Beispiel emby.meinedomain.com)
Im Beispiel von Emby würde das dann so aussehen:
VIRTUAL_PORT : 8096
VIRTUAL_HOST : emby.meinedomain.com
LETSENCRYPT_HOST: emby.meinefomain.com
LETSENCRYPT_EMAIL: nevrion@nerds.de
Das Ganze funktioniert auch mit Filebot, Omni und eigentlich allem was irgendwie über ein Webinterface aufrufbar ist. Ein weiterer Vorteil ist, ihr müsst nach außen nur die Ports 80/443 öffnen.