TEKO Schweizerische FachschuleEAI IntegrationslaborDocker · Setup, Tests & Betrieb
Docker-TheorieLive-Labor

Reproduzierbare Anleitung

Aufsetzen. Prüfen.
Kaputtmachen. Verstehen.

Diese Anleitung startet Kurswebsite, Lern-API und Orthanc als einen Compose-Stack. Sie enthält Voraussetzungen, erwartete Ergebnisse, Healthchecks, automatisierte Tests, Logs, Stoppen und einen ausdrücklich markierten Reset.

Linux · macOS · WSL2Docker Compose v2ca. 10–20 Minutenkeine echten Daten
0 · Überblick

Nur ein Port verlässt den Stack

Docker-Compose-Architektur des TEKO-LaborsBrowser greift über Port 3190 auf course-web zu. Der Webcontainer proxyiert ausgewählte Laborpfade an die Lern-API. Diese erreicht Orthanc nur im internen PACS-Netz. Ein einmaliger Seeder erzeugt synthetische Studien.Browserlocalhost:3190course-webstatische Seitenselektiver API-Proxyeinziger Host-Portorthanc-labSync + Async APIQueue · Retry · DLQnon-root · read-onlyOrthancDICOM REST internsynthetische Studienkein Host-Portorthanc-seed (einmalig)3 synthetische Studienpacs-internal · kein externer Netzwerkzugriff
Der Browser erreicht Orthanc nie direkt. Das Gateway erlaubt nur Lern-API-Pfade; DICOM-Port, Orthanc-UI, Python-Quellcode und Tests bleiben intern beziehungsweise außerhalb des Images.
1 · Voraussetzungen

Versionen und Ressourcen prüfen

Benötigt werden Docker Engine oder Docker Desktop mit Compose v2, das entpackte Projekt, curl, Python 3 für die Testskripte und OpenSSL zur lokalen Secret-Erzeugung. Für den vollständigen Orthanc-Stack sollten ungefähr 2 GB freier Arbeitsspeicher und mehrere GB freier Plattenspeicher vorhanden sein.

docker version
docker compose version
python3 --version
curl --version
openssl version
docker system df
df -h .
Erwartung: Alle Befehle enden mit Exitcode 0; docker compose version zeigt v2.x. Bei knappem Speicher nicht blind docker system prune ausführen – zuerst klären, welche Images und Volumes noch gebraucht werden.
2 · Konfiguration

Internes Orthanc-Passwort erzeugen

Das Passwort liegt nur in der nicht versionierten Datei .env und wird sowohl für Orthanc als auch für den internen Adapter verwendet. Der Browser erhält es nicht. Das Skript überschreibt keine vorhandene Datei.

cd teko-integrationslabor
chmod +x scripts/init-env.sh scripts/smoke-test.sh
./scripts/init-env.sh
test -s .env
docker compose config --quiet
Nicht tun: .env in Git committen, per Screenshot teilen oder unter den Webroot kopieren. docker compose config ohne --quiet kann aufgelöste Werte anzeigen.
3 · Build & Start

Images bauen und auf Health warten

docker compose build --pull
docker compose up -d --wait
docker compose ps

Beim ersten Start wird das Orthanc-Image geladen. Der Ablauf ist absichtlich gestaffelt: Orthanc wird gesund, der einmalige Seeder legt drei synthetische DICOM-Studien an, die Lern-API startet und prüft Orthanc, danach wird das Web-Gateway gesund. --wait endet ungleich 0, wenn ein Healthcheck nicht rechtzeitig grün wird.

ServiceErwarteter ZustandÖffentlich?
course-webUp (healthy), 127.0.0.1:3190→8080nur über lokalen Port/Host-Reverse-Proxy
orthanc-labUp (healthy), kein Hostportnur ausgewählte Routen via Gateway
orthancUp (healthy), kein Hostportnein
orthanc-seedExited (0)nein; einmaliger Initialisierer
4 · Manuelle Smoke-Tests

Jede Schicht gezielt prüfen

# Website-Gateway
curl -i http://localhost:3190/healthz

# Lern-API lebt unabhängig von Orthanc
curl -s http://localhost:3190/lab/healthz

# Readiness prüft den internen Orthanc-Aufruf
curl -s http://localhost:3190/lab/api/v1/pacs/status

# Nur synthetische, öffentliche Referenzen
curl -s http://localhost:3190/lab/api/v1/demo-studies
Erwartung: Beide Health-Endpunkte liefern status: ok. Der PACS-Status nennt Orthanc und eine Version, aber keine Credentials oder interne URL. Die Studienliste enthält keine StudyInstanceUID und keine Patientendaten.
5 · Automatisierte Tests

