release: 0.2.2
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@ -3,6 +3,7 @@ __pycache__/
|
|||||||
*$py.class
|
*$py.class
|
||||||
.venv/
|
.venv/
|
||||||
upload.token
|
upload.token
|
||||||
|
update-addon.env
|
||||||
venv/
|
venv/
|
||||||
ENV/
|
ENV/
|
||||||
.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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# Projekt-Logbuch (Changelog)
|
# 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 | 🏗️ 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: 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 | ⚙️ 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) |
|
| 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# Safe Kiddo Daemon
|
# Safe Kiddo Daemon
|
||||||
|
|||||||
@ -28,11 +28,13 @@ from backend.models import (
|
|||||||
UpdateLogEntry,
|
UpdateLogEntry,
|
||||||
UpdateServiceStatus,
|
UpdateServiceStatus,
|
||||||
UpdateStatus,
|
UpdateStatus,
|
||||||
|
SystemMetrics,
|
||||||
UserStatus,
|
UserStatus,
|
||||||
)
|
)
|
||||||
from backend.oidc import OIDCClient, OIDCError
|
from backend.oidc import OIDCClient, OIDCError
|
||||||
from backend.settings import Settings, get_settings
|
from backend.settings import Settings, get_settings
|
||||||
from backend import update
|
from backend import update
|
||||||
|
from backend import system_metrics
|
||||||
|
|
||||||
logging.basicConfig(
|
logging.basicConfig(
|
||||||
level=logging.INFO,
|
level=logging.INFO,
|
||||||
@ -321,6 +323,12 @@ def update_service_status(settings: Settings = Depends(get_settings)) -> UpdateS
|
|||||||
return UpdateServiceStatus(**data)
|
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("/", response_class=HTMLResponse)
|
||||||
@app.get("/login", response_class=HTMLResponse)
|
@app.get("/login", response_class=HTMLResponse)
|
||||||
@app.get("/dashboard", response_class=HTMLResponse)
|
@app.get("/dashboard", response_class=HTMLResponse)
|
||||||
|
|||||||
@ -82,3 +82,14 @@ class UpdateServiceStatus(BaseModel):
|
|||||||
error: Optional[str] = None
|
error: Optional[str] = None
|
||||||
checked_url: str
|
checked_url: str
|
||||||
environment: 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>
|
||||||
</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 -->
|
<!-- User Management Section -->
|
||||||
<section id="userSection" class="panel-section hidden">
|
<section id="userSection" class="panel-section hidden">
|
||||||
<h3><i data-lucide="users"></i> Nutzerverwaltung</h3>
|
<h3><i data-lucide="users"></i> Nutzerverwaltung</h3>
|
||||||
@ -326,14 +350,24 @@
|
|||||||
showApp();
|
showApp();
|
||||||
document.getElementById('userSection').classList.remove('hidden');
|
document.getElementById('userSection').classList.remove('hidden');
|
||||||
document.getElementById('updateSection').classList.remove('hidden');
|
document.getElementById('updateSection').classList.remove('hidden');
|
||||||
|
document.getElementById('systemSection').classList.remove('hidden');
|
||||||
await refreshUsers();
|
await refreshUsers();
|
||||||
await refreshUpdateStatus();
|
await refreshUpdateStatus();
|
||||||
|
await refreshSystemMetrics();
|
||||||
|
if (!window.systemMetricsTimer) {
|
||||||
|
window.systemMetricsTimer = setInterval(refreshSystemMetrics, 5000);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
document.getElementById('currentUser').textContent = 'Nicht angemeldet';
|
document.getElementById('currentUser').textContent = 'Nicht angemeldet';
|
||||||
showLanding();
|
showLanding();
|
||||||
document.getElementById('userSection').classList.add('hidden');
|
document.getElementById('userSection').classList.add('hidden');
|
||||||
document.getElementById('updateSection').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;
|
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
|
// Event listeners
|
||||||
document.getElementById('loginForm').addEventListener('submit', async (e) => {
|
document.getElementById('loginForm').addEventListener('submit', async (e) => {
|
||||||
e.preventDefault();
|
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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# Architektur
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# Konfiguration
|
# Konfiguration
|
||||||
@ -6,7 +6,8 @@ By: Codex (GPT-5)
|
|||||||
## Speicherort
|
## Speicherort
|
||||||
Die Konfiguration erfolgt per ENV-Dateien:
|
Die Konfiguration erfolgt per ENV-Dateien:
|
||||||
- `/etc/skd/env` (Core-App, Vorlage: `env.example`)
|
- `/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
|
## 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.
|
- `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_STATUS_FILE` (default `/var/lib/skd/update_status.json`)
|
||||||
- `SKD_UPDATE_LOG_FILE` (default `/var/lib/skd/update_logs.jsonl`)
|
- `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_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
|
## Dry-Run
|
||||||
- `SKD_DRY_RUN` (default `false`): Keine echten System-Aktionen, nur Logging.
|
- `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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# Deployment
|
# Deployment
|
||||||
@ -94,13 +94,31 @@ Hinweis: Der Update-Check ist erst moeglich, wenn der Langzeit-Token gespeichert
|
|||||||
Enrollment-Tools:
|
Enrollment-Tools:
|
||||||
- `scripts/manual_enroll.py`: Enrollment direkt gegen den Update-Service, schreibt Token in `SKD_UPDATE_TOKEN_FILE`.
|
- `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_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):
|
Beispiel (curl-Script):
|
||||||
```bash
|
```bash
|
||||||
sudo ./scripts/enroll_update_service.sh --enroll-token "enroll_example"
|
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:
|
Lokale Status/Logs:
|
||||||
- `SKD_UPDATE_STATUS_FILE` (default `/var/lib/skd/update_status.json`)
|
- `SKD_UPDATE_STATUS_FILE` (default `/var/lib/skd/update_status.json`)
|
||||||
- `SKD_UPDATE_LOG_FILE` (default `/var/lib/skd/update_logs.jsonl`)
|
- `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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# Development
|
# Development
|
||||||
@ -23,6 +23,20 @@ Standard: `0.0.0.0:80`. Fuer andere Ports:
|
|||||||
HOST=127.0.0.1 PORT=8000 ./scripts/run.sh
|
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
|
## Tests und Lint
|
||||||
Im Repo sind keine automatisierten Tests enthalten. Verfuegbare Checks:
|
Im Repo sind keine automatisierten Tests enthalten. Verfuegbare Checks:
|
||||||
- Bash-Syntax: `bash -n sk.sh`
|
- 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# FAQ
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# Fuer Nutzerinnen und Nutzer
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# Getting Started
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# Troubleshooting
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# Usage
|
# Usage
|
||||||
@ -61,6 +61,9 @@ Alle Update-Endpunkte erfordern Admin-Auth.
|
|||||||
- `POST /update/rollback`
|
- `POST /update/rollback`
|
||||||
- `GET /update/logs?limit=200`
|
- `GET /update/logs?limit=200`
|
||||||
|
|
||||||
|
### System-API (lokal)
|
||||||
|
- `GET /system/metrics` (CPU %, RAM, GPU VRAM, Netzwerk Mbps)
|
||||||
|
|
||||||
Beispiel (Enrollment):
|
Beispiel (Enrollment):
|
||||||
```bash
|
```bash
|
||||||
ENROLL_TOKEN="example-enroll-token"
|
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.
|
Archived – superseded by new documentation.
|
||||||
By: Codex (GPT-5)
|
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.
|
Archived – superseded by new documentation.
|
||||||
|
|
||||||
# Client Quickstart
|
# 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.
|
Archived – superseded by new documentation.
|
||||||
By: Codex (GPT-5)
|
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.
|
Archived – superseded by new documentation.
|
||||||
By: Codex (GPT-5)
|
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.
|
Archived – superseded by new documentation.
|
||||||
By: Codex (GPT-5)
|
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.
|
Archived – superseded by new documentation.
|
||||||
By: Codex (GPT-5)
|
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.
|
Archived – superseded by new documentation.
|
||||||
By: Codex (GPT-5)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
|
|||||||
@ -7,3 +7,5 @@ SKD_UPDATE_TOKEN_FILE=/var/lib/skd/update_token
|
|||||||
SKD_UPDATE_INTERVAL=3600
|
SKD_UPDATE_INTERVAL=3600
|
||||||
SKD_UPDATE_STATUS_FILE=/var/lib/skd/update_status.json
|
SKD_UPDATE_STATUS_FILE=/var/lib/skd/update_status.json
|
||||||
SKD_UPDATE_LOG_FILE=/var/lib/skd/update_logs.jsonl
|
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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# Repository Guidelines
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# Projekt-Status
|
# 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] TASK_000055: Endpoint und UI fuer Update-Service Status
|
||||||
- [x] US_000047: Update-Config auslagern
|
- [x] US_000047: Update-Config auslagern
|
||||||
- [x] TASK_000056: Update-ENV separieren
|
- [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)
|
### EPIC_000009: Update Webservice (External Team)
|
||||||
- [ ] US_000026: Client bezieht Updates (Pull)
|
- [x] US_000026: Client bezieht Updates (Pull)
|
||||||
- [ ] US_000027: Client verifiziert und wendet Updates an
|
- [x] US_000027: Client verifiziert und wendet Updates an
|
||||||
- [ ] US_000028: Client meldet Update-Status
|
- [x] US_000028: Client meldet Update-Status
|
||||||
|
|
||||||
### EPIC_000010: Update-Service v1 Migration (Major Release)
|
### EPIC_000010: Update-Service v1 Migration (Major Release)
|
||||||
- [x] US_000034: Enrollment fuer Langzeit-Token
|
- [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
|
- [x] TASK_000048: External Dependencies und Audience-Ergaenzungen
|
||||||
|
|
||||||
### EPIC_000013: System Telemetry im Dashboard
|
### EPIC_000013: System Telemetry im Dashboard
|
||||||
- [ ] US_000044: Systemmetriken im Dashboard anzeigen
|
- [x] US_000044: Systemmetriken im Dashboard anzeigen
|
||||||
- [ ] TASK_000050: Backend-Endpoint fuer Systemmetriken
|
- [x] TASK_000050: Backend-Endpoint fuer Systemmetriken
|
||||||
- [ ] TASK_000051: UI-Kacheln im Dashboard (System Information)
|
- [x] TASK_000051: UI-Kacheln im Dashboard (System Information)
|
||||||
|
|
||||||
### EPIC_000014: Login-Zeitfenster und Parent-Control Regeln
|
### EPIC_000014: Login-Zeitfenster und Parent-Control Regeln
|
||||||
- [ ] US_000045: Regeln fuer Login-Zeitfenster definieren und durchsetzen
|
- [ ] 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# 📊 Projekt-Status (Template)
|
# 📊 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# Onboarding: Arbeitsweise im Sound Architect Projekt
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# 🧬 SETUP_GUIDE: Phase 0 - Project Genesis
|
# 🧬 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# Requirements Engineer Prompt
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# EPIC_000001: Legacy CLI Account Control (sk.sh)
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# EPIC_000002: Backend API Service
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# EPIC_000003: Authentication & Sessions
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# EPIC_000004: Web UI
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# EPIC_000005: Automation Scripts
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# EPIC_000006: Systemd & Deployment Artifacts
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# EPIC_000007: Documentation & Runbook
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# EPIC_000008: Client-Side Update Mechanism
|
# 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_000033: Rollback im Web-UI anstossen
|
||||||
- US_000043: Enrollment-Token per Script abrufen
|
- US_000043: Enrollment-Token per Script abrufen
|
||||||
- US_000046: Update-Service Erreichbarkeit anzeigen
|
- 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# EPIC_000009: Update Webservice (External Team)
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# EPIC_000010: Update-Service v1 Migration (Major Release)
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# EPIC_000011: Documentation and Configuration Alignment
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# EPIC_000012: Dokumentations-Overhaul
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# EPIC_000013: System Telemetry im Dashboard
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# EPIC_000014: Login-Zeitfenster und Parent-Control Regeln
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000001: Nutzerkonto per CLI deaktivieren
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000002: Nutzerkonto per CLI aktivieren
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000003: Health-Status abfragen
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000004: Verfuegbare Nutzer auflisten
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000005: Nutzer per API deaktivieren
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000006: Nutzer per API aktivieren
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000007: PAM-Login mit Token
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000008: OIDC-Login Flow
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000009: Autorisierung und /me-Identitaet
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000010: Index-Seite ausliefern
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000011: Virtualenv und Abhaengigkeiten erstellen
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000012: Service lokal starten
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000013: Service installieren
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000014: Service aktualisieren
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000015: Remote-Deployment durchfuehren
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000016: OIDC-Client registrieren
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000017: Systemd-Unit im Repo
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000018: Konfigurations-Templates verfuegbar
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000019: Deployment-Archiv vorhanden
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000020: Makefile-Automation bereitstellen
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000021: Konfiguration per ENV steuern
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000022: Web-UI Aktionen ausfuehren
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000023: Runbook und Security-Hinweise dokumentieren
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000024: Watchtower Theme fuer Web-UI
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000025: OIDC End-to-End Validierung und Runbook
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000026: Client bezieht Updates (Pull)
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000027: Client verifiziert und wendet Updates an
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000028: Client meldet Update-Status
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000029: Update-Status im Web-UI anzeigen
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000030: Update-Check im Web-UI ausloesen
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000031: Update im Web-UI anstossen
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000032: Update-Logs im Web-UI anzeigen
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000033: Rollback im Web-UI anstossen
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000034: Enrollment fuer Langzeit-Token
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000035: v1 Update-Endpoints und Status-Schema
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000036: Doku-Versionen auf VERSION synchronisieren
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000037: Update-API-Doku mit /update/enroll abgleichen
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000038: ENV-Beispiele und Healthcheck-Auth angleichen
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000039: Doku-Audit fuer verbleibende Abweichungen
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000040: Doku-Struktur und Inhalte erstellen
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000041: Einbindung externer Services dokumentieren
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000042: Consumer-Perspektive und Audience-Split ergaenzen
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000043: Enrollment-Token per Script abrufen
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000044: Systemmetriken im Dashboard anzeigen
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000045: Regeln fuer Login-Zeitfenster definieren und durchsetzen
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000046: Update-Service Erreichbarkeit anzeigen
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# US_000047: Update-Config auslagern
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# TASK_000025: OIDC E2E validation
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# TASK_000026: OIDC runbook update
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# TASK_000027: Update endpoint config
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# TASK_000028: Verify and apply update
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# TASK_000029: Report update status
|
# 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)
|
By: Codex (GPT-5)
|
||||||
|
|
||||||
# TASK_000030: UI update status view
|
# 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