Betrieb & Installation

Installation

So bringst Du das ETB auf Deinen eigenen Server. Der Großteil läuft über den Setup-Wizard — vorher musst Du nur die Voraussetzungen schaffen.

Voraussetzungen

  • PHP 8.1+ (getestet bis 8.4) mit den Extensions:
    • pdo_mysql (Datenbank)
    • imap (Mail-Postfach für Alarm-Mails)
    • mbstring, fileinfo, curl, dom, gd
  • MySQL 5.7+ oder MariaDB 10.3+
  • Webserver mit Document-Root auf public/ und Rewrite-Modul (Apache mod_rewrite oder Nginx)
  • Cron alle 1–5 Minuten, um neue Alarm-Mails abzufragen
  • IMAP-Postfach für die eingehenden Alarm-Mails der Leitstelle
  • Optional: SMTP-Postfach für ausgehende App-Mails (Passwort-vergessen). Getrennt vom IMAP-Postfach oben — siehe den SMTP-Block in Konfiguration. Ohne SMTP bleibt die „Passwort vergessen"-Selbsthilfe inaktiv (Admin setzt Passwörter dann selbst).
  • Optional: Telegram-Bot-Token, falls Du die App-Push-Benachrichtigung nutzen willst
  • Optional: what3words-API-Schlüssel (kostenpflichtiger Plan) — nur wenn Du den Kurz-Standort per what3words nutzen willst; als W3W_API_KEY in config/.env (Vorlage in config/.env.example). Die kostenlose Kurz-Standort-Variante Plus Codes braucht nichts davon und wird offline berechnet.
  • Optional: PHP-Extension zip — nur für den Excel-Export der Bevölkerungswarnung im Original-Formular einer Leitstelle. Fehlt sie, läuft alles andere unverändert; im Admin steht dann ein Hinweis, und es bleibt beim Standard-Dokument (PDF). Ohne zip bietet der Admin-Bereich auch die Gemeinde-Auswahl und das Einspielen einer neuen Formular-Version nicht an — beides liest das ETB aus der Formular-Datei.

Schritt 1: Code auf den Server bringen

git clone https://gitlab.com/brun-soft/das-etb.git /var/www/etb
cd /var/www/etb

ℹ️ Tipp: Lege das Repo so an, dass git pull für spätere Updates funktioniert. Schreibrechte für den Webserver-User braucht nur storage/ — der Rest darf read-only sein.

Schritt 2: Webserver konfigurieren

Document-Root muss auf public/ zeigen, nicht auf das Repo-Root. Sonst wären die src/-Dateien direkt aus dem Web erreichbar.

Apache (/etc/apache2/sites-available/etb.conf):

<VirtualHost *:443>
    ServerName etb.example.de
    DocumentRoot /var/www/etb/public

    <Directory /var/www/etb/public>
        AllowOverride All
        Require all granted
    </Directory>

    # SSL-Konfiguration nach deinem Setup …
</VirtualHost>

Nginx:

server {
    listen 443 ssl http2;
    server_name etb.example.de;
    root /var/www/etb/public;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Schritt 3: .env anlegen

Das ETB liest Zugangsdaten aus config/.env. Eine Vorlage liegt unter config/.env.example:

cp config/.env.example config/.env

Diese Datei legst Du jetzt nicht selbst mit allen Werten an — der Setup-Wizard tut das gleich für Dich. Wichtig ist nur, dass die Datei existiert und die DB-Zugangsdaten eingetragen sind, damit der Wizard sich überhaupt erst mit der Datenbank verbinden kann:

DB_HOST=localhost
DB_NAME=etb
DB_USER=etb
DB_PASS=geheim
DB_TABLE_PREFIX=etb_

⚠️ Achtung: Den Tabellen-Präfix solltest Du vor dem ersten Setup festlegen. Wer den Präfix nachträglich ändern will, muss in der Datenbank Tabellen umbenennen — der Wizard tut das nicht.

Zeitzone

Für deutsche Feuerwehren musst Du hier nichts tun — ohne Eintrag gilt Europe/Berlin. Nur wenn Deine Wehr in einer anderen Zeitzone liegt, trägst Du sie zusätzlich ein:

APP_TIMEZONE=Europe/Vienna

Der Wert gilt für alle Uhrzeiten im Tagebuch — angezeigte wie gespeicherte: Anwendung und Datenbank werden gemeinsam darauf gesetzt. Erlaubt sind nur echte Kennungen aus der Zeitzonen-Datenbank (Europe/Berlin, Europe/Vienna, UTC); feste Offsets wie +02:00 werden abgelehnt, weil sie die Sommerzeit nicht kennen. Steht dort ein unbekannter Wert, greift Europe/Berlin, und im PHP-Log steht ein Hinweis.

⚠️ Die Zeitzone gehört vor den ersten Einsatz festgelegt. Wer sie später ändert, verschiebt damit die Anzeige aller bereits erfassten Zeitstempel.

Ob es geklappt hat, siehst Du nach dem Setup jederzeit auf der Karte Zeitzone unter System-Status — sie muss synchron anzeigen.

Schritt 4: Im Browser öffnen

Rufe https://etb.example.de/ auf. Bei einer frischen Installation landest Du automatisch auf dem Setup-Wizard. Folge der Anleitung in Setup-Wizard.

Wenn etwas nicht klappt: Schau ins Webserver-Log und in logs/ im Repo. Häufige Fehler sind in der FAQ zusammengefasst.

Was wird auf der Platte gespeichert?

  • config/.env — sensible Zugangsdaten (DB, Mail, Telegram). Niemals ins Repo committen.
  • storage/uploads/ — Bilder und Dokumente, die in Kommentaren hochgeladen werden.
  • public/branding/ — Dein hochgeladenes Logo und Favicon.
  • logs/ — Cron-Logs, Mail-Parser-Logs, Telegram-Webhook-Logs.
  • storage/warnformular/ — nur bei der Bevölkerungswarnung mit Kreis-Vorlage: eine selbst eingespielte Formular-Version der Leitstelle und die gespeicherte Gemeindegrenze. Beides ist jederzeit neu erzeugbar (erneut hochladen bzw. erneut holen) und übersteht ein Update, weil storage/ beim Deploy ausgespart bleibt.

Diese Verzeichnisse sicherst Du regelmäßig (siehe Backup & Updates).

Was als nächstes?