docs: add project management structure

This commit is contained in:
2025-12-28 09:16:22 +01:00
parent 3991362e67
commit 4eb20e2449
50 changed files with 1905 additions and 0 deletions

View File

@ -0,0 +1,18 @@
ID: US_000001 | Version: 0.1.0 | Status: Final
By: Codex (GPT-5)
# US_000001: Nutzerkonto per CLI deaktivieren
Status: Done
Als Admin moechte ich ein Nutzerkonto per CLI deaktivieren, damit der Zugriff sofort unterbunden wird.
## Akzeptanzkriterien
- Given ein existierender Nutzer und Root-Rechte
- When das Skript mit `disable` und optionalen Countdown/Sound-Parametern aufgerufen wird
- Then das Konto ist gesperrt und ein aktiver Login wird erkannt
- And bei aktivem Login wird eine Warnung/Countdown versendet und anschliessend abgemeldet
- And ein Shutdown erfolgt nur, wenn der Nutzer zuvor eingeloggt war
## Task-Platzhalter
- TASK_000001: Disable user countdown (Details bei Story-Start)

View File

@ -0,0 +1,17 @@
ID: US_000002 | Version: 0.1.0 | Status: Final
By: Codex (GPT-5)
# US_000002: Nutzerkonto per CLI aktivieren
Status: Done
Als Admin moechte ich ein Nutzerkonto per CLI aktivieren, damit sich der Nutzer wieder anmelden kann.
## Akzeptanzkriterien
- Given ein existierender Nutzer und Root-Rechte
- When das Skript mit `enable` aufgerufen wird
- Then das Konto ist entsperrt und Login ist wieder moeglich
- And es wird kein Shutdown ausgeloest
## Task-Platzhalter
- TASK_000002: Enable user account (Details bei Story-Start)

View File

@ -0,0 +1,17 @@
ID: US_000003 | Version: 0.1.0 | Status: Final
By: Codex (GPT-5)
# US_000003: Health-Status abfragen
Status: Done
Als Admin moechte ich den Health-Status per API abfragen, damit ich den Service-Zustand sehe.
## Akzeptanzkriterien
- Given der Service laeuft
- When ein GET auf `/health` erfolgt
- Then die Antwort enthaelt `status` mit dem Wert `ok`
- And die Antwort enthaelt `dry_run` als Boolean
## Task-Platzhalter
- TASK_000003: Health response payload (Details bei Story-Start)

View File

@ -0,0 +1,17 @@
ID: US_000004 | Version: 0.1.0 | Status: Final
By: Codex (GPT-5)
# US_000004: Verfuegbare Nutzer auflisten
Status: Done
Als Admin moechte ich verwaltbare Nutzer per API auflisten, damit ich ihren Login-Status sehe.
## Akzeptanzkriterien
- Given ein autorisierter Admin-Login
- When ein GET auf `/users` erfolgt
- Then die Antwort ist eine Liste von Eintraegen mit `user` und `logged_in`
- And die Liste enthaelt nur verwaltbare, nicht-root Nutzer
## Task-Platzhalter
- TASK_000004: List users status (Details bei Story-Start)

View File

@ -0,0 +1,17 @@
ID: US_000005 | Version: 0.1.0 | Status: Final
By: Codex (GPT-5)
# US_000005: Nutzer per API deaktivieren
Status: Done
Als Admin moechte ich einen Nutzer per API deaktivieren, damit ich den Zugriff remote steuern kann.
## Akzeptanzkriterien
- Given ein autorisierter Admin-Login und ein erlaubter Nutzer
- When ein POST auf `/users/{username}/disable` mit optionalen Feldern `countdown`, `sound`, `message` erfolgt
- Then die Antwort enthaelt `user`, `action` = `disable`, `dry_run`, `steps` und `logged_in`
- And nicht erlaubte Nutzer werden mit 403 abgewiesen
## Task-Platzhalter
- TASK_000005: API disable action (Details bei Story-Start)

View File

