CI/CD
.yml
GitLab · Magento · Notfall-Deployment · Audit
Manuelle Notfall-Deployments
dokumentieren und absichern

Wenn die Pipeline nicht schnell genug ist, greifen Teams auf manuelle Deployments zurück. Das ist akzeptabel – aber nur, wenn dabei eine vollständige Dokumentation entsteht, ein Rollback-Pfad vorbereitet ist und der Hotfix danach sauber in den Normalprozess übertragen wird.

10 Min. Lesezeit Hotfix · Audit-Trail · Rollback · Bash-Protokoll Magento 2.4 · GitLab CI/CD · PHP 8.4

1. Wann ein manuelles Deployment legitim ist

Ein manuelles Notfall-Deployment ist keine Niederlage gegen den Automatisierungsprozess, sondern ein bewusstes Ausnahmeventil für Situationen, in denen der reguläre Pipeline-Durchlauf zu langsam wäre. Wenn ein kritischer Bug im Liveshop zu Umsatzverlust führt – ein defekter Checkout, eine kaputte Zahlungsintegration, eine fehlerhafte Preisberechnung –, dann zählt jede Minute. Eine normale Pipeline mit Build, Tests und manueller Freigabe kann fünfzehn Minuten dauern. Das manuelle Deployment kann in drei Minuten abgeschlossen sein.

Das Problem ist nicht das manuelle Deployment selbst, sondern der Weg, wie es üblicherweise durchgeführt wird: ohne Protokoll, ohne Rollback-Vorbereitung, ohne Dokumentation im GitLab-Issue. Wer hinterher wissen will, wer wann was auf welchem Server geändert hat, findet oft nur Lücken im Audit-Log. Genau diese Lücken gilt es zu schließen – nicht durch das Verbot manueller Deployments, sondern durch einen klar definierten Prozess für den Ausnahmefall.

2. Die Risiken unkontrollierter Notfall-Deployments

Das größte Risiko eines improvisierten Notfall-Deployments ist der Verlust der Reproduzierbarkeit. Wenn ein Entwickler unter Zeitdruck direkt auf dem Server Dateien ändert, entsteht ein Zustand, der nirgendwo im Repository abgebildet ist. Der nächste reguläre Deploy über die Pipeline überschreibt diese Änderungen, ohne dass irgendjemand davon weiß. Oder noch schlimmer: der Hotfix ist im Git-Repository, aber der reguläre Deploy-Prozess läuft gegen eine Datenbankstruktur, die der Hotfix bereits geändert hat.

Ein weiteres Risiko ist die fehlende Abgrenzung des Notfall-Deployments. Unter Druck neigen Entwickler dazu, mehr zu ändern als nötig. Was als Einzeldatei-Hotfix beginnt, endet mit fünf geänderten Dateien, einer neuen Konfiguration und einem cache:flush, der andere Probleme verbirgt. Dokumentation zwingt zur Eingrenzung: was genau wird geändert, warum und mit welcher Erwartung? Diese Fragen bremsen nicht – sie verhindern, dass der Notfall-Deploy selbst zum Problem wird.

3. Vorbereitung: was vor dem Notfall bereitstehen muss

Die beste Vorbereitung für Notfall-Deployments ist eine vollständige Release-Struktur, die Rollback in Sekunden ermöglicht. Das bedeutet: auf dem Produktionsserver liegen mindestens die letzten fünf Releases als vollständige Verzeichnisse, ein Symlink current zeigt auf den aktiven Stand, und ein vorbereitetes Rollback-Skript kann ohne Recherche ausgeführt werden. Wenn diese Struktur im Normalbetrieb gepflegt wird, ist sie im Notfall sofort verfügbar.

Ebenso wichtig ist ein vorbereitetes Notfall-Bash-Skript, das die häufigsten Hotfix-Szenarien abdeckt: Einzeldatei ersetzen, Cache leeren, einen einzelnen Patch einspielen. Dieses Skript sollte mit vollständiger Protokollierung ausgestattet sein – jede Aktion wird mit Zeitstempel, ausführendem Benutzer und Hostname in eine Logdatei geschrieben. Das Skript liegt im Repository und wird regelmäßig geprobt, nicht erst im Notfall zum ersten Mal ausgeführt.

