d4rkbot: API v1 mit Key-System, Env-Diät, Rebranding

- API-Keys (SHA-256-Hash, Scopes, last_used) — Verwaltung auf der Setup-Seite,
  Klartext-Key wird genau einmal angezeigt
- /api/v1: message, dm, roles (add/remove), member/:id, stats — Bearer-Auth
  mit Scope-Prüfung, Embed-Sanitizing, README-Doku mit Python-Beispiel
- Env-Diät: PUBLIC_URL + GITEA_URL jetzt Settings (Env nur Fallback),
  OAuth-Redirect dynamisch; Env enthält nur noch Secrets/Bootstrap
- Rebranding ecobot → d4rkbot (Packages, Container, Cookies, README);
  Volume-Name bleibt ecobot_data (Datenerhalt), Portainer-Stack-Name bleibt

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-23 11:56:48 +02:00
co-authored by Claude Opus 4.8
parent eb51be4ebc
commit 143288affa
19 changed files with 468 additions and 37 deletions
+38
View File
@@ -503,6 +503,44 @@ a.sha:hover { border-color: var(--neon); background: rgba(245, 197, 24, .07); }
.toggle input:checked::after { transform: translateX(16px); background: var(--neon); }
.toggle > span:first-of-type { color: var(--text); font-size: .95rem; }
/* API-Keys */
.key-list { margin-bottom: 1.2rem; border: 1px solid rgba(255, 255, 255, .06); }
.key-row {
display: flex; align-items: center; gap: 1rem;
padding: .5rem .8rem;
border-bottom: 1px solid rgba(255, 255, 255, .05);
font-size: .9rem;
}
.key-row:last-child { border-bottom: none; }
.key-name { font-weight: 600; min-width: 8rem; }
.key-scopes {
font-family: var(--mono); font-size: .65rem; letter-spacing: .1em;
color: var(--neon); flex: 1;
}
.key-used { font-family: var(--mono); font-size: .62rem; color: var(--muted2); white-space: nowrap; }
.key-created {
border: 1px solid rgba(0, 255, 136, .3);
background: rgba(0, 255, 136, .04);
padding: .8rem 1rem;
margin-bottom: 1.2rem;
font-size: .9rem;
}
.key-created p { margin: 0 0 .5rem; }
.key-created code {
display: block;
font-family: var(--mono); font-size: .8rem;
color: var(--success);
background: #000; padding: .5rem .7rem;
user-select: all; word-break: break-all;
}
.scope-row { display: flex; gap: 1.2rem; margin-top: .5rem; flex-wrap: wrap; }
.scope-pick {
display: flex; align-items: center; gap: .4rem;
font-family: var(--mono); font-size: .7rem; letter-spacing: .1em;
color: var(--muted); cursor: pointer;
}
.scope-pick input { accent-color: var(--neon); }
.settings-actions { display: flex; align-items: center; gap: 1rem; }
.btn-save { background: var(--neon); color: #0a0a0a; border-color: var(--neon); font-weight: 600; }
.btn-save:hover:not(:disabled) { background: var(--text); border-color: var(--text); }