diff --git a/deploy/ports.tsv b/deploy/ports.tsv index 49176f32..788bb9b7 100644 --- a/deploy/ports.tsv +++ b/deploy/ports.tsv @@ -1,8 +1,13 @@ # module first last (Standard-Ports der Binaries, Betriebsstufe 1: alle Module auf einem Host) +# Ein Modul darf mehrere Zeilen haben; Bereiche verschiedener Module duerfen sich nicht ueberschneiden. +# core/archive entsprechen den auf dem Referenz-Host (192.168.1.131) real belegten Ports (Stand 2026-09-18). core 8080 8089 -archive 8090 8099 -dms 8100 8199 -mail 8200 8299 -workflow 8300 8399 -ai 8400 8499 -connect 8500 8599 +core 8093 8094 +core 8098 8109 +archive 8090 8092 +archive 8095 8097 +dms 8600 8699 +mail 8700 8799 +workflow 8800 8899 +ai 8900 8999 +connect 9500 9599 diff --git a/dms/README.md b/dms/README.md index 4c74c800..8ec2fae7 100644 --- a/dms/README.md +++ b/dms/README.md @@ -19,10 +19,10 @@ make install # baut App und Worker make run # startet beide (Strg+C beendet beide) ``` -App läuft danach auf `:8100` (überschreibbar über +App läuft danach auf `:8600` (überschreibbar über `NEXARCH_DMS_APP_LISTEN_ADDR`), `GET /healthz` liefert den Status. Der Worker -liefert Metriken auf `:8101` (`NEXARCH_DMS_WORKER_METRICS_ADDR`). Portbereich des -DMS laut `deploy/ports.tsv`: 8100–8199; Prüfung: `scripts/check-port-defaults.sh`. +liefert Metriken auf `:8601` (`NEXARCH_DMS_WORKER_METRICS_ADDR`). Portbereich des +DMS laut `deploy/ports.tsv`: 8600–8699; Prüfung: `scripts/check-port-defaults.sh`. ## Struktur diff --git a/dms/cmd/app/main.go b/dms/cmd/app/main.go index 90e37c4a..bfde1033 100644 --- a/dms/cmd/app/main.go +++ b/dms/cmd/app/main.go @@ -26,7 +26,7 @@ import ( func main() { addr := os.Getenv("NEXARCH_DMS_APP_LISTEN_ADDR") if addr == "" { - addr = ":8100" + addr = ":8600" } logger := logging.NewDefault() diff --git a/dms/cmd/worker/main.go b/dms/cmd/worker/main.go index 047b840d..26835228 100644 --- a/dms/cmd/worker/main.go +++ b/dms/cmd/worker/main.go @@ -34,7 +34,7 @@ func main() { metricsAddr := os.Getenv("NEXARCH_DMS_WORKER_METRICS_ADDR") if metricsAddr == "" { - metricsAddr = ":8101" + metricsAddr = ":8601" } go func() { if err := http.ListenAndServe(metricsAddr, metricsReg.Handler()); err != nil { diff --git a/dms/docs/FDN-01-PRUEFPROTOKOLL.md b/dms/docs/FDN-01-PRUEFPROTOKOLL.md index 6fa61b30..feccff79 100644 --- a/dms/docs/FDN-01-PRUEFPROTOKOLL.md +++ b/dms/docs/FDN-01-PRUEFPROTOKOLL.md @@ -6,7 +6,7 @@ Session-Verlauf: DMS als Unterordner statt eigenes Gitea-Repo). ## Struktur -- `cmd/app` — Anfrage-Dienst (HTTP, Port 8100 per Default) +- `cmd/app` — Anfrage-Dienst (HTTP, Port 8600 per Default) - `cmd/worker` — Hintergrund-Dienst (getrennter Prozess) - `internal/shared` — gemeinsam genutzter Code - `go.mod` — eigenes Modul `gitea.perlbach24.de/scripte/nexarch/dms`, diff --git a/dms/docs/FDN-12-PRUEFPROTOKOLL.md b/dms/docs/FDN-12-PRUEFPROTOKOLL.md index 089ee045..e7717a84 100644 --- a/dms/docs/FDN-12-PRUEFPROTOKOLL.md +++ b/dms/docs/FDN-12-PRUEFPROTOKOLL.md @@ -4,12 +4,14 @@ Stand: 2026-09-18. Lokal ausgeführt (reines Bash, kein Testhost nötig). Basis: ## Umsetzung -- `deploy/ports.tsv`: Portbereich je Modul (core 8080–8089, archive 8090–8099, dms 8100–8199, mail 8200–8299, - workflow 8300–8399, ai 8400–8499, connect 8500–8599). +- `deploy/ports.tsv`: Portbereiche je Modul (mehrere Zeilen je Modul erlaubt; Bereiche verschiedener Module dürfen sich + nicht überschneiden, das prüft das Skript). core/archive spiegeln die auf dem Referenz-Host 192.168.1.131 real + belegten Ports (core 8080–8089, 8093–8094, 8098–8109; archive 8090–8092, 8095–8097); dms 8600–8699, mail 8700–8799, + workflow 8800–8899, ai 8900–8999, connect 9500–9599. - `scripts/check-port-defaults.sh [ROOT]`: liest alle `":NNNN"`-Literale aus `cmd/**/main.go` (Wurzel-`cmd/` = core, sonst `/cmd/`), meldet Ports außerhalb des Modulbereichs, doppelt vergebene Ports über Dateien hinweg und Module ohne Registereintrag. Exit 1 bei jedem Befund. -- DMS-Defaults verschoben: App `:8090` → `:8100`, Worker-Metriken `:8091` → `:8101`; `dms/README.md` und +- DMS-Defaults verschoben: App `:8090` → `:8600`, Worker-Metriken `:8091` → `:8601`; `dms/README.md` und FDN-01-Protokoll angepasst. - Archive-Defaults bleiben unverändert (eigenes Board). @@ -17,7 +19,7 @@ Stand: 2026-09-18. Lokal ausgeführt (reines Bash, kein Testhost nötig). Basis: | # | Prüfung | Ergebnis | |---|---------|----------| -| 1 | Skript gegen echten Baum aus Archive-Quellen (Branch `ana-01`), Core-`cmd/` und DMS-Stand vor der Änderung | meldet `dms/cmd/app` 8090 doppelt (scrub-metrics) und `dms/cmd/worker` 8091 doppelt (restoretest-metrics), je auch außerhalb 8100–8199; Exit 1 | +| 1 | Skript gegen echten Baum aus Archive-Quellen (Branch `ana-01`), Core-`cmd/` und DMS-Stand vor der Änderung | meldet `dms/cmd/app` 8090 doppelt (scrub-metrics) und `dms/cmd/worker` 8091 doppelt (restoretest-metrics), je auch außerhalb des DMS-Bereichs; Exit 1 | | 2 | Skript nach der Änderung gegen denselben Baum mit neuem DMS-Stand; sowie gegen den Repo-Stand | `port-defaults ok`, Exit 0 | | 3 | `scripts/check-port-defaults_test.sh` mit synthetischem Baum: sauberer Baum besteht, Duplikat, Bereichsverletzung und unbekanntes Modul werden erkannt | bestanden | @@ -30,3 +32,11 @@ Stand: 2026-09-18. Lokal ausgeführt (reines Bash, kein Testhost nötig). Basis: erst auf dem zusammengeführten Stand ab. - Folgekacheln (bewusst nicht Teil von FDN-12): Datenbank/Schema und Migrationstabelle je Modul, Routenpräfix je Modul, Preflight im Installationsskript. + +## Korrektur (2026-09-18, gefunden durch FDN-15-Preflight auf 192.168.1.131) + +Die erste Fassung wies DMS 8100–8199 zu, abgeleitet nur aus den Code-Defaults. Auf dem Referenz-Host laufen aber +Core-Dienste (per Umgebungsdatei konfiguriert) auf 8093, 8094, 8098–8102 (u. a. `rbac-admin-api` :8100, +`notifyprefs-api` :8101, `kek-api` :8102). Damit hätte der DMS-Default kollidiert. Register korrigiert (DMS 8600–8699, +Core/Archive-Bereiche nach der realen Belegung), Überschneidungsprüfung zwischen Modulen im Skript ergänzt. Nicht im +Register: Entwicklungs-/Fake-Dienste auf 8293–8296 (Bereich 8200–8299 bleibt bewusst frei). diff --git a/scripts/check-port-defaults.sh b/scripts/check-port-defaults.sh index 509251c6..48a9a673 100755 --- a/scripts/check-port-defaults.sh +++ b/scripts/check-port-defaults.sh @@ -6,28 +6,52 @@ root="${1:-.}" registry="$root/deploy/ports.tsv" [ -f "$registry" ] || { echo "register fehlt: $registry" >&2; exit 2; } -declare -A first last owner +declare -A owner +mods=(); los=(); his=() while IFS=$'\t' read -r mod lo hi; do case "$mod" in ''|'#'*) continue ;; esac - first[$mod]=$lo - last[$mod]=$hi + mods+=("$mod"); los+=("$lo"); his+=("$hi") done < "$registry" fail=0 +for i in "${!mods[@]}"; do + for j in "${!mods[@]}"; do + [ "$i" -lt "$j" ] && [ "${mods[$i]}" != "${mods[$j]}" ] || continue + if [ "${los[$i]}" -le "${his[$j]}" ] && [ "${los[$j]}" -le "${his[$i]}" ]; then + echo "FEHLER register: ${mods[$i]} ${los[$i]}-${his[$i]} ueberschneidet ${mods[$j]} ${los[$j]}-${his[$j]}" >&2 + fail=1 + fi + done +done + +in_range() { + local i + for i in "${!mods[@]}"; do + [ "${mods[$i]}" = "$1" ] && [ "$2" -ge "${los[$i]}" ] && [ "$2" -le "${his[$i]}" ] && return 0 + done + return 1 +} + +module_known() { + local m + for m in "${mods[@]}"; do [ "$m" = "$1" ] && return 0; done + return 1 +} + while IFS= read -r file; do rel="${file#"$root"/}" case "$rel" in cmd/*) mod=core ;; */cmd/*) mod="${rel%%/*}" ;; esac - if [ -z "${first[$mod]:-}" ]; then + if ! module_known "$mod"; then echo "FEHLER $rel: modul \"$mod\" nicht im register" >&2 fail=1 continue fi for port in $(grep -oE '":[0-9]{2,5}"' "$file" | tr -d '":' | sort -u); do - if [ "$port" -lt "${first[$mod]}" ] || [ "$port" -gt "${last[$mod]}" ]; then - echo "FEHLER $rel: port $port ausserhalb ${first[$mod]}-${last[$mod]} ($mod)" >&2 + if ! in_range "$mod" "$port"; then + echo "FEHLER $rel: port $port ausserhalb der Bereiche von $mod (deploy/ports.tsv)" >&2 fail=1 fi if [ -n "${owner[$port]:-}" ] && [ "${owner[$port]}" != "$rel" ]; then diff --git a/scripts/check-port-defaults_test.sh b/scripts/check-port-defaults_test.sh index 267f6833..c38506c2 100755 --- a/scripts/check-port-defaults_test.sh +++ b/scripts/check-port-defaults_test.sh @@ -17,20 +17,30 @@ put() { mkdir -p "$(dirname "$1")"; printf 'package main\nvar addr = "%s"\n' "$2 expect_fail() { if "$check" "$1" >/dev/null 2>"$tmp/err"; then echo "FAIL: $2 nicht erkannt" >&2; exit 1; fi; grep -q "$3" "$tmp/err" || { echo "FAIL: $2: meldung fehlt ($3)" >&2; cat "$tmp/err" >&2; exit 1; }; } ok="$(mk ok)" -put "$ok/dms/cmd/app/main.go" ":8100" -put "$ok/dms/cmd/worker/main.go" ":8101" +put "$ok/dms/cmd/app/main.go" ":8600" +put "$ok/dms/cmd/worker/main.go" ":8601" put "$ok/archive/cmd/scrub-metrics/main.go" ":8090" put "$ok/cmd/auditlog-devserver/main.go" ":8083" "$check" "$ok" >/dev/null || { echo "FAIL: sauberer baum abgelehnt" >&2; exit 1; } dup="$(mk dup)" -put "$dup/dms/cmd/app/main.go" ":8100" -put "$dup/dms/cmd/worker/main.go" ":8100" +put "$dup/dms/cmd/app/main.go" ":8600" +put "$dup/dms/cmd/worker/main.go" ":8600" expect_fail "$dup" "duplikat" "doppelt vergeben" range="$(mk range)" put "$range/dms/cmd/app/main.go" ":8090" -expect_fail "$range" "bereichsverletzung" "ausserhalb 8100-8199" +expect_fail "$range" "bereichsverletzung" "ausserhalb der Bereiche von dms" + +overlap="$(mk overlap)" +printf 'dms\t8600\t8699\nmail\t8650\t8750\n' >> "$overlap/deploy/ports.tsv" +expect_fail "$overlap" "registerueberschneidung" "ueberschneidet" + +# Ein Modul mit mehreren Bereichen: beide Bereiche gueltig. +multi="$(mk multi)" +put "$multi/cmd/a/main.go" ":8083" +put "$multi/cmd/b/main.go" ":8093" +"$check" "$multi" >/dev/null || { echo "FAIL: mehrere bereiche je modul abgelehnt" >&2; exit 1; } unk="$(mk unk)" put "$unk/foo/cmd/app/main.go" ":9000"