From 4da7890119fcdfd16f5c3fd3e6b500075f2eb446 Mon Sep 17 00:00:00 2001 From: hkoeck Date: Sun, 31 May 2026 22:30:16 +0200 Subject: [PATCH] Vereinheitliche Stack-Steuerung auf scripts/lab.sh Eine einzige Quelle der Wahrheit fuer alle Stack-Aktionen statt doppelt gepflegter Verb-Tabellen in Makefile und PowerShell-Wrapper. - scripts/lab.sh: zentraler Dispatcher (bootstrap/up/redeploy/ proxy-reload/down/logs/reset/reset-hard/reset-origin) - workshop.ps1: switch-Tabelle kollabiert zu Delegation an lab.sh (kein --remove-orphans-Drift mehr zwischen den Oberflaechen) - Makefile entfernt: WSL/Ubuntu bringt make nicht standardmaessig mit, Doku-Verben (make X) passten nicht zur PowerShell-Mehrheit - bootstrap.sh: Logik inline, redundante bootstrap-unix.sh und bootstrap-wsl.sh entfernt - Doku/HTML: alle 32 "make X" -> "./scripts/lab.sh X", Prosa (macOS-make-Hinweis, PowerShell-Wrapper-Text) angepasst Verifiziert: bootstrap -> proxy-reload -> redeploy -> reset laufen end-to-end gegen den Stack, Basisrouten und Done-Checks gruen. Co-Authored-By: Claude Opus 4.8 --- Makefile | 29 ----------------------------- README.md | 24 ++++++++++-------------- challenges/README.md | 26 +++++++++++++------------- proxy/html/challenges.html | 2 +- proxy/html/hints.html | 8 ++++---- proxy/html/solutions.html | 8 ++++---- scripts/bootstrap-unix.sh | 36 ------------------------------------ scripts/bootstrap-wsl.sh | 6 ------ scripts/bootstrap.sh | 33 ++++++++++++++++++++++++++++++++- scripts/lab.sh | 27 +++++++++++++++++++++++++++ scripts/workshop.ps1 | 12 +----------- 11 files changed, 92 insertions(+), 119 deletions(-) delete mode 100644 Makefile delete mode 100755 scripts/bootstrap-unix.sh delete mode 100755 scripts/bootstrap-wsl.sh create mode 100755 scripts/lab.sh diff --git a/Makefile b/Makefile deleted file mode 100644 index 69ee4e9..0000000 --- a/Makefile +++ /dev/null @@ -1,29 +0,0 @@ -.PHONY: bootstrap up down logs redeploy proxy-reload reset reset-hard reset-origin - -bootstrap: - ./scripts/bootstrap.sh - -up: - ./scripts/compose.sh up -d --build - -redeploy: - ./scripts/compose.sh up -d --build --remove-orphans - ./scripts/compose.sh restart reverse-proxy - -proxy-reload: - ./scripts/compose.sh restart reverse-proxy - -down: - ./scripts/compose.sh down - -logs: - ./scripts/compose.sh logs -f - -reset: - ./scripts/reset-lab.sh - -reset-hard: - ./scripts/reset-lab.sh --hard - -reset-origin: - ./scripts/reset-lab.sh --hard-origin diff --git a/README.md b/README.md index 532eea5..a94138c 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ Basisrouten nach dem Start: Plattformhinweise: - Linux: Docker Engine oder Docker Desktop -- macOS: Docker Desktop (falls `make` fehlt -> `xcode-select --install`) +- macOS: Docker Desktop - Windows: Docker Desktop + WSL Integration aktiv ## Schnellstart @@ -61,7 +61,7 @@ Option B (PowerShell Wrapper): ./scripts/workshop.ps1 -Action bootstrap ``` -Der PowerShell-Wrapper braucht kein `make` und ruft Linux-Skripte direkt in WSL auf. +Der PowerShell-Wrapper ruft intern `./scripts/lab.sh` in WSL auf - die gleiche Steuer-Oberflaeche wie unter Linux/WSL. Falls PowerShell das Script blockiert: @@ -91,20 +91,16 @@ Das Skript: - erstellt `.env` aus `.env.example` (falls nicht vorhanden) - startet den Stack -Hinweis zu Skriptnamen: - -- `scripts/bootstrap.sh` ist der empfohlene Einstieg -- intern nutzt es `scripts/bootstrap-unix.sh` -- `scripts/bootstrap-wsl.sh` existiert nur noch als Kompatibilitaets-Wrapper - ## Neu deployen / resetten +Alle Aktionen laufen ueber `./scripts/lab.sh ` (in WSL/Linux). Windows-PowerShell-Nutzer nehmen `./scripts/workshop.ps1 -Action ` - dahinter steckt dasselbe Skript. + ```bash -make redeploy -make proxy-reload -make reset -make reset-hard -make reset-origin +./scripts/lab.sh redeploy +./scripts/lab.sh proxy-reload +./scripts/lab.sh reset +./scripts/lab.sh reset-hard +./scripts/lab.sh reset-origin ``` - `redeploy`: build + restart aller Services @@ -113,7 +109,7 @@ make reset-origin - `reset-hard`: wie `reset`, plus lokale Git-Aenderungen verwerfen (falls Git-Repo) - `reset-origin`: wie `reset-hard`, aber bevorzugt Ruecksetzen auf `origin/main` -Hinweis: `make redeploy` startet zusaetzlich den Reverse Proxy neu, damit Nginx-Config-Aenderungen sicher aktiv sind. +Hinweis: `redeploy` startet zusaetzlich den Reverse Proxy neu, damit Nginx-Config-Aenderungen sicher aktiv sind. ## Kurz testen diff --git a/challenges/README.md b/challenges/README.md index 83111f2..db626af 100644 --- a/challenges/README.md +++ b/challenges/README.md @@ -12,7 +12,7 @@ Diese Aufgaben sind bewusst auf **manuelle Proxy-Konfiguration** ausgelegt. Die meisten Teilnehmer arbeiten unter **Windows mit Docker Desktop + WSL**. Wichtig: -- **Stack steuern** (`make ...` oder der PowerShell-Wrapper `scripts/workshop.ps1`): geht aus PowerShell **oder** aus dem WSL-Terminal. +- **Stack steuern** (`./scripts/lab.sh ...` in WSL oder der PowerShell-Wrapper `scripts/workshop.ps1`): geht aus PowerShell **oder** aus dem WSL-Terminal. - **Alle Challenge-Kommandos** (`curl`, `openssl`, `grep`, `wget`, `for`-Schleifen, `./scripts/compose.sh ...`): laufen im **WSL-Terminal (bash)**, nicht in PowerShell. - **Warnung:** In PowerShell ist `curl` ein Alias fuer `Invoke-WebRequest` und versteht die hier genutzten Flags (`-I`, `-k`, `--cacert`) **nicht**. Immer im WSL-Terminal testen. - Das Repo liegt im WSL-Dateisystem oder unter `/mnt/c/...`; arbeite am besten aus dem WSL-Terminal im Projektordner. @@ -20,7 +20,7 @@ Die meisten Teilnehmer arbeiten unter **Windows mit Docker Desktop + WSL**. Wich ## Arbeitsmodus 1. Dateien anpassen (`proxy/nginx.conf`, `docker-compose.yml`). -2. Deployen: nach reinen `nginx.conf`-Aenderungen reicht `make proxy-reload`; nach Aenderungen an `docker-compose.yml` (z. B. neue Ports oder Services) immer `make redeploy`, da der Container neu erstellt werden muss. +2. Deployen: nach reinen `nginx.conf`-Aenderungen reicht `./scripts/lab.sh proxy-reload`; nach Aenderungen an `docker-compose.yml` (z. B. neue Ports oder Services) immer `./scripts/lab.sh redeploy`, da der Container neu erstellt werden muss. 3. Testen mit `curl` / `openssl` / Wireshark. 4. Bei Problemen: `./scripts/compose.sh logs reverse-proxy`. @@ -29,7 +29,7 @@ Die meisten Teilnehmer arbeiten unter **Windows mit Docker Desktop + WSL**. Wich - Es wird **additiv in einer einzigen `proxy/nginx.conf`** gearbeitet: jede Challenge erweitert den Stand der vorherigen. Loesungen nicht wieder loeschen - die TLS-Challenges (10-12) bauen direkt aufeinander auf. - **Ausnahme Challenge 9** (Debugging): Diese ueberschreibt die `nginx.conf` bewusst. Vorher sichern (`cp proxy/nginx.conf proxy/nginx.conf.bak`), danach wiederherstellen. - Jede Angabe nennt einen **Ausgangszustand** (worauf baue ich auf) und einen **Zielzustand / Akzeptanz** (woran erkenne ich "fertig"). Der Done-Check ist die pruefbare Form des Zielzustands. -- Komplett zuruecksetzen geht jederzeit mit `make reset` (Container/Volumes) bzw. `make reset-hard` (zusaetzlich lokale Datei-Aenderungen verwerfen). +- Komplett zuruecksetzen geht jederzeit mit `./scripts/lab.sh reset` (Container/Volumes) bzw. `./scripts/lab.sh reset-hard` (zusaetzlich lokale Datei-Aenderungen verwerfen). --- @@ -77,7 +77,7 @@ curl http://localhost:8080/service/b # -> "Reverse Proxy Target B" **Schritte (Muss)** - Service `backend-c` in Compose einbauen. - Upstream + Route `/service/c` in Nginx anlegen. -- Deployen mit `make redeploy` (Compose-Aenderung -> Container-Neustart noetig). +- Deployen mit `./scripts/lab.sh redeploy` (Compose-Aenderung -> Container-Neustart noetig). **Zielzustand / Akzeptanz** - `/service/c` liefert Backend C. @@ -104,7 +104,7 @@ curl http://localhost:8080/service/b # -> weiterhin "Reverse Proxy Target B" **Schritte (Muss)** - Route `/demo/a` anbieten, die auf Backend A fuehrt. - Entweder per rewrite oder per eigener proxy-Route loesen. -- Deployen mit `make proxy-reload`. +- Deployen mit `./scripts/lab.sh proxy-reload`. **Zielzustand / Akzeptanz** - `/demo/a` liefert dieselbe Antwort wie `/service/a` (Backend A), obwohl der externe Pfad ein anderer ist. @@ -138,7 +138,7 @@ curl http://localhost:8080/demo/a # -> "Reverse Proxy Target A" - `Cross-Origin-Opener-Policy: same-origin` - `Cross-Origin-Resource-Policy: same-origin` - Optional (Bonus): `Content-Security-Policy` fuer statische Seiten (mit Inline-Styles bewusst beruecksichtigen) -- Deployen mit `make proxy-reload`. +- Deployen mit `./scripts/lab.sh proxy-reload`. **Fallstrick (`add_header`-Vererbung)** - Header am besten **einmal im `server {}`-Block** setzen, dann gelten sie fuer alle Locations. @@ -167,7 +167,7 @@ curl -I http://localhost:8080/ **Schritte (Muss)** - Route `/internal/status` bauen. - Nur `127.0.0.1` erlauben, alle anderen verbieten. -- Deployen mit `make proxy-reload`. +- Deployen mit `./scripts/lab.sh proxy-reload`. **Wichtiger Hinweis** - Host-Request ueber `localhost:8080` kommt aus Docker-Sicht oft **nicht** von `127.0.0.1`. @@ -198,7 +198,7 @@ curl -i http://localhost:8080/internal/status **Schritte (Muss)** - Eigenes `log_format` mit Upstream-Infos anlegen. - Access-Log auf das neue Format umstellen. -- Deployen mit `make proxy-reload`. +- Deployen mit `./scripts/lab.sh proxy-reload`. **Hinweis** - `log_format` gehoert in den `http {}`-Block (nicht in `server {}` oder `location {}`), sonst startet Nginx mit `"log_format" directive is not allowed here` nicht. `access_log` darf in `http`, `server` oder `location` stehen. @@ -232,7 +232,7 @@ curl http://localhost:8080/service/a - Zweite Instanz von Backend A (`backend-a2`) anlegen. - `upstream backend_a` auf beide Instanzen erweitern. - Mehrfach-Requests zeigen, dass beide Instanzen antworten. -- Deployen mit `make redeploy` (Compose-Aenderung). +- Deployen mit `./scripts/lab.sh redeploy` (Compose-Aenderung). **Zielzustand / Akzeptanz** - Bei mehreren Aufrufen von `/service/a` antworten **beide** Instanzen (Round-Robin), also sowohl `Target A` als auch `Target A2`. @@ -261,7 +261,7 @@ done - Mit `proxy_hide_header` mindestens einen durchgereichten Backend-Header ausblenden (z. B. `ETag`, `Last-Modified`). - Kurz erklaeren, warum weniger Fingerprinting-Infos hilfreich sind. -- Deployen mit `make proxy-reload`. +- Deployen mit `./scripts/lab.sh proxy-reload`. **Abgrenzung zu Challenge 4** - Challenge 4 setzt aktive Schutz-Header. @@ -337,7 +337,7 @@ curl http://localhost:8080/service/b # -> "Reverse Proxy Target B" - CA + Server-Zertifikat fuer `localhost` mit SAN erstellen (`--subject-alt-name="DNS:localhost,IP:127.0.0.1"`). - Nur Runtime-Cert + Key bereitstellen (nicht die ganze PKI mounten). - Proxy auf `443` erweitern (Mapping `8443:443`) und TLS in Nginx aktivieren. -- Mit `make redeploy` deployen (Compose-Aenderung -> Container-Neustart noetig). +- Mit `./scripts/lab.sh redeploy` deployen (Compose-Aenderung -> Container-Neustart noetig). - Root-CA in den System-Trust-Store importieren. **Zielzustand / Akzeptanz** @@ -376,7 +376,7 @@ curl --cacert certs/easyrsa/pki/ca.crt https://localhost:8443/service/a **Schritte (Muss)** - HTTP Requests auf HTTPS redirecten (`return 301 https://$host:8443$request_uri;`). - `/healthz` darf optional auf HTTP bleiben. -- Deployen mit `make proxy-reload` (reine `nginx.conf`-Aenderung). +- Deployen mit `./scripts/lab.sh proxy-reload` (reine `nginx.conf`-Aenderung). **Zielzustand / Akzeptanz** - HTTP-Aufrufe auf `8080` antworten mit `301` und `Location: https://localhost:8443/...`. @@ -409,7 +409,7 @@ curl -I http://localhost:8080/service/a - TLS auf 1.2/1.3 beschraenken (`ssl_protocols TLSv1.2 TLSv1.3;`). - HSTS setzen (`Strict-Transport-Security`). - Zertifikatskette pruefen und kurz erklaeren. -- Deployen mit `make proxy-reload`. +- Deployen mit `./scripts/lab.sh proxy-reload`. **Hinweis** - Im HTTP-Basissetup ist HSTS absichtlich **noch nicht** aktiv. Das ist Teil der Aufgabe. diff --git a/proxy/html/challenges.html b/proxy/html/challenges.html index 6a117f8..e07b451 100644 --- a/proxy/html/challenges.html +++ b/proxy/html/challenges.html @@ -298,7 +298,7 @@ curl http://localhost:8080/service/b # -> "Target B"
Hard 10) HTTPS von 0 (Easy-RSA)

