Eine selbstgehostete Web-Anwendung zur Verwaltung persönlicher Gesundheitsdaten (z.B. Diagnosen, Vitalwerte, Blutwerte, Dokumente) mit Fokus auf Sicherheit (Login, 2FA/Passkeys, Rate Limiting, verschlüsselte Dateispeicherung) und Backup/Restore.
- 🔐 Sicherheit
- Login via
Flask-Login - 2FA (TOTP) und Passkeys (WebAuthn)
- CSRF-Schutz, Rate Limiting (Redis)
- Uploads mit MIME-Type Validierung (libmagic)
- Verschlüsselte Speicherung (Fernet via
DATABASE_KEY)
- Login via
- 🗄️ Datenverwaltung
- Profile, Diagnosen, Vitalwerte, Blutwerte, Dokumente
- ♻️ Backup & Restore
- Backup enthält Datenbank + Uploads +
.env(wichtig fürDATABASE_KEY)
- Backup enthält Datenbank + Uploads +
- Backend: Python / Flask
- DB: SQLite (persistiert über Volume)
- Cache/Rate limiting: Redis
- Webserver: Gunicorn
- Deployment: Docker / Docker Compose
Ziel: Die Webversion auf deinem eigenen Server starten.
- Docker und Docker Compose installiert
- Optional (empfohlen): Reverse Proxy (z.B. Nginx Proxy Manager)
git clone <DEIN_GITHUB_REPO_URL>
cd MEINEEPAAPPmkdir -p epa-data/instance epa-data/uploads epa-data/redisDiese App nutzt env_file: .env in docker-compose.yml.
- Wenn keine
./.envexistiert, kanndocker compose(je nach Version) beim Laden derenv_filescheitern. - Lege daher zunächst eine leere
.envan:
touch .env
chmod 600 .envHinweis: In dieser Compose-Konfiguration wird die .env zusätzlich als Volume gemountet (./.env:/app/.env). Je nach Host-Setup/UID-Mapping kann es vorkommen, dass die Datei nach dem Start andere Owner/Permissions bekommt. Falls danach z.B. docker compose ps mit permission denied auf .env scheitert, setze die Rechte/Owner auf dem Host wieder passend.
Wichtig: Beim ersten Start erzeugt die Anwendung automatisch folgende Werte und schreibt sie in .env, falls sie fehlen:
SECRET_KEY(Flask Session Secret)DATABASE_KEY(Fernet Key zur Ver-/Entschlüsselung)
docker compose up -d --buildWenn du Nginx Proxy Manager (oder einen anderen Reverse Proxy) nutzt, der im Netzwerk npm_default läuft, kannst du die App zusätzlich in dieses externe Netzwerk hängen.
- Falls das Netzwerk noch nicht existiert:
docker network create npm_default- Dann mit zusätzlicher Compose-Datei starten:
docker compose -f docker-compose.yml -f docker-compose.npm.yml up -d --buildStandardmäßig wird kein Port nach außen gemappt. Das ist ideal, wenn du die App über einen Reverse Proxy erreichst.
- Mit Reverse Proxy: Route auf den Container-Service
meine-epaund Port8000.
Wenn du ohne Reverse Proxy testen willst, gibt es zwei Optionen:
- Option A (empfohlen): Lege eine
docker-compose.override.ymlan (wird von Compose automatisch mitgeladen) und mappe den Port nach außen:
services:
meine-epa:
ports:
- "8000:8000"Dann erreichst du die App unter http://localhost:8000.
- Option B: Greife intern über das Docker-Netzwerk zu (z.B. via Reverse Proxy/Container-zu-Container).
Diese Werte werden über .env/Compose gesetzt oder automatisch erzeugt:
SECRET_KEY– Flask SecretDATABASE_KEY– Verschlüsselungsschlüssel (kritisch für Entschlüsselung bestehender Uploads)REDIS_URL– wird indocker-compose.ymlgesetzt (redis://epa-redis:6379/0)
-
Persistenz:
./epa-data/instance→/app/instance./epa-data/uploads→/app/uploads./epa-data/redis→/data./.env→/app/.env
-
Backup/Restore:
- Backups beinhalten
.env(damitDATABASE_KEYerhalten bleibt). - Beim Restore kann die aktuelle
.envals.env.oldgesichert werden.
- Backups beinhalten
- Halte die
.envprivat und sichere sie (Permissions600). - Nutze HTTPS über einen Reverse Proxy.
- Betreibe Redis nicht öffentlich erreichbar.
Falls du eine Lizenz nutzen willst, ergänze hier eine passende Lizenz (z.B. MIT/Apache-2.0).