# .gitlab-ci.yml — emergency hotfix pipeline (fast path)
hotfix:deploy:
  stage: deploy
  environment:
    name: production
    url: https://shop.example.com
  variables:
    GIT_STRATEGY: fetch
  script:
    # Document who triggered this emergency deploy
    - echo "EMERGENCY DEPLOY by ${GITLAB_USER_LOGIN} at $(date -u)"
    - echo "Triggered from pipeline ${CI_PIPELINE_ID}, commit ${CI_COMMIT_SHA}"
    # Transfer only changed files (faster than full rsync)
    - |
      ssh "${DEPLOY_USER}@${DEPLOY_HOST}" "
        set -euo pipefail
        HOTFIX_LOG=${DEPLOY_PATH}/shared/var/log/hotfix-$(date +%Y%m%d-%H%M%S).log
        echo 'HOTFIX START: $(date -u)' >> \$HOTFIX_LOG
        echo 'User: ${GITLAB_USER_LOGIN}' >> \$HOTFIX_LOG
        echo 'Commit: ${CI_COMMIT_SHA}' >> \$HOTFIX_LOG
        echo 'Pipeline: ${CI_PIPELINE_ID}' >> \$HOTFIX_LOG
        cd ${DEPLOY_PATH}/current &&
        bin/magento cache:flush &&
        echo 'HOTFIX END: $(date -u)' >> \$HOTFIX_LOG"
  when: manual
  allow_failure: false
  rules:
    - if: '$CI_COMMIT_BRANCH == "hotfix/*"'
      when: manual

4. Protokollierung während des Deployments

Jede Aktion in einem Notfall-Deployment muss protokolliert werden. Das Mindestformat: Zeitstempel in UTC, Benutzername, ausgeführter Befehl, Ergebnis (Erfolg oder Fehler mit Exit-Code). In Bash erreicht man das mit einer Wrapper-Funktion, die jeden Befehl erst ins Log schreibt, dann ausführt und das Ergebnis ebenfalls protokolliert. Diese Funktion kostet fünfzehn Zeilen Code und spart im Störfall Stunden Debugging.

Die Logdatei sollte an einem Ort landen, der von regulären Deployments nicht überschrieben wird – also im shared/var/log/-Verzeichnis, nicht im Release-Verzeichnis. Wer einen Root-Cause-Analysis-Prozess nach Störfällen etablieren will, braucht diese Logs. Ohne sie ist jede Post-mortem-Analyse eine Rekonstruktion aus Erinnerungen – unzuverlässig und im Zweifel schuldzuweisend statt lösungsorientiert.

5. GitLab als Audit-Trail für manuelle Aktionen

GitLab bietet mehrere Mechanismen, um manuelle Aktionen im Deployment-Kontext sichtbar zu machen. Der erste ist der Pipeline-Audit-Trail: jede manuell getriggerte Pipeline hat einen Eintrag, wer sie ausgelöst hat, wann und aus welchem Branch. Dieser Trail ist unveränderlich und kann nicht im Nachhinein editiert werden. Für Compliance-Anforderungen in E-Commerce-Projekten ist das ein wertvoller Nachweis.

Der zweite Mechanismus sind GitLab-Environment-Jobs. Wenn ein Hotfix als manueller Job in der Pipeline modelliert ist, erscheint er im Deployment-Tab des Environments mit Zeitstempel, Pipeline-ID und ausführendem Benutzer. Das macht auch außerordentliche Deployments für das gesamte Team transparent und verhindert, dass der nächste reguläre Deploy einen undokumentierten Zustand vorfindet. Als dritten Mechanismus sollte der Hotfix-Commit mit einer aussagekräftigen Commit-Message versehen werden, die das Ticket-Nummer des Incidents und eine kurze Beschreibung enthält.

# Dedicated verify job after every emergency deploy
verify:hotfix:
  stage: verify
  script:
    # Confirm no stale maintenance flag remains
    - |
      ssh "${DEPLOY_USER}@${DEPLOY_HOST}" "
        test ! -f ${DEPLOY_PATH}/current/var/.maintenance.flag"
    # HTTP check on critical paths
    - curl --fail --silent --max-time 10
        https://shop.example.com/
    - curl --fail --silent --max-time 10
        https://shop.example.com/checkout/cart/
    # Log verification result to shared audit log
    - |
      ssh "${DEPLOY_USER}@${DEPLOY_HOST}" "
        echo 'VERIFY OK: $(date -u) | Pipeline ${CI_PIPELINE_ID}' >>
          ${DEPLOY_PATH}/shared/var/log/hotfix-audit.log"
  needs: ["hotfix:deploy"]
  rules:
    - if: '$CI_COMMIT_BRANCH == "hotfix/*"'

