# Phase-1-Live-Deploy — Anleitung **Ausgangssituation:** - Test-System läuft mit Phase 1 (Laravel-10-Upgrade, Contacts-Modul, Duplicats-Commands, Soft-Delete- & Merge-Fields auf `customer`-Tabelle) - Live-Server ist bei Git-Commit `389d5d1` (Januar 2026) — noch ohne Phase 1 - Der Workspace wurde per `dev/backups/phase2-offers-2026-04-17/` um Phase 2 + Offers bereinigt und ist jetzt **exakt auf Phase-1-Stand** wie Test --- ## Vorbereitung (einmalig) 1. **Backup auf Live-Server** - Vollständiges DB-Backup (mysqldump oder Hoster-Tool) — speichere mit Zeitstempel - Vollständiges Dateisystem-Backup (zumindest `/app`, `/config`, `/routes`, `/resources`, `/database/migrations`, `/composer.json`, `/composer.lock`) 2. **Maintenance-Mode aktivieren** (empfohlen für 15–30 min) ```bash php artisan down --render="errors::503" --secret="dein-geheimer-preview-token" ``` Mit `--secret` kannst du über `https://domain/dein-geheimer-preview-token` weiter auf Live zugreifen, während alle anderen die 503-Seite sehen. 3. **Abhängigkeiten abklären** - Läuft auf Live mindestens **PHP 8.1** (Laravel-10-Anforderung)? Prüfen: `php -v` - Ist **Composer** auf dem Live-Server installiert? Falls Managed Hosting: `composer install` vor dem Deploy auf einem Staging-Server ausführen und das `vendor/`-Verzeichnis mitsyncen --- ## Upload (rsync / scp / SFTP) ### Was **muss** hochgeladen werden **Neue Dateien:** ``` database/migrations/2025_04_15_100001_phase1_add_merge_fields_to_customer_table.php database/migrations/2025_04_15_100002_phase1_add_soft_delete_to_customer_table.php app/Models/Contact.php app/Repositories/ContactRepository.php app/Http/Controllers/ContactController.php app/Console/Commands/ContactsFindDuplicates.php app/Console/Commands/ContactsMergeDuplicates.php app/Services/MailDirService.php resources/views/contact/_detail_contact.blade.php resources/views/contact/_detail_history.blade.php resources/views/contact/detail.blade.php resources/views/contact/duplicates.blade.php resources/views/contact/index.blade.php database/factories/BookingFactory.php database/factories/CustomerFactory.php database/factories/LeadFactory.php tests/Feature/Api/BookingImportTest.php tests/Feature/Auth/LoginTest.php tests/Feature/BookingControllerTest.php tests/Unit/Services/UtilTest.php ``` **Modifizierte Dateien** — vollständige Upload-Liste generieren: ```bash cd /workspace/mein.sterntours.de git diff --name-only HEAD^ \ | grep -Ev "^(dev/|tests/|\.env|\.mcp\.json$|CLAUDE\.md$|boost\.json$|_ide_helper|\.devcontainer/|bootstrap/cache/|mein\.sterntours\.de\.code-workspace$|docker-compose\.yml$|public/storage$)" \ > /tmp/phase1-files-to-upload.txt cat /tmp/phase1-files-to-upload.txt wc -l /tmp/phase1-files-to-upload.txt ``` Das filtert die unerwünschten Dateien automatisch raus. Die wichtigsten modifizierten Dateien (komplette Liste in der generierten Textdatei): - `app/Models/Customer.php`, `Booking.php`, `Lead.php` (und viele weitere Models — Laravel-10-Upgrade) - `app/Http/Controllers/*.php` (Controllers mit Laravel-10-Anpassungen) - `app/Http/Kernel.php`, `app/Console/Kernel.php`, `app/Providers/*.php`, `app/Http/Middleware/TrustProxies.php` (Laravel-10-Upgrade) - `app/Repositories/*.php` (Laravel-10: `Storage::disk()->path()` statt `getAdapter()->getPathPrefix()`) - `app/Libraries/CreatePDF.php` - `routes/web.php` (neue `/contacts`-Routen) - `resources/views/layouts/application.blade.php`, `resources/views/layouts/includes/layout-sidenav.blade.php` - `config/trustedproxy.php` - `packages/digital-bird/shoppingcart/**`, `packages/iqcontent/laravel-filemanager/**` (Package-Updates) - `composer.json`, `composer.lock` - `phpunit.xml` ### Was **nicht** hochgeladen werden darf - **Alles unter `dev/`** — dort liegt Entwicklungsdokumentation und die Backups (Phase 2, Offers) - `.env`, `.env.*` — enthält produktive Credentials, wird separat verwaltet - `_ide_helper.php`, `_ide_helper_models.php` — lokale IDE-Hilfen (von barryvdh/laravel-ide-helper generiert) - `bootstrap/cache/config.php` — wird auf Live per `php artisan config:cache` frisch generiert - `.mcp.json`, `CLAUDE.md`, `boost.json` — Dev-Tools-Konfiguration - `.devcontainer/` — Entwicklungsumgebung (VSCode-Devcontainer) - `storage/logs/*`, `storage/framework/cache/*`, `storage/framework/views/*`, `storage/framework/sessions/*` — Runtime-Daten - `vendor/` — wird auf Live per `composer install` generiert (außer Managed Hosting, siehe oben) - `node_modules/` — genauso - `.git/` — Repo-Metadaten - `tests/` — nur auf Test relevant; auf Live-Production nicht nötig (aber nicht schädlich, falls mit rauf kommt) - `mein.sterntours.de.code-workspace` — IDE-Workspace-Datei - `docker-compose.yml` — lokale Dev-Orchestrierung ### Beispiel rsync-Kommando (als Orientierung) ```bash # Von lokal → Live # Achtung: --dry-run zuerst, dann ohne --dry-run wiederholen! rsync -av --dry-run \ --exclude='.git/' \ --exclude='dev/' \ --exclude='node_modules/' \ --exclude='vendor/' \ --exclude='storage/logs/' \ --exclude='storage/framework/cache/' \ --exclude='storage/framework/views/' \ --exclude='storage/framework/sessions/' \ --exclude='storage/app/public/temp/' \ --exclude='public/storage' \ --exclude='.env*' \ --exclude='bootstrap/cache/' \ --exclude='_ide_helper*' \ --exclude='.mcp.json' \ --exclude='CLAUDE.md' \ --exclude='boost.json' \ --exclude='.devcontainer/' \ /workspace/mein.sterntours.de/ \ user@live-server:/pfad/zu/mein.sterntours.de/ ``` Falls du **nur geänderte Dateien** syncen möchtest (sicherer bei großer Codebase): ```bash git diff --name-only HEAD^ | grep -v "^dev/" > /tmp/phase1-files.txt rsync -av --files-from=/tmp/phase1-files.txt . user@live-server:/pfad/zu/mein.sterntours.de/ ``` --- ## Ausführung auf Live-Server Nach dem Upload, per SSH auf dem Live-Server: ```bash cd /pfad/zu/mein.sterntours.de # 1. Composer Dependencies aktualisieren (Laravel 10 Upgrade!) composer install --no-dev --optimize-autoloader # 2. Alle Caches leeren (wichtig wegen Struktur-Änderungen) php artisan config:clear php artisan route:clear php artisan view:clear php artisan cache:clear # 3. DB-Migrationen ausführen (nur die 2 Phase-1-Migrationen) php artisan migrate --force # Sollte zeigen: # Running: 2025_04_15_100001_phase1_add_merge_fields_to_customer_table # Running: 2025_04_15_100002_phase1_add_soft_delete_to_customer_table # 4. Autoload neu generieren (neue Klassen: Contact, ContactRepository, MailDirService) composer dump-autoload --optimize # 5. Duplicats-Analyse (read-only, erzeugt Reports) php artisan contacts:find-duplicates # → Reports unter storage/app/contacts/duplicates/*.csv # 6. Duplicats-Merging (DRY-RUN zuerst!) php artisan contacts:merge-duplicates --dry-run # Review der Ausgabe. Wenn OK: # 7. Duplicats-Merging (echt) php artisan contacts:merge-duplicates --confidence=HIGH --force # Merged nur hochkonfidente Duplikate automatisch. # Mittlere/niedrige Konfidenz bleibt für manuelle Review. # 8. Production-Caches wieder aufbauen (für Performance) php artisan config:cache php artisan route:cache php artisan view:cache # Optional: php artisan event:cache # NICHT php artisan optimize (das cached auch, aber einige Setups haben damit Probleme) # 9. Maintenance-Mode deaktivieren php artisan up ``` --- ## Smoke-Tests nach dem Deploy Nach dem `php artisan up` diese Kernfunktionen manuell testen: - [ ] Login funktioniert (`/login`) - [ ] Buchungsliste lädt (`/booking`) - [ ] Einzelne Buchung öffnen, Detailseite lädt - [ ] Anfragenliste lädt (`/lead`) - [ ] Einzelne Anfrage öffnen, Detailseite lädt - [ ] **NEU**: Kontakte-Liste lädt (`/contacts` oder `/contact` je nach Route) - [ ] **NEU**: Kontakte-Duplikats-Übersicht lädt (`/contacts/duplicates` oder ähnlich) - [ ] PDF-Erzeugung funktioniert (Buchungsbestätigung, Voucher, Storno) — testet `Storage::disk()->path()`-Änderung - [ ] Mail-Versand über CustomerMail funktioniert - [ ] Admin-Report läuft durch (`/admin/report`) --- ## Rollback-Plan (falls etwas schiefgeht) 1. **Maintenance-Mode aktivieren:** `php artisan down` 2. **DB-Rollback:** ```bash php artisan migrate:rollback --step=2 ``` oder — falls das fehlschlägt — das zuvor erstellte DB-Backup einspielen. 3. **Dateisystem-Rollback:** das zuvor erstellte Dateisystem-Backup zurückspielen (überschreiben). 4. **Caches leeren + Up:** ```bash php artisan config:clear && php artisan cache:clear && php artisan view:clear && php artisan up ``` --- ## Nach erfolgreichem Live-Deploy 1. **Lokal** im Workspace: Restore-Script laufen lassen, um Phase 2 + Offers zurückzuholen: ```bash cd /workspace/mein.sterntours.de bash dev/backups/phase2-offers-2026-04-17/restore.sh ``` 2. Der Workspace enthält dann wieder Phase 2 Code + Offers-Modul. Weitermachen nach Plan in: - `dev/customer-bookings/umsetzung.md` (Phase 2–4) - `dev/offers/umsetzung.md` (Offers-Modul) 3. **Master-Branch** im Git kann bei Gelegenheit mit dem WIP-Commit `e3dc1af` aktualisiert werden (push), damit der Remote-Stand den aktuellen Arbeitsstand abbildet. --- ## Dateien in diesem Backup - `dev/backups/phase2-offers-2026-04-17/MANIFEST.md` — detaillierte Übersicht - `dev/backups/phase2-offers-2026-04-17/FILES/migrations/` — 18 Migrations-Dateien - `dev/backups/phase2-offers-2026-04-17/FILES/models/` — 6 Offer-Models - `dev/backups/phase2-offers-2026-04-17/PATCHES/` — 11 Diff-Dateien zur Dokumentation - `dev/backups/phase2-offers-2026-04-17/restore.sh` — automatisches Restore **Zusätzliche Sicherheitsnetze:** - Tarball: `../backups-safety/workspace-pre-phase1-rollback-2026-04-17.tar.gz` (182 MB, kompletter Workspace-State vor dem Rückbau) - Git-Commit: `e3dc1af` auf lokalem `master` (nicht gepusht) — enthält Phase 1 + 2 + Offers gemischt