mivita/dev/subdomain-optimization-grok/MIGRATION_GUIDE.md
2025-10-20 17:42:08 +02:00

383 lines
9.2 KiB
Markdown

# Migration Guide - Von altem zu neuem Domain System
## Übersicht
Dieser Guide führt Sie durch die Migration vom aktuellen Domain-System zum neuen optimierten System. Die Migration erfolgt schrittweise, um Risiken zu minimieren.
## Vor der Migration
### 1. Backup erstellen
```bash
# Datenbank Backup
mysqldump mivita > mivita_backup_$(date +%Y%m%d_%H%M%S).sql
# Code Backup
cp -r app/ app_backup_$(date +%Y%m%d_%H%M%S)/
```
### 2. Tests vorbereiten
```bash
# Bestehende Tests ausführen
php artisan test
# Domain-spezifische Tests erstellen
php artisan make:test DomainRoutingTest
php artisan make:test SessionDomainSwitchingTest
```
### 3. Neue Dateien bereitstellen
```bash
# Neue Klassen kopieren
cp dev/subdomain-optimization-grok/src/Domain/DomainType.php app/Domain/
cp dev/subdomain-optimization-grok/src/Domain/DomainContext.php app/Domain/
cp dev/subdomain-optimization-grok/src/Middleware/DomainResolver.php app/Http/Middleware/
cp dev/subdomain-optimization-grok/src/Middleware/DomainSessionHandler.php app/Http/Middleware/
cp dev/subdomain-optimization-grok/src/Services/DomainService.php app/Services/
cp dev/subdomain-optimization-grok/src/Services/DomainCacheManager.php app/Services/
cp dev/subdomain-optimization-grok/src/Providers/RouteServiceProvider.php app/Providers/
cp dev/subdomain-optimization-grok/src/Events/DomainChangedEvent.php app/Events/
```
## Schritt-für-Schritt Migration
### Schritt 1: Neue Middleware registrieren (Test-Environment)
**Datei: `app/Http/Kernel.php`**
```php
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
// NEUE MIDDLEWARE (nach Cookies, vor Session)
\App\Http\Middleware\DomainResolver::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
// NEUE MIDDLEWARE (nach Session)
\App\Http\Middleware\DomainSessionHandler::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\Localization::class,
],
```
### Schritt 2: DomainServiceProvider aktualisieren
**Datei: `app/Providers/DomainServiceProvider.php`**
```php
public function register()
{
// DomainService registrieren (bleibt gleich)
$this->app->singleton(DomainService::class, function ($app) {
$domainService = new DomainService($app['config']['domains']);
// ... bestehende Validierung
return $domainService;
});
// DomainContext registrieren (AKTUALISIERT)
$this->app->singleton(DomainContext::class, function ($app) {
/** @var DomainService $domainService */
$domainService = $app->make(DomainService::class);
$request = $app->make('request');
$domainInfo = $domainService->parseDomain($request->getHost());
$userShop = null;
if ($domainInfo['type'] === 'user-shop' && $domainInfo['subdomain']) {
$userShop = $domainService->getUserShop($domainInfo['subdomain']);
if (!$userShop) {
$domainInfo['type'] = 'unknown';
}
}
if ($domainInfo['type'] === 'main-shop' && $domainInfo['default_user_shop']) {
$userShop = $domainService->getUserShop($domainInfo['default_user_shop']);
}
// NEU: DomainContext::fromArray verwenden
return DomainContext::fromArray($domainInfo, $userShop);
});
}
```
### Schritt 3: RouteServiceProvider aktualisieren
**Datei: `app/Providers/RouteServiceProvider.php`**
```php
protected function loadDomainAwareRoutes(): void
{
/** @var DomainContext $context */
$context = app(DomainContext::class);
if (config('app.debug')) {
\Log::channel('domain')->info('loadDomainAwareRoutes', ['context' => $context]);
}
// NEUE DOMAIN-TYPES verwenden
match ($context->type) {
'main' => $this->loadDomainRoutes('main', 'main.php'),
'shop' => $this->loadDomainRoutes('shop', 'shop.php'),
'crm' => $this->loadDomainRoutes('crm', 'crm.php'),
'portal' => $this->loadDomainRoutes('portal', 'portal.php'),
'checkout' => $this->loadDomainRoutes('checkout', 'checkout.php'),
'user-shop' => [
$this->loadDomainRoutes('user-shop', 'user-shop.php'),
$this->loadDomainRoutes('portal', 'portal.php'),
],
default => $this->loadAllDomainRoutesForCaching(),
};
}
```
### Schritt 4: Event-ServiceProvider registrieren
**Datei: `config/app.php`**
```php
'providers' => [
// ... andere Provider
App\Providers\EventServiceProvider::class,
],
```
**Datei: `app/Providers/EventServiceProvider.php`**
```php
protected $listen = [
\App\Events\DomainChangedEvent::class => [
// Optional: Listener für Domain-Änderungen
// \App\Listeners\DomainChangedListener::class,
],
];
```
### Schritt 5: Konfiguration aktualisieren
**Datei: `config/domains.php`** (keine Änderungen nötig)
### Schritt 6: Tests durchführen
```bash
# Grundfunktionalität testen
php artisan tinker
```
```php
// Domain-Auflösung testen
$domainService = app(\App\Services\DomainService::class);
$context = $domainService->resolveDomain('my.mivita.care');
echo $context; // Sollte DomainType::CRM zeigen
// UserShop testen
$userShop = $domainService->getUserShop('aloevera');
echo $userShop?->name ?? 'UserShop nicht gefunden';
```
## Rollback-Plan
Falls Probleme auftreten:
### Schnell-Rollback
```bash
# Kernel.php zurücksetzen
git checkout HEAD -- app/Http/Kernel.php
# Neue Middleware auskommentieren
# \App\Http\Middleware\DomainResolver::class,
# \App\Http\Middleware\DomainSessionHandler::class,
```
### Vollständiges Rollback
```bash
# Alle neuen Dateien entfernen
rm app/Domain/DomainType.php
rm app/Domain/DomainContext.php
rm app/Http/Middleware/DomainResolver.php
rm app/Http/Middleware/DomainSessionHandler.php
rm app/Services/DomainCacheManager.php
rm app/Events/DomainChangedEvent.php
# Alte Dateien wiederherstellen
git checkout HEAD -- app/Providers/DomainServiceProvider.php
git checkout HEAD -- app/Providers/RouteServiceProvider.php
```
## Nach der Migration
### 1. Cache leeren
```bash
php artisan cache:clear
php artisan config:clear
php artisan route:clear
```
### 2. Route-Cache neu aufbauen
```bash
php artisan route:cache
```
### 3. Tests ausführen
```bash
# Vollständige Test-Suite
php artisan test
# Domain-spezifische Tests
php artisan test --filter=Domain
```
### 4. Monitoring einrichten
```bash
# Domain-Logs überwachen
tail -f storage/logs/domain-*.log
# Performance überwachen
php artisan tinker
```
```php
$cacheManager = app(\App\Services\DomainCacheManager::class);
$stats = $cacheManager->getCacheStatistics();
$health = $cacheManager->performHealthCheck();
```
## Häufige Probleme und Lösungen
### Problem 1: Session-Konflikte
**Symptom:** Zwei Sessions werden erstellt
**Lösung:**
- Sicherstellen, dass DomainResolver NACH Cookies aber VOR Session läuft
- DomainSessionHandler NACH Session-Start ausführen
### Problem 2: UserShop wird nicht beibehalten
**Symptom:** Beim Wechsel von Shop zu in. geht UserShop verloren
**Lösung:**
- Überprüfen, dass `shouldPreserveSession()` korrekt implementiert ist
- DomainSessionHandler muss UserShop-Daten korrekt setzen
### Problem 3: Performance-Probleme
**Symptom:** Langsame Domain-Auflösung
**Lösung:**
```bash
# Cache leeren
php artisan cache:clear
# Cache vorwärmen
php artisan tinker
$cacheManager = app(\App\Services\DomainCacheManager::class);
$cacheManager->warmupCache(['mivita.care', 'my.mivita.care'], ['aloevera']);
```
### Problem 4: Route-Loading Fehler
**Symptom:** Falsche Routen werden geladen
**Lösung:**
- Route-Cache leeren: `php artisan route:clear`
- Domain-Kontext überprüfen im Debug-Modus
- Route-Dateien auf Existenz prüfen
## Performance-Optimierungen
### Cache-Konfiguration
**Datei: `config/cache.php`**
```php
'stores' => [
'redis' => [
'driver' => 'redis',
'connection' => 'cache',
'lock_connection' => 'default',
],
],
```
### Queue für Cache-Operationen
```bash
# Cache-Operationen asynchron verarbeiten
php artisan queue:work
```
## Monitoring und Alerting
### Log-Konfiguration
**Datei: `config/logging.php`**
```php
'channels' => [
'domain' => [
'driver' => 'daily',
'path' => storage_path('logs/domain.log'),
'level' => 'debug',
'days' => 30,
],
],
```
### Health-Checks
```bash
# Domain-System Health-Check
curl https://mivita.care/health/domain
```
## Support
Bei Problemen:
1. Logs überprüfen: `storage/logs/domain-*.log`
2. Debug-Modus aktivieren: `.env APP_DEBUG=true`
3. Cache-Statistiken prüfen
4. Domain-Service direkt testen
## Zeitplan
- **Tag 1:** Neue Dateien bereitstellen und testen
- **Tag 2:** Middleware-Migration in Test-Environment
- **Tag 3:** Vollständige Migration in Staging
- **Tag 4:** Production-Deployment mit Rollback-Plan
- **Tag 5:** Monitoring und Optimierung
## Checklisten
### Pre-Migration ✅
- [ ] Backup erstellt
- [ ] Tests vorbereitet
- [ ] Neue Dateien bereitgestellt
- [ ] Rollback-Plan dokumentiert
### Post-Migration ✅
- [ ] Cache geleert
- [ ] Routes gecacht
- [ ] Tests bestanden
- [ ] Monitoring aktiv
- [ ] Performance baseline etabliert