diff --git a/.env.example b/.env.example index 52603e8..da4e6cf 100644 --- a/.env.example +++ b/.env.example @@ -1,3 +1,2 @@ -# Nach .env kopieren und den Netzwerknamen des Nginx Proxy Managers eintragen -# (herausfinden mit: docker inspect --format '{{range $k, $v := .NetworkSettings.Networks}}{{$k}} {{end}}') -PROXY_NETWORK=npm_default +# Optional: nach .env kopieren, wenn Port 3000 auf dem Server schon belegt ist +HCRB_PORT=3000 diff --git a/DEPLOY.md b/DEPLOY.md index c691f9b..0dfb7d5 100644 --- a/DEPLOY.md +++ b/DEPLOY.md @@ -4,7 +4,7 @@ Annahme: ein Linux-Server mit SSH-Zugang und Docker, auf dem der **Nginx Proxy M und die Domains verwaltet. Dazu eine (Sub-)Domain, z. B. `hcrb.dbks.eu`. Der Ablauf: Code liegt in einem Git-Repository → Server holt ihn per `git pull` → `docker compose` baut und startet -den Container → der Container hängt im selben Docker-Netz wie NPM → NPM leitet die Domain per HTTPS an `hcrb:3000`. +den Container auf Port 3000 → NPM leitet die Domain per HTTPS an `Server-IP:3000`. Die Daten (`data/`) liegen außerhalb des Containers auf dem Server und bleiben bei Updates erhalten. ## 1. Git-Repository ✓ @@ -42,22 +42,26 @@ chmod +x deploy/*.sh mkdir -p data && sudo chown 1000:1000 data ``` -## 4. Mit dem Netz des Nginx Proxy Managers verbinden +## 4. Port und Server-IP -Der HCRB-Container wird in das Docker-Netz gehängt, in dem NPM schon läuft. Am NPM selbst muss nichts geändert werden. - -Name des NPM-Containers und seines Netzes herausfinden: +Der Container ist auf dem Server über **Port 3000** erreichbar. Prüfen, ob der Port noch frei ist +(keine Ausgabe = frei): ```bash -docker ps --format '{{.Names}}\t{{.Image}}' | grep -i nginx-proxy-manager -docker inspect NAME-DES-NPM-CONTAINERS --format '{{range $k, $v := .NetworkSettings.Networks}}{{$k}} {{end}}' +sudo ss -ltnp | grep ':3000 ' ``` -Die zweite Zeile gibt den Netzwerknamen aus, z. B. `npm_default`. Diesen in die Datei `.env` eintragen: +Ist er belegt, einen anderen freien Port wählen (z. B. 3010) und in die Datei `.env` schreiben: ```bash cp .env.example .env -nano .env # PROXY_NETWORK=npm_default (durch den ausgegebenen Namen ersetzen) +nano .env # HCRB_PORT=3010 +``` + +Lokale IP des Servers herausfinden (die erste Adresse, meist `192.168.…`) – die kommt später in den Proxy Manager: + +```bash +hostname -I ``` ## 5. Daten übernehmen (optional) @@ -86,10 +90,10 @@ Ohne übernommene Daten jetzt den ersten Login anlegen (Passwort wird verdeckt a docker compose exec hcrb npm run user -- add elias ``` -Prüfen, ob NPM den Container erreicht (sollte `{"user":null}` ausgeben): +Prüfen, ob die Seite läuft (sollte `{"user":null}` ausgeben – Server-IP und ggf. Port anpassen): ```bash -docker exec NAME-DES-NPM-CONTAINERS curl -s http://hcrb:3000/api/me +curl -s http://192.168.178.20:3000/api/me ``` Der Container startet automatisch neu – nach Abstürzen und nach einem Server-Neustart (`restart: unless-stopped`). @@ -104,8 +108,8 @@ Reiter **Details** | --- | --- | | Domain Names | `hcrb.dbks.eu` | | Scheme | `http` | -| Forward Hostname / IP | `hcrb` | -| Forward Port | `3000` | +| Forward Hostname / IP | lokale IP des Servers aus Schritt 4, z. B. `192.168.178.20` (**nicht** `127.0.0.1`/`localhost` – das wäre der Proxy-Manager-Container selbst) | +| Forward Port | `3000` (bzw. der Port aus `.env`) | | Cache Assets | aus | | Block Common Exploits | an | | Websockets Support | aus (wird nicht gebraucht) | @@ -127,7 +131,8 @@ NPM gibt die echte Besucher-IP und das Protokoll (`X-Forwarded-For`, `X-Forwarde das braucht die Seite für die Sperre nach 10 falschen Passwörtern und für das sichere Login-Cookie. Unter *Advanced* muss dafür nichts eingetragen werden. -**Hinweis:** Port 3000 wird bewusst **nicht** nach außen freigegeben – die Seite ist nur über NPM erreichbar. +**Hinweis:** Port 3000 im Router **nicht** freigeben – von außen soll die Seite nur über NPM (Port 443) erreichbar sein. +Im Heimnetz ist sie unter `http://Server-IP:3000` direkt erreichbar, das ist unkritisch. Die NPM-Oberfläche (Port 81) sollte ebenfalls nicht offen im Internet stehen. ## 8. Backups @@ -177,7 +182,7 @@ Alle im Ordner `~/festplatte/dockercontainer/hcrb` ausführen: | Problem | Ursache / Lösung | | --- | --- | -| `network … declared as external, but could not be found` | Netzwerkname in `.env` stimmt nicht – Schritt 4 wiederholen. | -| NPM zeigt „502 Bad Gateway“ | Container läuft nicht (`docker compose ps`, `docker compose logs`) oder hängt nicht im NPM-Netz (Schritt 4). | +| `port is already allocated` beim Start | Port belegt – in `.env` einen anderen `HCRB_PORT` setzen (Schritt 4) und in NPM nachziehen. | +| NPM zeigt „502 Bad Gateway“ | Container läuft nicht (`docker compose ps`, `docker compose logs`), oder in NPM steht `127.0.0.1` bzw. ein falscher Port – dort die lokale Server-IP eintragen. | | Container startet neu mit `EACCES … data` | Rechte am Datenordner: `sudo chown -R 1000:1000 ~/festplatte/dockercontainer/hcrb/data` | | Nach 10 falschen Passwörtern ist der Login für **alle** gesperrt | Die Seite erkennt die echte Besucher-IP nicht – prüfen, ob `TRUST_PROXY` in `docker-compose.yml` gesetzt ist und der Zugriff über NPM erfolgt. | diff --git a/README.md b/README.md index b169131..4e4fd5e 100644 --- a/README.md +++ b/README.md @@ -74,5 +74,5 @@ private/ nur angemeldet: Kalender, Fahrtplaner, Gruppe ## Auf einem Server betreiben Per Docker hinter dem Nginx Proxy Manager: `docker compose up -d --build` (Daten liegen in `./data`, -das Docker-Netz des Proxys steht in `.env`). Schritt-für-Schritt-Anleitung inkl. Domain, HTTPS, Updates und Backups: +die Seite läuft auf Port 3000, änderbar per `HCRB_PORT` in `.env`). Schritt-für-Schritt-Anleitung inkl. Domain, HTTPS, Updates und Backups: [DEPLOY.md](DEPLOY.md). Skripte für Updates und Backups liegen in `deploy/`. diff --git a/docker-compose.yml b/docker-compose.yml index f0ea2f2..e55c0ab 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,19 +4,14 @@ services: image: hcrb container_name: hcrb restart: unless-stopped - # Kein Port nach außen – der Nginx Proxy Manager erreicht den Container über das gemeinsame Netz als hcrb:3000 + ports: + # Port auf dem Server – im Nginx Proxy Manager als Ziel eintragen (Server-IP + dieser Port). + # Anderer Port: in der Datei .env HCRB_PORT=... setzen. + - "${HCRB_PORT:-3000}:3000" environment: TZ: Europe/Berlin - # Anfragen kommen vom Proxy-Container aus dem Docker-Netz (172.x.x.x) + # Anfragen kommen vom Proxy Manager aus dem lokalen bzw. Docker-Netz TRUST_PROXY: "loopback, uniquelocal" volumes: # Mitglieder, Termine, Logins – bleiben bei Updates und Neubau des Containers erhalten - ./data:/app/data - networks: - - proxy - -networks: - proxy: - # Netz des Nginx Proxy Managers – Name steht in der Datei .env (PROXY_NETWORK=...) - external: true - name: ${PROXY_NETWORK:-proxy}