mein-sterntours/dev/customer-bookings/phase-1-live-deploy.md
2026-04-17 17:19:11 +02:00

9.7 KiB
Raw Blame History

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 1530 min)

    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:

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)

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

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:

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:
    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:
    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:
    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 24)
    • 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