- Rebranding: chessu → Michess (Header, Footer, Metadata, Session-Cookie) - Stockfish KI-Integration: 6 Schwierigkeitsgrade (Anfänger bis Meister) - Admin-Panel: Nutzerverwaltung, Sperren/Entsperren, Git-Pull-Update - Freundessystem: Anfragen, Freundesliste, Nutzersuche - DB-Schema: role, banned, friend_request, friendship Tabellen - Docker: NAS-optimiertes docker-compose.yml mit PostgreSQL Healthcheck - Stockfish binary via apk im Alpine-Image installiert - .env.example für einfaches Deployment - scripts/update.sh für manuelles NAS-Update - Brain.md + Plan.md als Projekt-Gedächtnis Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
190 lines
5.7 KiB
Markdown
190 lines
5.7 KiB
Markdown
# Plan.md — Michess Entwicklungsplan
|
|
|
|
---
|
|
|
|
## Vision
|
|
|
|
**Michess** ist eine selbst-gehostete Schachplattform für eine private Community, inspiriert von Lichess.org.
|
|
Läuft als Docker-Container auf einer Synology/QNAP NAS, komplett ohne Cloud-Abhängigkeit.
|
|
|
|
---
|
|
|
|
## Phase 1: Foundation (Basis)
|
|
|
|
### 1.1 Projekt-Setup
|
|
- [x] chessu (MIT) als Basis klonen
|
|
- [x] Brain.md & Plan.md erstellen
|
|
- [ ] Git remote auf `https://git.mischlabs.de/MrDiderot/Michess.git` setzen
|
|
- [ ] Initaler Push (chessu-Basis + eigene Dateien)
|
|
|
|
### 1.2 Rebranding chessu → Michess
|
|
- [ ] `package.json` Namen anpassen
|
|
- [ ] README durch Michess-README ersetzen
|
|
- [ ] Alle Titel/Meta-Tags im Frontend ändern
|
|
- [ ] Logo-Platzhalter anpassen
|
|
|
|
### 1.3 Docker NAS-Deployment
|
|
- [ ] `docker-compose.yml` überarbeiten (michess-app, postgres, eigene Secrets)
|
|
- [ ] `.env.example` erstellen mit allen benötigten Variablen
|
|
- [ ] Stockfish in Docker-Image einbauen (`apk add stockfish`)
|
|
- [ ] Update-Script: `scripts/update.sh` (git pull + docker restart)
|
|
- [ ] Deployment-README schreiben (einziger Befehl für NAS)
|
|
|
|
---
|
|
|
|
## Phase 2: Datenbank-Erweiterungen
|
|
|
|
### 2.1 Schema-Änderungen
|
|
```sql
|
|
-- User: Admin-Rolle hinzufügen
|
|
ALTER TABLE "user" ADD COLUMN role VARCHAR(16) DEFAULT 'user';
|
|
|
|
-- Freundschaftsanfragen
|
|
CREATE TABLE IF NOT EXISTS "friend_request" (
|
|
id SERIAL PRIMARY KEY,
|
|
from_id INT REFERENCES "user"(id) ON DELETE CASCADE,
|
|
to_id INT REFERENCES "user"(id) ON DELETE CASCADE,
|
|
status VARCHAR(16) DEFAULT 'pending', -- pending | accepted | rejected
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
UNIQUE(from_id, to_id)
|
|
);
|
|
|
|
-- Freunde (bidirektional, normalisiert als kleinere_id + größere_id)
|
|
CREATE TABLE IF NOT EXISTS "friendship" (
|
|
id SERIAL PRIMARY KEY,
|
|
user_id_1 INT REFERENCES "user"(id) ON DELETE CASCADE,
|
|
user_id_2 INT REFERENCES "user"(id) ON DELETE CASCADE,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
UNIQUE(user_id_1, user_id_2)
|
|
);
|
|
```
|
|
|
|
---
|
|
|
|
## Phase 3: Stockfish AI-Integration
|
|
|
|
### 3.1 Backend
|
|
- [ ] `stockfish` npm-Paket als Server-Dependency
|
|
- [ ] `server/src/controllers/stockfish.controller.ts` — Stockfish-Prozess-Manager
|
|
- [ ] Schwierigkeitsgrade:
|
|
| Level | Name | Stockfish Skill | Depth |
|
|
|---|---|---|---|
|
|
| 1 | Anfänger | 0 | 1 |
|
|
| 2 | Leicht | 3 | 3 |
|
|
| 3 | Mittel | 8 | 5 |
|
|
| 4 | Fortgeschritten | 14 | 10 |
|
|
| 5 | Experte | 18 | 15 |
|
|
| 6 | Meister | 20 | 20 |
|
|
- [ ] Socket-Events: `ai:move`, `ai:game_start`, `ai:game_end`
|
|
|
|
### 3.2 Frontend
|
|
- [ ] "Gegen KI spielen" Button auf Startseite
|
|
- [ ] Schwierigkeitsgrad-Auswahl Modal
|
|
- [ ] KI-Spielpartie-UI (keine zweite Socket-Session nötig, nur lokal)
|
|
|
|
---
|
|
|
|
## Phase 4: Admin-Panel
|
|
|
|
### 4.1 Backend
|
|
- [ ] `isAdmin` Middleware für `/v1/admin/*`
|
|
- [ ] `GET /v1/admin/users` — alle Nutzer auflisten (paginiert)
|
|
- [ ] `PATCH /v1/admin/users/:id` — Nutzer sperren/entsperren, Rolle ändern
|
|
- [ ] `DELETE /v1/admin/users/:id` — Nutzer löschen
|
|
- [ ] `POST /v1/admin/update` — git pull + trigger restart
|
|
- [ ] `GET /v1/admin/stats` — Nutzerzahl, Spiele, etc.
|
|
|
|
### 4.2 Frontend
|
|
- [ ] `/admin` Route (nur für Admins sichtbar)
|
|
- [ ] Dashboard mit Statistiken
|
|
- [ ] Nutzertabelle mit Such-/Filterfunktion
|
|
- [ ] "Website aktualisieren" Button mit Bestätigung
|
|
- [ ] Nutzer sperren/entsperren/löschen
|
|
|
|
### 4.3 Erster Admin
|
|
- [ ] `ADMIN_EMAIL` env-Variable
|
|
- [ ] Beim Server-Start: wenn User mit dieser E-Mail existiert → Role = 'admin'
|
|
- [ ] Alternativ: `ADMIN_SETUP_TOKEN` für initiale Admin-Einrichtung
|
|
|
|
---
|
|
|
|
## Phase 5: Freundessystem
|
|
|
|
### 5.1 Backend
|
|
- [ ] `POST /v1/friends/request` — Anfrage senden (via Username)
|
|
- [ ] `GET /v1/friends/requests` — eigene Anfragen (eingehend + ausgehend)
|
|
- [ ] `PATCH /v1/friends/requests/:id` — annehmen/ablehnen
|
|
- [ ] `GET /v1/friends` — eigene Freundesliste
|
|
- [ ] `DELETE /v1/friends/:id` — Freundschaft beenden
|
|
- [ ] `GET /v1/users/search?q=` — Nutzer suchen
|
|
|
|
### 5.2 Frontend
|
|
- [ ] Freundesliste im User-Profil
|
|
- [ ] "Freund hinzufügen" Button auf fremden Profilseiten
|
|
- [ ] Benachrichtigungs-Badge bei ausstehenden Anfragen
|
|
- [ ] "Freund herausfordern" → direktes Spiel erstellen
|
|
|
|
---
|
|
|
|
## Phase 6: Registrierungs-Flow
|
|
|
|
### Aktueller chessu-Flow:
|
|
`name + email + password` → Account erstellt
|
|
|
|
### Gewünschter Michess-Flow:
|
|
1. `email + password` → Account erstellt (noch kein Nutzername)
|
|
2. Weitergeleitet zu "Nutzername wählen" (einmalig, nicht änderbar)
|
|
3. Nutzername prüfen: verfügbar? gültig? → bestätigen
|
|
4. Account aktiv
|
|
|
|
- [ ] `name` Feld nullable machen in DB (bis Schritt 2)
|
|
- [ ] `POST /v1/auth/choose-username` Endpoint
|
|
- [ ] "Username wählen"-Seite im Frontend
|
|
|
|
---
|
|
|
|
## Phase 7: Sonstige Verbesserungen
|
|
|
|
- [ ] Zeitkontrolle für Partien (Bullet/Blitz/Rapid/Classical)
|
|
- [ ] Rating-System (Elo) für Nutzer-vs-Nutzer
|
|
- [ ] Rematch-Funktion
|
|
- [ ] Spectator-Verbesserungen (Live-Zuschauer)
|
|
- [ ] Mobile-Optimierung
|
|
|
|
---
|
|
|
|
## Deployment-Anleitung (Ziel-Zustand)
|
|
|
|
```bash
|
|
# Einmalige Erstinstallation auf der NAS:
|
|
git clone https://git.mischlabs.de/MrDiderot/Michess.git michess
|
|
cd michess
|
|
cp .env.example .env
|
|
# .env anpassen (Passwörter, Admin-Email, etc.)
|
|
docker compose up -d
|
|
|
|
# Update (manuell oder per Admin-Panel):
|
|
./scripts/update.sh
|
|
# oder via Admin-Panel "Website aktualisieren" Button
|
|
```
|
|
|
|
---
|
|
|
|
## Git-Strategie
|
|
|
|
- `main` — Production-Branch (immer deploybar)
|
|
- Features werden direkt auf main entwickelt (kleines Team)
|
|
- Issues aus `git.mischlabs.de` als Feature-Tracker
|
|
- Commit-Messages: `feat:`, `fix:`, `admin:`, `docker:`, `ui:` Prefixe
|
|
|
|
---
|
|
|
|
## Prioritäten (Reihenfolge)
|
|
|
|
1. **P0**: Foundation + Docker + Git (läuft auf NAS)
|
|
2. **P0**: Stockfish AI (Kernfeature)
|
|
3. **P1**: Admin-Panel (Verwaltbarkeit)
|
|
4. **P1**: Freundessystem (Social)
|
|
5. **P2**: Registrierungs-Flow verfeinern
|
|
6. **P3**: Zeitkontrolle + Rating
|