Files
Rezepte/EXTERNAL_MYSQL_SETUP.md
2025-09-22 16:35:59 +02:00

6.9 KiB

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:

# Alle MySQL-Container anzeigen
docker ps | grep mysql

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

2. Docker-Netzwerk finden:

# Gitea-Netzwerke anzeigen
docker network ls | grep gitea

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

3. MySQL-Zugangsdaten ermitteln:

# Gitea docker-compose.yml oder .env prüfen
cat /path/to/gitea/docker-compose.yml | grep -A5 -B5 MYSQL

⚙️ Konfiguration

1. Environment-Datei erstellen:

# Template kopieren
cp .env.external-db.example .env.external-db

# Anpassen:
nano .env.external-db

2. Wichtige Einstellungen:

# 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:

./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:

networks:
  # Traefik-eigenes Netzwerk
  traefik-network:
    driver: bridge
  
  # Gitea-Netzwerk (extern)
  gitea_default:
    external: true

Service-Konfiguration:

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:

-- 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:

# 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:

# Alle Container auflisten
docker ps -a | grep mysql

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

Netzwerk-Verbindung fehlschlägt:

# Netzwerk-Details anzeigen
docker network inspect gitea_default

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

Berechtigungen prüfen:

# 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:

# 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:

# 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! 🚀