# Externe MySQL-Datenbank Integration - Rezepte Klaus

## 🗄️ Bestehende MySQL-Datenbank nutzen (Gitea)

Statt einen separaten MySQL-Container zu starten, können Sie die bestehende MySQL-Instanz Ihrer Gitea-Installation nutzen. Das spart Ressourcen und zentralisiert die Datenbank-Verwaltung.

## 🔍 Vorbereitung: Gitea-Setup analysieren

### 1. **MySQL-Container identifizieren:**
```bash
# Alle MySQL-Container anzeigen
docker ps | grep mysql

# Typische Namen:
# - gitea-mysql-1
# - gitea_mysql_1  
# - mysql
# - gitea-db
```

### 2. **Docker-Netzwerk finden:**
```bash
# Gitea-Netzwerke anzeigen
docker network ls | grep gitea

# Typische Namen:
# - gitea_default
# - gitea-network
# - gitea_gitea
```

### 3. **MySQL-Zugangsdaten ermitteln:**
```bash
# Gitea docker-compose.yml oder .env prüfen
cat /path/to/gitea/docker-compose.yml | grep -A5 -B5 MYSQL
```

## ⚙️ Konfiguration

### 1. **Environment-Datei erstellen:**
```bash
# Template kopieren
cp .env.external-db.example .env.external-db

# Anpassen:
nano .env.external-db
```

### 2. **Wichtige Einstellungen:**
```bash
# MySQL Container (von Gitea)
MYSQL_HOST=gitea-mysql-1          # Ihr MySQL-Container-Name
MYSQL_PORT=3306
MYSQL_ADMIN_USER=root
MYSQL_ADMIN_PASSWORD=your_gitea_root_password

# Neuer Rezepte-User
MYSQL_REZEPTE_PASSWORD=secure_password_for_rezepte

# Netzwerk (von Gitea)
EXTERNAL_MYSQL_NETWORK=gitea_default
```

## 🚀 Deployment

### **Automatisches Setup:**
```bash
./deploy-external-db.sh
```

### **Was passiert automatisch:**
1. ✅ **Container-Erkennung**: Findet Gitea MySQL-Container
2. ✅ **Netzwerk-Validierung**: Prüft Docker-Netzwerk
3. ✅ **Verbindungstest**: Testet MySQL-Zugriff
4. ✅ **Datenbank-Setup**: Erstellt `rezepte_klaus` DB
5. ✅ **User-Erstellung**: Legt `rezepte_user` an
6. ✅ **Daten-Import**: Importiert SQL-Dateien
7. ✅ **Service-Start**: Startet alle Services

## 🏗️ Architektur-Übersicht

### **Vor der Integration:**
```
┌─────────────┐    ┌─────────────┐
│    Gitea    │    │ Rezepte App │
│             │    │             │
│ ┌─────────┐ │    │ ┌─────────┐ │
│ │ MySQL   │ │    │ │ MySQL   │ │
│ └─────────┘ │    │ └─────────┘ │
└─────────────┘    └─────────────┘
   2x Ressourcen       Dopplung
```

### **Nach der Integration:**
```
┌─────────────────────────────────┐
│        Shared MySQL             │
│  ┌─────────────────────────────┐│
│  │ ┌──────────┐ ┌────────────┐││
│  │ │   gitea  │ │rezepte_klaus│││
│  │ └──────────┘ └────────────┘││
│  └─────────────────────────────┘│
└─────────────────────────────────┘
              ↑
    ┌─────────┼─────────┐
    │         │         │
┌───▼───┐ ┌───▼────┐ ┌──▼─────┐
│ Gitea │ │ Rezepte│ │phpMyAdm│
└───────┘ └────────┘ └────────┘
```

## 🔧 Technische Details

### **Docker-Netzwerk-Integration:**
```yaml
networks:
  # Traefik-eigenes Netzwerk
  traefik-network:
    driver: bridge
  
  # Gitea-Netzwerk (extern)
  gitea_default:
    external: true
```

