md code aktualisiert V9
All checks were successful
Deploy Development / deploy (push) Successful in 56s
Build Test / lint-backend (push) Successful in 0s
Build Test / build-frontend (push) Successful in 13s

This commit is contained in:
Lars 2026-03-17 14:08:44 +01:00
parent 4a6dc37854
commit c36085daa4

154
CLAUDE.md
View File

@ -1,33 +1,32 @@
# Mitai Jinkendo Entwickler-Kontext für Claude Code # Mitai Jinkendo Entwickler-Kontext für Claude Code
## Projekt-Übersicht ## Projekt-Übersicht
**Mitai Jinkendo** ist eine selbst-gehostete PWA für Körper-Tracking (Gewicht, Körperfett, Umfänge, Ernährung, Aktivität) mit KI-Auswertung. Teil der **Jinkendo**-App-Familie (人拳道 Der menschliche Weg der Kampfkunst). **Mitai Jinkendo** (身体 Jinkendo) ist eine selbst-gehostete PWA für Körper-Tracking (Gewicht, Körperfett, Umfänge, Ernährung, Aktivität) mit KI-Auswertung. Teil der **Jinkendo**-App-Familie (人拳道 Der menschliche Weg der Kampfkunst).
**Produktfamilie:** body · fight · guard · train · mind (alle unter jinkendo.de) **Produktfamilie:** mitai · miken · ikigai · shinkan · kenkou (alle unter jinkendo.de)
## Tech-Stack ## Tech-Stack
| Komponente | Technologie | Version | | Komponente | Technologie | Version |
|-----------|-------------|---------| |-----------|-------------|---------|
| Frontend | React 18 + Vite + PWA | Node 20 | | Frontend | React 18 + Vite + PWA | Node 20 |
| Backend | FastAPI (Python) | Python 3.12 | | Backend | FastAPI (Python) | Python 3.12 |
| Datenbank | PostgreSQL | 16 (Ziel: v9) / SQLite (aktuell: v8) | | Datenbank | SQLite (v9a) → PostgreSQL (v9b geplant) | - |
| Container | Docker + Docker Compose | - | | Container | Docker + Docker Compose | - |
| Webserver | nginx (Reverse Proxy + HTTPS) | Alpine | | Webserver | nginx (Reverse Proxy) | Alpine |
| Auth | Token-basiert (eigene Impl.) | - | | Auth | Token-basiert + bcrypt | - |
| KI | OpenRouter API (claude-sonnet-4) | - | | KI | OpenRouter API (claude-sonnet-4) | - |
## Ports ## Ports
| Service | Intern | Extern (Dev) | | Service | Prod | Dev |
|---------|--------|-------------| |---------|------|-----|
| Frontend | 80 (nginx) | 3002 | | Frontend | 3002 | 3099 |
| Backend | 8000 (uvicorn) | 8002 | | Backend | 8002 | 8099 |
| PostgreSQL | 5432 | nicht exponiert |
## Verzeichnisstruktur ## Verzeichnisstruktur
``` ```
mitai-jinkendo/ mitai-jinkendo/
├── backend/ ├── backend/
│ ├── main.py # FastAPI App, alle Endpoints │ ├── main.py # FastAPI App, alle Endpoints (~2000 Zeilen)
│ ├── requirements.txt │ ├── requirements.txt
│ └── Dockerfile │ └── Dockerfile
├── frontend/ ├── frontend/
@ -38,28 +37,29 @@ mitai-jinkendo/
│ │ │ ├── AuthContext.jsx # Session, Login, Logout │ │ │ ├── AuthContext.jsx # Session, Login, Logout
│ │ │ └── ProfileContext.jsx # Aktives Profil │ │ │ └── ProfileContext.jsx # Aktives Profil
│ │ ├── pages/ # Alle Screens │ │ ├── pages/ # Alle Screens
│ │ ├── utils/ │ │ └── utils/
│ │ │ ├── api.js # Alle API-Calls (injiziert Token + ProfileId) │ │ ├── api.js # Alle API-Calls (injiziert Token automatisch)
│ │ │ ├── calc.js # Körperfett-Formeln │ │ ├── calc.js # Körperfett-Formeln
│ │ │ ├── interpret.js # Regelbasierte Auswertung │ │ ├── interpret.js # Regelbasierte Auswertung
│ │ │ ├── Markdown.jsx # Eigener MD-Renderer │ │ ├── Markdown.jsx # Eigener MD-Renderer
│ │ │ └── guideData.js # Messanleitungen │ │ └── guideData.js # Messanleitungen
│ │ └── main.jsx │ └── public/ # Icons (Jinkendo Ensō-Logo)
│ ├── public/ # Icons (Jinkendo Ensō-Logo) ├── .gitea/workflows/
│ ├── index.html │ ├── deploy-prod.yml # Auto-Deploy bei Push auf main
│ ├── vite.config.js │ ├── deploy-dev.yml # Auto-Deploy bei Push auf develop
│ └── Dockerfile │ └── test.yml # Build-Test bei jedem Push
├── nginx/ ├── docker-compose.yml # Produktion (Ports 3002/8002)
│ └── nginx.conf ├── docker-compose.dev-env.yml # Development (Ports 3099/8099)
├── docker-compose.yml # Produktion └── CLAUDE.md # Diese Datei
├── docker-compose.dev.yml # Entwicklung (Hot-Reload)
├── .env.example
└── CLAUDE.md # Diese Datei
``` ```
## Aktuelle Version: v8 ## Aktuelle Version: v9a
### Was implementiert ist: ### Was implementiert ist:
- ✅ Multi-User mit PIN/Passwort-Auth + Token-Sessions - ✅ Multi-User mit E-Mail + Passwort Login (bcrypt)
- ✅ Auth-Middleware auf ALLE Endpoints (44 Endpoints geschützt)
- ✅ Rate Limiting (Login: 5/min, Reset: 3/min)
- ✅ CORS konfigurierbar via ALLOWED_ORIGINS in .env
- ✅ Admin/User Rollen, KI-Limits, Export-Berechtigungen - ✅ Admin/User Rollen, KI-Limits, Export-Berechtigungen
- ✅ Gewicht, Umfänge, Caliper (4 Formeln), Ernährung, Aktivität - ✅ Gewicht, Umfänge, Caliper (4 Formeln), Ernährung, Aktivität
- ✅ FDDB CSV-Import (Ernährung), Apple Health CSV-Import (Aktivität) - ✅ FDDB CSV-Import (Ernährung), Apple Health CSV-Import (Aktivität)
@ -68,24 +68,57 @@ mitai-jinkendo/
- ✅ Verlauf mit 5 Tabs + Zeitraumfilter + KI pro Sektion - ✅ Verlauf mit 5 Tabs + Zeitraumfilter + KI pro Sektion
- ✅ Dashboard mit Kennzahlen, Zielfortschritt, Combo-Chart - ✅ Dashboard mit Kennzahlen, Zielfortschritt, Combo-Chart
- ✅ Assistent-Modus (Schritt-für-Schritt Messung) - ✅ Assistent-Modus (Schritt-für-Schritt Messung)
- ✅ PWA (iPhone Home Screen), Jinkendo-Icon - ✅ PWA (iPhone Home Screen), Jinkendo Ensō-Logo
- ✅ E-Mail (SMTP) für Password-Recovery - ✅ E-Mail (SMTP) für Password-Recovery
- ✅ Admin-Panel: User verwalten, KI-Limits, E-Mail-Test - ✅ Admin-Panel: User verwalten, KI-Limits, E-Mail-Test
- ✅ Multi-Environment: Prod (mitai.jinkendo.de) + Dev (dev.mitai.jinkendo.de)
- ✅ Gitea CI/CD mit Auto-Deploy auf Raspberry Pi 5
### Was in v9 kommt: ### Was in v9b kommt:
- 🔲 PostgreSQL Migration (aktuell: SQLite) - 🔲 PostgreSQL Migration (aktuell noch SQLite)
- 🔲 Auth-Middleware auf ALLE Endpoints
- 🔲 bcrypt statt SHA256
- 🔲 Rate Limiting
- 🔲 CORS auf Domain beschränken
- 🔲 Selbst-Registrierung mit E-Mail-Bestätigung - 🔲 Selbst-Registrierung mit E-Mail-Bestätigung
- 🔲 Freemium Tier-System (free/basic/premium/selfhosted) - 🔲 Freemium Tier-System (free/basic/premium/selfhosted)
- 🔲 Login via E-Mail statt Profil-Liste - 🔲 14-Tage Trial automatisch
- 🔲 nginx + Let's Encrypt - 🔲 Einladungslinks für Beta-Nutzer
- 🔲 Admin kann Tiers manuell setzen
## Datenbank-Schema (SQLite, v8) ### Was in v9c kommt:
- 🔲 OAuth2-Grundgerüst für Fitness-Connectoren
- 🔲 Strava Connector
- 🔲 Withings Connector (Waage)
- 🔲 Garmin Connector
## Deployment
### Infrastruktur
```
Internet → privat.stommer.com (Fritz!Box DynDNS)
→ Synology NAS (Reverse Proxy + Let's Encrypt)
→ Raspberry Pi 5 (192.168.2.49, Docker)
```
### Git Workflow
```
develop branch → Auto-Deploy → dev.mitai.jinkendo.de (Port 3099/8099)
main branch → Auto-Deploy → mitai.jinkendo.de (Port 3002/8002)
```
### Deployment-Befehle (manuell falls nötig)
```bash
# Prod
cd /home/lars/docker/bodytrack
docker compose -f docker-compose.yml build --no-cache
docker compose -f docker-compose.yml up -d
# Dev
cd /home/lars/docker/bodytrack-dev
docker compose -f docker-compose.dev-env.yml build --no-cache
docker compose -f docker-compose.dev-env.yml up -d
```
## Datenbank-Schema (SQLite, v9a)
### Wichtige Tabellen: ### Wichtige Tabellen:
- `profiles` Nutzer mit Auth (role, pin_hash, auth_type, ai_enabled, export_enabled) - `profiles` Nutzer (role, pin_hash/bcrypt, email, auth_type, ai_enabled)
- `sessions` Auth-Tokens mit Ablaufdatum - `sessions` Auth-Tokens mit Ablaufdatum
- `weight_log` Gewichtseinträge (profile_id, date, weight) - `weight_log` Gewichtseinträge (profile_id, date, weight)
- `circumference_log` 8 Umfangspunkte - `circumference_log` 8 Umfangspunkte
@ -93,58 +126,49 @@ mitai-jinkendo/
- `nutrition_log` Kalorien + Makros (aus FDDB-CSV) - `nutrition_log` Kalorien + Makros (aus FDDB-CSV)
- `activity_log` Training (aus Apple Health oder manuell) - `activity_log` Training (aus Apple Health oder manuell)
- `ai_insights` KI-Auswertungen (scope = prompt-slug) - `ai_insights` KI-Auswertungen (scope = prompt-slug)
- `ai_prompts` Konfigurierbare Prompts mit Templates - `ai_prompts` Konfigurierbare Prompts mit Templates (11 Prompts)
- `ai_usage` KI-Calls pro Tag pro Profil - `ai_usage` KI-Calls pro Tag pro Profil
## Auth-Flow (aktuell v8) ## Auth-Flow (v9a)
``` ```
Login-Screen → Profil-Liste → PIN/Passwort → Token im localStorage Login-Screen → E-Mail + Passwort → Token im localStorage
Token → X-Auth-Token Header → Backend require_auth() Token → X-Auth-Token Header → Backend require_auth()
Profile-Id → aus Session (nicht aus Header!) Profile-Id → aus Session (nicht aus Header!)
SHA256 Passwörter → automatisch zu bcrypt migriert beim Login
``` ```
## API-Konventionen ## API-Konventionen
- Alle Endpoints: `/api/...` - Alle Endpoints: `/api/...`
- Auth-Header: `X-Auth-Token: <token>` - Auth-Header: `X-Auth-Token: <token>`
- Profile-Header: `X-Profile-Id: <uuid>` (nur wo noch nicht migriert)
- Responses: immer JSON - Responses: immer JSON
- Fehler: `{"detail": "Fehlermeldung"}` - Fehler: `{"detail": "Fehlermeldung"}`
- Rate Limit überschritten: HTTP 429
## Umgebungsvariablen (.env) ## Umgebungsvariablen (.env)
``` ```
OPENROUTER_API_KEY= # KI-Calls OPENROUTER_API_KEY= # KI-Calls
OPENROUTER_MODEL=anthropic/claude-sonnet-4 OPENROUTER_MODEL=anthropic/claude-sonnet-4
ANTHROPIC_API_KEY= # Alternative zu OpenRouter
SMTP_HOST= # E-Mail SMTP_HOST= # E-Mail
SMTP_PORT=587 SMTP_PORT=587
SMTP_USER= SMTP_USER=
SMTP_PASS= SMTP_PASS=
SMTP_FROM= SMTP_FROM=
APP_URL= # Für Links in E-Mails APP_URL=https://mitai.jinkendo.de
DATA_DIR=/app/data # SQLite-Pfad (v8) ALLOWED_ORIGINS=https://mitai.jinkendo.de
DATA_DIR=/app/data
PHOTOS_DIR=/app/photos PHOTOS_DIR=/app/photos
# v9 (PostgreSQL):
DATABASE_URL=postgresql://jinkendo:password@db/jinkendo
DB_PASSWORD=
```
## Deployment (aktuell)
```bash
# Heimserver (Raspberry Pi 5, lars@raspberrypi5)
cd /home/lars/docker/bodytrack
docker compose build --no-cache [frontend|backend]
docker compose up -d
docker logs mitai-api --tail 30
``` ```
## Wichtige Hinweise für Claude Code ## Wichtige Hinweise für Claude Code
1. **Ports immer 3002/8002** nie ändern 1. **Ports immer 3002/8002 (Prod) oder 3099/8099 (Dev)** nie ändern
2. **npm install** (nicht npm ci) kein package-lock.json vorhanden 2. **npm install** (nicht npm ci) kein package-lock.json vorhanden
3. **SQLite safe_alters** neue Spalten immer via _safe_alters() hinzufügen 3. **SQLite safe_alters** neue Spalten immer via safe_alters Liste
4. **Pipeline-Prompts** haben slug-Prefix `pipeline_` nie als Einzelanalyse zeigen 4. **Pipeline-Prompts** haben slug-Prefix `pipeline_` nie als Einzelanalyse zeigen
5. **dayjs.week()** braucht Plugin stattdessen native JS Wochenberechnung 5. **dayjs.week()** braucht Plugin stattdessen native JS ISO-Wochenberechnung
6. **useNavigate()** nur in React-Komponenten (Großbuchstabe), nicht in Helper-Functions 6. **useNavigate()** nur in React-Komponenten, nicht in Helper-Functions
7. **Bar fill=function** in Recharts nicht unterstützt nur statische Farben 7. **api.js nutzen** für alle API-Calls injiziert Token automatisch
8. **bcrypt** für alle neuen Passwort-Operationen verwenden
9. **session=Depends(require_auth)** als separater Parameter nie in Header() einbetten
## Code-Style ## Code-Style
- React: Functional Components, Hooks - React: Functional Components, Hooks