# P42 Dashboard auf dem Server betreiben (Docker + eigener nginx) Der Container öffnet **nur einen internen Port** (Standard `127.0.0.1:3000`). Von außen erreichbar wird das Dashboard ausschließlich über deinen nginx, der per HTTPS auf diesen Port weiterleitet. - **Daten** (`data/`: Datenbank + hochgeladene Bilder) liegen auf dem Server außerhalb des Containers. - **Einstellungen** (`config.json`: API-Keys, Wikipedia-Kontakt) werden nur lesend eingebunden, nicht ins Image gebaut. - Beides bleibt bei Updates und beim Neubau des Containers erhalten. ## 1. Projekt auf den Server holen (einmalig) Der Code liegt in https://github.com/guyg1474/p42.f-w. `config.json`, `data/` und `.env` stehen in `.gitignore` – Schlüssel und Daten landen nie im Repository. `/pfad/zu/docker` ist ein Platzhalter – durch den Container-Ordner auf dem Server ersetzen. ```bash mkdir -p /pfad/zu/docker git clone https://github.com/guyg1474/p42.f-w.git /pfad/zu/docker/p42 cd /pfad/zu/docker/p42 ``` Das Repository ist öffentlich, Klonen klappt daher ohne Schlüssel. Wird es später privat, wie beim HCRB-Projekt einen Deploy-Key (nur Lesezugriff) anlegen und mit `git@github.com:guyg1474/p42.f-w.git` klonen. `deploy/update-docker.sh` holt bei jedem Aufruf per `git pull` den neuesten Stand und baut den Container neu. ## 2. Einstellungen und Daten (einmalig, auf dem Server) ```bash cd /pfad/zu/docker/p42 cp config.example.json config.json # nur falls nicht mitkopiert – API-Keys etc. eintragen chmod +x deploy/*.sh # Datenordner: der Container läuft als UID 1000 und muss hier schreiben dürfen mkdir -p data && sudo chown -R 1000:1000 data ``` Bestehende Daten übernehmen (lokal ausführen, den lokalen Server vorher stoppen, damit die Datenbank vollständig ist): ```bash scp -r data config.json DEIN-USER@SERVER:/pfad/zu/docker/p42/ # danach auf dem Server: sudo chown -R 1000:1000 /pfad/zu/docker/p42/data ``` Neue Tabellen und Spalten legt der Server beim ersten Start selbst an. ## 3. Port und Bindung (optional) Standard: Port `3000`, nur auf `127.0.0.1` – passt, wenn nginx **direkt auf dem Server** läuft. Prüfen, ob der Port frei ist (keine Ausgabe = frei): `sudo ss -ltnp | grep ':3000 '` Anpassen über `.env`: ```bash cp .env.example .env nano .env ``` | Variable | Bedeutung | |---|---| | `P42_PORT` | Port auf dem Server (Ziel für nginx) | | `P42_BIND` | `127.0.0.1` für nginx auf dem Server. Läuft nginx als Docker-Container (z. B. Nginx Proxy Manager), die lokale Server-IP eintragen (`hostname -I`). Nicht `0.0.0.0`, sonst ist der Port offen im Netz. | | `P42_TRUSTED_PROXIES` | Wem die `X-Forwarded-*`-Header geglaubt werden. `*` ist sicher, solange nur nginx den Port erreicht. | ## 4. Starten / Updaten ```bash ./deploy/update-docker.sh ``` Baut das Image (Frontend + Backend), startet den Container und zeigt den Status. Bei einem Git-Projekt holt es vorher den neuen Code. Nach etwa 15 Sekunden sollte `docker compose ps` den Zustand `healthy` zeigen. Erster Aufruf über die Domain: Es erscheint die Einrichtung des ersten Kontos (wird Administrator) – oder, mit übernommenen Daten, die normale Anmeldung. ## 5. nginx (machst du) – was das Dashboard braucht ```nginx location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # sonst bekommt das Login-Cookie kein "Secure" client_max_body_size 16m; # Bild-Uploads bis 15 MB (nginx-Standard: 1 MB) proxy_read_timeout 60s; # Rezept-/Infoabrufe können ein paar Sekunden dauern } ``` - `X-Forwarded-For` ist wichtig: Der Login-Schutz (max. 5 Fehlversuche in 10 Minuten) zählt pro echter Client-IP. - Ohne `client_max_body_size` schlagen Fotos über 1 MB mit Fehler 413 fehl. - Nginx Proxy Manager: „Forward Hostname/IP" = Server-IP, „Forward Port" = `P42_PORT`; die Größe im Reiter *Advanced* als `client_max_body_size 16m;` eintragen. ## 6. Nützliche Befehle ```bash docker compose logs -f # Log ansehen docker compose restart # nach Änderungen an config.json docker compose exec p42 python -m app.reset_password BENUTZERNAME # Passwort zurücksetzen ``` **Backup:** Container kurz stoppen (`docker compose stop`), Ordner `data/` sichern, wieder starten (`docker compose start`). ## Hinweise - **Monitoring:** Die Prüfungen laufen jetzt aus dem Container. `localhost`/`127.0.0.1` meint dort den Container selbst, nicht den Server – für Dienste auf dem Server dessen LAN-IP eintragen (z. B. `192.168.0.10:22`). - **Zeitzone** ist `Europe/Berlin` (für Uhrzeiten in Monitoring und Logs).