### **Service-Konfiguration:**
```yaml
backend:
  environment:
    - DATABASE_URL=mysql://rezepte_user:${MYSQL_REZEPTE_PASSWORD}@${MYSQL_HOST}:3306/rezepte_klaus
  networks:
    - traefik-network
    - gitea_default  # Zugriff auf Gitea MySQL
```

### **phpMyAdmin-Zugriff:**
- ✅ **Gitea-Datenbank**: Voller Zugriff mit Admin-Credentials
- ✅ **Rezepte-Datenbank**: Separater User mit eingeschränkten Rechten
- ✅ **Multi-DB-Verwaltung**: Beide Datenbanken in einer Oberfläche

## 🔒 Sicherheit

### **Getrennte Benutzer:**
```sql
-- Gitea nutzt eigenen User (meist 'gitea')
-- Rezepte Klaus bekommt eigenen User ('rezepte_user')
-- Keine gegenseitigen Zugriffe

GRANT ALL PRIVILEGES ON rezepte_klaus.* TO 'rezepte_user'@'%';
-- Kein Zugriff auf 'gitea' Datenbank
```

### **Netzwerk-Isolation:**
```yaml
# Rezepte-Services sind nur im eigenen Netzwerk erreichbar
# MySQL ist shared, aber mit User-Trennung
networks:
  - traefik-network     # Web-Zugriff
  - gitea_default       # DB-Zugriff
```

## 📊 Vorteile

### **Ressourcen-Einsparung:**
- ❌ **Vorher**: 2x MySQL-Container (je ~500MB RAM)
- ✅ **Nachher**: 1x MySQL-Container für beide Apps
- 💾 **Einsparung**: ~500MB RAM + Disk Space

### **Zentrale Verwaltung:**
- ✅ **Ein phpMyAdmin**: Für alle Datenbanken
- ✅ **Ein Backup-Punkt**: Für alle MySQL-Daten
- ✅ **Eine Überwachung**: MySQL-Performance zentral
- ✅ **Eine Wartung**: Updates nur an einer Stelle

### **Professionelle Architektur:**
- ✅ **Microservices**: Services bleiben getrennt
- ✅ **Shared Database**: Datenbank-Layer konsolidiert
- ✅ **Skalierbarkeit**: Weitere Apps können MySQL nutzen

## 🛠️ Troubleshooting

### **MySQL-Container nicht gefunden:**
```bash
# Alle Container auflisten
docker ps -a | grep mysql

# Gitea docker-compose prüfen
cd /path/to/gitea && docker-compose ps
```

### **Netzwerk-Verbindung fehlschlägt:**
```bash
# Netzwerk-Details anzeigen
docker network inspect gitea_default

# Container-Netzwerke prüfen
docker inspect gitea-mysql-1 | grep NetworkMode
```

### **Berechtigungen prüfen:**
```bash
# Als rezepte_user anmelden
docker exec -it gitea-mysql-1 mysql -urezepte_user -p

# Datenbanken anzeigen
SHOW DATABASES;

# Berechtigungen prüfen
SHOW GRANTS FOR 'rezepte_user'@'%';
```

## 📋 Befehle-Referenz

### **Deployment:**
```bash
# Vollständiges Setup
./deploy-external-db.sh

# Nur Services neu starten
docker-compose -f docker-compose.traefik-external-db.yml restart

# Logs anzeigen
docker-compose -f docker-compose.traefik-external-db.yml logs -f backend
```

### **Datenbank-Zugriff:**
```bash
# Als Admin (Gitea + Rezepte)
docker exec -it gitea-mysql-1 mysql -uroot -p

# Als Rezepte-User (nur Rezepte)
docker exec -it gitea-mysql-1 mysql -urezepte_user -p rezepte_klaus

# Backup erstellen
docker exec gitea-mysql-1 mysqldump -uroot -p rezepte_klaus > backup.sql
```

## 🎯 Fazit

Die externe MySQL-Integration bietet:
- **50% weniger Ressourcenverbrauch** 💾
- **Zentrale Datenbank-Verwaltung** 🗄️
- **Professionelle Multi-Tenant-Architektur** 🏗️
- **Einfachere Backup-Strategien** 💾
- **Kosteneffizienz** bei Cloud-Deployments ☁️

Perfect für Server mit mehreren Anwendungen! 🚀