# Rezepte - Docker & Modern Stack

Dieses Repository enthält zwei Welten: den modernen Node.js / React Stack sowie die historische PHP Legacy-App. Über Docker Compose Profile kannst du gezielt nur die benötigten Teile starten.

## Services & Ports

| Service      | Profil    | Port Host -> Container | Beschreibung |
|--------------|-----------|------------------------|--------------|
| mysql        | (auto)    | 3307 -> 3306           | MySQL 8 Datenbank |
| backend      | (auto)    | 3001 -> 3001           | Node.js API (Express + Prisma) |
| frontend     | (auto)    | 3000 -> 80             | React Build via nginx |
| phpmyadmin   | admin     | 8083 -> 80             | DB Verwaltung (optional) |

## Node / Modern Stack
Empfohlene Node Version: **22.12.0** (`.nvmrc`, `.tool-versions`).

Lokal ohne Docker (Entwicklung Hot Reload):
```bash
nvm use
cd backend && npm install && npm run dev   # startet API auf :3001
cd ../frontend && npm install && npm run dev  # startet Vite auf :5173
```

## Docker Nutzung

### Standard (nur moderner Stack: DB + API + Frontend)
```bash
docker compose up -d
```
Öffnen: http://localhost:3000

### Mit phpMyAdmin
```bash
docker compose --profile admin up -d
```
Öffnen: http://localhost:8083

### Alles stoppen
```bash
docker compose down
```

### Neu bauen (z.B. nach Codeänderungen Backend/Frontend)
```bash
docker compose build backend frontend
docker compose up -d
```

### Nur Backend neu bauen
```bash
docker compose build backend && docker compose up -d backend
```

### Logs
```bash
docker compose logs -f backend
docker compose logs -f frontend
docker compose logs -f mysql
```

## CORS Hinweis
Das Backend akzeptiert nur Ursprünge aus `CORS_ORIGIN` (kommagetrennt). In Produktion wird ein Wildcard `*` geblockt, außer du setzt bewusst `ALLOW_INSECURE_CORS=1` (nicht empfohlen). Beispiel:
```env
CORS_ORIGIN=http://esprimo:3000,http://localhost:3000
```
Nach Änderung Backend neu bauen / starten.

## Datenbankzugang

## Environment (.env)
Beispiel siehe `.env.example`. Wichtigste Variablen:
```
DOMAIN=example.com
MYSQL_DATABASE=rezepte
MYSQL_USER=rezepte_user
MYSQL_PASSWORD=change_this_password
MYSQL_ROOT_PASSWORD=change_this_root_password
BACKEND_PORT=3001
FRONTEND_PORT=3000
DATABASE_URL=mysql://${MYSQL_USER}:${MYSQL_PASSWORD}@mysql:3306/${MYSQL_DATABASE}
JWT_SECRET=please_change_to_secure_32_char_min
CORS_ORIGIN=http://localhost:3000
VITE_API_URL=http://localhost:3001/api
UPLOAD_PATH=/app/uploads
MAX_FILE_SIZE=5242880
```
Nicht gesetzte Variablen fallen auf sichere Defaults (oder Dummy Werte) zurück; vor Produktion immer mit echten Secrets überschreiben.

## Datenbankzugang

### Für die Anwendung:
- Host: mysql
- Database: rezepte
- User: rezepte_user
- Password: rezepte_pass

### Für phpMyAdmin:
- Server: mysql
- Username: rezepte_user
- Password: rezepte_pass

### Root-Zugang:
- Username: root
- Password: rezepte123

## Entwicklung innerhalb Docker

Status:
```bash
docker compose ps
```

Direktes DB Login (Host hat mysql Client):
```bash
mysql -h 127.0.0.1 -P 3307 -u rezepte_user -p'rezepte_pass' rezepte
```

## Datenvolumes

Die MySQL-Daten werden in einem Docker-Volume gespeichert und bleiben auch nach dem Stoppen der Container erhalten.

## Datenbankinitialisierung

Beim ersten Start importiert MySQL automatisch SQL-Skripte aus `sql-init/`.

## Weiterführend
- Moderne Stack Doku: `NODEJS_README.md`
- Traefik / Registry Deploy: siehe entsprechende `*_SETUP.md` Dateien
- Sicherheitshärtung TODO: CORS einschränken, CSP Header, chown Migration verbessern
 - Erweiterte Compose Overrides: siehe `legacy/README_COMPOSE_LEGACY.md`
 - Beispiel Umgebungsvariablen: `.env.example`
 - CI Build Tags: Branch, Semver, `sha-<short>`, Run-ID, `latest` (nur main)