diff --git a/.env.example b/.env.example index 824b454..bca0a96 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,8 @@ # Kopie als .env neben die compose.yaml legen und Werte ersetzen. # Passwort des Datenbank-Nutzers. Lang und zufaellig waehlen. +# Achtung: Ein $ im Wert wird von Docker Compose als Variable gedeutet und +# verschluckt. Entweder $ vermeiden oder als $$ schreiben. DB_PASSWORD=hier-ein-langes-zufaelliges-passwort # Schluessel fuer Sitzungen und CSRF-Token, mindestens 32 Zeichen. @@ -15,6 +17,10 @@ BOOTSTRAP_ADMIN_PASSWORD= # --- Optional --- +# Name des Docker-Netzwerks, in dem der Reverse Proxy laeuft. Der Proxy legt es +# an; bei Nginx Proxy Manager heisst es meist nginx_default. +# PROXY_NETWORK=nginx_default + # Adresse der GExtension-Instanz fuer den Paket-Abgleich. Der Parser ist auf # deren Seitenaufbau gebaut; ein anderes Shop-System laesst sich damit nicht # auslesen. Leer lassen, wenn der Abgleich nicht genutzt wird. diff --git a/README.md b/README.md index e0d8647..e8ba2f6 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,24 @@ Der App-Port wird bewusst **nicht** nach außen gemappt. Davor gehört ein Rever (Nginx Proxy Manager, Traefik oder Caddy), der HTTPS terminiert und intern auf `app:3000` weiterleitet. So ist nur Port 443 offen und die Zertifikate laufen über Let's Encrypt. +Damit der Proxy die App erreicht, hängt der `app`-Service zusätzlich im Netzwerk des Proxys. +Die `compose.yaml` erwartet es unter dem Namen `nginx_default` — so heißt es bei Nginx Proxy +Manager. Heißt es bei dir anders, setz `PROXY_NETWORK` in der `.env`: + +``` +PROXY_NETWORK=mein-proxy-netz +``` + +Das Netzwerk muss existieren, bevor der Stack startet; angelegt wird es vom Proxy. Betreibst du +gar keinen Proxy in Docker, entferne den `networks`-Block am Ende der `compose.yaml` samt der +`networks`-Liste beim `app`-Service und mappe stattdessen einen Port — dann aber bitte HTTPS +anderweitig davorsetzen. + +> **Zu `$` in der `.env`:** Docker Compose deutet `$name` als Variable und ersetzt es durch +> nichts, wenn es die Variable nicht gibt. Ein Passwort mit `$` kommt dadurch gekürzt in der App +> an — ohne Fehler, nur mit einer leicht zu übersehenden Warnung. Entweder `$` vermeiden oder +> als `$$` schreiben. + Läuft die App hinter einem Proxy, muss `TRUST_PROXY=true` gesetzt bleiben — sonst landen im Audit-Log die Proxy-IPs statt der echten. In Produktion werden Cookies automatisch auf `Secure` gesetzt; nur zum Testen ohne TLS lässt sich das über `COOKIE_SECURE=false` abschalten. diff --git a/compose.yaml b/compose.yaml index 1eea7fa..d5d920a 100644 --- a/compose.yaml +++ b/compose.yaml @@ -21,6 +21,9 @@ services: depends_on: db: condition: service_healthy + networks: + - default # App zur Datenbank + - proxy # Reverse Proxy zur App db: image: postgres:16-alpine @@ -56,5 +59,17 @@ services: sleep 86400; done' +networks: + # Das Netzwerk des Reverse Proxy. Es muss bereits existieren - der Proxy + # legt es an, bei Nginx Proxy Manager heisst es meist nginx_default. + # Anderer Name? Dann PROXY_NETWORK in der .env setzen. + # + # Ohne Reverse Proxy in Docker: diesen Block und die networks-Liste beim + # app-Service entfernen und stattdessen einen Port mappen (ports: "3000:3000"). + # Dann aber selbst fuer HTTPS sorgen - die App gehoert nicht ungeschuetzt ins Netz. + proxy: + external: true + name: ${PROXY_NETWORK:-nginx_default} + volumes: cc_db: