- Changed WEBUI_URL in .env.example from localhost to the accessible host IP address (http://10.111.0.65:3000) for proper deployment. - Updated PHASE-TRACKING.md to reflect the new OAuth2-Redirect URLs and clarify the WebUI integration process.
13 KiB
13 KiB
Nexumi – Phasen-Tracking
Dieses Dokument hält den aktuellen Implementierungsstand fest. Es wird bei jedem Arbeitsfortschritt aktualisiert.
Assets
- Bot-Logo vorhanden:
docs/logo/nexumi-logo.svg
Phase 1 – Fundament (Status: abgeschlossen, manuelle Discord-Tests ausstehend)
Bereits abgeschlossen
- Monorepo-Basis mit Workspaces:
apps/botpackages/shared
- Basis-Tooling:
- TypeScript strict
- ESLint
- Prettier
- Vitest
- Turbo
- Docker-Compose-Grundstack:
postgresmit Healthcheckredismit Healthcheckbotwebui-Scaffold-Service (temporär)backupsVolume angebunden
- Prisma-Grundmodell inkl. Moderationsdaten:
GuildGuildSettingsUserCaseWarningModNoteEscalationRule
- Bot-Grundarchitektur:
- Sharding-Startpfad
- Command-Registrierung
- Command-Routing
- zentraler Permission-Check
- Basis-i18n in
@nexumi/shared - Guild-Locale-Auflösung über DB-Settings mit Fallback auf Env-Default
- Health-Endpoint (
/health) und token-geschütztes/metrics-Scaffold
- BullMQ-Integration:
- Moderation-Queue
- Temp-Ban-Expire-Job
- täglicher Backup-Job (
pg_dump) - Backup-Retention-Cleanup
- Moderation als Referenzmodul (implementiert):
/ban,/unban,/kick,/timeout,/untimeout/warn add|list|remove|clear/warn escalation-set|escalation-list|escalation-remove/purge(Filter: User, Bots, Links, Attachments, Regex)/slowmode,/lock,/unlock/nick set|reset/case view|edit|delete/modnote add|list- user-facing Reply-Strings im Moderationsfluss auf i18n-Keys umgestellt (
de/en) - Slash-Command-Beschreibungen und Optionstexte lokalisiert (
de+en-USvia Discord-Localizations) - Bestätigungsflow für destruktive Aktionen (
/ban,/purge,/case delete) mit Buttons - standardisierte Case-Audit-Metadaten über
@nexumi/shared(buildCaseMetadata)
- Docker-Build/Runtime-Fixes für E2E:
.dockerignoreergänzt- Prisma-Migration beim Bot-Start (
prisma migrate deploy) - Bot-Healthcheck auf
/health
- E2E-Verifikation (automatisiert, lokal):
docker compose up -d --builderfolgreich- Postgres/Redis healthy
- Migration
20260722123000_initangewendet - Bot online (
Nexumi#9122), 13 Slash-Commands registriert - Bot-Container healthy
- Tests (aktuell vorhanden):
packages/shared/src/i18n.test.tspackages/shared/src/audit.test.tsapps/bot/src/modules/moderation/duration.test.ts
Manuelle Discord-Tests (noch offen)
- Bot auf Test-Server einladen (falls noch nicht geschehen)
- Slash-Commands testen:
/ban,/warn add,/purge,/case view - Bestätigungsbuttons bei
/banund/purgeprüfen
Phase 2 – AutoMod, Logging, Welcome, Verifizierung (Status: implementiert, manuelle Tests ausstehend)
Abgeschlossen
- Prisma-Erweiterung + Migration
20260722140000_phase2_modules:AutoModConfig,AutoModRuleLoggingConfig,LogChannelWelcomeConfigVerificationConfig
- Shared-Schemas und Hilfsfunktionen (
packages/shared/src/phase2.ts) - AutoMod (
apps/bot/src/modules/automod/):- Filter: Spam, Massen-Mentions, Caps, Invite-Links, externe Links, Wortfilter, Duplikate, Emoji-Spam, Zalgo, Phishing-Blockliste
- Standardregeln werden pro Guild beim ersten Zugriff angelegt
- Anti-Raid (Join-Rate → Lockdown)
- Anti-Nuke (Massen-Bans/Channel-Löschungen → Rechteentzug)
/automod status- Phishing-Listen-Refresh via BullMQ (alle 6h + beim Start)
- Logging (
apps/bot/src/modules/logging/):- Event-Handler für alle SPEC-Events (Nachrichten, Member, Bans, Rollen, Kanäle, Voice, Invites, Emoji/Sticker, Threads, Guild-Update)
- Mod-Action-Log verknüpft mit Case-System (
logModActionincreateCase) - Ignore-Listen (Kanäle, Rollen, Bots) über DB
- Log-Kanal-Zuordnung über
LogChannel-Tabelle (Konfiguration künftig WebUI)
- Welcome/Leave (
apps/bot/src/modules/welcome/):- Text-, Embed- und Bild-Karten (Canvas via
@napi-rs/canvas) - Platzhalter-System
- Autoroles (User/Bots getrennt)
- Welcome-DM
/welcome test,/welcome preview
- Text-, Embed- und Bild-Karten (Canvas via
- Verifizierung (
apps/bot/src/modules/verification/):/verify setup,/verify panel- Button-Verify und Captcha-Verify (Captcha-Seite unter
/verify/captchaam Health-Server) - Mindest-Accountalter, Fehlschlag-Aktionen (Kick/Ban/None)
- Unverified-Rolle bei Join
- Bot-Intents erweitert:
GuildMembers,GuildMessages,MessageContent,GuildModeration,GuildVoiceStates,GuildEmojisAndStickers,GuildInvites
- Neue Env-Variable:
PUBLIC_BASE_URL(Captcha-Links) - Tests:
packages/shared/src/phase2.test.ts
Manuelle Discord-Tests (noch offen)
- Privileged Intents im Developer Portal aktivieren:
SERVER MEMBERS INTENTMESSAGE CONTENT INTENT
- AutoMod: Spam-/Invite-Testnachrichten senden
/automod statusprüfen- Logging: Log-Kanäle per DB/ später WebUI setzen, Events auslösen
/welcome previewund/welcome test(Konfiguration zunächst per DB oder später WebUI)/verify setup+/verify panel, Button- und Captcha-Flow testenPUBLIC_BASE_URLauf erreichbare URL setzen (für Captcha außerhalb localhost)
Hinweise
- Welcome-/Logging-Konfiguration erfolgt in Phase 2 über die Datenbank; die WebUI-Editoren kommen in Phase 7.
- Captcha-Seite läuft am Bot-Health-Port (
HEALTH_PORT); in Produktion mussPUBLIC_BASE_URLdarauf zeigen oder über Reverse-Proxy geroutet werden.
Phase 3 – Leveling, Economy, Utility, Fun (Status: implementiert, manuelle Tests ausstehend)
Abgeschlossen
- Prisma-Migration
20260722150000_phase3_modules:LevelingConfig,MemberLevel,LevelRewardEconomyConfig,MemberEconomy,ShopItem,InventoryItemPoll,PollVote,Reminder,AfkStatus
- Shared-Helfer
packages/shared/src/phase3.ts+ Tests - Commands und Events in Root verdrahtet (
commands.ts,index.ts)
Leveling (apps/bot/src/modules/leveling/)
/rank(Canvas-Rankkarte),/leaderboard,/xp give|remove|reset- Text-XP (Cooldown Redis) und Voice-XP
- Multiplikatoren, No-XP-Kanäle/-Rollen, Level-Rewards, Level-Up CHANNEL/DM/OFF
Economy (apps/bot/src/modules/economy/)
/balance,/daily,/weekly,/work,/pay/gamble,/slots,/blackjack(Buttons),/coinflip(Wette)/shop view|buy,/inventory,/eco leaderboard|give|remove|reset- Währung pro Server in
EconomyConfig
Utility (apps/bot/src/modules/utility/)
/userinfo,/serverinfo,/roleinfo,/channelinfo,/avatar,/banner/poll create(Buttons, DB, Ablauf via BullMQ)/remindme,/reminders list|delete(BullMQ)/afk set,/emoji add|remove|steal,/sticker add,/timestamp- Context-Menu Translate,
/snipe,/editsnipe,/embed builder
Fun (apps/bot/src/modules/fun/)
/8ball,/dice,/flip(freier Münzwurf; Economy behält/coinflip)/rps,/choose,/trivia,/tictactoe,/connect4,/hangman/meme,/cat,/dog(abschaltbar via Redisfun:config:{guildId})
Manuelle Discord-Tests (Phase 3 – bestätigt)
- Manuell auf Test-Server bestätigt (User-Freigabe).
Phase 4 – Giveaways … Temp-Voice (Status: abgeschlossen, manuell bestätigt)
- Manuell auf Test-Server bestätigt (User-Freigabe).
Phase 5 – Stats/Invites, Feeds, Scheduler, Guild-Backup (Status: abgeschlossen, manuell bestätigt)
Abgeschlossen
- Prisma-Migration
20260722170000_phase5_modules(deployed) - Shared
packages/shared/src/phase5.ts+ Tests - Module verdrahtet in
commands.ts,index.ts,jobs.ts - Queues/Worker:
stats,feeds,schedules,guild-backups - Optional:
TWITCH_CLIENT_ID/TWITCH_CLIENT_SECRET - E2E:
docker compose up -d --build botOK; Bot ready; 74 Guild-Commands registriert - Manuell auf Test-Server bestätigt (User-Freigabe)
- Temp-Voice Control-Panel postet in den Voice-Kanal-Chat (statt DM)
Phase 6 – WebUI-Fundament (Status: implementiert, manuelle Tests ausstehend)
Abgeschlossen
apps/webuials@nexumi/webui(Next.js 15 App Router, Tailwind 4, React 19), Scriptsdev/build/start/lint/typecheck/test/prisma:generatenext.config.ts:output: 'standalone',transpilePackages: ['@nexumi/shared'],outputFileTracingRootauf Monorepo-Root- Env-Validierung (
src/lib/env.ts, Zod):DATABASE_URL,REDIS_URL,BOT_CLIENT_ID,BOT_CLIENT_SECRET,WEBUI_URL,SESSION_SECRET(≥32 Zeichen),SENTRY_DSNoptional,DEFAULT_LOCALE - Discord-OAuth2-Login (
src/lib/discord-oauth.ts): Authorize-URL, Code-Exchange,/users/@me,/users/@me/guilds(mit kurzlebigem Redis-Cache) - Redis-Sessions (
src/lib/session.ts): Cookienexumi_session(httpOnly, sameSite=lax, secure in Produktion, 7 Tage), signiert via HMAC (SESSION_SECRET), Redis-Keywebui:session:{id} - Auth-Helfer (
src/lib/auth.ts):requireAuth/requireAuthOrRedirect,requireGuildAccess/requireGuildAccessOrRedirect(Manage-Guild-Check + Bot-Präsenz in der DB),toApiErrorResponse src/lib/guilds.ts,src/lib/guild-settings.ts,src/lib/modules.ts,src/lib/access-rules.ts,src/lib/audit.ts(Dashboard-Audit-Log lesen/schreiben)- Modul-Status-Aggregation (
getModuleStatuses/updateModuleStatuses) über bestehende Prisma-Configs (AutoMod, Logging, Welcome, Verification, Leveling, Economy, Tickets, Starboard, Suggestions, Birthdays, TempVoice, Stats), Fun-Redis-Config (fun:config:{guildId}, neues Feldenabled) sowie einen generischen Redis-Hashdashboard:modules:{guildId}für Module ohne eigenes Enabled-Flag (Giveaways, Tags, Selfroles, Feeds, Scheduler, Guildbackup) - Settings-Framework (
src/components/settings/):settings-form.tsx(Dirty-Tracking, Sticky-Save-Bar, Toasts, Inline-Fehler),save-bar.tsx,general-settings-form.tsx,module-toggles-form.tsx,access-rules-form.tsx - Layout (
src/components/layout/):theme-provider.tsx(next-themes, Dark als Standard),sidebar.tsx(Modul-Gruppen ausDASHBOARD_MODULES),server-switcher.tsx,user-menu.tsx,dashboard-shell.tsx - shadcn-artige UI-Komponenten (
src/components/ui/): Button, Card, Input, Label, Switch, Select, Separator, Skeleton, Avatar, Badge, Dropdown-Menu — Indigo-Akzent (#6366F1) über CSS-Variablen inglobals.css, Inter-Font vianext/font/google - i18n (
src/lib/i18n.ts,src/messages/de.json,src/messages/en.json): Cookienexumi_locale, vollständige de/en-Strings für Login, Dashboard, Settings, Module, Access, Fehler - Seiten:
/,/login,/dashboard,/dashboard/[guildId](Übersicht mit Modul-Status + letzten 10 Audit-Einträgen),/dashboard/[guildId]/settings,/dashboard/[guildId]/modules,/dashboard/[guildId]/access,/dashboard/[guildId]/[module](Platzhalter „Modul-Einstellungen kommen in Phase 7", i18n) — Skeleton-Ladezustände überloading.tsxje Route middleware.ts: leichte Edge-Prüfung auf vorhandenes Session-Cookie für/dashboard/*; vollständige Session-/Berechtigungsprüfung serverseitig in den Layouts- API-Routen (alle Zod-validiert, Auth-geprüft, schreiben Dashboard-Audit bei PATCH/PUT):
GET /api/health,GET /api/auth/login,GET /api/auth/callback,POST /api/auth/logout,GET /api/auth/me,GET /api/guilds,GET|PATCH /api/guilds/[guildId]/settings,GET|PATCH /api/guilds/[guildId]/modules,GET|PUT /api/guilds/[guildId]/access-rules,GET /api/guilds/[guildId]/audit apps/webui/Dockerfile(Multi-Stage:pnpm --filter @nexumi/shared build,prisma generate --schema=../bot/prisma/schema.prisma,next build, Standalone-Runner,HEALTHCHECKauf/api/health,EXPOSE 3000)docker-compose.yml:webui-Service baut jetzt ausapps/webui/Dockerfile,env_file: .env,depends_onPostgres/Redis (healthy), Healthcheck, bestehende Traefik-Labels beibehalten.env.exampleergänzt umWEBUI_URL,SESSION_SECRET(Kommentar: ≥32 Zeichen); lokale.envumWEBUI_URLund generiertesSESSION_SECRETergänzt (keine bestehenden Werte überschrieben)- Tests:
src/lib/utils.test.ts(cn()), bestehendepackages/shared/src/phase6.test.ts(Zod-Schemas,hasManageGuildPermission)
Manuelle Tests (noch offen)
- Discord Developer Portal: OAuth2-Redirect
http://10.111.0.65:3000/api/auth/callback(bzw.https://nexumi.de/api/auth/callbackin Produktion) unter „OAuth2 → Redirects" eintragen - Login-Flow Ende-zu-Ende (
http://10.111.0.65:3000/login→ Discord →/dashboard) WEBUI_URLzeigt auf den erreichbaren Host (http://10.111.0.65:3000), nicht auf localhost- Zugriff ohne „Server verwalten" prüfen
- Modul-Toggles + Access-Rules speichern; Audit-Log prüfen
Deploy-Verifikation (automatisiert)
docker compose up -d --build bot webuiOK- Migration
20260722180000_phase6_webuiangewendet (DashboardAccessRule,DashboardAuditLog,GuildSettings.timezone) - Bot healthy + ready; WebUI healthy (
/api/health→{"ok":true}), Login-Seite erreichbar - Checks: shared tests 23, webui typecheck/lint/test grün
Nächster geplanter Schritt
- Nach Freigabe der manuellen Phase-6-Tests: Phase 7 (Modul-Seiten je Modul + Owner-Panel).