From 55ec4e653bb2cd1fa3d0d68a8dd1dc1986152959 Mon Sep 17 00:00:00 2001 From: smueller Date: Tue, 7 Jul 2026 15:09:44 +0200 Subject: [PATCH] Enhance admin bootstrap process with reset functionality - Update .env.example and README.md to include new ADMIN_BOOTSTRAP_RESET option for resetting admin credentials on startup. - Modify main.py to implement logic for resetting the admin's password, role, and status if ADMIN_BOOTSTRAP_RESET is set to true. - Adjust config.py to define the new setting, ensuring proper configuration management. --- .env.example | 5 +++++ README.md | 12 ++++++++++++ app/core/config.py | 3 +++ app/main.py | 6 ++++++ 4 files changed, 26 insertions(+) diff --git a/.env.example b/.env.example index ca55781..6622e6c 100644 --- a/.env.example +++ b/.env.example @@ -13,3 +13,8 @@ COOKIE_SECURE=false # Auf true setzen, wenn hinter HTTPS/TLS-Terminierung (Reverse Proxy) ADMIN_BOOTSTRAP_EMAIL=admin@internal.local ADMIN_BOOTSTRAP_PASSWORD=ChangeMe123! +# true = setzt Passwort/Rolle/Status des Bootstrap-Admins bei jedem Start +# auf die obigen Werte zurueck (auch wenn der User schon existiert). +# Nach erfolgreichem Login wieder auf false setzen, damit UI-Passwortaenderungen +# nicht beim naechsten Neustart ueberschrieben werden. +ADMIN_BOOTSTRAP_RESET=false diff --git a/README.md b/README.md index f4f1f5f..4ab6db9 100644 --- a/README.md +++ b/README.md @@ -101,6 +101,18 @@ Der Workflow `.gitea/workflows/docker-build.yml` baut und pusht das Image über - `REGISTRY_USER` (optional): Registry-Benutzername, falls abweichend vom Repo-Owner - **Optionale Repo-Variable**: `REGISTRY`, um den Registry-Host zu überschreiben (Default `git.hexahost.dev`). +## Admin-Login & Passwort zurücksetzen + +- Das Login erfolgt über **E-Mail + Passwort** (kein separater Benutzername). Beim ersten Start wird der Admin aus `ADMIN_BOOTSTRAP_EMAIL` / `ADMIN_BOOTSTRAP_PASSWORD` angelegt. +- **Wichtig:** Existiert der Admin bereits (persistente DB im Volume `newsletter_data`), wird eine spätere Passwort-Änderung in der `.env` normalerweise **nicht** übernommen. +- Um Passwort/Rolle/Status auf die `.env`-Werte zurückzusetzen: `ADMIN_BOOTSTRAP_RESET=true` setzen und Container neu starten: + + ```bash + docker compose up -d --force-recreate + ``` + + Nach erfolgreichem Login `ADMIN_BOOTSTRAP_RESET=false` setzen, damit UI-Passwortänderungen nicht bei jedem Neustart überschrieben werden. + ## Sicherheits-Hinweise für Produktion - Reverse Proxy (z. B. Nginx/Traefik) mit TLS vor den Container setzen. diff --git a/app/core/config.py b/app/core/config.py index 815bb5c..72defcf 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -13,6 +13,9 @@ class Settings(BaseSettings): cookie_secure: bool = False admin_bootstrap_email: str = "admin@internal.local" admin_bootstrap_password: str = "ChangeMe123!" + # Wenn true: setzt Passwort/Rolle/Status des Bootstrap-Admins beim Start + # auf die .env-Werte zurück (auch wenn der User bereits existiert). + admin_bootstrap_reset: bool = False model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8") diff --git a/app/main.py b/app/main.py index c33356b..4c86553 100644 --- a/app/main.py +++ b/app/main.py @@ -97,6 +97,12 @@ def _bootstrap_admin() -> None: try: existing = db.query(User).filter(User.email == settings.admin_bootstrap_email).first() if existing: + if settings.admin_bootstrap_reset: + existing.password_hash = hash_password(settings.admin_bootstrap_password) + existing.is_admin = True + existing.role = "admin" + existing.is_active = True + db.commit() return user = User( email=settings.admin_bootstrap_email, -- 2.47.3