@ -0,0 +1,17 @@
ID: US_000006 | Version: 0.1.0 | Status: Final
By: Codex (GPT-5)
# US_000006: Nutzer per API aktivieren
Status: Done
Als Admin moechte ich einen Nutzer per API aktivieren, damit ich den Zugriff remote wieder erlaube.
## Akzeptanzkriterien
- Given ein autorisierter Admin-Login und ein erlaubter Nutzer
- When ein POST auf `/users/{username}/enable` erfolgt
- Then die Antwort enthaelt `user`, `action` = `enable`, `dry_run`, `steps` und `logged_in`
- And nicht erlaubte Nutzer werden mit 403 abgewiesen
## Task-Platzhalter
- TASK_000006: API enable action (Details bei Story-Start)

View File

@ -0,0 +1,18 @@
ID: US_000007 | Version: 0.1.0 | Status: Final
By: Codex (GPT-5)
# US_000007: PAM-Login mit Token
Status: Done
Als Admin moechte ich mich per PAM-Login anmelden, damit ich ein Session-Token erhalte.
## Akzeptanzkriterien
- Given `SKD_AUTH_MODE=pam` und gueltige Admin-Credentials
- When ein POST auf `/login` mit Benutzername und Passwort erfolgt
- Then die Antwort enthaelt `token` und `expires_in`
- And ein Session-Cookie mit dem Token wird gesetzt
- And der Login ist ohne OIDC-Konfiguration als Schnellstart moeglich
## Task-Platzhalter
- TASK_000007: PAM login token (Details bei Story-Start)

View File

@ -0,0 +1,19 @@
ID: US_000008 | Version: 0.1.0 | Status: Final
By: Codex (GPT-5)
# US_000008: OIDC-Login Flow
Status: Done
Als Admin moechte ich mich per OIDC anmelden, damit ich ohne Passwort-Login zugreifen kann.
## Akzeptanzkriterien
- Given `SKD_AUTH_MODE=oidc` und ein erreichbarer OIDC-Provider
- When ein GET auf `/login/oidc/start` erfolgt
- Then der Nutzer wird zum Provider umgeleitet und ein State-Cookie gesetzt
- When der Provider auf `/login/oidc/callback` mit Code und State zurueckleitet
- Then der State wird validiert und ein Session-Cookie gesetzt
- And bei ungueltigem State erfolgt eine 400-Antwort
## Task-Platzhalter
- TASK_000008: OIDC auth callback (Details bei Story-Start)

View File

@ -0,0 +1,20 @@
ID: US_000009 | Version: 0.1.0 | Status: Final
By: Codex (GPT-5)
# US_000009: Autorisierung und /me-Identitaet
Status: Done
Als Admin moechte ich autorisiert werden und meine Identitaet abrufen, damit API-Zugriffe nachvollziehbar sind.
## Akzeptanzkriterien
- Given ein gueltiges Session-Token
- When ein GET auf `/me` erfolgt
- Then die Antwort enthaelt `user` und `auth_mode`
- Given kein oder ungueltiges Token
- When ein Zugriff auf geschuetzte Endpunkte erfolgt
- Then der Zugriff wird mit 401/403 verweigert
- And bei OIDC wird die Allowlist gegen `preferred_username`, `email` oder `sub` geprueft
## Task-Platzhalter
- TASK_000009: Authorization /me gate (Details bei Story-Start)

View File

@ -0,0 +1,16 @@
ID: US_000010 | Version: 0.1.0 | Status: Final
By: Codex (GPT-5)
# US_000010: Index-Seite ausliefern
Status: Done
Als Admin moechte ich die Web-UI im Browser oeffnen, damit ich mich anmelden und Aktionen starten kann.
## Akzeptanzkriterien
- Given der Service laeuft
- When ein GET auf `/` erfolgt
- Then die Antwort ist HTML aus dem Template-Verzeichnis
## Task-Platzhalter
- TASK_000010: Serve UI template (Details bei Story-Start)

View File

