= Nginx als Reverse Proxy im Container einrichten =

Da ich in letzter Zeit mit einigen Servern in Docker/[Podman]-Containern herumgespielt habe, ist es mir lästig geworden, in jedem dieser Server immer wieder neu herauszufinden, wie man dort SSL konfiguriert. Eine zentrale Verwaltung dieses Problems erschien mir angemessen. Natürlich gibt es auch hierfür wunderschöne Container.

== Auswahl des richtigen Basis-Images ==

=== fertige Reverse Proxy Images ===

Ich habe mir zuerst mal mehrere Nginx Reverse Proxy Container angeschaut. Sehr viele von denen habe eine letsencrypt-Automatik eingebaut, die ich in meinem Setup leider nicht nutzen kann (meine Server sind größtenteils nur intern im LAN, haben aber dennoch ein auch öffentlcih gültiges Server-Zertifikat). Z.B. der [Nginx Proxy Manager|https://hub.docker.com/r/nginxproxymanager/nginx-proxy-manager] glänzt mit einer hübschen Weboberfläche, funktionierte nicht mit eigenen Zertifikaten. ''(Es handelte sich wohl um einen Bug, der evtl. irgendwann behoben ist, aber so lange wollte ich nicht warten. Schade, der hatte mir gefallen.)'' Ich habe mir dann noch zwei andere angeschaut.

Am Ende kam ich zu der Erkenntnis, das es wohl einfacher ist, einen nackten nginx selbst zu konfigurieren. Das kann ja auch kein Hexenwerk sein und letztlich kann man eigene Besonderheiten später viel einfacher umsetzen.

=== Nginx Images ===

So einfach wie vorgestellt, war das dann aber auch nicht.

Diese [Container Beschreibung|https://hub.docker.com/_/nginx] hat mich überzeugt, das es ein offizielles nginx Image gibt. Es gibt natürlich noch tausend andere (z.B. auch von Distributionen, etc.), aber ich fing dann mal hier an. Da ich nur den reverse Proxy brauche, ist es vielleicht nicht nötig, viel drumgerum zu haben. Dieses Image basiert scheinbar auf Alpine Linux, das optimiert auf "klein & schlank" ist. Allerdings ergab es beim ersten Versuch, den Container zu starten (der fehlschlagen musste, weil keine Konfiguration vorlag) eine Fehlermeldung, als ich mir das log anschauen wollte(`/docker-entrypoint.sh: 38: exec: -p: not found`) und auch keine andere Fehlermeldung bekam. Einen Container, den ich nicht loggen kann, taugt für mich nix. Meine Vermutung ist, das das mit Docker nicht passiert wäre, aber ich will ja weiterkommen, also habe ich das nächste Image probiert.

Um diesem Problem aus dem Weg zu gehen, habe ich dann ein Image von Ubuntu gewählt, weil da sicher mehr Betriebssystem dabei ist. Also ist das Image, mit dem ich hier weitermache, jetzt '''ubuntu/nginx'''


= Container einrichten =

== ausgesuchten Container installieren ==

  podman pull ubuntu/nginx 

Laut [Beschreibung des Images|https://hub.docker.com/r/ubuntu/nginx] könnte diese Option sinnvoll sein:

  -e TZ=Europe/Berlin 

== Konfigurationsverzeichnisse einrichten ==

Meine Konvention ist, für einen Container xxx ein Verzeichnis /var/xxx/config für Konfigurationsdateien und /var/xxx/data/ für ein persistentes Datenverzeichnis zu haben. Für den Reverse Proxy brauchen wir wohl keine persistenten Daten.

  mkdir -p /var/nginx/config 

== Zertifikate in den Container bringen ==

  scp -3 -r root@chef:/etc/letsencrypt/live root@podman.loc:/var/nginx/data/ 

Dafür später die Option verwenden:

  -v /var/nginx/data/live/:/etc/letsencrypt/live 

== Konfigurationsdatei erzeugen ==

Es gibt eine Datei, die der certbot von Letsencrypt mit installiert, in der von ihm vorgeschlagene Sicherheitseinstellungen stehen. Da ich denke, das das eine gute Idee ist, diese Einstellungen zu übernehmen, habe ich diese Datei, wie sie ist, mit kopiert. Ab und an kann man die ja mal erneuern. Die wird allerdings wohl nur automatisch erzeugt, wenn der certbot auch selber den nginx konfiguriert, also bei mir nicht. Ich musste sie aus dem Internet ziehen.

Natürlich habe ich diese Datei nach /var/nginx/config geschrieben.

  -v /var/nginx/config/options-ssl-nginx.conf:/etc/letsencrypt/options-ssl-nginx.conf 

Die eigentliche Konfiguration meiner Server ist in einer einzigen Datei. Ich überlagere sie über die vorhandene defaults Konfiguration des nginx, so das dieser nicht mehr selber auf Port 80 antwortet, sondern ausschließlich meine Konfiguration benutzt.

  -v /var/nginx/config/meine_sites.conf:/etc/nginx/sites-enabled/default 

Um diese Datei zu erstellen, habe ich mir die Nginx Anleitung angeschaut, die sehr übersichtlich und gut erklärt hat, wie einerseits ein Reverse Proxy und andererseits ssl eingerichtet wird. Dabei waren folgende Seiten hilfreich:

* Reverse Proxy
** https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/
* ssl
** https://nginx.org/en/docs/http/configuring_https_servers.html
** https://docs.nginx.com/nginx/admin-guide/security-controls/terminating-ssl-http/ (hier wird z.B. auch Server Name Indication/SNI erklärt, das war mir neu)
** https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/ - Hier wird erklärt, wie man LetsEncrypt Zertifikate verwendet bzw. wo welche Datei hinkopiert werden kann/muss.
* Logging (habe ich selber bisher noch nicht perfekt eingerichtet)
** https://docs.nginx.com/nginx/admin-guide/monitoring/logging/

== Container starten ==

  podman run -d --name nginx \
  -v /var/nginx/data/live/:/etc/letsencrypt/live \
  -v /var/nginx/config/options-ssl-nginx.conf:/etc/letsencrypt/options-ssl-nginx.conf \
  -v /var/nginx/config/meine_sites.conf:/etc/nginx/sites-enabled/default  \
  -e TZ=Europe/Berlin \
  -p 443:443 ubuntu/nginx 

Beim Debuggen hilft:

  podman exec -it nginx /bin/bash 

== Container in Pods zusammenfassen ==

Unter Umständen kann es sinnvoller sein, einen Reverse Proxy und die von ihm verwalteten Services in einem sogenannten Pod zusammenzufassen. Damit habe ich experimentiert und das hier beschrieben: [Podman Container Pod].

[{Tag ServerDienste Cloud EigeneWolke Container}]