Technologien¶
Diese Seite gibt einen Überblick über die im Vogelschlagmelder eingesetzten Technologien. Sie richtet sich an Entwickler*innen, die am Projekt mitarbeiten oder es erweitern möchten.
Kurzprofil¶
Der Vogelschlagmelder ist eine Python-Webanwendung auf Basis von FastAPI, die als Docker-Container betrieben wird. Das Frontend wird serverseitig mit Jinja2-Templates gerendert und kommt ohne JavaScript-Framework aus. Als Datenbank dient SQLite.
Schicht |
Technologie |
Version |
|---|---|---|
Programmiersprache |
Python |
3.11 |
Web-Framework |
FastAPI |
0.115.0 |
ASGI-Server |
Uvicorn |
0.30.1 |
ORM |
SQLModel (SQLAlchemy + Pydantic) |
0.0.22 |
Datenbank |
SQLite |
3.x |
Template-Engine |
Jinja2 |
≥ 3.1.6 |
Karten |
Leaflet.js |
1.9.4 |
Container |
Docker + Docker Compose |
– |
Backend¶
Python und FastAPI¶
Die Anwendung nutzt FastAPI als Web-Framework. FastAPI basiert auf Starlette (ASGI) und Pydantic (Datenvalidierung) und bietet asynchrone Request-Verarbeitung, automatische OpenAPI-Dokumentation sowie typisierte Request-/Response-Modelle.
Als ASGI-Server kommt Uvicorn zum Einsatz, der die Anwendung auf Port 8000 ausliefert.
Abhängigkeiten¶
Paket |
Version |
Zweck |
|---|---|---|
|
0.115.0 |
Web-Framework, Routing, OpenAPI |
|
0.30.1 |
ASGI-Server |
|
0.0.22 |
ORM (SQLAlchemy + Pydantic) |
|
≥ 3.1.6 |
Serverseitige HTML-Templates |
|
0.0.9 |
Multipart-Formulardaten und Datei-Uploads |
|
2.2.0 |
E-Mail-Validierung nach RFC 5321/5322 |
|
0.27.0 |
Asynchroner HTTP-Client (Matrix-API) |
|
10.4.0 |
Bildverarbeitung und Formatkonvertierung |
|
0.18.0 |
HEIC-/HEIF-Unterstützung (iPhone-Fotos) |
|
≥ 0.2.14 |
HTML-Sanitisierung gegen XSS |
|
8.3.3 |
Test-Framework |
Datenbank¶
Als Datenbank wird SQLite eingesetzt – eine dateibasierte, serverlose Datenbank, die direkt in den Anwendungsprozess eingebettet ist. Die Datenbankdatei liegt unter /app/data/vogelschlagmelder.db und wird über ein Docker-Volume persistiert.
Der Datenbankzugriff erfolgt über SQLModel, ein ORM das SQLAlchemy und Pydantic vereint. Datenbankmodelle sind gleichzeitig Pydantic-Modelle mit Typhinweisen und Validierung.
Schema-Migrationen werden manuell über ALTER TABLE-Befehle mit PRAGMA-Prüfungen durchgeführt (kein Alembic).
Bildverarbeitung¶
Pillow und pillow-heif übernehmen die Bildverarbeitung:
Automatische HEIC → JPEG-Konvertierung (iPhone-Unterstützung)
EXIF-basierte Orientierungskorrektur (Auto-Rotation)
RGBA → RGB-Umwandlung mit weißem Hintergrund
JPEG-Qualitätsoptimierung (Qualitätsstufe 85)
Kommunikation¶
E-Mail: Benachrichtigungen werden über das in Python eingebaute smtplib mit TLS-Verschlüsselung versendet.
Element/Matrix: Die Integration mit dem Matrix-Protokoll erfolgt über httpx (asynchroner HTTP-Client), der direkt die Matrix-Client-API anspricht (/_matrix/client/r0/). Ein dediziertes SDK wird nicht verwendet.
Frontend¶
Rendering¶
Das Frontend wird vollständig serverseitig mit Jinja2 gerendert. Es gibt kein Single-Page-Application-Framework – alle Seiten werden als HTML vom Server ausgeliefert.
CSS¶
Das Styling erfolgt über eine einzige, handgeschriebene CSS-Datei (style.css) mit CSS-Custom-Properties für die Farbgestaltung. Es wird kein CSS-Framework (kein Bootstrap, kein Tailwind) eingesetzt.
Schriftart: Inter (via CDN rsms.me) + System-Fonts als Fallback
Layout: Flexbox-basiertes responsives Design
Breakpoint: 900 px für mobile Ansichten
Farbsystem: Dynamisch über Admin konfigurierbar (CSS-Custom-Properties)
JavaScript¶
Das Frontend nutzt Vanilla JavaScript (ES6+) ohne Framework (kein React, Vue oder Angular).
Karten¶
Für die interaktive Kartenansicht wird Leaflet.js 1.9.4 über CDN (unpkg.com) eingebunden. Als Kartenkacheln dienen die Tiles von OpenStreetMap (primär tile.openstreetmap.org, Fallback tile.openstreetmap.de).
Funktionen: Markersetzung, Geolokalisierung, Radius-Anzeige (erlaubte/eingeschränkte Zonen), Heatmap-Overlay.
Sicherheit¶
Mechanismus |
Umsetzung |
|---|---|
Passwort-Hashing |
PBKDF2-SHA256, 120.000 Iterationen ( |
CSRF-Schutz |
HMAC-SHA256-Token mit Zeitstempelablauf (1 h) |
HTML-Sanitisierung |
|
Datei-Upload-Validierung |
Magic-Byte-Prüfung + Größenbegrenzung |
HTTP-Security-Header |
CSP, HSTS, X-Frame-Options, X-Content-Type-Options |
Sitzungsverwaltung |
HttpOnly/SameSite/Secure-Cookies (24 h Gültigkeit) |
Rate-Limiting |
Max. 5 Fehlversuche / 5 Min. → 15 Min. Sperre |
Infrastruktur¶
Die Anwendung wird als Docker-Container betrieben:
Basis-Image:
python:3.11-slimNicht-Root-Benutzer:
appuser(UID 1001)Persistenz: Docker-Volume
./data:/app/datafür Datenbank und UploadsHealthcheck:
GET /healthzalle 30 SekundenNeustart-Richtlinie:
unless-stopped
Die Konfiguration erfolgt vollständig über Umgebungsvariablen in der docker-compose.yaml (Zugangsdaten, SMTP, Matrix, CSRF-Secret, Produktionsmodus).
Handbuch¶
Dieses Handbuch wird mit folgenden Werkzeugen erstellt:
Werkzeug |
Version |
Zweck |
|---|---|---|
Sphinx |
≥ 9.0 |
Dokumentationsgenerator |
MyST-Parser |
≥ 2.0 |
Markdown-Unterstützung für Sphinx (.md statt .rst) |
sphinx-design |
≥ 0.5 |
Erweiterte UI-Komponenten (Grids, Cards, Tabs) |
Theme: Alabaster (klassisches, responsives Sphinx-Theme) mit angepasstem Stylesheet (nabu.css) in den NABU-Markenfarben.
MyST-Erweiterungen: Colon-Fence-Syntax (:::), Definitionslisten, Feldlisten, Substitutionen ({{ }}), HTML-Bilder und automatische Überschriftenanker bis Ebene 3.
Build-Befehl:
make html
Die kompilierte HTML-Dokumentation wird im Verzeichnis handbuch/ abgelegt.