@ -0,0 +1,17 @@
ID: US_000011 | Version: 0.1.0 | Status: Final
By: Codex (GPT-5)
# US_000011: Virtualenv und Abhaengigkeiten erstellen
Status: Done
Als Operator moechte ich eine virtuelle Umgebung erstellen, damit der Service reproduzierbar laeuft.
## Akzeptanzkriterien
- Given ein verfuegbares Python-Executable
- When `scripts/create_venv.sh` ausgefuehrt wird
- Then eine `.venv` wird erstellt und aktiviert
- And die Abhaengigkeiten aus `backend/requirements.txt` sind installiert
## Task-Platzhalter
- TASK_000011: Provision venv deps (Details bei Story-Start)

View File

@ -0,0 +1,16 @@
ID: US_000012 | Version: 0.1.0 | Status: Final
By: Codex (GPT-5)
# US_000012: Service lokal starten
Status: Done
Als Operator moechte ich den Service lokal starten, damit ich die API ohne Systemd testen kann.
## Akzeptanzkriterien
- Given eine vorhandene `.venv`
- When `scripts/run.sh` ausgefuehrt wird
- Then `uvicorn` startet die App `backend.app:app` auf dem konfigurierten Host/Port
## Task-Platzhalter
- TASK_000012: Run uvicorn service (Details bei Story-Start)

View File

@ -0,0 +1,19 @@
ID: US_000013 | Version: 0.1.0 | Status: Final
By: Codex (GPT-5)
# US_000013: Service installieren
Status: Done
Als Operator moechte ich den Service installieren, damit er als Systemdienst laeuft.
## Akzeptanzkriterien
- Given sudo-Rechte und ein Zielpfad
- When `scripts/install.sh` ausgefuehrt wird
- Then der Service-User/-Group existiert oder wird erstellt
- And das Projekt wird ins Install-Verzeichnis synchronisiert
- And eine Env-Datei wird aus `env.example` erstellt, falls sie fehlt
- And eine Systemd-Unit wird geschrieben und der Service gestartet
## Task-Platzhalter
- TASK_000013: Install service setup (Details bei Story-Start)

View File

@ -0,0 +1,18 @@
ID: US_000014 | Version: 0.1.0 | Status: Final
By: Codex (GPT-5)
# US_000014: Service aktualisieren
Status: Done
Als Operator moechte ich den Service aktualisieren, damit Updates schnell eingespielt werden.
## Akzeptanzkriterien
- Given ein vorhandenes Repo-Checkout
- When `scripts/update.sh` ausgefuehrt wird
- Then das Repo wird auf den Ziel-Branch aktualisiert
- And die Abhaengigkeiten werden in der venv aktualisiert
- And der Systemdienst wird neu gestartet
## Task-Platzhalter
- TASK_000014: Update service refresh (Details bei Story-Start)

View File

@ -0,0 +1,18 @@
ID: US_000015 | Version: 0.1.0 | Status: Final
By: Codex (GPT-5)
# US_000015: Remote-Deployment durchfuehren
Status: Done
Als Operator moechte ich auf ein Zielsystem deployen, damit das Projekt remote aktualisiert wird.
## Akzeptanzkriterien
- Given ein Host-Eintrag in `deploy_hosts.yml` oder JSON-Konfig
- When `scripts/deploy.sh <host>` ausgefuehrt wird
- Then das Projekt wird als Archiv gepackt und auf den Host kopiert
- And der Inhalt wird im Install-Verzeichnis entpackt und Rechte werden gesetzt
- And Abhaengigkeiten werden installiert und der Service neu gestartet
## Task-Platzhalter
- TASK_000015: Remote deploy package (Details bei Story-Start)

View File

@ -0,0 +1,20 @@
ID: US_000016 | Version: 0.1.0 | Status: Final
By: Codex (GPT-5)
# US_000016: OIDC-Client registrieren
Status: Done
Als Operator moechte ich einen OIDC-Client registrieren, damit der Login-Flow konfiguriert werden kann.
## Akzeptanzkriterien
- Given `SKD_OIDC_ISSUER` und `OIDC_INITIAL_ACCESS_TOKEN` sind gesetzt
- When `scripts/register_oidc_client.sh` ausgefuehrt wird
- Then ein Registrierungsrequest wird an den Provider gesendet
- And Client-ID und Client-Secret werden ausgegeben
- And bei HTTP-Fehler wird mit Fehlermeldung abgebrochen
- And die Redirect-URI ist exakt `https://<device-host>[:port]/login/oidc/callback` (keine Wildcards)
- And bei Host/Port-Aenderung erfolgt eine Neuregistrierung mit neuen Credentials
## Task-Platzhalter
- TASK_000016: OIDC client register (Details bei Story-Start)

