Merge FDN-12 (portbereiche korrigiert) in FDN-14

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
patrickandClaude Sonnet 5 committed 2026-09-18 22:05:45 +02:00
commit 37825c18ff
8 files changed
+76 -27

No files matched your search

+11 -6
View File
@@ -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
1 # module first last (Standard-Ports der Binaries, Betriebsstufe 1: alle Module auf einem Host)
2 # Ein Modul darf mehrere Zeilen haben; Bereiche verschiedener Module duerfen sich nicht ueberschneiden.
3 # core/archive entsprechen den auf dem Referenz-Host (192.168.1.131) real belegten Ports (Stand 2026-09-18).
4 core 8080 8089
5 archive core 8090 8093 8099 8094
6 dms core 8100 8098 8199 8109
7 mail archive 8200 8090 8299 8092
8 workflow archive 8300 8095 8399 8097
9 ai dms 8400 8600 8499 8699
10 connect mail 8500 8700 8599 8799
11 workflow 8800 8899
12 ai 8900 8999
13 connect 9500 9599
+3 -3
View File
@@ -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`.
Fachliche Routen (z. B. `POST /retention/destroy-callback`) liegen unter dem Präfix
`/api/dms/v1` (`NEXARCH_DMS_APP_ROUTE_PREFIX`, Register `deploy/routes.tsv`, Prüfung
+1 -1
View File
@@ -27,7 +27,7 @@ import (
func main() {
addr := os.Getenv("NEXARCH_DMS_APP_LISTEN_ADDR")
if addr == "" {
addr = ":8100"
addr = ":8600"
}
logger := logging.NewDefault()
+1 -1
View File
@@ -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 {
+1 -1
View File
@@ -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`,
+14 -4
View File
@@ -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 `<modul>/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).
+30 -6
View File
@@ -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
+15 -5
View File
@@ -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"