# 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-`, Run-ID, `latest` (nur main)