View File

@ -0,0 +1,16 @@
ID: US_000017 | Version: 0.1.0 | Status: Final
By: Codex (GPT-5)
# US_000017: Systemd-Unit im Repo
Status: Done
Als Operator moechte ich eine Systemd-Unit im Repo haben, damit der Service standardisiert betrieben werden kann.
## Akzeptanzkriterien
- Given die Datei `systemd/skd.service` existiert
- When die Unit inspiziert wird
- Then sie enthaelt Description, User/Group, WorkingDirectory, EnvironmentFile, ExecStart und Restart-Policy
## Task-Platzhalter
- TASK_000017: Systemd unit template (Details bei Story-Start)

View File

@ -0,0 +1,19 @@
ID: US_000018 | Version: 0.1.0 | Status: Final
By: Codex (GPT-5)
# US_000018: Konfigurations-Templates verfuegbar
Status: Done
Als Operator moechte ich Konfigurationsvorlagen im Repo haben, damit Installationen konsistent sind.
## Akzeptanzkriterien
- Given `env.example` liegt im Root-Verzeichnis
- When die Datei geprueft wird
- Then sie enthaelt SKD-Konfigurationswerte fuer Auth und Defaults
- Given `deploy_hosts.yml` liegt im Root-Verzeichnis
- When die Datei geprueft wird
- Then sie enthaelt eine Host-Liste mit Name, Host, User, Port, Install-Dir und Service-Parametern
## Task-Platzhalter
- TASK_000018: Config templates ready (Details bei Story-Start)

View File

@ -0,0 +1,16 @@
ID: US_000019 | Version: 0.1.0 | Status: Final
By: Codex (GPT-5)
# US_000019: Deployment-Archiv vorhanden
Status: Done
Als Operator moechte ich ein Deployment-Archiv im Repo haben, damit ich manuell ausrollen kann.
## Akzeptanzkriterien
- Given `sk_deploy.zip` liegt im Root-Verzeichnis
- When das Archiv geoeffnet wird
- Then es enthaelt das Projekt fuer die manuelle Bereitstellung
## Task-Platzhalter
- TASK_000019: Deployment zip artifact (Details bei Story-Start)

View File

@ -0,0 +1,18 @@
ID: US_000020 | Version: 0.1.0 | Status: Final
By: Codex (GPT-5)
# US_000020: Makefile-Automation bereitstellen
Status: Done
Als Operator moechte ich Standard-Targets fuer Installation, Start/Stop und Updates haben, damit Betriebsablaeufe vereinfacht werden.
## Akzeptanzkriterien
- Given ein Makefile im Root-Verzeichnis
- When die Targets `install`, `up`, `down`, `uninstall`, `update` ausgefuehrt werden
- Then die entsprechenden Service-Aktionen werden aufgerufen
- And `healthcheck` und `token` stehen als Hilfs-Targets bereit
- And `healthcheck` prueft nur die Erreichbarkeit von `/health` ohne Auth-Anforderung
## Task-Platzhalter
- TASK_000020: Makefile ops targets (Details bei Story-Start)

View File

