release: 0.2.2
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@ -3,6 +3,7 @@ __pycache__/
|
||||
*$py.class
|
||||
.venv/
|
||||
upload.token
|
||||
update-addon.env
|
||||
venv/
|
||||
ENV/
|
||||
.env
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: DOC_000001 | Version: 0.2.1 | Status: Final
|
||||
ID: DOC_000001 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# Projekt-Logbuch (Changelog)
|
||||
@ -76,6 +76,12 @@ By: Codex (GPT-5)
|
||||
| 15.01.2026 | 🏗️ Planning | ID: US_000048/TASK_000057 Release-Upload automatisieren. By: Codex (GPT-5) |
|
||||
| 15.01.2026 | ⚙️ Code | ID: Release-Upload Script hinzugefuegt (tar.gz + curl). By: Codex (GPT-5) |
|
||||
| 15.01.2026 | ⚙️ Code | ID: Upload-Script toleriert fehlende Leserechte fuer /etc/skd/*. By: Codex (GPT-5) |
|
||||
| 15.01.2026 | 🏗️ Planning | ID: US_000049/TASK_000058 deployment.env fuer lokale Uploads. By: Codex (GPT-5) |
|
||||
| 15.01.2026 | ⚙️ Code | ID: deployment.env.example hinzugefuegt und Scripts angepasst. By: Codex (GPT-5) |
|
||||
| 15.01.2026 | ⚙️ Code | ID: deployment.env als lokale Quelle fuer Enrollment/Upload Scripts. By: Codex (GPT-5) |
|
||||
| 15.01.2026 | ⚙️ Code | ID: EPIC_000013 System Telemetry Endpoint und UI umgesetzt. By: Codex (GPT-5) |
|
||||
| 15.01.2026 | 📝 Req | ID: EPIC_000009 Update Webservice als erledigt markiert. By: Codex (GPT-5) |
|
||||
| 15.01.2026 | 🚀 Release | ID: VERSION auf 0.2.2 erhoeht. By: Codex (GPT-5) |
|
||||
| 15.01.2026 | ⚙️ Code | ID: Makefile restart-Target hinzugefuegt. By: Codex (GPT-5) |
|
||||
|
||||
---
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: README_000001 | Version: 0.2.1 | Status: Draft
|
||||
ID: README_000001 | Version: 0.2.2 | Status: Draft
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# Safe Kiddo Daemon
|
||||
|
||||
@ -28,11 +28,13 @@ from backend.models import (
|
||||
UpdateLogEntry,
|
||||
UpdateServiceStatus,
|
||||
UpdateStatus,
|
||||
SystemMetrics,
|
||||
UserStatus,
|
||||
)
|
||||
from backend.oidc import OIDCClient, OIDCError
|
||||
from backend.settings import Settings, get_settings
|
||||
from backend import update
|
||||
from backend import system_metrics
|
||||
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
@ -321,6 +323,12 @@ def update_service_status(settings: Settings = Depends(get_settings)) -> UpdateS
|
||||
return UpdateServiceStatus(**data)
|
||||
|
||||
|
||||
@app.get("/system/metrics", response_model=SystemMetrics, dependencies=[Depends(get_current_admin)])
|
||||
def system_metrics_status() -> SystemMetrics:
|
||||
data = system_metrics.get_system_metrics()
|
||||
return SystemMetrics(**data)
|
||||
|
||||
|
||||
@app.get("/", response_class=HTMLResponse)
|
||||
@app.get("/login", response_class=HTMLResponse)
|
||||
@app.get("/dashboard", response_class=HTMLResponse)
|
||||
|
||||
@ -82,3 +82,14 @@ class UpdateServiceStatus(BaseModel):
|
||||
error: Optional[str] = None
|
||||
checked_url: str
|
||||
environment: str
|
||||
|
||||
|
||||
class SystemMetrics(BaseModel):
|
||||
cpu_percent: float
|
||||
ram_total_mb: float
|
||||
ram_used_percent: float
|
||||
gpu_vram_total_mb: Optional[float] = None
|
||||
gpu_vram_used_percent: Optional[float] = None
|
||||
gpu_present: bool = False
|
||||
net_rx_mbps: float
|
||||
net_tx_mbps: float
|
||||
|
||||
139
backend/system_metrics.py
Normal file
139
backend/system_metrics.py
Normal file
@ -0,0 +1,139 @@
|
||||
import time
|
||||
import shutil
|
||||
import subprocess
|
||||
from typing import Any, Dict, Optional, Tuple
|
||||
|
||||
_last_cpu: Optional[Tuple[float, float]] = None
|
||||
_last_net: Optional[Tuple[float, float, float]] = None
|
||||
|
||||
|
||||
def _read_cpu_times() -> Tuple[float, float]:
|
||||
with open("/proc/stat", "r", encoding="utf-8") as handle:
|
||||
line = handle.readline()
|
||||
parts = line.strip().split()
|
||||
if not parts or parts[0] != "cpu":
|
||||
return 0.0, 0.0
|
||||
values = [float(p) for p in parts[1:]]
|
||||
total = sum(values)
|
||||
idle = values[3] if len(values) > 3 else 0.0
|
||||
return total, idle
|
||||
|
||||
|
||||
def _cpu_percent() -> float:
|
||||
global _last_cpu
|
||||
total, idle = _read_cpu_times()
|
||||
if _last_cpu is None:
|
||||
_last_cpu = (total, idle)
|
||||
return 0.0
|
||||
last_total, last_idle = _last_cpu
|
||||
_last_cpu = (total, idle)
|
||||
delta_total = total - last_total
|
||||
delta_idle = idle - last_idle
|
||||
if delta_total <= 0:
|
||||
return 0.0
|
||||
return max(0.0, min(100.0, (delta_total - delta_idle) / delta_total * 100.0))
|
||||
|
||||
|
||||
def _read_meminfo() -> Dict[str, float]:
|
||||
data: Dict[str, float] = {}
|
||||
with open("/proc/meminfo", "r", encoding="utf-8") as handle:
|
||||
for line in handle:
|
||||
key, value = line.split(":", 1)
|
||||
parts = value.strip().split()
|
||||
if not parts:
|
||||
continue
|
||||
data[key] = float(parts[0])
|
||||
return data
|
||||
|
||||
|
||||
def _read_net_bytes() -> Tuple[float, float]:
|
||||
rx_total = 0.0
|
||||
tx_total = 0.0
|
||||
with open("/proc/net/dev", "r", encoding="utf-8") as handle:
|
||||
for line in handle:
|
||||
if ":" not in line:
|
||||
continue
|
||||
iface, stats = line.split(":", 1)
|
||||
iface = iface.strip()
|
||||
if iface == "lo":
|
||||
continue
|
||||
fields = stats.split()
|
||||
if len(fields) < 16:
|
||||
continue
|
||||
rx_total += float(fields[0])
|
||||
tx_total += float(fields[8])
|
||||
return rx_total, tx_total
|
||||
|
||||
|
||||
def _net_mbps() -> Tuple[float, float]:
|
||||
global _last_net
|
||||
now = time.time()
|
||||
rx, tx = _read_net_bytes()
|
||||
if _last_net is None:
|
||||
_last_net = (now, rx, tx)
|
||||
return 0.0, 0.0
|
||||
last_time, last_rx, last_tx = _last_net
|
||||
_last_net = (now, rx, tx)
|
||||
delta_t = now - last_time
|
||||
if delta_t <= 0:
|
||||
return 0.0, 0.0
|
||||
rx_mbps = (rx - last_rx) * 8.0 / (delta_t * 1_000_000.0)
|
||||
tx_mbps = (tx - last_tx) * 8.0 / (delta_t * 1_000_000.0)
|
||||
return max(0.0, rx_mbps), max(0.0, tx_mbps)
|
||||
|
||||
|
||||
def _gpu_metrics() -> Dict[str, Any]:
|
||||
if not shutil.which("nvidia-smi"):
|
||||
return {
|
||||
"gpu_vram_total_mb": None,
|
||||
"gpu_vram_used_percent": None,
|
||||
"gpu_present": False,
|
||||
}
|
||||
try:
|
||||
output = subprocess.check_output(
|
||||
[
|
||||
"nvidia-smi",
|
||||
"--query-gpu=memory.total,memory.used",
|
||||
"--format=csv,noheader,nounits",
|
||||
],
|
||||
text=True,
|
||||
).strip()
|
||||
if not output:
|
||||
raise ValueError("empty nvidia-smi output")
|
||||
total_str, used_str = output.split(",", 1)
|
||||
total_mb = float(total_str.strip())
|
||||
used_mb = float(used_str.strip())
|
||||
used_percent = 0.0 if total_mb == 0 else used_mb / total_mb * 100.0
|
||||
return {
|
||||
"gpu_vram_total_mb": total_mb,
|
||||
"gpu_vram_used_percent": used_percent,
|
||||
"gpu_present": True,
|
||||
}
|
||||
except Exception:
|
||||
return {
|
||||
"gpu_vram_total_mb": None,
|
||||
"gpu_vram_used_percent": None,
|
||||
"gpu_present": False,
|
||||
}
|
||||
|
||||
|
||||
def get_system_metrics() -> Dict[str, Any]:
|
||||
meminfo = _read_meminfo()
|
||||
total_kb = meminfo.get("MemTotal", 0.0)
|
||||
available_kb = meminfo.get("MemAvailable", 0.0)
|
||||
used_kb = max(0.0, total_kb - available_kb)
|
||||
ram_total_mb = total_kb / 1024.0
|
||||
ram_used_percent = 0.0 if total_kb == 0 else used_kb / total_kb * 100.0
|
||||
|
||||
cpu_percent = _cpu_percent()
|
||||
rx_mbps, tx_mbps = _net_mbps()
|
||||
gpu = _gpu_metrics()
|
||||
|
||||
return {
|
||||
"cpu_percent": cpu_percent,
|
||||
"ram_total_mb": ram_total_mb,
|
||||
"ram_used_percent": ram_used_percent,
|
||||
"net_rx_mbps": rx_mbps,
|
||||
"net_tx_mbps": tx_mbps,
|
||||
**gpu,
|
||||
}
|
||||
@ -95,6 +95,30 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- System Information Section -->
|
||||
<section id="systemSection" class="panel-section hidden">
|
||||
<h3><i data-lucide="monitor"></i> System Information</h3>
|
||||
<div class="metrics" id="systemMetrics">
|
||||
<div class="metric-card" id="metricCpu">
|
||||
<div class="label"><i data-lucide="cpu"></i> CPU</div>
|
||||
<div class="value">-</div>
|
||||
</div>
|
||||
<div class="metric-card" id="metricRam">
|
||||
<div class="label"><i data-lucide="memory-stick"></i> RAM</div>
|
||||
<div class="value">-</div>
|
||||
</div>
|
||||
<div class="metric-card" id="metricGpu">
|
||||
<div class="label"><i data-lucide="monitor"></i> GPU</div>
|
||||
<div class="value">-</div>
|
||||
</div>
|
||||
<div class="metric-card" id="metricNet">
|
||||
<div class="label"><i data-lucide="network"></i> Netzwerk</div>
|
||||
<div class="value">-</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-muted" style="font-size: 0.75rem; margin-top: 0.5rem;">Aktualisierung alle 5 Sekunden.</div>
|
||||
</section>
|
||||
|
||||
<!-- User Management Section -->
|
||||
<section id="userSection" class="panel-section hidden">
|
||||
<h3><i data-lucide="users"></i> Nutzerverwaltung</h3>
|
||||
@ -326,14 +350,24 @@
|
||||
showApp();
|
||||
document.getElementById('userSection').classList.remove('hidden');
|
||||
document.getElementById('updateSection').classList.remove('hidden');
|
||||
document.getElementById('systemSection').classList.remove('hidden');
|
||||
await refreshUsers();
|
||||
await refreshUpdateStatus();
|
||||
await refreshSystemMetrics();
|
||||
if (!window.systemMetricsTimer) {
|
||||
window.systemMetricsTimer = setInterval(refreshSystemMetrics, 5000);
|
||||
}
|
||||
return true;
|
||||
} catch (err) {
|
||||
document.getElementById('currentUser').textContent = 'Nicht angemeldet';
|
||||
showLanding();
|
||||
document.getElementById('userSection').classList.add('hidden');
|
||||
document.getElementById('updateSection').classList.add('hidden');
|
||||
document.getElementById('systemSection').classList.add('hidden');
|
||||
if (window.systemMetricsTimer) {
|
||||
clearInterval(window.systemMetricsTimer);
|
||||
window.systemMetricsTimer = null;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -513,6 +547,29 @@
|
||||
}
|
||||
}
|
||||
|
||||
async function refreshSystemMetrics() {
|
||||
try {
|
||||
const data = await api('/system/metrics');
|
||||
document.querySelector('#metricCpu .value').textContent = `${data.cpu_percent.toFixed(1)}%`;
|
||||
const ramGb = data.ram_total_mb / 1024.0;
|
||||
document.querySelector('#metricRam .value').textContent = `${data.ram_used_percent.toFixed(1)}% (${ramGb.toFixed(1)} GB)`;
|
||||
if (data.gpu_present && data.gpu_vram_total_mb) {
|
||||
const gpuGb = data.gpu_vram_total_mb / 1024.0;
|
||||
const gpuPct = data.gpu_vram_used_percent ?? 0;
|
||||
document.querySelector('#metricGpu .value').textContent = `${gpuPct.toFixed(1)}% (${gpuGb.toFixed(1)} GB)`;
|
||||
} else {
|
||||
document.querySelector('#metricGpu .value').textContent = 'Nicht verfuegbar';
|
||||
}
|
||||
document.querySelector('#metricNet .value').textContent = `${data.net_rx_mbps.toFixed(1)} / ${data.net_tx_mbps.toFixed(1)} Mbps`;
|
||||
lucide.createIcons();
|
||||
} catch (err) {
|
||||
document.querySelector('#metricCpu .value').textContent = 'Fehler';
|
||||
document.querySelector('#metricRam .value').textContent = 'Fehler';
|
||||
document.querySelector('#metricGpu .value').textContent = 'Fehler';
|
||||
document.querySelector('#metricNet .value').textContent = 'Fehler';
|
||||
}
|
||||
}
|
||||
|
||||
// Event listeners
|
||||
document.getElementById('loginForm').addEventListener('submit', async (e) => {
|
||||
e.preventDefault();
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: DOC_000012 | Version: 0.2.1 | Status: Draft
|
||||
ID: DOC_000012 | Version: 0.2.2 | Status: Draft
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# Architektur
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: DOC_000011 | Version: 0.2.1 | Status: Draft
|
||||
ID: DOC_000011 | Version: 0.2.2 | Status: Draft
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# Konfiguration
|
||||
@ -6,7 +6,8 @@ By: Codex (GPT-5)
|
||||
## Speicherort
|
||||
Die Konfiguration erfolgt per ENV-Dateien:
|
||||
- `/etc/skd/env` (Core-App, Vorlage: `env.example`)
|
||||
- `/etc/skd/update.env` (Update-Service, Vorlage: `env.update.example`)
|
||||
- `/etc/skd/update.env` (Update-Service fuer Laufzeit, Vorlage: `env.update.example`)
|
||||
- `update-addon.env` (lokal fuer Upload/Enrollment, Vorlage: `update-addon.env.example`)
|
||||
|
||||
## Authentifizierung
|
||||
- `SKD_AUTH_MODE` (default `pam`): `pam` oder `oidc`. Ungueltige Werte fallen auf `pam` zurueck. Hinweis: Der Wert wird aktuell nicht zur Erzwingung genutzt; OIDC ist aktiv, sobald die OIDC-Variablen gesetzt sind.
|
||||
@ -67,6 +68,8 @@ Hinweis: OIDC ist aktiv, sobald Issuer, Client-ID und Secret gesetzt sind.
|
||||
- `SKD_UPDATE_STATUS_FILE` (default `/var/lib/skd/update_status.json`)
|
||||
- `SKD_UPDATE_LOG_FILE` (default `/var/lib/skd/update_logs.jsonl`)
|
||||
- `SKD_UPDATE_INTERVAL` (default `3600`): Hinweis: wird aktuell nur eingelesen, aber nicht automatisch genutzt.
|
||||
- `SKD_UPDATE_UPLOAD_TOKEN` (optional; fuer Release-Upload)
|
||||
- `SKD_UPDATE_UPLOAD_TOKEN_FILE` (optional; z.B. `/etc/skd/update.upload.token`)
|
||||
|
||||
## Dry-Run
|
||||
- `SKD_DRY_RUN` (default `false`): Keine echten System-Aktionen, nur Logging.
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: DOC_000014 | Version: 0.2.1 | Status: Draft
|
||||
ID: DOC_000014 | Version: 0.2.2 | Status: Draft
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# Deployment
|
||||
@ -94,13 +94,31 @@ Hinweis: Der Update-Check ist erst moeglich, wenn der Langzeit-Token gespeichert
|
||||
Enrollment-Tools:
|
||||
- `scripts/manual_enroll.py`: Enrollment direkt gegen den Update-Service, schreibt Token in `SKD_UPDATE_TOKEN_FILE`.
|
||||
- `scripts/enroll_local.py`: Enrollment ueber die lokale API (`/update/enroll`), benoetigt Admin-Session; `--token` setzen (Default-Token ist nur Prototyp-Altlast).
|
||||
- `scripts/enroll_update_service.sh`: Holt den Langzeit-Token per curl vom Update-Service (liest `/etc/skd/env`).
|
||||
- `scripts/enroll_update_service.sh`: Holt den Langzeit-Token per curl vom Update-Service (liest `update-addon.env`).
|
||||
|
||||
Beispiel (curl-Script):
|
||||
```bash
|
||||
sudo ./scripts/enroll_update_service.sh --enroll-token "enroll_example"
|
||||
```
|
||||
|
||||
## Release-Upload (Dev/Prod)
|
||||
Fuer Dev/Prod Uploads kann ein Release-Archiv (tar.gz) automatisiert gebaut und hochgeladen werden.
|
||||
|
||||
Beispiel:
|
||||
```bash
|
||||
./scripts/upload_release.sh --profile dev
|
||||
```
|
||||
|
||||
Token-Quelle:
|
||||
- `update-addon.env` (z.B. `DEV_UPDATE_UPLOAD_TOKEN_FILE=./upload.token`).
|
||||
|
||||
## Lokale update-addon.env
|
||||
Fuer lokale Tests kann eine `update-addon.env` im Repo genutzt werden (gitignored).
|
||||
Beispiel:
|
||||
```bash
|
||||
cp update-addon.env.example update-addon.env
|
||||
```
|
||||
|
||||
Lokale Status/Logs:
|
||||
- `SKD_UPDATE_STATUS_FILE` (default `/var/lib/skd/update_status.json`)
|
||||
- `SKD_UPDATE_LOG_FILE` (default `/var/lib/skd/update_logs.jsonl`)
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: DOC_000013 | Version: 0.2.1 | Status: Draft
|
||||
ID: DOC_000013 | Version: 0.2.2 | Status: Draft
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# Development
|
||||
@ -23,6 +23,20 @@ Standard: `0.0.0.0:80`. Fuer andere Ports:
|
||||
HOST=127.0.0.1 PORT=8000 ./scripts/run.sh
|
||||
```
|
||||
|
||||
## Release-Upload (Dev/Prod)
|
||||
Das Update-Artefakt wird als tar.gz gebaut und ueber den Update-Service hochgeladen.
|
||||
Das Script nutzt `VERSION` und laedt ein vollstaendiges Release (kein Delta).
|
||||
|
||||
Vorbereitung:
|
||||
```bash
|
||||
cp update-addon.env.example update-addon.env
|
||||
```
|
||||
|
||||
Beispiel (Dev):
|
||||
```bash
|
||||
./scripts/upload_release.sh --profile dev
|
||||
```
|
||||
|
||||
## Tests und Lint
|
||||
Im Repo sind keine automatisierten Tests enthalten. Verfuegbare Checks:
|
||||
- Bash-Syntax: `bash -n sk.sh`
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: DOC_000015 | Version: 0.2.1 | Status: Draft
|
||||
ID: DOC_000015 | Version: 0.2.2 | Status: Draft
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# FAQ
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: DOC_000017 | Version: 0.2.1 | Status: Draft
|
||||
ID: DOC_000017 | Version: 0.2.2 | Status: Draft
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# Fuer Nutzerinnen und Nutzer
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: DOC_000009 | Version: 0.2.1 | Status: Draft
|
||||
ID: DOC_000009 | Version: 0.2.2 | Status: Draft
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# Getting Started
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: DOC_000016 | Version: 0.2.1 | Status: Draft
|
||||
ID: DOC_000016 | Version: 0.2.2 | Status: Draft
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# Troubleshooting
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: DOC_000010 | Version: 0.2.1 | Status: Draft
|
||||
ID: DOC_000010 | Version: 0.2.2 | Status: Draft
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# Usage
|
||||
@ -61,6 +61,9 @@ Alle Update-Endpunkte erfordern Admin-Auth.
|
||||
- `POST /update/rollback`
|
||||
- `GET /update/logs?limit=200`
|
||||
|
||||
### System-API (lokal)
|
||||
- `GET /system/metrics` (CPU %, RAM, GPU VRAM, Netzwerk Mbps)
|
||||
|
||||
Beispiel (Enrollment):
|
||||
```bash
|
||||
ENROLL_TOKEN="example-enroll-token"
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: DOC_000006 | Version: 0.2.1 | Status: Draft
|
||||
ID: DOC_000006 | Version: 0.2.2 | Status: Draft
|
||||
Archived – superseded by new documentation.
|
||||
By: Codex (GPT-5)
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: DOC_000008 | Version: 0.2.1 | Status: Draft
|
||||
ID: DOC_000008 | Version: 0.2.2 | Status: Draft
|
||||
Archived – superseded by new documentation.
|
||||
|
||||
# Client Quickstart
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: DOC_000003 | Version: 0.2.1 | Status: Draft
|
||||
ID: DOC_000003 | Version: 0.2.2 | Status: Draft
|
||||
Archived – superseded by new documentation.
|
||||
By: Codex (GPT-5)
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: DOC_000005 | Version: 0.2.1 | Status: Draft
|
||||
ID: DOC_000005 | Version: 0.2.2 | Status: Draft
|
||||
Archived – superseded by new documentation.
|
||||
By: Codex (GPT-5)
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: DOC_000006 | Version: 0.2.1 | Status: Draft
|
||||
ID: DOC_000006 | Version: 0.2.2 | Status: Draft
|
||||
Archived – superseded by new documentation.
|
||||
By: Codex (GPT-5)
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: DOC_000004 | Version: 0.2.1 | Status: Draft
|
||||
ID: DOC_000004 | Version: 0.2.2 | Status: Draft
|
||||
Archived – superseded by new documentation.
|
||||
By: Codex (GPT-5)
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: DOC_000005 | Version: 0.2.1 | Status: Draft
|
||||
ID: DOC_000005 | Version: 0.2.2 | Status: Draft
|
||||
Archived – superseded by new documentation.
|
||||
By: Codex (GPT-5)
|
||||
|
||||
|
||||
@ -7,3 +7,5 @@ SKD_UPDATE_TOKEN_FILE=/var/lib/skd/update_token
|
||||
SKD_UPDATE_INTERVAL=3600
|
||||
SKD_UPDATE_STATUS_FILE=/var/lib/skd/update_status.json
|
||||
SKD_UPDATE_LOG_FILE=/var/lib/skd/update_logs.jsonl
|
||||
SKD_UPDATE_UPLOAD_TOKEN=
|
||||
SKD_UPDATE_UPLOAD_TOKEN_FILE=/etc/skd/update.upload.token
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: AGENTS_000001 | Version: 0.2.1 | Status: Draft
|
||||
ID: AGENTS_000001 | Version: 0.2.2 | Status: Draft
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# Repository Guidelines
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: STATUS_000001 | Version: 0.2.1 | Status: Final
|
||||
ID: STATUS_000001 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# Projekt-Status
|
||||
@ -113,11 +113,15 @@ Sicheres, remote steuerbares System zum Sperren/Entsperren lokaler Nutzerkonten.
|
||||
- [x] TASK_000055: Endpoint und UI fuer Update-Service Status
|
||||
- [x] US_000047: Update-Config auslagern
|
||||
- [x] TASK_000056: Update-ENV separieren
|
||||
- [x] US_000048: Release-Upload automatisieren
|
||||
- [x] TASK_000057: Script fuer Release-Upload erstellen
|
||||
- [x] US_000049: Lokale deployment.env fuer Update-Uploads
|
||||
- [x] TASK_000058: deployment.env Beispiel und Script-Anpassungen
|
||||
|
||||
### EPIC_000009: Update Webservice (External Team)
|
||||
- [ ] US_000026: Client bezieht Updates (Pull)
|
||||
- [ ] US_000027: Client verifiziert und wendet Updates an
|
||||
- [ ] US_000028: Client meldet Update-Status
|
||||
- [x] US_000026: Client bezieht Updates (Pull)
|
||||
- [x] US_000027: Client verifiziert und wendet Updates an
|
||||
- [x] US_000028: Client meldet Update-Status
|
||||
|
||||
### EPIC_000010: Update-Service v1 Migration (Major Release)
|
||||
- [x] US_000034: Enrollment fuer Langzeit-Token
|
||||
@ -144,9 +148,9 @@ Sicheres, remote steuerbares System zum Sperren/Entsperren lokaler Nutzerkonten.
|
||||
- [x] TASK_000048: External Dependencies und Audience-Ergaenzungen
|
||||
|
||||
### EPIC_000013: System Telemetry im Dashboard
|
||||
- [ ] US_000044: Systemmetriken im Dashboard anzeigen
|
||||
- [ ] TASK_000050: Backend-Endpoint fuer Systemmetriken
|
||||
- [ ] TASK_000051: UI-Kacheln im Dashboard (System Information)
|
||||
- [x] US_000044: Systemmetriken im Dashboard anzeigen
|
||||
- [x] TASK_000050: Backend-Endpoint fuer Systemmetriken
|
||||
- [x] TASK_000051: UI-Kacheln im Dashboard (System Information)
|
||||
|
||||
### EPIC_000014: Login-Zeitfenster und Parent-Control Regeln
|
||||
- [ ] US_000045: Regeln fuer Login-Zeitfenster definieren und durchsetzen
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: PROJECT_STATUS_TEMPLATE | Version: 0.2.1 | Status: Draft
|
||||
ID: PROJECT_STATUS_TEMPLATE | Version: 0.2.2 | Status: Draft
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# 📊 Projekt-Status (Template)
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: SOP_000001 | Version: 0.2.1 | Status: Draft
|
||||
ID: SOP_000001 | Version: 0.2.2 | Status: Draft
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# Onboarding: Arbeitsweise im Sound Architect Projekt
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: SETUP_000005 | Version: 0.2.1 | Status: Draft
|
||||
ID: SETUP_000005 | Version: 0.2.2 | Status: Draft
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# 🧬 SETUP_GUIDE: Phase 0 - Project Genesis
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: PROMPT_000008 | Version: 0.2.1 | Status: Draft
|
||||
ID: PROMPT_000008 | Version: 0.2.2 | Status: Draft
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# Requirements Engineer Prompt
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: EPIC_000001 | Version: 0.2.1 | Status: Final
|
||||
ID: EPIC_000001 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# EPIC_000001: Legacy CLI Account Control (sk.sh)
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: EPIC_000002 | Version: 0.2.1 | Status: Final
|
||||
ID: EPIC_000002 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# EPIC_000002: Backend API Service
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: EPIC_000003 | Version: 0.2.1 | Status: Final
|
||||
ID: EPIC_000003 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# EPIC_000003: Authentication & Sessions
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: EPIC_000004 | Version: 0.2.1 | Status: Final
|
||||
ID: EPIC_000004 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# EPIC_000004: Web UI
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: EPIC_000005 | Version: 0.2.1 | Status: Final
|
||||
ID: EPIC_000005 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# EPIC_000005: Automation Scripts
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: EPIC_000006 | Version: 0.2.1 | Status: Final
|
||||
ID: EPIC_000006 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# EPIC_000006: Systemd & Deployment Artifacts
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: EPIC_000007 | Version: 0.2.1 | Status: Final
|
||||
ID: EPIC_000007 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# EPIC_000007: Documentation & Runbook
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: EPIC_000008 | Version: 0.2.1 | Status: Draft
|
||||
ID: EPIC_000008 | Version: 0.2.2 | Status: Draft
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# EPIC_000008: Client-Side Update Mechanism
|
||||
@ -46,3 +46,5 @@ Ermoegliche einen robusten Client-Update-Flow mit Verifikation und Rollback.
|
||||
- US_000033: Rollback im Web-UI anstossen
|
||||
- US_000043: Enrollment-Token per Script abrufen
|
||||
- US_000046: Update-Service Erreichbarkeit anzeigen
|
||||
- US_000048: Release-Upload automatisieren
|
||||
- US_000049: Lokale deployment.env fuer Update-Uploads
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: EPIC_000009 | Version: 0.2.1 | Status: Draft
|
||||
ID: EPIC_000009 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# EPIC_000009: Update Webservice (External Team)
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: EPIC_000010 | Version: 0.2.1 | Status: Done
|
||||
ID: EPIC_000010 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# EPIC_000010: Update-Service v1 Migration (Major Release)
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: EPIC_000011 | Version: 0.2.1 | Status: Done
|
||||
ID: EPIC_000011 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# EPIC_000011: Documentation and Configuration Alignment
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: EPIC_000012 | Version: 0.2.1 | Status: Done
|
||||
ID: EPIC_000012 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# EPIC_000012: Dokumentations-Overhaul
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: EPIC_000013 | Version: 0.2.1 | Status: Draft
|
||||
ID: EPIC_000013 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# EPIC_000013: System Telemetry im Dashboard
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: EPIC_000014 | Version: 0.2.1 | Status: Draft
|
||||
ID: EPIC_000014 | Version: 0.2.2 | Status: Draft
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# EPIC_000014: Login-Zeitfenster und Parent-Control Regeln
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000001 | Version: 0.2.1 | Status: Final
|
||||
ID: US_000001 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000001: Nutzerkonto per CLI deaktivieren
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000002 | Version: 0.2.1 | Status: Final
|
||||
ID: US_000002 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000002: Nutzerkonto per CLI aktivieren
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000003 | Version: 0.2.1 | Status: Final
|
||||
ID: US_000003 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000003: Health-Status abfragen
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000004 | Version: 0.2.1 | Status: Final
|
||||
ID: US_000004 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000004: Verfuegbare Nutzer auflisten
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000005 | Version: 0.2.1 | Status: Final
|
||||
ID: US_000005 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000005: Nutzer per API deaktivieren
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000006 | Version: 0.2.1 | Status: Final
|
||||
ID: US_000006 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000006: Nutzer per API aktivieren
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000007 | Version: 0.2.1 | Status: Final
|
||||
ID: US_000007 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000007: PAM-Login mit Token
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000008 | Version: 0.2.1 | Status: Final
|
||||
ID: US_000008 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000008: OIDC-Login Flow
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000009 | Version: 0.2.1 | Status: Final
|
||||
ID: US_000009 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000009: Autorisierung und /me-Identitaet
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000010 | Version: 0.2.1 | Status: Final
|
||||
ID: US_000010 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000010: Index-Seite ausliefern
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000011 | Version: 0.2.1 | Status: Final
|
||||
ID: US_000011 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000011: Virtualenv und Abhaengigkeiten erstellen
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000012 | Version: 0.2.1 | Status: Final
|
||||
ID: US_000012 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000012: Service lokal starten
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000013 | Version: 0.2.1 | Status: Final
|
||||
ID: US_000013 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000013: Service installieren
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000014 | Version: 0.2.1 | Status: Final
|
||||
ID: US_000014 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000014: Service aktualisieren
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000015 | Version: 0.2.1 | Status: Final
|
||||
ID: US_000015 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000015: Remote-Deployment durchfuehren
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000016 | Version: 0.2.1 | Status: Final
|
||||
ID: US_000016 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000016: OIDC-Client registrieren
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000017 | Version: 0.2.1 | Status: Final
|
||||
ID: US_000017 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000017: Systemd-Unit im Repo
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000018 | Version: 0.2.1 | Status: Final
|
||||
ID: US_000018 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000018: Konfigurations-Templates verfuegbar
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000019 | Version: 0.2.1 | Status: Final
|
||||
ID: US_000019 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000019: Deployment-Archiv vorhanden
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000020 | Version: 0.2.1 | Status: Final
|
||||
ID: US_000020 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000020: Makefile-Automation bereitstellen
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000021 | Version: 0.2.1 | Status: Final
|
||||
ID: US_000021 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000021: Konfiguration per ENV steuern
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000022 | Version: 0.2.1 | Status: Final
|
||||
ID: US_000022 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000022: Web-UI Aktionen ausfuehren
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000023 | Version: 0.2.1 | Status: Final
|
||||
ID: US_000023 | Version: 0.2.2 | Status: Final
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000023: Runbook und Security-Hinweise dokumentieren
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000024 | Version: 0.2.1 | Status: Done
|
||||
ID: US_000024 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000024: Watchtower Theme fuer Web-UI
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000025 | Version: 0.2.1 | Status: Draft
|
||||
ID: US_000025 | Version: 0.2.2 | Status: Draft
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000025: OIDC End-to-End Validierung und Runbook
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000026 | Version: 0.2.1 | Status: Done
|
||||
ID: US_000026 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000026: Client bezieht Updates (Pull)
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000027 | Version: 0.2.1 | Status: Done
|
||||
ID: US_000027 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000027: Client verifiziert und wendet Updates an
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000028 | Version: 0.2.1 | Status: Done
|
||||
ID: US_000028 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000028: Client meldet Update-Status
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000029 | Version: 0.2.1 | Status: Done
|
||||
ID: US_000029 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000029: Update-Status im Web-UI anzeigen
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000030 | Version: 0.2.1 | Status: Done
|
||||
ID: US_000030 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000030: Update-Check im Web-UI ausloesen
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000031 | Version: 0.2.1 | Status: Done
|
||||
ID: US_000031 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000031: Update im Web-UI anstossen
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000032 | Version: 0.2.1 | Status: Done
|
||||
ID: US_000032 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000032: Update-Logs im Web-UI anzeigen
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000033 | Version: 0.2.1 | Status: Done
|
||||
ID: US_000033 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000033: Rollback im Web-UI anstossen
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000034 | Version: 0.2.1 | Status: Done
|
||||
ID: US_000034 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000034: Enrollment fuer Langzeit-Token
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000035 | Version: 0.2.1 | Status: Done
|
||||
ID: US_000035 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000035: v1 Update-Endpoints und Status-Schema
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000036 | Version: 0.2.1 | Status: Done
|
||||
ID: US_000036 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000036: Doku-Versionen auf VERSION synchronisieren
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000037 | Version: 0.2.1 | Status: Done
|
||||
ID: US_000037 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000037: Update-API-Doku mit /update/enroll abgleichen
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000038 | Version: 0.2.1 | Status: Done
|
||||
ID: US_000038 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000038: ENV-Beispiele und Healthcheck-Auth angleichen
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000039 | Version: 0.2.1 | Status: Done
|
||||
ID: US_000039 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000039: Doku-Audit fuer verbleibende Abweichungen
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000040 | Version: 0.2.1 | Status: Done
|
||||
ID: US_000040 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000040: Doku-Struktur und Inhalte erstellen
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000041 | Version: 0.2.1 | Status: Done
|
||||
ID: US_000041 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000041: Einbindung externer Services dokumentieren
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000042 | Version: 0.2.1 | Status: Done
|
||||
ID: US_000042 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000042: Consumer-Perspektive und Audience-Split ergaenzen
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000043 | Version: 0.2.1 | Status: Done
|
||||
ID: US_000043 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000043: Enrollment-Token per Script abrufen
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000044 | Version: 0.2.1 | Status: Draft
|
||||
ID: US_000044 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000044: Systemmetriken im Dashboard anzeigen
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000045 | Version: 0.2.1 | Status: Draft
|
||||
ID: US_000045 | Version: 0.2.2 | Status: Draft
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000045: Regeln fuer Login-Zeitfenster definieren und durchsetzen
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000046 | Version: 0.2.1 | Status: Done
|
||||
ID: US_000046 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000046: Update-Service Erreichbarkeit anzeigen
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: US_000047 | Version: 0.2.1 | Status: Done
|
||||
ID: US_000047 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000047: Update-Config auslagern
|
||||
|
||||
17
project-management/requirements/stories/US_000048.md
Normal file
17
project-management/requirements/stories/US_000048.md
Normal file
@ -0,0 +1,17 @@
|
||||
ID: US_000048 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000048: Release-Upload automatisieren
|
||||
|
||||
Als Admin moechte ich das Erstellen des Release-Archivs und den Upload zum Update-Service
|
||||
automatisieren, damit Dev/Prod Releases reproduzierbar und fehlerarm erstellt werden.
|
||||
|
||||
## Akzeptanzkriterien
|
||||
- Given eine gueltige VERSION
|
||||
- When das Upload-Script ausgefuehrt wird
|
||||
- Then wird ein tar.gz Archiv erzeugt (vollstaendiges Release)
|
||||
- And der Upload erfolgt gegen die konfigurierte Update-Service URL
|
||||
- And Dev/Prod kann ueber URL oder Parameter unterschieden werden
|
||||
|
||||
## Task-Platzhalter
|
||||
- TASK_000057: Script fuer Release-Upload erstellen und dokumentieren
|
||||
16
project-management/requirements/stories/US_000049.md
Normal file
16
project-management/requirements/stories/US_000049.md
Normal file
@ -0,0 +1,16 @@
|
||||
ID: US_000049 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# US_000049: Lokale deployment.env fuer Update-Uploads
|
||||
|
||||
Als Admin moechte ich eine lokale deployment.env nutzen, um Update-Service Parameter
|
||||
und Tokens fuer Dev/Prod Tests zu konfigurieren, ohne /etc/skd/ zu verwenden.
|
||||
|
||||
## Akzeptanzkriterien
|
||||
- Given ich arbeite lokal im Repo
|
||||
- When ich ein Update-Artefakt hochlade oder Enrollment teste
|
||||
- Then kann ich eine deployment.env als Quelle fuer Update-Variablen nutzen
|
||||
- And die Datei ist nicht Teil des Repos (lokal, gitignored)
|
||||
|
||||
## Task-Platzhalter
|
||||
- TASK_000058: deployment.env Beispiel und Script-Anpassungen
|
||||
@ -1,4 +1,4 @@
|
||||
ID: TASK_000025 | Version: 0.2.1 | Status: Blocked
|
||||
ID: TASK_000025 | Version: 0.2.2 | Status: Blocked
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# TASK_000025: OIDC E2E validation
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: TASK_000026 | Version: 0.2.1 | Status: Blocked
|
||||
ID: TASK_000026 | Version: 0.2.2 | Status: Blocked
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# TASK_000026: OIDC runbook update
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: TASK_000027 | Version: 0.2.1 | Status: Done
|
||||
ID: TASK_000027 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# TASK_000027: Update endpoint config
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: TASK_000028 | Version: 0.2.1 | Status: Done
|
||||
ID: TASK_000028 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# TASK_000028: Verify and apply update
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: TASK_000029 | Version: 0.2.1 | Status: Done
|
||||
ID: TASK_000029 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# TASK_000029: Report update status
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
ID: TASK_000030 | Version: 0.2.1 | Status: Done
|
||||
ID: TASK_000030 | Version: 0.2.2 | Status: Done
|
||||
By: Codex (GPT-5)
|
||||
|
||||
# TASK_000030: UI update status view
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user