241 lines
9.7 KiB
Markdown
241 lines
9.7 KiB
Markdown
# 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
|