Skip to content

Installation Docker

github-actions[bot] edited this page Oct 20, 2026 · 8 revisions

Installation mit Docker Compose

← Zurück zur Startseite

Docker Compose startet die App mit MariaDB 12.3 und Redis 7. Ein vorhandenes Datenverzeichnis einer älteren Version (z. B. 10.11) aktualisiert der Container beim ersten Start selbst (MARIADB_AUTO_UPGRADE); vorher ein Backup ziehen. Redis ist wegen der zwei Gunicorn-Worker verpflichtend. Ein Reverse-Proxy mit TLS bleibt erforderlich; Compose ersetzt NGINX nicht.

GitHub Actions baut das App-Image automatisch bei jedem Push auf main und bei jedem Versions-Tag (.github/workflows/docker-build.yml) und veröffentlicht es nach ghcr.io/battloxx/einsatzcockpit. Standardmäßig wird dieses fertige Image gepullt (schneller, kein lokaler Build nötig); wer eigene Änderungen am Dockerfile oder Code testen will, baut stattdessen lokal — beide Wege stehen unter Schritt 3.

1. Voraussetzungen

Docker Engine mit Compose-Plugin und Git müssen installiert sein. Repository klonen:

git clone https://github.com/BattloXX/Einsatzcockpit.git
cd Einsatzcockpit

2. .env anlegen

cp deploy/docker.env.example .env
nano .env

Alle leeren Geheimnisse sicher befüllen. Besonders wichtig sind MARIADB_ROOT_PASSWORD, MARIADB_PASSWORD, SECRET_KEY, FERNET_KEY und BOOTSTRAP_ADMIN_PASSWORD. Das Passwort in DATABASE_URL muss mit MARIADB_PASSWORD übereinstimmen; Sonderzeichen müssen URL-kodiert werden.

Im Compose-Netz werden Service-Namen statt 127.0.0.1 verwendet:

DATABASE_URL=mysql+pymysql://einsatzleiter:PASSWORT@db:3306/einsatzleiter
REDIS_URL=redis://redis:6379/0

MEDIA_STORAGE_DIR, OBJEKT_MEDIA_DIR, NACHSCHLAGEWERK_DATA_DIR und BACKUP_DIR liegen standardmäßig unter app_storage/. Das benannte Volume app_storage bindet dieses Verzeichnis persistent nach /app/app_storage ein.

3. Starten

Option A — vorgebautes Image von GHCR (Standard, empfohlen):

docker compose pull
docker compose up -d
docker compose ps
docker compose logs -f app

IMAGE_TAG in der .env wählt die Version (Default latest = letzter Stand von main); für ein festes Release z. B. IMAGE_TAG=v2026.08.17 setzen.

Option B — selbst bauen (für lokale Änderungen am Dockerfile/Code):

docker compose up -d --build
docker compose ps
docker compose logs -f app

Der Entrypoint führt bei jedem App-Start automatisch alembic upgrade head aus. Seed-Daten bleiben bewusst ein manueller Schritt nach dem ersten Start:

docker compose exec app python -m app.seed_data

Wenn kein Bootstrap-Admin konfiguriert wurde, einen Admin manuell anlegen:

docker compose exec app python -m app.cli create-admin \
  --username admin --password 'SICHERES-PASSWORT'

4. Reverse-Proxy und TLS

Der Host-Port ist aus Sicherheitsgründen nur als 127.0.0.1:8092 veröffentlicht. Port 8092 nicht in der Firewall freigeben. NGINX auf demselben Host kann an http://127.0.0.1:8092 weiterleiten; WebSocket-Header und Timeouts stehen unter NGINX-Reverse-Proxy.

TLS wird außerhalb von Compose terminiert, etwa mit Certbot auf dem Host oder einem vorgelagerten Reverse-Proxy-Container. TRUSTED_PROXY_IPS muss zur tatsächlichen Proxy-Adresse passen; niemals beliebige Quellnetze eintragen.

5. Updates

Mit dem GHCR-Image (Option A):

docker compose pull
docker compose up -d
docker compose ps

Bei lokalem Build (Option B):

git pull origin main
docker compose up -d --build
docker compose ps

Migrationen laufen beim Neustart automatisch (Entrypoint führt alembic upgrade head aus), in beiden Fällen.

6. Backups

Vor Updates und regelmäßig im Betrieb Datenbank und Medien getrennt sichern:

docker compose exec -T db sh -c \
  'mariadb-dump -u"$MARIADB_USER" -p"$MARIADB_PASSWORD" "$MARIADB_DATABASE"' \
  > einsatzcockpit.sql

Zusätzlich das Volume app_storage sichern. Ein bloßes Kopieren des Datenbank-Volumes im laufenden Betrieb ist kein konsistenter Dump. Aufbewahrung, Off-Site-Kopie und Restore-Proben beschreibt Backup & Disaster-Recovery.


Nächster Schritt: Erst-Setup

Clone this wiki locally