feat(betrieb): native Installation, Proxmox-Einzeiler und Abnahme
Prüfung / pruefung (push) Canceled after 0s
Prüfung / pruefung (pull_request) Canceled after 0s
Prüfung / e2e (push) Canceled after 0s
Prüfung / e2e (pull_request) Canceled after 0s

Zwei Wege in den Betrieb, beide so weit gefahren, wie es hier moeglich war.

deploy/install.sh richtet Debian 13 in neun Schritten ein: PostgreSQL 17 hoert
nur am Unix-Socket, der Dienstnutzer hat kein Login, die Geheimnisse entstehen
im Zielsystem und liegen 0600 bei root. Die Umgebungsdatei wird nie
ueberschrieben -- auch nicht beim Aktualisieren, sonst enden alle Sitzungen und
die verschluesselten Bind-Passwoerter waeren unlesbar.

deploy/proxmox/laufzettel.sh legt den Container an und ruft install.sh darin
auf. Der pct-Teil ist ungetestet, weil kein PVE-Host zur Verfuegung stand; die
Gegenprobe steht als Pruefliste in docs/betrieb/proxmox.md, das Folge-Issue ist
#024.

Die Abnahme gegen alle 61 Kriterien hat drei Zusagen ohne Deckung gefunden, alle
behoben: der Healthcheck des Webdienstes konnte nie bestehen (busybox loest
localhost nach ::1 auf, Next lauscht nur auf IPv4), die CI-Pipeline konnte in
keinem Job gruen werden (kein LDAP-Dienst, kein gestarteter Server, kein
shellcheck), und der README nannte fuer die Entwicklungsdatenbank den falschen
Port.

Closes #19
This commit is contained in:
Florian Wilde
2026-09-26 15:53:01 +02:00
parent fbbb634e56
commit bf1e52cf73
20 changed files with 3663 additions and 103 deletions
+47 -5
View File
@@ -44,6 +44,21 @@ jobs:
- name: Prisma-Client erzeugen
run: pnpm exec prisma generate
# Der Verzeichnis-Abgleich wird gegen ein echtes OpenLDAP geprueft. Ohne
# diesen Container bricht `pnpm test` in CI ab (tests/fixtures/ldap gibt in
# CI absichtlich keinen stillen Uebersprung) -- gefunden bei der Abnahme zu
# #019. Kein services:-Block, weil der Container die Fixture-LDIFs aus dem
# Arbeitsbaum einhaengt und Dienste vor dem Checkout starten.
#
# Bedingung an den Runner: die Schritte muessen den von compose
# veroeffentlichten Port 127.0.0.1:1389 selbst erreichen. Auf einem
# act_runner, der die Schritte in einem Container ausfuehrt und nur den
# Docker-Socket durchreicht, liegt der Port auf dem Host -- dort braucht es
# `--network host` fuer den Job oder einen Runner im Host-Modus. Ungeprueft:
# fuer dieses Repo ist noch kein Runner registriert.
- name: LDAP-Testverzeichnis starten
run: docker compose -f docker-compose.test.yml up -d --wait ldap
- name: Code-Stil prüfen
run: pnpm lint
@@ -62,13 +77,17 @@ jobs:
- name: Dokumentation prüfen
run: pnpm pruefe:doku
# Im Container und nicht per apt: so laeuft in CI genau die Fassung, die
# auch lokal geprueft wird, und der Runner braucht shellcheck nicht selbst
# mitzubringen.
- name: Shell-Skripte prüfen
run: |
if compgen -G "deploy/*.sh" > /dev/null || compgen -G "deploy/proxmox/*.sh" > /dev/null; then
shellcheck --severity=warning deploy/*.sh deploy/proxmox/*.sh
else
echo "Noch keine Shell-Skripte vorhanden (kommen mit #019)."
fi
docker run --rm -v "$PWD:/mnt:ro" koalaman/shellcheck:stable \
--severity=warning /mnt/deploy/install.sh /mnt/deploy/proxmox/laufzettel.sh
- name: LDAP-Testverzeichnis stoppen
if: always()
run: docker compose -f docker-compose.test.yml down -v
e2e:
runs-on: ubuntu-latest
@@ -116,9 +135,32 @@ jobs:
- name: Bauen
run: pnpm build
# Playwright bringt keinen Server mit (kein webServer in der Config, damit
# lokal immer gegen einen bewusst gebauten Stand geprueft wird). In CI muss
# er deshalb hier starten, sonst bricht global-setup mit „Unter
# http://127.0.0.1:3000 antwortet keine Anwendung“ ab -- gefunden bei der
# Abnahme zu #019.
- name: Gebauten Stand starten
run: |
pnpm start &
echo $! > /tmp/laufzettel.pid
for i in $(seq 1 60); do
if curl -fsS http://127.0.0.1:3000/api/gesundheit > /dev/null; then
echo "Anwendung antwortet nach ${i}s."
exit 0
fi
sleep 1
done
echo "Die Anwendung ist nicht hochgekommen." >&2
exit 1
- name: Ende-zu-Ende-Tests
run: pnpm exec playwright test
- name: Stand beenden
if: always()
run: kill "$(cat /tmp/laufzettel.pid)" || true
- uses: actions/upload-artifact@v4
if: failure()
with: