Docker + Nginx + Let's Encrypt Konfiguration

  • Hallo!

    Ich bin gerade dabei eine Anwendung zum laufen zu bekommen, die aber ein gültiges Zertifikat braucht (LE funktioniert damit).

    Mein Problem dabei ist, dass ich mittlerweile gefühlt jede Anleitung aus dem Internet versucht habe (ich habe des Server jedes mal neu installiert, so dass keine fehlerhaften Rückstände da sind), ich es aber bis jetzt nicht hinbekommen habe, ein LE Zertifikat mit Nginx zu koppeln. Nginx läuft in einem Docker Container.

    In der docker-compose Datei werden 3 Services konfiguriert, einmal eine DB, Nginx und die Anwendung an sich. Die 3 laufen auch ohne Problem, aber Zugriff auf die Domain wird abgelehnt, da kein Zertifikat.

    Meine Frage ist nun:

    Kennt jemand eine Anleitung die 100%ig funktioniert? Oder hat es schon mal selbst jemand gemacht und kann mir dabei helfen?

    Ist das echt so kompliziert?

    Viele Grüße

  • Das ist die docker-compose.yml


    Und das ist die nginx.conf

  • Es gibt mehrere Probleme: certbot speichert die Zertifikate nicht in /opt/application, ./certbot/www (relativ zu was eigentlich?) wird nicht in den nginx-Container durchgereicht, ssl_certificate u. ssl_certificate_key in der nginx-Config sind falsch.

    Wahrscheinlich gibt es auch noch mehr...

    Wenn du auf dem Niveau sowas machst, solltest du vlt. keinen öffentlich erreichbaren Server betreiben.

  • Es gibt mehrere Probleme: certbot speichert die Zertifikate nicht in /opt/application, ./certbot/www (relativ zu was eigentlich?) wird nicht in den nginx-Container durchgereicht, ssl_certificate u. ssl_certificate_key in der nginx-Config sind falsch.

    Wahrscheinlich gibt es auch noch mehr...

    Wenn du auf dem Niveau sowas machst, solltest du vlt. keinen öffentlich erreichbaren Server betreiben.

    Dei Einträge bei nginx habe ich vergessen rauszunehmen.

    Die Einträge bei certbot sind die vorgegebenen von EFF.

    Warum sind die Einträge in der nginx conf falsch bzw. was ist falsch.

    Dass das nicht geht ist mir klar, sonst hätte ich nicht gefragt.

    Den letzten Satz hättest du dir sparen können, mal davon abgesehen weisst du nicht mal ob es öffentliche Server sind, sondern unterstellst es mir einfach.

    Das hört sich für mich eher nach einem Routing Problem an. Kann man den Container überhaupt von außen erreichen? Firewall, Forwarding, Adressen, ...?

    Wenn ich die Domain im Browser eingebe kommt immer nur die Meldung dass die Verbindung abgelehnt wurde.

  • Das ist der zweite Schritt. Zunächst muss ja die Erreichbarkeit auf IPv4 und IPv6 Ebene sichergestellt sein. Überprüfe das doch zunächst.

    Ich schließe mich so langsam der Meinung meiner Vorredner an. Jemand mit deinem Kenntnisstand sollte keinen Server im Internet betreiben. Ich empfehle, das ganze zunächst auf einer VM zu Hause zu üben.

  • Ich weiß ehrlich gesagt nicht was euer Problem ist. Der Server ist erreichbar per IPv4 und IPv6, und so lange ich nichts dran mache oder sauber läuft, auch ausgeschaltet.

    Und ihr wollt mir mangelnde Kenntnisse vorwerfen auf Grund von der Frage?

    Ja, ich habe das noch nie gemacht in dieser Konstellation, deswegen frage ich ja.

    War aber anscheinend ein Fehler hier zu fragen.

    Anscheinend habt ihr aber auch keine Lösung und/oder kennt euch damit aus, stattdessen kommen solche Aussagen.

  • Wie sollen wir eine Lösung haben, wenn wir das Problem noch nicht eingrenzen konnten? Im Moment gibt es noch 1 Million potentielle Ursachen.

    Und ihr wollt mir mangelnde Kenntnisse vorwerfen auf Grund von der Frage?

    Ja. All deine Fragen lassen auf völlige Ahnungslosigkeit schließen. Es geht nicht um ein spezifisches Detail, die kompletten Grundlagen fehlen.

    Der Server ist erreichbar per IPv4 und IPv6

    Es geht nicht um den Server, sondern um den Container.

  • Ich werfe mal jwilders nginx-proxy image (https://github.com/nginx-proxy/nginx-proxy) zusammen mit dem acme-companion (https://github.com/nginx-proxy/acme-companion) in die Runde. Da gibt es reichlich viele Beispiele und abgesehen von der docker-compose.yml-Datei muss nichts konfiguriert werden um einen laufenden Docker-Stack mit nginx und gültigem LE-Zertifikat zu bekommen.

    Eine weitere Lösung ist der nginx proxy manager (https://nginxproxymanager.com/guide/), aber damit kenne ich mich nicht gut aus.

  • Je komplexer das Konstrukt, umso schwieriger ist es zu debuggen.

    Nimm doch zunächst mal nur eine rudimentäres nginx, ganz ohne DB und Anwendung und versuche dort das cert zu Laufen zu bringen.

    Wenn das dann klappt kannst du den Rest drumherumbauen.

  • Dei Einträge bei nginx habe ich vergessen rauszunehmen.

    Es wäre sinnvoll, das zu posten, mit dem du es versuchst/versucht hast, bzw. eine Minimalkonfiguration mit der es nicht funktioniert.

    Die Einträge bei certbot sind die vorgegebenen von EFF.

    Das ist vollkommen egal, wie soll nginx beispielsweise auf /etc/nginx/server.pem zugreifen, wenn /opt/application/server.pem dahin gebindmountet wurde, aber certbot darauf kein Zugriff hat.

    Warum sind die Einträge in der nginx conf falsch bzw. was ist falsch.

    Volume: '/opt/application/server.pem:/etc/nginx/server.pem'

    Config: ssl_certificate /etc/letsencrypt/live/domain.tld/fullchain.pen; (warum eigentlich .pen?)

    Übrigens funktioniert "ssl_ciphers 'irgendeincode';" auch nicht.

    Den letzten Satz hättest du dir sparen können

    Du scheinst dich (aus meiner Sicht) einfach zu wenig auszukennen, sonst hättest du selbst debuggen/recherchieren (können) und wärst nicht auf "Anleitung[en] die 100%ig funktionier[en]" angewiesen.

  • Wie sollen wir eine Lösung haben, wenn wir das Problem noch nicht eingrenzen konnten? Im Moment gibt es noch 1 Million potentielle Ursachen.

    Ja. All deine Fragen lassen auf völlige Ahnungslosigkeit schließen. Es geht nicht um ein spezifisches Detail, die kompletten Grundlagen fehlen.

    Es geht nicht um den Server, sondern um den Container.

    Aha, völlige Ahnungslosigkeit? In der Konstellation, ja, ansonsten nicht.

    Was willst du jetzt genau wissen? Die App ist erreichbar, sehe es ja in den Logs, aber die Verbindung wird abgelehnt.

    cltrmx

    Vielen Dank, ich schaue mir die Links an.

    aRaphael Werde ich machen, ansonsten komme ich hier so nicht weiter. Ich sag es mal so: Selbst der Hersteller der App konnte mir nicht helfen in dieser Sache mit dem Zertifikat.

    Error: User not found Bei mir ging es heute drunter und drüber, und vor lauter testen habe ich irgendwann den Überblick verloren und vergessen was wo rein muss und was wieder weg kann.

    Um es nochmal zu sagen: Ich kenne mich schon aus, aber diese Konstellation habe ich vorher noch nicht gemacht. Und wenn es so einfach wäre mit dem LE Zertifikat + nginx in Docker, dann würde es keine 50 verschiedene Anleitungen geben. Wahrscheinlich funktionieren die alle, aber in meinem spezifischen Konstrukt nicht. Oder ich mache irgendwo einen Fehler, finde den aber nicht.

    Das minimal Beispiel wäre die docker-compose.yml ohne den certbot Abschnitt. Die anderen 3 Sachen müssen drin bleiben, die sind voneinander abhängig.

    Wer sich das selbst mal antun möchte: https://hub.relution.io/docs/installat…/dockercompose/

    Für viele wahrscheinlich kein Problem, ich hänge halt an dem LE Zertifikat.

  • Was willst du jetzt genau wissen?

    Das hab ich doch geschrieben. Wenn du dich auskennst, sollte das klar sein. Es geht um die Erreichbarkeit des Containers auf IP Ebene, Details siehe oben. Was daran ist unklar?

    Die App ist erreichbar, sehe es ja in den Logs, aber die Verbindung wird abgelehnt.

    Was siehst du in den Logs? Die Dinge, die du überprüfen sollst, erzeugen keine Logeinträge.

  • Ich weiß ehrlich gesagt nicht was euer Problem ist. Der Server ist erreichbar per IPv4 und IPv6, und so lange ich nichts dran mache oder sauber läuft, auch ausgeschaltet.

    Und ihr wollt mir mangelnde Kenntnisse vorwerfen auf Grund von der Frage?

    Ja, ich habe das noch nie gemacht in dieser Konstellation, deswegen frage ich ja.

    War aber anscheinend ein Fehler hier zu fragen.

    Anscheinend habt ihr aber auch keine Lösung und/oder kennt euch damit aus, stattdessen kommen solche Aussagen.

    Das ist wie in anderen Foren auch: Ohne die Leute zu kennen, wird unterstellt alles wäre unsicher... Ignorieren

    ISt aber nicht von allen so... Viele sind sehr hilfsbereit!

  • Sehr gewagt von dir als Laie in einem deutschen Forum nach Hilfe zu fragen.

    Mehr als eine öffentliche Hinrichtung kannst du in der typisch deutschen Forenkultur im Normalfall nicht erwarten :D

    Anyways, ein Ratschlag von mir was solche Fragen angeht, zukünftig einfach auf ChatGPT o.Ä. zurück zu greifen. Die sind relativ gut bei genau solchen Problemstellungen und außerdem geben sie dir gute Anhaltspunkte wo du weiter nachforschen / dranschrauben musst. Außerdem wirst du da zügig geholfen und das auch noch passend zu deiner Situation und all das ohne dich bei irgendwem rechtfertigen zu müssen ^^

    Fehler

    Korrigierte docker-compose.yml u. nginx.conf

    Zitat
    1. Erstelle ein Projektverzeichnis für deine Docker-Umgebung.
    2. Platziere die korrigierte docker-compose.yml und nginx.conf in diesem Verzeichnis.
    3. Erstelle die Dateien application.yml und application.cnf im selben Verzeichnis. Diese sollten die spezifischen Konfigurationen für deine Anwendung enthalten.
    4. Erstelle die Unterverzeichnisse certbot/conf und certbot/www. Diese werden für die Let's Encrypt-Zertifikate benötigt.
    5. Generiere eine dhparams.pem-Datei mit folgendem Befehl:
    6. Code
      openssl dhparam -out dhparams.pem 2048
    7. Ersetze in beiden Dateien (docker-compose.yml und nginx.conf) alle Vorkommen von domain.tld durch deine tatsächliche Domain.
    8. Stelle sicher, dass die DNS-Einstellungen für deine Domain korrekt konfiguriert sind und auf den Server zeigen, auf dem du diese Docker-Umgebung einrichtest.
    9. Starte die Docker-Container mit:
      Code
      docker-compose up -d@@@WCF_PRE_LINEBREAK@@@@@@WCF_PRE_LINEBREAK@@@
    10. Warte einige Minuten, bis die initiale Zertifikatsgenerierung abgeschlossen ist.
    11. Starte den Nginx-Container neu, um die neuen Zertifikate zu laden:
      Code
      docker-compose restart nginx@@@WCF_PRE_LINEBREAK@@@

    Beachte dabei folgende Punkte:

    • Stelle sicher, dass die Dateiberechtigungen korrekt gesetzt sind.
    • Konfiguriere deine Firewall so, dass die Ports 80 und 443 erreichbar sind.
    • Die Zertifikatserneuerung erfolgt automatisch, aber behalte sie im Auge.
    • Sichere regelmäßig das certbot/conf-Verzeichnis.
    • Passe bei Bedarf die Rate-Limits und andere Einstellungen in der Nginx-Konfiguration an deine spezifischen Anforderungen an.

    Ich hab den Schritt einfach schon mal für dich gemacht. Habs nur kurz überflogen, sah aber auf dem ersten Blick schon richtig aus. Das sollte eine solide Grundlage bilden womit du dein Problem besser eingrenzen kannst oder auf es auf den Grund zu gehen.

    Hol dir eine Subscription für irgendein GPT und wenn du noch Fragen hast würde ich Foren oder Communitys empfehlen die sich genau in dem Gebiet spezialisieren.

    Vorzugsweise englischsprachige Communitys :S

  • Das ist wie in anderen Foren auch: Ohne die Leute zu kennen, wird unterstellt alles wäre unsicher... Ignorieren

    Sorry, aber das ist doch grober Unfug. Fährst du Auto, ohne einen Führerschein gemacht zu haben? Bastelst du ohne entsprechende Ausbildung an deiner Elektroinstallation zu Hause rum? Nein. Und kein Mensch würde auf die Idee kommen. Aber einen komplexen Server am Netz betreiben kann jedes Schulkind?

    Komm jetzt nicht mit: "Aber Autofahren ist gefährlich, ein Server nicht." Falsch! Ein kompromittierter Server kann massiv Schaden anrichten, nicht nur für einen selber, sondern auch für andere Betroffene. Schadensersatzforderungen im 5- oder 6-stelligen Bereich sind möglich.

    Natürlich darf man als Anfänger Fragen stellen. Aber es kommt immer auf den Kontext an. Bei Experimenten am lebenden Objekt muss man sich solche Hinweise gefallen lassen, denn es ist grob fahrlässig. Würde aus dem Kontext heraus klar werden, dass der Fragesteller zu Hause auf einer VM testet, um sich mit der Technik vertraut zu machen, dann würden die Antworten anders ausfallen.

  • Liebe Community,


    wir möchten euch alle herzlich dazu einladen, in unseren Diskussionen und Interaktionen stets mit Respekt und Wertschätzung aufeinander zuzugehen. Es ist von großer Bedeutung, dass sich jeder hier willkommen und respektiert fühlt. Da die Kommunikation über Text oft Interpretationsspielraum lässt, ist es besonders wichtig, auf ein respektvolles Miteinander zu achten. Es ist noch kein Meister vom Himmel gefallen und manchmal braucht es mehrere Rückfragen oder detailliertere Hilfestellung, um ein Problem zu lösen. Achtet daher bitte auf das was ihr sagt.

    Vielen Dank für eure Unterstützung!


    Liebe Grüße,
    Bianca A.