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

241 lines
9.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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