3.0 KiB
3.0 KiB
tOS – Claude Code Guide
Projekt
Enterprise Web Operating System: Next.js 14 + NestJS 10 + Prisma + PostgreSQL 16 + Keycloak 24.
pnpm-Monorepo mit Turbo (apps/web, apps/api, packages/shared).
Dev-Befehle
# Infrastruktur starten (PostgreSQL, Redis, Keycloak)
cd docker && docker compose up -d
# Apps starten
pnpm dev # alle Apps
pnpm dev:api # nur Backend
pnpm dev:web # nur Frontend
# Datenbank
pnpm db:push # Schema anwenden (dev)
pnpm db:seed # Default-Daten (Rollen, SystemSettings)
# TypeScript-Check
pnpm --filter @tos/api exec tsc --noEmit
pnpm --filter @tos/web exec tsc --noEmit
Ports
| Service | Port |
|---|---|
| Frontend | 3000 |
| Backend | 3001 |
| Keycloak | 8080 |
| PostgreSQL | 5432 |
| Redis | 6379 |
Datenbanken
tos_db– Keycloak (wird automatisch erstellt)tos_app– Anwendung (wird viadocker/postgres/init.sqlautomatisch erstellt)- Beide in derselben PostgreSQL-Instanz
Keycloak (Dev)
- Admin-UI: http://localhost:8080 → admin / admin123
- Realm:
tOS - Frontend-Client:
tos-nextauth(NextAuth) - Backend-Client:
tos-backend(NestJS)
Architektur
Auth:
- Keycloak SSO → NextAuth (Frontend-Session) + passport-jwt RS256 via JWKS (Backend)
- JWT wird über Keycloak JWKS-Endpoint validiert – KEIN symmetrischer JWT_SECRET
- Global Guard Chain: JWT → Roles → Permissions,
@Public()für opt-out
API-Kommunikation:
- Backend wickelt alle Responses in
{success, data, timestamp}(TransformInterceptor) - Frontend-
api.tsunwrappt diesen Envelope automatisch NEXT_PUBLIC_API_URLenthält bereits/api/v1(z.B.http://localhost:3001/api/v1)
Konfiguration:
- Integration-Credentials und SystemSettings liegen in der DB, nicht in
.env .enventhält nur Bootstrap-Variablen (DB-URL, Secrets, Keycloak-Koordinaten)
Code-Konventionen
- Route-Pattern:
page.tsx(Server Component) importiert*-content.tsx(Client Component) - Routen:
[locale]/(auth)/...= geschützt,[locale]/(setup)/...= public,/login= public - State: Zustand für UI-State, TanStack Query für Server-State
- i18n: ASCII-Umlaute in JSON-Keys (
oe,ae,uestattö,ä,ü) - Installer-API-Calls: direktes
fetch()mitx-setup-tokenHeader (kein Bearer-Token)
Deployment
# Lokaler Full-Stack-Test (identisch zu Prod, vor Commit)
cd docker && docker compose -f docker-compose.local.yml up --build
# → http://localhost:3000/setup?token=local-setup-token-for-testing
# Produktions-Installation (interaktiv)
./install.sh
# → fragt Domain + SSL-Modus, generiert Secrets, startet docker-compose.prod.yml
# → SSL via Let's Encrypt (Caddy, --profile ssl) oder externer Reverse Proxy
Bekannte Issues / TODOs
- HR-Hooks nutzen noch Mock-Daten (nicht an Backend angebunden)
- Morning Meeting Endpoints nutzen
DASHBOARD_VIEWPermission (Security-Gap) apps/api/integrations.backup/– deaktivierte Integrations-Module (via .gitignore ignoriert)