Zertifikat fuer localhost, Port 8443:443, Root-CA importiert.

-

Wichtig: Der neue Port ist eine Compose-Aenderung → mit make redeploy deployen, nicht nur make proxy-reload.

+

Wichtig: Der neue Port ist eine Compose-Aenderung → mit ./scripts/lab.sh redeploy deployen, nicht nur ./scripts/lab.sh proxy-reload.

Warum wichtig: TLS-Grundaufbau ist Voraussetzung fuer vertrauliche und manipulationssichere Kommunikation.

Zielzustand: Aufruf liefert Backend A ohne -k (kein SAN-/Zertifikatsfehler). Zertifikat mit SAN signieren!

curl https://localhost:8443/service/a   # -> Backend A, KEIN "SSL certificate problem"
diff --git a/proxy/html/hints.html b/proxy/html/hints.html index ff9a486..1cba4d1 100644 --- a/proxy/html/hints.html +++ b/proxy/html/hints.html @@ -149,14 +149,14 @@

Neu deployen

-
make redeploy
-make proxy-reload
+
./scripts/lab.sh redeploy
+./scripts/lab.sh proxy-reload

PowerShell: ./scripts/workshop.ps1 -Action redeploy

Reset

-
make reset
-make bootstrap
+
./scripts/lab.sh reset
+./scripts/lab.sh bootstrap