@ -0,0 +1,20 @@
ID: US_000021 | Version: 0.1.0 | Status: Final
By: Codex (GPT-5)
# US_000021: Konfiguration per ENV steuern
Status: Done
Als Operator moechte ich Konfigurationen per ENV setzen, damit Verhalten und Defaults steuerbar sind.
## Akzeptanzkriterien
- Given Umgebungsvariablen aus `env.example`
- When der Service startet
- Then Auth- und Session-Settings werden aus ENV geladen (`SKD_AUTH_MODE`, `SKD_AUTH_SECRET`, `SKD_TOKEN_TTL_SECONDS`, `SKD_AUTH_ALLOWED_USERS`, `SKD_AUTH_ALLOWED_GROUPS`, `SKD_AUTH_PAM_SERVICE`, `SKD_SESSION_COOKIE_NAME`, `SKD_SESSION_COOKIE_SECURE`, `SKD_OIDC_STATE_COOKIE_NAME`)
- And OIDC-Settings werden aus ENV geladen (`SKD_OIDC_ISSUER`, `SKD_OIDC_CLIENT_ID`, `SKD_OIDC_CLIENT_SECRET`, `SKD_OIDC_REDIRECT_URI`, `SKD_OIDC_SCOPES`)
- And Allowlist/Defaults werden aus ENV geladen (`SKD_ALLOWED_USERS`, `SKD_DEFAULT_COUNTDOWN`, `SKD_DEFAULT_SOUND`, `SKD_NOTIFY_TIMEOUT`, `SKD_DRY_RUN`)
- And Sound/Notify-Pfade sind ueber ENV ueberschreibbar (`SKD_SOUND_PLAYER`, `SKD_SOUND_FILE`, `SKD_NOTIFY_SEND_PATH`)
- And der OIDC Issuer entspricht der externen URL des Providers
## Task-Platzhalter
- TASK_000021: ENV settings defaults (Details bei Story-Start)

View File

@ -0,0 +1,19 @@
ID: US_000022 | Version: 0.1.0 | Status: Final
By: Codex (GPT-5)
# US_000022: Web-UI Aktionen ausfuehren
Status: Done
Als Admin moechte ich mich im Web-UI anmelden, Nutzer laden und Aktionen ausfuehren, damit ich keine CLI benoetige.
## Akzeptanzkriterien
- Given die Web-UI ist erreichbar
- When ich mich per PAM oder OIDC anmelde
- Then der Session-Status wird angezeigt
- When ich Nutzer lade und eine Aktion sende
- Then die Aktionsergebnisse (Steps/Status) werden als Text angezeigt
- And Fehlerantworten werden als Text angezeigt
## Task-Platzhalter
- TASK_000022: UI login and actions (Details bei Story-Start)

View File

@ -0,0 +1,17 @@
ID: US_000023 | Version: 0.1.0 | Status: Final
By: Codex (GPT-5)
# US_000023: Runbook und Security-Hinweise dokumentieren
Status: Done
Als Operator moechte ich eine klare Betriebs- und Security-Dokumentation haben, damit der Service sicher betrieben werden kann.
## Akzeptanzkriterien
- Given das README im Root-Verzeichnis
- When ich es lese
- Then ich finde Abschnitte zu Quick Start, Configuration, Running, Updates und Deployment
- And Security Hardening ist als eigener Abschnitt beschrieben
## Task-Platzhalter
- TASK_000023: README runbook notes (Details bei Story-Start)

View File

@ -0,0 +1,22 @@
ID: US_000024 | Version: 0.1.0 | Status: Draft
By: Codex (GPT-5)
# US_000024: Watchtower Theme fuer Web-UI
Status: Zurueckgestellt
Als Admin moechte ich das Watchtower-Design verwenden, damit die Web-UI dem vereinbarten Dark-Mode-Branding entspricht.
## Akzeptanzkriterien
- Given die Web-UI wird aus dem Template ausgeliefert
- When das UI geladen wird
- Then das Watchtower-Theme praegt Farben, Typografie und Kontraste der UI
- And die Theme-Assets liegen unter `assets/` in einer klaren Design-Struktur (z.B. `assets/design/`)
- And das Theme nutzt die bereitgestellten Dateien `tokens_watchtower.css` und `theme_watchtower.css`
- And ein Hintergrundrauschen (`bg-noise`) ist sichtbar
## Notizen
- Assets sind unter `assets/design/` abgelegt (noch nicht eingebunden).
## Task-Platzhalter
- TASK_000024: Apply Watchtower theme (Details bei Story-Start)