- Python 97.1%
- Shell 1.2%
- Dockerfile 0.7%
- Go Template 0.5%
- PowerShell 0.4%
- Other 0.1%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Ohne konfigurierten SMTP-Provider scheitert in Zitadel jede Zustellung mit "Errors.SMTPConfig.NotFound". Der Registrierungsfluss bricht damit an der Stelle ab, an der der Bestaetigungscode verschickt werden soll - und zwar unsichtbar: im Browser sieht es nach Erfolg aus, der Fehler steht nur im Log des Brokers. Auffaellig wird es erst beim zweiten Benutzer, weil der erste Administrator bei der Instanzeinrichtung ohne Mailversand entsteht. Bewusst ein Auffangserver und kein echter Relay: In der Entwicklung soll keine Nachricht nach draussen gehen. Ein Tippfehler in einer Testadresse schickte sonst Zugangscodes an fremde Postfaecher. Der SMTP-Port wird deshalb auch nicht veroeffentlicht, nur die Weboberflaeche. R17 haelt fest, dass die Zustellung ueber einen echten Versanddienst bislang nicht nachgewiesen ist: Zitadel uebergibt fehlerfrei an Mailjet, failed_events2 bleibt leer - es kommt trotzdem bei keinem Empfaenger etwas an. Die Ursache liegt ausserhalb der Plattform. Blockiert nichts vor Sprint 7, wo der Einladungsfluss darauf aufbaut, ist aber vor dem Produktivbetrieb zwingend zu klaeren. |
||
| .github/workflows | ||
| ai-service | ||
| backend | ||
| database | ||
| docs | ||
| frontend-streamlit | ||
| frontend-web | ||
| infrastructure | ||
| mobile | ||
| scripts | ||
| shared/openapi | ||
| .editorconfig | ||
| .env.example | ||
| .gitattributes | ||
| .gitignore | ||
| .pre-commit-config.yaml | ||
| LICENSE | ||
| README.md | ||
Versicherungsplattform
Mandantenfähige, White-Label-fähige Plattform für Versicherungsmakler. Alle Clients (Backoffice, Maklerportal, Kundenportal, Mobile App) konsumieren dieselbe REST-API; Fachlogik existiert ausschließlich im Backend.
Aktueller Stand: Sprint 0 — technisches Fundament. Fachliche Module folgen ab Sprint 1.
Repositorystruktur
| Verzeichnis | Inhalt | Stand |
|---|---|---|
backend/ |
FastAPI, SQLAlchemy 2, Alembic — Modular Monolith | Sprint 0 |
ai-service/ |
eigenständiger KI-Dienst (OCR, RAG, Analyse) | ab Sprint 6 |
frontend-streamlit/ |
Makler-Backoffice | geplant |
frontend-web/ |
Makler- und Kundenportal (Next.js) | geplant |
mobile/ |
Flutter-App | geplant |
shared/ |
OpenAPI-Spezifikationen, generierte Clients | Sprint 0 |
infrastructure/ |
Docker Compose, Traefik-Anbindung | Sprint 0 |
database/ |
Rollen-Bootstrap, Seeds | Sprint 0 |
docs/ |
ADRs, Architektur, Feature-Spezifikationen | Sprint 0 |
scripts/ |
Entwicklungs- und Betriebsskripte | Sprint 0 |
Schnellstart
1. Voraussetzungen
- Git
- Docker-CLI mit erreichbarem Daemon (lokal oder entfernt, siehe ADR-0006)
- Optional für Arbeit außerhalb der Container: Python 3.12 (
py -3.12)
2. Konfiguration
Copy-Item .env.example .env
# Passwörter in .env setzen — die Datei ist per .gitignore ausgeschlossen
3. Starten
Zwei Eigenheiten von Docker Compose, die hier zusammenkommen:
- Das Dev-Overlay wird nur bei der automatischen Dateisuche geladen — sobald
-fangegeben ist, nicht mehr. .envwird im Projektverzeichnis gesucht, also im Verzeichnis der ersten Compose-Datei. Da unsere.envim Repo-Wurzelverzeichnis liegt, muss sie mit--env-filebenannt werden.
Lokal, ohne Traefik:
cd infrastructure/compose
docker compose --env-file ../../.env up -d --build
curl http://localhost:8000/health/ready
Auf Development-, Staging- und Produktionsservern — hinter der vorhandenen Traefik-Instanz, ohne Dev-Overlay. Traefik läuft als eigener PVE-Container mit File-Provider, das Routing wird daher in einem zweiten Schritt ausgerollt:
cd infrastructure/compose
docker compose --env-file ../../.env -f docker-compose.yml -f docker-compose.traefik.yml up -d
cd ../..
./scripts/deploy-traefik-config.sh
Voraussetzung sind die TRAEFIK_*- und BACKEND_BIND_ADDRESS-Werte in .env sowie eine PVE-Firewallregel, die den Backend-Port ausschließlich für die Traefik-IP freigibt. Beides ist in infrastructure/traefik/README.md beschrieben — die Firewallregel ist nicht optional.
Erwartete Antwort:
{"status":"up","version":"0.1.0","environment":"local","checks":{"postgresql":"up","redis":"up"}}
API-Dokumentation: http://localhost:8000/docs (in Produktion abgeschaltet).
4. Entwicklung ohne Container
cd backend
py -3.12 -m venv .venv
.\.venv\Scripts\Activate.ps1
py -m pip install -e . --group dev
py -m pytest -m "unit or api" # ohne Infrastruktur lauffähig
py -m ruff check src tests scripts
py -m black --check src tests scripts
py -m mypy
lint-imports
Arbeitsweise
- Ein Feature pro Increment. Nach jedem abgeschlossenen Feature bleibt die Plattform lauffähig.
- Jede strukturelle Entscheidung wird als ADR dokumentiert (
docs/adr/), inklusive der verworfenen Alternativen. - API vor Implementierung: Schema und Route entstehen zuerst, siehe ADR-0004.
- Conventional Commits, Semantic Versioning.
- Direkte Commits auf
main/mastersind per Pre-Commit-Hook blockiert — Arbeit erfolgt auf Feature-Branches.
pre-commit install --install-hooks
pre-commit install --hook-type commit-msg
Dokumentation
| Dokument | Inhalt |
|---|---|
| Systemübersicht | Analyse, Systemschnitt, Schichten, Mandantenfähigkeit, Identität, Verzeichnisstruktur |
| API-Konventionen | Fehlerformat, Pagination, Idempotenz, Versionierung, Mandantenkontext |
| Risikoregister | offene und geschlossene Risiken mit Status |
| Teststrategie | Testebenen, Werkzeuge, Abnahmekriterien |
| Roadmap | Reihenfolge der Increments und deren Begründung |
| Feature-Spezifikationen | je Feature: Ziel, Story, Akzeptanzkriterien, Datenmodell, API, Tests |
| ADRs | Architekturentscheidungen samt verworfener Alternativen |
Arbeitsteilung: Die Architekturdokumente beschreiben, was gilt. Die ADRs begründen, warum — und was aus welchem Grund verworfen wurde.
Architektur in Kürze
| Thema | Entscheidung | ADR |
|---|---|---|
| Systemschnitt | Modular Monolith, AI-Service separat | 0001 |
| Mandantentrennung | Shared Schema + PostgreSQL RLS | 0002 |
| Authentifizierung | self-hosted OIDC-Broker, Autorisierung im Backend | 0003 |
| API-Vertrag | OpenAPI Contract-Enforced | 0004 |
| Laufzeit | Python 3.12 | 0005 |
| Entwicklungsumgebung | entfernter Docker-Daemon | 0006 |
| Reverse Proxy | Traefik, kein anwendungsinternes Nginx | 0007 |