Unit, HTTP, Docker-E2E und Link-Crawl

# API-/Orthanc-Integrationstests mit Fake-Orthanc
PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -v

# Vollständiger laufender Stack: Seiten, Health, Seed, Async,
# Idempotenz, Datenschutz-Negativtest und private Pfade
./scripts/smoke-test.sh

# Alle internen HTML-Links, Assets und Fragmente
python3 tests/site_crawl.py http://localhost:3190

Der Smoke-Test startet keinen neuen Stack, sondern prüft den bereits laufenden. Für die öffentliche Installation wird exakt dasselbe Skript mit anderer Basis-URL ausgeführt:

BASE_URL=https://teko.algorithma.app ./scripts/smoke-test.sh
python3 tests/site_crawl.py https://teko.algorithma.app
Was der Test beweist: Mindestens eine gesäte Studie wird intern über /tools/find gefunden; Wiederholung liefert denselben Job; ein Patientendatenfeld wird abgelehnt; Builddateien, .env, Python-Quellcode, Tests und Orthanc-Pfade antworten mit 404.
6 · Störungslabor

Fehler kontrolliert beobachten

Temporärer Fehler

Im Live-Labor „Temporärer Orthanc-Fehler“ wählen. Erwartet: retrying, steigender Versuchszähler, danach completed.

Fachfehler

„Fachfehler“ wählen. Erwartet: ohne sinnlose technische Retries nach dead_letter; Eintrag ist über die DLQ-Route sichtbar.

Echter Dienststopp

Lokal Orthanc stoppen, Job senden und später starten. Readiness wird 503; API-Liveness bleibt 200. Nach Retry-Limit endet der Job nachvollziehbar.

docker compose stop orthanc
curl -i http://localhost:3190/lab/healthz
curl -i http://localhost:3190/lab/readyz
docker compose start orthanc
docker compose ps
Grenze: Ein absichtlich gestoppter Orthanc kann aktive Laborjobs in die DLQ schicken. Nur in einer eigenen lokalen Übungsumgebung durchführen, nicht mitten in einer gemeinsamen Unterrichtsdemonstration.
7 · Debugging

Zuerst Zustand, dann Logs, dann Konfiguration

docker compose ps
docker compose logs --tail=100 course-web
docker compose logs --tail=100 orthanc-lab
docker compose logs --tail=100 orthanc
docker compose logs orthanc-seed
docker compose config --quiet
ss -ltn | grep 3190
SymptomWahrscheinliche UrsachePrüfung
Compose verlangt Passwort.env fehlt./scripts/init-env.sh
3190 already allocatedHostport belegtss -ltnp | grep 3190
API 200, Readiness 503Orthanc nicht bereit/FehlauthentisierungOrthanc- und Lab-Logs vergleichen
Seeder Exit 1Create-DICOM oder Credential fehlgeschlagendocker compose logs orthanc-seed
Website 502Lern-API nicht gesunddocker compose ps und Gatewaylog
Job matchCount 0synthetische Studie fehltSeeder erneut ausführen
8 · Stoppen & Reset

Erhalten oder bewusst löschen

Stoppen, Daten behalten

docker compose down

Container und Netze werden entfernt; das Orthanc-Volume bleibt. Beim nächsten up sind synthetische Studien weiterhin vorhanden.

Neu starten

docker compose up -d --wait

Der Seeder ist idempotent. Bereits vorhandene synthetische Instanzen werden nicht fachlich verdoppelt.

Destruktiver Reset – löscht das gesamte Orthanc-Lab-Volume:
docker compose down -v
Nur ausführen, wenn die synthetischen Labordaten vollständig verworfen werden sollen. Docker-Volumes anderer Projekte werden nicht berührt.
9 · Referenzpfade

Lokal und öffentlich gleich aufgebaut

ZweckLokalÖffentlich
Kurshttp://localhost:3190/teko.algorithma.app/
Async-Lektion/lessons/03-async.html/lessons/03-async.html
Fallstudie/cases/orthanc-spital.html/cases/orthanc-spital.html
Live-Labor/lab/orthanc.html/lab/orthanc.html
Liveness/lab/healthz/lab/healthz
Orthanc-Status/lab/api/v1/pacs/status/lab/api/v1/pacs/status
OpenAPI/lab/openapi.json/lab/openapi.json
i
Logic Apps, Paperless/DMS und externe AI
Diese Komponenten bleiben im Kurs als optionale Cloud-/Fremdsystem-Labore dokumentiert. Der mitgelieferte Stack benötigt dafür keine Zugangsdaten und behauptet keine erfolgreiche Live-Prüfung gegen fremde Konten.