CV laden

Stack

Eine Compose-Datei, sieben Services

nginx, PHP, Vue SSR, MySQL, Redis, Memcached und die Queue starten aus einer Datei. Ein frischer Checkout sind drei Befehle.

Der Site-Stack ist keine Mischung mehr aus lokalem PHP, einem Node-Skript und einer Datenbank, die jemand anders startete. Eine Compose-Datei startet nginx, php, queue, schedule, vue, mysql, redis und memcached. Das PHP-Image ist ein lokales laraboom-php:latest plus redis- und memcached-Extensions, eine langsame Registry blockiert den ersten Lauf also nicht.

Das Hochfahren hat drei Schritte. Die zwei Env-Dateien kopieren. Compose bauen und starten. composer setup im PHP-Container ausführen. Setup schreibt den App-Key, wartet bis MySQL Verbindungen annimmt, fährt Migrationen, seedet die öffentlichen Inhalte und verlinkt storage.

Eine Compose-Datei. Sieben Prozesse. Die Host-App startet sie nicht per Hand.
Eine Compose-Datei. Sieben Prozesse. Die Host-App startet sie nicht per Hand.

Warum das Warten zählt

Migrationen scheiterten beim Kaltstart. MySQL initialisierte noch. Der Fehler sah wie falsche Zugangsdaten aus. Das Setup-Skript wiederholt die Verbindung jetzt für eine begrenzte Zeit und nennt den Service, auf den es wartet. Ein zweiter Lauf ist sicher. Seeds ersetzen Demo-Zeilen statt sie zu duplizieren.

Der Build ist gestuft. Lockfiles installieren in einer frühen Schicht. Der Frontend-Build hat eine eigene Stage. Nur das Ergebnis landet im Runtime-Image. Eine PHP-Änderung installiert Composer-Pakete nicht neu. Rebuilds fielen von Minuten auf Sekunden.

Setup wartet auf MySQL. nginx wartet auf Vue SSR. Uploads warten auf die Storage-UID.
Setup wartet auf MySQL. nginx wartet auf Vue SSR. Uploads warten auf die Storage-UID.

Was noch gesund sein muss

nginx darf SSR nicht routen, bevor der vue-Container steht. Sonst ist der erste Hit eine leere Shell. Die Storage-Volume-UID muss zum PHP-User passen, sonst scheitern Uploads erst nach dem ersten Admin-Login. Queue und Schedule sind getrennte Prozesse, ein langer Job verzögert also keinen Cron-Tick.

Der Check nach einem frischen Checkout ist kurz. Home-HTML kommt aus Vue SSR. /api/user antwortet ohne Token. Redis und Memcached nehmen einen Ping aus dem PHP-Container an. Wenn eines davon fehlschlägt, ist die Compose-Datei der Ort, nicht ein Host-routes-Ordner.

Zurück zu News