Markus Michalski FAQ

LeaveFlow: Installation

Installation von LeaveFlow per Docker Compose: Voraussetzungen, Migrationen, Einrichtungsassistent, Umgebungsvariablen, HTTPS, Update und Entwicklungsumgebung.

English Version

Zurück zur Übersicht

LeaveFlow: Installation

Voraussetzungen

Du brauchst Docker mit dem Compose-Plugin (docker compose) und Git. PHP und MariaDB musst du nicht selbst installieren, beides liefert der Compose-Stack. Die weiteren Anforderungen stehen auf der Übersichtsseite.

Installation

  1. Repository klonen:

    git clone https://github.com/markus-michalski/leaveflow.git
    cd leaveflow
    
  2. Container starten (baut das Image und startet App, Datenbank, Mailpit und OpenLDAP):

    docker compose up -d --build
    

    Beim ersten Start installiert der Container die Composer-Abhängigkeiten selbst und baut das Tailwind-Stylesheet. Das dauert einen Moment, den Fortschritt siehst du mit docker compose logs -f app.

  3. Datenbankmigrationen ausführen:

    docker compose exec -u app app php bin/console doctrine:migrations:migrate --no-interaction
    
  4. Die Anwendung im Browser öffnen: http://localhost:8080. Solange noch kein Unternehmen existiert, leitet LeaveFlow jede Seite auf den Einrichtungsassistenten unter /setup um.

Der Stack ist ein Entwicklungs-Stack: compose.yaml baut das Docker-Ziel dev und setzt APP_ENV: dev. Die Host-Ports kommen aus compose.override.yaml (8080:80, 8443:443 und 3306, 1025, 8025 für Datenbank und Mailpit). Das Dockerfile enthält zusätzlich ein Ziel prod, eine fertige Produktions-Compose-Datei liefert das Repository nicht mit.

Einrichtungsassistent

Der Assistent unter /setup prüft zuerst die Systemvoraussetzungen und legt danach Unternehmen und ersten Admin an.

Prüfung Was geprüft wird
PHP version PHP 8.4.0 oder neuer
PHP extensions pdo_mysql, intl, gd, mbstring, json, curl, ctype, fileinfo
Database connection Verbindung zur Datenbank
Database migrations Alle Migrationen sind eingespielt
var directory Verzeichnis var/ ist beschreibbar
public/uploads directory Verzeichnis public/uploads/ ist beschreibbar

Solange eine Prüfung rot ist, lässt sich das Formular nicht absenden. Das Formular verlangt Firmenname, Admin-E-Mail und ein Admin-Passwort mit mindestens 12 Zeichen. Der Assistent legt ausschließlich das Unternehmen und das Admin-Konto an und ist einmalig. Nach der Anlage zeigt er die Abschlussseite unter /setup/done mit einer Liste der nächsten Schritte und der Schaltfläche Zur Anmeldung, die zur Anmeldeseite führt.

Der Assistent legt weder Urlaubsarten noch Standorte, Teams oder Mitarbeiter an. Das erledigst du danach im Admin-Menü, die Reihenfolge steht im Admin-Leitfaden.

Konfiguration über Umgebungsvariablen

Symfony liest .env, .env.local und .env.dev. Umgebungsvariablen, die der Container direkt erhält, haben Vorrang vor allen diesen Dateien.

compose.yaml setzt DATABASE_URL (mit dem Passwort !ChangeMe!) und MAILER_DSN (smtp://mailer:1025) fest als Umgebungsvariablen des Containers. Werte aus .env.local greifen für diese beiden Variablen deshalb nicht. Zum Ändern passt du compose.yaml an und änderst das Datenbankpasswort an allen drei Stellen (MARIADB_PASSWORD, MARIADB_ROOT_PASSWORD und DATABASE_URL).

Variable Bedeutung
APP_ENV Umgebung; compose.yaml setzt dev
APP_SECRET Geheimer Schlüssel für CSRF-Token und Signaturen, pro Installation eindeutig. In .env leer, .env.dev bringt einen Wert für die Entwicklung mit
DATABASE_URL Datenbankverbindung; Host im Stack ist database
MAILER_DSN Mail-Transport; im Stack smtp://mailer:1025 (Mailpit)
MESSENGER_TRANSPORT_DSN Warteschlange für asynchrone Nachrichten; Standard doctrine://default?auto_setup=0
DEFAULT_URI Basis-URL für Links, die ohne Browser-Anfrage erzeugt werden (Konsolenbefehle, Cron-Jobs, Mails aus der Warteschlange); Standard http://localhost:8080
SERVER_NAME Adresse, auf der der integrierte Webserver lauscht; Standard :80
APP_LDAP_ENCRYPTION_KEY 32-Byte-Schlüssel (Base64) zur Verschlüsselung gespeicherter Zugangsdaten für LDAP und Slack
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET OAuth-Zugangsdaten für die Anmeldung mit Google
ENTRA_CLIENT_ID, ENTRA_CLIENT_SECRET OAuth-Zugangsdaten für die Anmeldung mit Microsoft
ENTRA_TENANT_ID Tenant für die Microsoft-Anmeldung; Standard common

Es gibt keine Variable APP_URL. Die Basis-URL für Links außerhalb von Browser-Anfragen setzt DEFAULT_URI.

SERVER_NAME wertet Docker Compose beim Start aus der Shell-Umgebung oder der .env im Projektverzeichnis aus, nicht aus .env.local. Den Schlüssel für APP_LDAP_ENCRYPTION_KEY erzeugst du mit:

php -r "echo base64_encode(random_bytes(SODIUM_CRYPTO_SECRETBOX_KEYBYTES)) . PHP_EOL;"

Ohne diesen Schlüssel lassen sich Slack-Token, Slack-Signing-Secret und das LDAP-Bind-Passwort nicht speichern. Wer den Schlüssel später ändert, kann bereits gespeicherte Werte nicht mehr entschlüsseln.

HTTPS und Domain

Die PHP-Konfiguration setzt Session-Cookies mit session.cookie_secure = 1. Betreibe die Instanz deshalb außerhalb von localhost hinter HTTPS und setze DEFAULT_URI auf die öffentliche Adresse. Der integrierte Webserver (Caddy in FrankenPHP) bedient die in SERVER_NAME angegebene Adresse.

Update

git pull
docker compose up -d --build
make install
docker compose exec -u app app php bin/console doctrine:migrations:migrate --no-interaction

Offene Migrationen zeigt dir der Einrichtungsassistent nicht mehr an, sobald ein Unternehmen existiert. Spiele sie deshalb nach jedem Update ein.

Entwicklungsumgebung

Befehl Wirkung
make up / make down Container starten und stoppen
make test PHPUnit-Testsuite
make stan PHPStan
make fixtures Datenbank leeren und Demo-Daten laden

make fixtures leert die Datenbank vollständig, bevor die Demo-Daten geladen werden. Führe den Befehl niemals gegen eine Instanz mit echten Daten aus.

Nach make fixtures gibt es das Demo-Unternehmen mit Standorten, Teams, Mitarbeitern, sieben Urlaubsarten und drei Testkonten.

E-Mail Passwort Rolle
admin@leaveflow.test leaveflow-dev Administrator
manager@leaveflow.test leaveflow-dev Manager
employee@leaveflow.test leaveflow-dev Mitarbeiter

Mailpit, der E-Mail-Catcher des Stacks, ist unter http://localhost:8025 erreichbar.