Deployment & Rollback
Synchronisiert Code-Änderungen von der Entwicklungsumgebung zur Produktion. Ermöglicht sicheres Testen auf dev bevor Änderungen live gehen. Bei Problemen kann auf den letzten Stand zurückgerollt werden.
| Script | /opt/scripts/sync-dev-prod.sh |
|---|---|
| Richtung | dev → prod |
| Pre-Checks | Contract Validation, PHPStan, PHP-CS-Fixer, Composer Audit, Semgrep, PHPUnit |
| Rollback | Aus /backup/ wiederherstellen |
Pre-Deployment Checks
Das Sync-Script führt automatisch alle Quality- und Security-Checks durch. Bei Fehlern wird der Sync abgebrochen.
Check 1: Contract Validation
| Contract | Prüft | Blockiert bei |
|---|---|---|
| View Structure v1.0 | CRUD-Views, Struktur | Critical |
| HTML Tables v1.0 | Modals, Aktionen-Spalte | Critical |
| CSS Contract v1.0 | Stylelint-Regeln | Major |
| Python Pipeline v1.0 | Ruff, mypy | Major |
| Layered Architecture v1.0 | Layer-Grenzen | Critical |
| Betriebsdokumentation v1.1 | Docs-Struktur | Major |
Script: /opt/scripts/contract-check.sh
Dokumentation: Contracts
Check 2: PHP Quality Check
| Tool | Prüft | Blockiert bei |
|---|---|---|
| PHPStan + Strict Rules | Typen, Null-Safety, Bugs | Errors |
| PHP-CS-Fixer | PSR-12 Code Style | Style Issues |
| Composer Audit | Dependency CVEs | Vulnerabilities |
| Semgrep | OWASP Security | Security Findings |
Check 3: PHPUnit Tests
Alle Unit-Tests im tests/ Verzeichnis müssen bestehen.
Bei fehlgeschlagenen Checks
# Contract Validation fehlgeschlagen:
❌ SYNC ABGEBROCHEN: Contract Validation fehlgeschlagen
Behebe die Contract-Violations und versuche es erneut.
Tipp: /opt/scripts/contract-check.sh
# PHP Quality Check fehlgeschlagen:
❌ SYNC ABGEBROCHEN: PHP Quality Check fehlgeschlagen
Behebe die Fehler und versuche es erneut.
Tipp: /opt/scripts/php-check.sh /var/www/dev.campus.systemische-tools.de --fix
Deployment ausführen
Standard-Deployment
/opt/scripts/sync-dev-prod.sh
Erwartete Ausgabe (Erfolg)
=== Sync Dev → Prod: Sat Dec 20 10:00:00 CET 2025 ===
=== Contract Validation ===
[1/6] View Structure Contract v1.0
OK tasks/*
OK content/*
[2/6] HTML Tables Contract v1.0
OK HTML Tables geprüft
[3/6] CSS Contract v1.0
OK Stylelint passed
[4/6] Python Pipeline Contract v1.0
OK Ruff + mypy passed
[5/6] Layered Architecture Contract v1.0
OK Layer-Grenzen eingehalten
[6/6] Betriebsdokumentation Contract v1.1
OK Dokumentation strukturell korrekt
=== Ergebnis ===
Critical: 0
Major: 0
Minor: 0
PASSED: Alle Contracts erfüllt
=== PHP Quality Check ===
[1/4] PHPStan - Static Analysis + Strict Rules
✓ PHPStan: OK
[2/4] PHP-CS-Fixer - Code Style (PSR-12)
✓ PHP-CS-Fixer: OK
[3/4] Composer Audit - Dependency Vulnerabilities
✓ Composer Audit: No vulnerabilities
[4/4] Semgrep - OWASP Security Scan
✓ Semgrep: No vulnerabilities
=== Summary ===
All checks passed!
=== PHPUnit Tests ===
PHPUnit 12.5.4
✓ All tests passed!
sending incremental file list
src/Controller/
src/Controller/HomeController.php
...
=== Sync abgeschlossen ===
Was wird synchronisiert
| Verzeichnis | Inhalt | rsync-Flags |
|---|---|---|
| src/ | Backend (MVC) | --delete (entfernt gelöschte Dateien) |
| app/ | Frontend (MVP) | --delete |
| routes/ | Web-Routes | -av |
| config/ | Autoloader (ohne config.php) | --exclude='config.php' |
| public/css/ | Stylesheets | --exclude='static-docs' |
| public/js/ | JavaScript | -av |
| public/images/ | Bilder | -av |
| public/index.php | Entry Point | -av |
| public/.htaccess | Apache Config | -av |
Was wird NICHT synchronisiert
- config/config.php - Umgebungsspezifische Einstellungen (APP_DEBUG=false, DB-Credentials)
- storage/ - Logs, Cache, Sessions (Verzeichnis existiert nur lokal)
- *.log in src/, app/ - Log-Dateien werden via --exclude ausgeschlossen
- public/static-docs/ - Statische Dokumentation
Nach dem Sync
Das Script führt automatisch /opt/scripts/fix-permissions.sh aus, um die Dateiberechtigungen (www-data:www-data, 755) zu setzen.
Rollback-Verfahren
Bei Problemen nach dem Deployment kann der vorherige Stand aus dem Backup wiederhergestellt werden.
Schritt 1: Backup identifizieren
# Verfügbare Backups anzeigen
ls -la /backup/
# Beispiel-Ausgabe:
# drwxr-xr-x 2 root root 4096 Dec 19 23:39 2025-12-19_23-38
# drwxr-xr-x 2 root root 4096 Dec 20 03:00 2025-12-20_03-00
Schritt 2: Backup-Inhalt prüfen
# Inhalt des Backups anzeigen
ls -lh /backup/2025-12-20_03-00/
# Dateien im www-Archiv auflisten
tar -tzf /backup/2025-12-20_03-00/www.tar.gz | head -20
Schritt 3a: Vollständiger Rollback (prod)
# Prod-Verzeichnis komplett wiederherstellen
cd /
tar -xzf /backup/2025-12-20_03-00/www.tar.gz var/www/prod.campus.systemische-tools.de
# Berechtigungen setzen
/opt/scripts/fix-permissions.sh
Schritt 3b: Einzelne Dateien wiederherstellen
# Nur bestimmte Datei extrahieren
tar -xzf /backup/2025-12-20_03-00/www.tar.gz \
-C / var/www/prod.campus.systemische-tools.de/src/Controller/HomeController.php
# Ganzes Verzeichnis extrahieren
tar -xzf /backup/2025-12-20_03-00/www.tar.gz \
-C / var/www/prod.campus.systemische-tools.de/src/Controller/
Schritt 4: Datenbank-Rollback (falls nötig)
# Dump entpacken
gunzip -k /backup/2025-12-20_03-00/mariadb_all.sql.gz
# Datenbank wiederherstellen
mariadb < /backup/2025-12-20_03-00/mariadb_all.sql
# Oder einzelne Datenbank:
# 1. Aus Dump extrahieren
sed -n '/^-- Current Database: `ki_system`/,/^-- Current Database:/p' \
/backup/2025-12-20_03-00/mariadb_all.sql > /tmp/ki_system.sql
# 2. Wiederherstellen
mariadb ki_system < /tmp/ki_system.sql
Schritt 5: Verifizieren
# Website prüfen
curl -I https://campus.systemische-tools.de
# Logs prüfen
tail -20 /var/www/prod.campus.systemische-tools.de/storage/logs/*.log
Notfall-Rollback (Schnell)
Wenn die Produktion sofort wiederhergestellt werden muss:
# Letztes Backup finden
LATEST=$(ls -1d /backup/*/ | tail -1)
# Vollständiger Prod-Rollback
cd / && tar -xzf "${LATEST}www.tar.gz" var/www/prod.campus.systemische-tools.de
# Berechtigungen
/opt/scripts/fix-permissions.sh
# Verifizieren
curl -I https://campus.systemische-tools.de
Workflow
┌─────────────────────────────────────────────────────────────┐
│ DEPLOYMENT WORKFLOW │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. ENTWICKLUNG │
│ └── Änderungen auf dev.campus.systemische-tools.de │
│ ↓ │
│ 2. TESTEN │
│ └── Funktionalität auf dev prüfen │
│ ↓ │
│ 3. PRE-CHECKS (automatisch) │
│ ├── Contract Validation (6 Contracts) │
│ ├── PHPStan (Typen, Bugs) │
│ ├── PHP-CS-Fixer (Style) │
│ ├── Composer Audit (CVEs) │
│ ├── Semgrep (Security) │
│ └── PHPUnit (Tests) │
│ ↓ OK ↓ FAIL │
│ 4. SYNC ABBRUCH │
│ └── rsync dev → prod └── Fehler beheben │
│ ↓ │
│ 5. VERIFIZIEREN │
│ └── Produktion prüfen │
│ ↓ OK ↓ PROBLEM │
│ FERTIG ROLLBACK │
│ └── Aus Backup wiederherstellen│
│ │
└─────────────────────────────────────────────────────────────┘
Checkliste vor Deployment
- ☐ Änderungen auf dev getestet?
- ☐ Browser-Cache gelöscht beim Testen?
- ☐ Keine sensiblen Daten im Code (API-Keys, Passwörter)?
- ☐ Datenbank-Migrationen berücksichtigt?
- ☐ Backup vorhanden? (
ls /backup/)
Checkliste nach Deployment
- ☐ Homepage lädt? (
curl -I https://campus.systemische-tools.de) - ☐ Wichtige Seiten funktionieren?
- ☐ Keine PHP-Fehler in Logs? (
tail /var/www/prod.*/storage/logs/*.log) - ☐ Formulare funktionieren?
- ☐ Bei Problemen: Rollback durchführen
Troubleshooting
Contract Validation bricht ab
# Contracts einzeln prüfen
/opt/scripts/contract-check.sh
# Häufige Violations:
# - page-container in View (FRB-001) → Entfernen
# - Modal in View (NAV-002) → Durch URL ersetzen
# - Fehlender Breadcrumb (SHW-001) → Hinzufügen
# - Layer-Violation → Import korrigieren
# Dokumentation:
# /docs/modul/contracts
Sync-Script bricht ab
# Fehler anzeigen
/opt/scripts/php-check.sh /var/www/dev.campus.systemische-tools.de
# Style-Fehler automatisch beheben
/opt/scripts/php-check.sh /var/www/dev.campus.systemische-tools.de --fix
# Tests einzeln ausführen
/opt/scripts/php-test.sh /var/www/dev.campus.systemische-tools.de
Produktion zeigt Fehler nach Sync
# 1. Fehler identifizieren
tail -50 /var/www/prod.campus.systemische-tools.de/storage/logs/error.log
# 2. Schneller Rollback
LATEST=$(ls -1d /backup/*/ | tail -1)
cd / && tar -xzf "${LATEST}www.tar.gz" var/www/prod.campus.systemische-tools.de
/opt/scripts/fix-permissions.sh
# 3. Auf dev debuggen und erneut deployen
Berechtigungsfehler
/opt/scripts/fix-permissions.sh
Apache-Cache leeren
systemctl reload apache2