md code aktualisiert V9
This commit is contained in:
parent
4a6dc37854
commit
c36085daa4
154
CLAUDE.md
154
CLAUDE.md
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user