6. Hotfix-Pipeline: schnell und trotzdem kontrolliert

Die beste Lösung für Notfall-Deployments ist keine vollständige Ausschaltung des Pipeline-Prozesses, sondern eine abgespeckte Hotfix-Pipeline, die die wichtigsten Sicherheitsschritte beibehält, aber auf zeitintensive Schritte verzichtet. Diese Pipeline läuft in unter fünf Minuten: kein vollständiger Build, keine Unit-Tests, aber ein PHPCS-Check auf geänderte Dateien, ein rsync der geänderten Dateien auf den Server, ein Cache-Flush und ein HTTP-Verify. Das ist schnell genug für Notfälle und sicher genug für Produktivumgebungen.

Der kritische Unterschied zur echten Improvisation: die Hotfix-Pipeline ist vorab im Repository definiert, nicht im Notfall zusammengeklickt. Sie wird auf einem dedizierten hotfix/*-Branch ausgelöst, der automatisch auf dem Production-Environment deployt. Das Team muss im Notfall nur einen Branch anlegen, den Fix committen und die manuelle Freigabe in der Pipeline bestätigen. Das dauert drei Minuten – mit vollständigem Audit-Trail.

7. Rollback nach einem Notfall-Deployment

Ein Notfall-Deployment, das selbst zum Problem wird, muss sofort zurückgedreht werden können. In einer sauberen Release-Struktur ist das Rollback eine einzige Operation: den Symlink current auf das vorherige Release-Verzeichnis zeigen lassen. Für Hotfixes, die direkt auf den aktuellen Release-Stand aufgebaut haben, ohne ein neues Release-Verzeichnis zu erstellen, ist der Rollback komplizierter. Das ist ein weiteres Argument für die Hotfix-Pipeline statt direkter Servereingriffe.

Der Rollback nach einem Notfall-Deployment muss ebenfalls dokumentiert werden – mit demselben Protokollformat wie das ursprüngliche Deployment. Wer rollbackt, warum, auf welchen Stand und mit welchem Ergebnis. Diese Information ist Pflichtbestandteil der Post-mortem-Analyse. Ohne sie fehlt dem Team die Grundlage, um zu entscheiden, ob der Rollback vollständig oder nur partiell war und ob der ursprüngliche Fehler noch im System vorhanden ist.

8. Improvisiert vs. dokumentiert im Vergleich

Der Unterschied zwischen einem unkontrollierten und einem dokumentierten Notfall-Deployment zeigt sich oft erst Tage später – beim nächsten regulären Deployment oder beim nächsten Incident. Wer vorher die Standards definiert, zahlt nichts drauf.

Aspekt Improvisiertes Notfall-Deploy Dokumentiertes Notfall-Deploy Vorteil
Audit-Trail Keine Aufzeichnung GitLab Pipeline + Logdatei Nachvollziehbarkeit bei Post-mortem
Rollback Unbekannt / manuell Symlink-Switch, <60 Sekunden Sofort ausführbar ohne Suche
Reproduzierbarkeit Serverzustand unklar Commit + Pipeline-Run nachvollziehbar Nächster Deploy schlägt nicht überraschend fehl
Teamtransparenz Nur der Durchführende weiß Bescheid GitLab-Environment-Tab sichtbar Kein überraschender Zustand beim nächsten Deploy
Dauer 3–5 Minuten (unkontrolliert) 3–5 Minuten (kontrolliert) Kein Zeitverlust durch Dokumentation

9. Rückführung in den Normalprozess

Ein Notfall-Deployment ist immer nur ein Zwischenzustand. Sobald der Incident behoben ist, muss der Hotfix in den normalen Entwicklungsprozess eingeflossen sein: als Commit auf dem Hauptbranch, mit Ticket-Referenz, Code-Review und regulärem Deployment über die vollständige Pipeline. Solange der Hotfix nur auf dem Server liegt und nicht im Repository abgebildet ist, besteht die Gefahr, dass er beim nächsten regulären Deploy überschrieben wird.

Die Nachbereitung umfasst außerdem eine kurze Post-mortem-Analyse: Was hat den Incident verursacht? Warum wurde der Fehler nicht in Staging gefunden? Welche Tests oder Checks hätten ihn abgefangen? Die Antworten auf diese Fragen fließen in bessere Tests, klarere Deployment-Checklisten und robustere Pipeline-Schritte ein. Das ist der eigentliche Gewinn aus einem Notfall-Deployment: die systematische Verbesserung des Prozesses, der ihn verhindern soll.

10. Zusammenfassung

Manuelle Notfall-Deployments sind ein akzeptabler Ausnahmefall im Magento-Betrieb – aber nur mit vollständiger Dokumentation, vorbereitetem Rollback-Pfad und anschließender Rückführung in den Normalprozess. Ein Notfall-Deployment ohne Protokoll ist ein technisches Schuld-Akkumulationsereignis: der Shop läuft, aber der Prozess ist beschädigt. Die Lösung ist keine bürokratische Zusatzlast, sondern eine vorbereitete Hotfix-Pipeline, die in drei Minuten durchläuft und trotzdem alle relevanten Informationen dokumentiert.

Der Schlüssel liegt in der Vorbereitung: Release-Struktur für sofortigen Rollback, vorbereitetes Bash-Protokollskript, definierter Hotfix-Branch-Prozess in GitLab und eine klare Erwartung, was nach dem Notfall-Deploy als Nachbereitung erwartet wird. Wer diese Strukturen im Normalbetrieb aufbaut, zahlt im Störfall einen Bruchteil des Preises, den ein unkontrollierter Notfall-Deploy kostet.

Manuelle Notfall-Deployments — Das Wichtigste auf einen Blick

Hotfix-Pipeline

Abgespeckte Pipeline auf hotfix/*-Branch: PHPCS, rsync, Cache-Flush, Verify – in unter 5 Minuten.

Audit-Trail

GitLab Pipeline-Log + Bash-Protokollskript mit Zeitstempel, Benutzer und Befehl – unveränderlich.

Rollback

Symlink current auf vorheriges Release-Verzeichnis – unter 60 Sekunden, kein manuelles Datei-Restore.

Nachbereitung

Hotfix in Hauptbranch mergen, Code-Review, Post-mortem-Analyse und Prozessverbesserung einleiten.

11. FAQ: Manuelle Notfall-Deployments

1Wann ist ein manuelles Deployment gerechtfertigt?
Bei kritischen Bugs im Livebetrieb, wenn die normale Pipeline zu langsam wäre. Ausnahmeventil, kein Ersatz für den regulären Prozess.
2Wie protokolliere ich ein manuelles Deployment?
Zeitstempel, Benutzername und Befehle in shared/var/log/. Bash-Wrapper-Funktion protokolliert automatisch bei jedem Befehl.
3Was ist eine Hotfix-Pipeline?
PHPCS, rsync, Cache-Flush und HTTP-Verify auf hotfix/*-Branch – unter 5 Minuten mit vollem Audit-Trail.
4Wird der Hotfix beim nächsten Deploy überschrieben?
Ja, wenn er nicht in den Hauptbranch gemergt wurde. Nachbereitung ist Pflicht: Merge, Code-Review, Ticket-Referenz.
5Wer darf Notfall-Deployments durchführen?
Nur Personen mit Production-Deployment-Berechtigung in GitLab. Der Pipeline-Trigger dokumentiert automatisch, wer freigegeben hat.
6Was ist nach dem Notfall-Deploy zu tun?
Hotfix in Normalprozess überführen, Post-mortem durchführen, Tests und Checks ergänzen, Prozess verbessern.
7Wie rollbacke ich ein fehlgeschlagenes Notfall-Deploy?
Symlink current auf vorheriges Release zurückbiegen, Cache leeren – unter 60 Sekunden als GitLab-Rollback-Job.
8Was ist der GitLab-Audit-Trail für Deployments?
Zeitstempel, Benutzer und Branch im Deployment-Tab – unveränderlich, geeignet für Compliance-Nachweise.
9Server direkt ändern oder Hotfix-Pipeline?
Immer die Hotfix-Pipeline. Direkte Servereingriffe hinterlassen keinen Trail und gefährden den nächsten regulären Deploy.
10Wie übe ich den Notfall-Prozess vor dem ersten Notfall?
Regelmäßige Fire-Drills auf Staging: Hotfix-Branch anlegen, Änderung committen, Pipeline auslösen, Rollback durchführen.

Manuelle Notfall-Deployments sind kein Zeichen von Schwäche im Prozess — sie sind eine bewusste Sicherheitsoption. Wer sie sauber dokumentiert und absichert, behält die Kontrolle auch dann, wenn die reguläre Pipeline nicht greift.

Der entscheidende Unterschied zwischen Chaos und kontrolliertem Eingriff liegt nicht in der Technik, sondern im Playbook: klare Schritte, klare Verantwortlichkeiten, klare Dokumentation des Ergebnisses.