PowerShell: ./scripts/workshop.ps1 -Action reset

diff --git a/proxy/html/solutions.html b/proxy/html/solutions.html index 58816ef..da6bcbb 100644 --- a/proxy/html/solutions.html +++ b/proxy/html/solutions.html @@ -165,7 +165,7 @@

Solutions Board (detailliert)

Hier stehen absichtlich konkrete Musterloesungen mit Snippets, Checks und typischen Stolperfallen.

-

Workflow: Nach jeder Konfig-Aenderung mindestens make proxy-reload, bei Compose-Aenderungen make redeploy.

+

Workflow: Nach jeder Konfig-Aenderung mindestens ./scripts/lab.sh proxy-reload, bei Compose-Aenderungen ./scripts/lab.sh redeploy.

diff --git a/scripts/bootstrap-unix.sh b/scripts/bootstrap-unix.sh deleted file mode 100755 index 126ae9a..0000000 --- a/scripts/bootstrap-unix.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_ROOT="$(cd -- "$SCRIPT_DIR/.." && pwd)" - -cd "$PROJECT_ROOT" - -if ! command -v docker >/dev/null 2>&1; then - echo "[error] docker nicht gefunden. Bitte Docker installieren (Linux/macOS) oder Docker Desktop + WSL Integration aktivieren." - exit 1 -fi - -if ! docker info >/dev/null 2>&1; then - echo "[error] Docker Daemon nicht erreichbar. Bitte Docker starten." - exit 1 -fi - -if ! "$SCRIPT_DIR/compose.sh" version >/dev/null 2>&1; then - echo "[error] Weder docker compose noch docker-compose verfuegbar." - exit 1 -fi - -if [[ ! -f .env ]]; then - cp .env.example .env - echo "[ok] .env aus .env.example erstellt" -else - echo "[skip] .env existiert bereits" -fi - -"$SCRIPT_DIR/compose.sh" up -d --build - -echo -echo "[ok] Workshop-Stack laeuft" -echo " Landing Page: http://localhost:8080" -echo " Test (backend-a): curl http://localhost:8080/service/a" diff --git a/scripts/bootstrap-wsl.sh b/scripts/bootstrap-wsl.sh deleted file mode 100755 index 50f3674..0000000 --- a/scripts/bootstrap-wsl.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" -echo "[warn] scripts/bootstrap-wsl.sh ist deprecated. Nutze bitte scripts/bootstrap.sh" -"$SCRIPT_DIR/bootstrap-unix.sh" diff --git a/scripts/bootstrap.sh b/scripts/bootstrap.sh index 0dda692..126ae9a 100755 --- a/scripts/bootstrap.sh +++ b/scripts/bootstrap.sh @@ -2,4 +2,35 @@ set -euo pipefail SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" -"$SCRIPT_DIR/bootstrap-unix.sh" +PROJECT_ROOT="$(cd -- "$SCRIPT_DIR/.." && pwd)" + +cd "$PROJECT_ROOT" + +if ! command -v docker >/dev/null 2>&1; then + echo "[error] docker nicht gefunden. Bitte Docker installieren (Linux/macOS) oder Docker Desktop + WSL Integration aktivieren." + exit 1 +fi + +if ! docker info >/dev/null 2>&1; then + echo "[error] Docker Daemon nicht erreichbar. Bitte Docker starten." + exit 1 +fi + +if ! "$SCRIPT_DIR/compose.sh" version >/dev/null 2>&1; then + echo "[error] Weder docker compose noch docker-compose verfuegbar." + exit 1 +fi + +if [[ ! -f .env ]]; then + cp .env.example .env + echo "[ok] .env aus .env.example erstellt" +else + echo "[skip] .env existiert bereits" +fi + +"$SCRIPT_DIR/compose.sh" up -d --build + +echo +echo "[ok] Workshop-Stack laeuft" +echo " Landing Page: http://localhost:8080" +echo " Test (backend-a): curl http://localhost:8080/service/a" diff --git a/scripts/lab.sh b/scripts/lab.sh new file mode 100755 index 0000000..9d0d284 --- /dev/null +++ b/scripts/lab.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Zentrale Steuer-Oberflaeche fuer den Workshop-Stack. +# Eine einzige Quelle der Wahrheit fuer alle Aktionen - der PowerShell-Wrapper +# (scripts/workshop.ps1) ruft genau dieses Skript in WSL auf. + +SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" + +usage() { + echo "usage: lab.sh {bootstrap|up|redeploy|proxy-reload|down|logs|reset|reset-hard|reset-origin}" +} + +case "${1:-}" in + bootstrap) "$SCRIPT_DIR/bootstrap.sh" ;; + up) "$SCRIPT_DIR/compose.sh" up -d --build ;; + redeploy) "$SCRIPT_DIR/compose.sh" up -d --build --remove-orphans + "$SCRIPT_DIR/compose.sh" restart reverse-proxy ;; + proxy-reload) "$SCRIPT_DIR/compose.sh" restart reverse-proxy ;; + down) "$SCRIPT_DIR/compose.sh" down ;; + logs) "$SCRIPT_DIR/compose.sh" logs -f ;; + reset) "$SCRIPT_DIR/reset-lab.sh" ;; + reset-hard) "$SCRIPT_DIR/reset-lab.sh" --hard ;; + reset-origin) "$SCRIPT_DIR/reset-lab.sh" --hard-origin ;; + -h|--help|"") usage ;; + *) echo "[error] unbekannte Aktion: $1"; usage; exit 2 ;; +esac diff --git a/scripts/workshop.ps1 b/scripts/workshop.ps1 index 330df41..908318f 100644 --- a/scripts/workshop.ps1 +++ b/scripts/workshop.ps1 @@ -17,17 +17,7 @@ if (-not $repoWslPath) { exit 1 } -switch ($Action) { - "bootstrap" { $linuxCommand = "./scripts/bootstrap.sh" } - "up" { $linuxCommand = "./scripts/compose.sh up -d --build" } - "redeploy" { $linuxCommand = "./scripts/compose.sh up -d --build --remove-orphans && ./scripts/compose.sh restart reverse-proxy" } - "proxy-reload" { $linuxCommand = "./scripts/compose.sh restart reverse-proxy" } - "down" { $linuxCommand = "./scripts/compose.sh down" } - "logs" { $linuxCommand = "./scripts/compose.sh logs -f" } - "reset" { $linuxCommand = "./scripts/reset-lab.sh" } - "reset-hard" { $linuxCommand = "./scripts/reset-lab.sh --hard" } - "reset-origin" { $linuxCommand = "./scripts/reset-lab.sh --hard-origin" } -} +$linuxCommand = "./scripts/lab.sh $Action" $wslArgs = @() if ($Distro) {