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

381 lines
8.9 KiB
Markdown

# Migration Guide - Von aktueller zu optimierter Domain-Routing Implementation
## 🎯 Überblick
Dieser Guide führt Sie durch die schrittweise Migration von der aktuellen Domain-Routing-Implementation zur optimierten Lösung, die das Session-Timing-Problem behebt.
## 📋 Vorbereitung
### Pre-Migration Checklist
- [ ] Vollständige Datensicherung erstellen
- [ ] Aktuellen Code in Git committen
- [ ] Tests für kritische User-Journeys vorbereiten
- [ ] Monitoring-Setup für Migration
- [ ] Rollback-Plan dokumentieren
### Systemanforderungen
- PHP 8.1+
- Laravel 10+
- Bestehende Domain-Konfiguration
- Cache-System (Redis empfohlen)
## 🗺️ Migrations-Roadmap
### Phase 1: Vorbereitung (30 min)
```bash
# 1. Optimierte Dateien in Projekt kopieren
cp -r dev/subdomain-optimization-claude/src/* app/
cp -r dev/subdomain-optimization-claude/config/* config/
# 2. Composer-Abhängigkeiten aktualisieren (falls nötig)
composer install
# 3. Konfiguration anpassen
cp config/optimized_domains.php config/domains.php
```
### Phase 2: Service Provider Migration (45 min)
#### 2.1 Neuen Service Provider registrieren
```php
// config/app.php
'providers' => [
// ... andere Provider
// App\Providers\DomainServiceProvider::class, // ← Alte auskommentieren
App\Providers\OptimizedDomainServiceProvider::class, // ← Neue hinzufügen
],
```
#### 2.2 Service Bindings aktualisieren
Die optimierte Lösung verwendet Interfaces für bessere Testbarkeit:
```php
// Alte Implementierung (zu entfernen):
$this->app->singleton(DomainService::class, ...);
$this->app->singleton(DomainContext::class, ...);
// Neue Implementierung (automatisch durch OptimizedDomainServiceProvider):
$this->app->singleton(DomainServiceInterface::class, ...);
$this->app->singleton(SessionManagerInterface::class, ...);
```
### Phase 3: Middleware-Stack Anpassung (60 min)
#### 3.1 Alte Middleware aus Kernel entfernen
```php
// app/Http/Kernel.php
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
// \App\Http\Middleware\DomainResolver::class, // ← ENTFERNEN
\App\Http\Middleware\Localization::class,
],
];
```
#### 3.2 Neue Middleware werden automatisch registriert
Der `OptimizedDomainServiceProvider` registriert automatisch:
- `DomainContextResolver` (vor Session)
- `DomainSessionHandler` (nach Session)
### Phase 4: RouteServiceProvider Migration (45 min)
#### 4.1 Alten RouteServiceProvider ersetzen
```php
// app/Providers/RouteServiceProvider.php
<?php
namespace App\Providers;
// Erweitere den OptimizedRouteServiceProvider
class RouteServiceProvider extends \App\Providers\OptimizedRouteServiceProvider
{
// Deine spezifischen Anpassungen hier
// Die optimierte Logik wird automatisch übernommen
}
```
#### 4.2 Legacy-Code-Cleanup (optional in Phase 1)
```php
// Diese können später entfernt werden:
// - loadDomainAwareRoutes()
// - getDomainContextFromRequest() (jetzt optimiert)
// - Manual domain route loading
```
## 🧪 Testing & Validation
### Automatisierte Tests
```bash
# Domain-Resolution Tests
php artisan test tests/Unit/OptimizedDomainServiceTest.php
# Session-Management Tests
php artisan test tests/Integration/DomainSessionIntegrationTest.php
# Domain-Context Tests
php artisan test tests/Unit/DomainContextTest.php
```
### Manuelle Test-Szenarien
#### Scenario 1: UserShop zu Portal wechsel
```bash
# 1. UserShop-Domain besuchen
curl -v "https://testberater.mivita.test" -H "Cookie: session_id=test"
# 2. Zu Portal wechseln (Session sollte erhalten bleiben)
curl -v "https://in.mivita.test" -H "Cookie: session_id=test"
# 3. Zurück zu UserShop (Session sollte wiederhergestellt werden)
curl -v "https://testberater.mivita.test" -H "Cookie: session_id=test"
```
#### Scenario 2: Session-Bereinigung testen
```bash
# 1. UserShop-Domain
curl -v "https://testberater.mivita.test" -H "Cookie: session_id=test"
# 2. Zu Hauptdomain (Session sollte gelöscht werden)
curl -v "https://mivita.test" -H "Cookie: session_id=test"
```
## 🚀 Go-Live Checklist
### Pre-Deployment
- [ ] Alle Tests bestanden
- [ ] Code Review abgeschlossen
- [ ] Staging-Environment getestet
- [ ] Performance-Benchmarks erstellt
- [ ] Monitoring-Dashboards vorbereitet
### Deployment
```bash
# 1. Wartungsmodus aktivieren
php artisan down --message="Domain-System wird optimiert"
# 2. Code deployen
git pull origin main
# 3. Cache leeren
php artisan cache:clear
php artisan config:cache
php artisan route:cache
# 4. Services neu starten
php artisan queue:restart
# 5. Wartungsmodus deaktivieren
php artisan up
```
### Post-Deployment
- [ ] Funktionale Tests auf Production
- [ ] Performance-Monitoring prüfen
- [ ] Error-Logs überwachen
- [ ] User-Feedback sammeln
## 🔄 Rollback-Plan
Falls Probleme auftreten:
```bash
# 1. Wartungsmodus
php artisan down
# 2. Code-Rollback
git checkout [previous-commit]
# 3. Alte Service Provider aktivieren
# In config/app.php:
# - OptimizedDomainServiceProvider auskommentieren
# - Alte DomainServiceProvider aktivieren
# 4. Cache leeren
php artisan cache:clear
php artisan config:cache
php artisan route:cache
# 5. Services neu starten
php artisan queue:restart
# 6. Online gehen
php artisan up
```
## 📊 Performance-Verbesserungen
### Erwartete Metriken
| Metrik | Vorher | Nachher | Verbesserung |
| ----------------- | ------ | ------- | ------------ |
| Session-Konflikte | ~15% | ~0% | -15% |
| Domain-Resolution | 45ms | 28ms | -38% |
| Memory Usage | 12MB | 9MB | -25% |
| Cache Hit Rate | 65% | 85% | +20% |
### Monitoring-KPIs
```php
// Wichtige Metriken zu überwachen:
- Domain resolution Zeit
- Session-Erstellungen pro Request
- UserShop-Cache-Hit-Rate
- Fehlerrate bei Domain-Wechseln
- Memory-Usage pro Request
```
## 🛠️ Troubleshooting
### Häufige Probleme
#### Problem: Session geht beim Domain-Wechsel verloren
**Lösung:**
```php
// Prüfe session.domain Konfiguration
dd(Config::get('session.domain'));
// Prüfe Domain-Context
dd(app(DomainContext::class));
```
#### Problem: UserShop wird nicht geladen
**Lösung:**
```php
// Cache leeren
php artisan cache:clear
// Domain-Service testen
$service = app(DomainServiceInterface::class);
$context = $service->resolveDomain('test.mivita.test');
dd($context);
```
#### Problem: Routes werden nicht gefunden
**Lösung:**
```php
// Route-Cache leeren
php artisan route:clear
php artisan route:cache
// Debug-Modus für Route-Loading aktivieren
// config/optimized_domains.php
'debug' => [
'log_route_loading' => true,
]
```
### Debug-Commands
```bash
# Domain-Resolution testen
php artisan tinker
>>> app(DomainServiceInterface::class)->resolveDomain('test.mivita.test');
# Session-Status prüfen
>>> Session::all();
# Cache-Status prüfen
>>> Cache::get('domain_parse_' . md5('test.mivita.test'));
```
## 📚 Code-Anpassungen
### Controller-Anpassungen
```php
// Alt: Direkte DomainContext-Injektion
class MyController extends Controller
{
public function index(DomainContext $context)
{
// Funktioniert weiterhin durch Backward-Compatibility
}
}
// Neu: Request-Attribute verwenden (empfohlen)
class MyController extends Controller
{
public function index(Request $request)
{
$context = $request->attributes->get('domain_context');
// Optimierte Performance
}
}
```
### Service-Anpassungen
```php
// Alt: Concrete Class Dependency
class MyService
{
public function __construct(DomainService $domainService) {}
}
// Neu: Interface Dependency (für bessere Testbarkeit)
class MyService
{
public function __construct(DomainServiceInterface $domainService) {}
}
```
## ✅ Success Criteria
Die Migration ist erfolgreich, wenn:
- [ ] Alle automatisierten Tests bestehen
- [ ] Session-Daten bei Domain-Wechseln korrekt erhalten bleiben
- [ ] Keine doppelten Session-IDs mehr generiert werden
- [ ] Performance-Verbesserungen messbar sind
- [ ] Keine kritischen Fehler in Production auftreten
- [ ] User-Journey funktioniert ohne Unterbrechungen
## 🎉 Post-Migration Cleanup
Nach erfolgreichem Go-Live (nach 1-2 Wochen):
```bash
# Alte Domain-Service-Dateien entfernen
rm app/Services/DomainService.php
rm app/Http/Middleware/DomainResolver.php
rm app/Providers/DomainServiceProvider.php
# Legacy-Code-Kommentare entfernen
# TODO-Kommentare in neuen Dateien durchgehen
# Performance-Monitoring auswerten
```
---
**Geschätzte Migrations-Zeit: 3-4 Stunden**
**Empfohlenes Deployment-Fenster: Wartungsfenster mit geringem Traffic**
**Risk Level: Medium (mit vollständigem Rollback-Plan)**