-
Notifications
You must be signed in to change notification settings - Fork 0
Installation und Setup
Diese Seite beschreibt die Einrichtung von ConvoyPlan für lokale Entwicklung und Produktivbetrieb.
| Komponente | Version | Zweck |
|---|---|---|
| Git | aktuell | Repository klonen |
| Docker + Docker Compose Plugin | aktuell | Alle Dienste starten |
| Node.js + npm | 20+ | Frontend-Entwicklung (lokal) |
| Python | 3.12 | Backend-Entwicklung (lokal, optional) |
git clone https://github.com/RettTechSolutions/ConvoyPlan.git
cd ConvoyPlandocker compose up -d --buildBeim ersten Start lädt GraphHopper die konfigurierte OSM-PBF-Datei herunter und baut den Routing-Graphen. Der Standard ist Deutschland (~4 GB). Für lokale Tests empfiehlt sich eine kleinere Region:
# docker-compose.yml
OSM_DOWNLOAD_URL: https://download.geofabrik.de/europe/germany/berlin-latest.osm.pbf
OSM_FILENAME: berlin-latest.osm.pbfLogs verfolgen:
docker compose logs -f graphhopperGesundheitschecks:
curl http://localhost:8000/health
curl http://localhost:8989/healthcd frontend
npm install
npm run dev| Dienst | URL |
|---|---|
| Frontend | http://localhost:5173 |
| Backend API | http://localhost:8000 |
| Swagger UI | http://localhost:8000/docs |
| GraphHopper | http://localhost:8989 |
Beim ersten Start leitet die Anwendung automatisch auf /setup weiter. Der fünfstufige Wizard führt durch:
- Superadmin-Account – E-Mail-Adresse und Passwort festlegen.
-
Erste Organisation – Org-Name und Org-Code (URL-Slug, 4–8 Zeichen) anlegen; dieser Slug wird Teil aller org-spezifischen URLs (
/o/[slug]/plan/,/o/[slug]/admin/). -
Domain und SSL – Serverdomain (FQDN) eingeben und TLS-Modus wählen:
- Let's Encrypt – automatisches öffentliches Zertifikat
- Eigenes Zertifikat – PEM-Datei hochladen
- Intern – selbstsigniertes Zertifikat für lokale Nutzung
- Branding (optional) – App-Name, Farben und Logo anpassen. Überspringbar und später im Admin-Bereich erreichbar.
-
Abschluss – Caddy wird live neu geladen, danach direkt zur Anmeldung unter
https://<DOMAIN>/o/[slug]/login.
Für lokale Entwicklung ohne Caddy:
localhostals Domain undinternalals TLS-Modus wählen.
Eine vollständige Vorlage liegt in .env.example. Die wichtigsten Variablen:
| Variable | Beschreibung |
|---|---|
POSTGRES_USER |
Datenbankbenutzer |
POSTGRES_PASSWORD |
Datenbankpasswort – in Produktion zwingend ändern |
POSTGRES_DB |
Datenbankname |
| Variable | Standard | Beschreibung |
|---|---|---|
DATABASE_URL |
(aus POSTGRES_* zusammengesetzt) | PostgreSQL/PostGIS-Verbindung |
APP_ENV |
production |
production erzwingt einen starken JWT_SECRET (Fail-Closed); development lockert die Prüfung für lokale Arbeit |
JWT_SECRET |
(kein sicherer Default) | Signaturschlüssel für JWTs – in Produktion zwingend ≥ 32 Zeichen; sonst startet das Backend nicht |
JWT_ALGORITHM |
HS256 |
JWT-Algorithmus |
JWT_EXPIRE_MINUTES |
10080 |
Token-Ablaufzeit in Minuten (7 Tage) |
GRAPHHOPPER_URL |
http://graphhopper:8989 |
URL der Routing-Engine |
APP_BASE_URL |
https://convoyplan.example.com |
Öffentliche App-Origin (Fallback für CORS in Produktion) |
CORS_ORIGINS |
(leer) | Komma-getrennte Allowlist oder *; leer = App-Origin aus APP_BASE_URL. * nur in Entwicklung |
Sicheren JWT-Secret generieren (die Installer tun das automatisch):
openssl rand -hex 32
⚠️ In Produktion (APP_ENV=production, Default) verweigert das Backend den Start, wennJWT_SECRETleer, der Platzhalter oder kürzer als 32 Zeichen ist (Fail-Closed).
| Variable | Beschreibung |
|---|---|
DOMAIN |
Serverdomain (z. B. convoy.example.com), Standard: localhost
|
ACME_EMAIL |
E-Mail für Let's Encrypt |
CADDY_TLS_CERT |
Pfad zum PEM-Zertifikat (optional, für eigene Zertifikate) |
CADDY_TLS_KEY |
Pfad zum PEM-Schlüssel (optional, für eigene Zertifikate) |
HTTP_PORT |
Externer HTTP-Port, Standard: 80
|
HTTPS_PORT |
Externer HTTPS-Port, Standard: 443
|
| Variable | Standard | Beschreibung |
|---|---|---|
OSM_DOWNLOAD_URL |
https://download.geofabrik.de/europe/germany-latest.osm.pbf |
Download-URL der OSM-PBF-Datei |
OSM_FILENAME |
germany-latest.osm.pbf |
Dateiname im persistenten OSM-Volume |
JAVA_OPTS |
-Xmx2g -Xms512m -XX:+UseG1GC |
JVM-Speicherkonfiguration |
Für große Regionen (Deutschland ~4 GB) mindestens
-Xmx4gempfohlen.
| Variable | Standard | Beschreibung |
|---|---|---|
MFA_ENCRYPTION_KEY |
(aus JWT_SECRET abgeleitet) |
Fernet-Schlüssel zur Verschlüsselung der TOTP-Secrets at-rest. Rotation von JWT_SECRET macht ohne eigenen Schlüssel bestehende MFA-Secrets unlesbar |
PASSWORD_BREACH_CHECK_ENABLED |
true |
Abgleich neuer Passwörter gegen Have-I-Been-Pwned (k-Anonymity, fail-open). Für Air-Gapped-Setups auf false
|
CSP_ENFORCE |
false |
Content-Security-Policy erzwingen (Default: Report-Only, bricht die UI nicht) |
RETENTION_ENABLED |
true |
Periodisches Purgen alter Daten durch den retention-Container |
RETENTION_INTERVAL |
3600 |
Sekunden zwischen den Purge-Läufen |
RETENTION_POSITIONS_HOURS |
24 |
Live-Positionen älter als dieser Wert werden gelöscht |
RETENTION_AUDIT_DAYS |
365 |
Audit-Log-Einträge älter als dieser Wert werden gelöscht |
RETENTION_SHARE_LINKS_DAYS |
30 |
Widerrufene Share-Links älter als dieser Wert werden gelöscht |
BACKUP_DIR |
./backups |
Zielverzeichnis für scripts/backup.sh
|
BACKUP_RETENTION_DAYS |
30 |
Aufbewahrungsdauer der Backups |
Details zu Härtung, Audit-Log, DSGVO und Backup/Restore: Sicherheit und Datenschutz.
| Variable | Beschreibung |
|---|---|
LICENSE_KEY |
Lizenzschlüssel. Ohne gültigen Schlüssel läuft die App im Demo-Modus. Alternativ über den Admin-Bereich eintragbar (wird dann in der DB gespeichert). |
GITHUB_TOKEN |
GitHub PAT mit repo-Leseberechtigung. Benötigt für den Auto-Updater, um neue Commits/Releases zu erkennen. |
GITHUB_REPO |
Repository, das der Auto-Updater überwacht. Standard: RettTechSolutions/ConvoyPlan. |
UPDATE_CHANNEL |
Fallback-Kanal: stable (Standard), beta oder nightly. Der Schalter im Admin-Bereich überschreibt diesen Wert. |
UPDATE_MODE |
Fallback-Modus: auto (Standard) oder notify. Der Schalter im Admin-Bereich überschreibt diesen Wert. |
UPDATE_NOTIFY_ON_AUTO |
Nur bei auto: true schickt zusätzlich eine E-Mail an Superadmins nach automatischer Installation (Standard: false). |
UPDATE_NOTIFY_INTERVAL |
Prüfintervall in Sekunden für fällige Update-Benachrichtigungen (Standard: 1800). |
Details: Auto-Updater und Lizenz und Demo-Modus.
| Variable | Beschreibung |
|---|---|
HERE_TRAFFIC_API_KEY / TOMTOM_TRAFFIC_API_KEY
|
Optionale API-Keys für die Live-Verkehrslage. Ohne Key bleibt die Funktion inaktiv. Alternativ im Admin-Bereich hinterlegbar (hat Vorrang). |
TRAFFIC_FLOW_PROVIDER |
Anbieter erzwingen (here/tomtom). Standard: automatisch, HERE bevorzugt. |
HERE_API_KEY |
Optional. Aktiviert die Adresssuche im Plan-Editor über HERE Geocoding & Search (serverseitig proxied). Leer = HERE_TRAFFIC_API_KEY mitbenutzen bzw. Photon-Fallback. |
HERE_MONTHLY_LIMIT |
Kostendeckel für die Adresssuche: max. HERE-Anfragen pro Kalendermonat (Standard 25000, 0 = kein App-Deckel). Deckel erreicht → automatischer Photon-Fallback. |
OPENDATA_TRAFFIC_ENABLED |
Offene Baustellen-/Sperrungsfeeds aktiviert lassen. Standard: true. |
OPENDATA_TRAFFIC_FEEDS |
Kommaseparierte Liste format|url. Formate: mobidata_bw, berlin_viz, datex2. |
OPENDATA_TRAFFIC_CLIENT_CERT |
Client-Zertifikat (PEM) für per mTLS geschützte datex2-Feeds (mobilithek). |
OPENDATA_TRAFFIC_CA_CERT |
Nur für Broker mit privater CA. Für den mobilithek-Broker leer lassen. |
Schritt-für-Schritt-Anleitung: Verkehrsdaten.
# frontend/.env.local
VITE_WS_HOST=localhost:8000Nach einer Änderung der OSM-Region muss der Graph-Cache neu aufgebaut werden:
docker compose down
docker volume rm convoyplan_gh_graph
docker compose up -d --build# 1. Umgebungsvariablen anpassen
cp .env.example .env
# JWT_SECRET, POSTGRES_PASSWORD, DOMAIN, ACME_EMAIL setzen
# 2. Stack starten
docker compose -f docker-compose.yml up -d --build
# 3. Setup-Wizard aufrufen
open https://<DOMAIN>/setupFür die Produktion wird dieselbe docker-compose.yml verwendet. Sie kann vorgefertigte Images aus der GitHub Container Registry (GHCR) statt lokaler Builds nutzen — kein git clone auf dem Server nötig. Pflichtvariablen beim Anlegen des Stacks:
| Variable | Beispiel |
|---|---|
BACKEND_IMAGE |
ghcr.io/retttechsolutions/convoyplan-backend:latest |
FRONTEND_IMAGE |
ghcr.io/retttechsolutions/convoyplan-frontend:latest |
GRAPHHOPPER_IMAGE |
ghcr.io/retttechsolutions/convoyplan-graphhopper:latest |
JWT_SECRET |
mit openssl rand -hex 32 erzeugen |
POSTGRES_PASSWORD |
sicheres Datenbankpasswort |
DOMAIN / ACME_EMAIL
|
FQDN bzw. E-Mail für Let's Encrypt |
Der Setup-Wizard übernimmt die Erstkonfiguration nach dem ersten Stack-Start.
Hinweis: Der
updater-Container ist nur indocker-compose.ymlenthalten. In Portainer übernimmt der Stack-Update-Mechanismus von Portainer selbst das Deployment neuer Images.
-
JWT_SECRETmitopenssl rand -hex 32generieren – nicht in Git versionieren - Datenbankpasswort ändern
-
CORS_ORIGINSauf die produktive Domain einschränken - Persistente Volumes (
postgres_data,caddy_data,cert_uploads,logo_uploads) regelmäßig sichern - Für Deutschland genug RAM einplanen (
JAVA_OPTS=-Xmx4g) - GraphHopper-Graph-Cache (
gh_graph) auf schnellem Speicher ablegen -
GITHUB_TOKENsetzen, damit der Auto-Updater Commit-Stände abrufen kann - Lizenzschlüssel setzen (Env oder Admin → System); sonst läuft die Instanz dauerhaft im Demo-Modus
cd backend
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
alembic upgrade head
uvicorn app.main:app --reloadPostgreSQL/PostGIS und GraphHopper müssen erreichbar sein – am einfachsten weiterhin über Docker Compose.
cd backend
pytestcd frontend
npm install
npm run check
npm run build# Aktuelle Migrationen ausführen
cd backend && alembic upgrade head
# Neue Migration erzeugen
cd backend && alembic revision --autogenerate -m "beschreibung"docker compose up -d --build # Stack starten
docker compose logs -f backend # Backend-Logs anzeigen
docker compose logs -f graphhopper # GraphHopper-Logs anzeigen
docker compose down # Services stoppen
docker compose down -v # Services stoppen inkl. persistenter DatenDas Frontend ist als Progressive Web App konfiguriert und kann im Browser installiert werden. Für native Apps ist Capacitor vorbereitet:
cd frontend
npm run build
npx cap add android # einmalig, alternativ: ios
npx cap sync
npx cap open androidFür iOS wird eine macOS-Umgebung mit Xcode benötigt.
CI-Checks (Backend-Tests, Frontend-Typecheck, Docker-Build) laufen automatisch auf Push und Pull Requests gegen main.
Für ein neues Release den Tag vX.Y.Z setzen – Docker-Images werden dann automatisch zu GHCR gebaut und gepusht und ein GitHub Release wird erstellt. Seit 2026.1.1 folgt die Versionsnummer dem kalenderbasierten Schema YYYY.MASTER.FIX (Jahr.Master-Release.Fix-Release) statt SemVer. Prerelease-Tags (vX.Y.Z-beta.N) bauen zusätzlich :beta-Images und ein GitHub-Prerelease, ohne :latest zu berühren; jeder Push auf main baut außerdem :nightly-Images.
- In Produktion (
APP_ENV=production, Default) verweigert das Backend den Start, wennJWT_SECRETleer, der Platzhalter oder kürzer als 32 Zeichen ist (Fail-Closed) — mitopenssl rand -hex 32erzeugen. - Die Datenbankzugänge in
docker-compose.ymlsind Entwicklungs-Defaults – in Produktion ändern. - Die Caddy-Admin-API läuft auf Port
:2019und ist nur im Docker-Netzwerk intern erreichbar. - Caddy liefert Security-Header (HSTS,
X-Content-Type-Options,X-Frame-Optionsu. a.) und eine Content-Security-Policy aus (Report-Only, perCSP_ENFORCE=trueerzwingbar). - TOTP-Secrets werden Fernet-verschlüsselt at-rest gespeichert; Passwort-/MFA-Reset entziehen über die
token_versionalle bestehenden JWTs. - Öffentliche Share-Links sind ohne Login abrufbar – Tokens sollten wie vertrauliche Links behandelt und bei Bedarf widerrufen werden.
- Live-Tracking verarbeitet Standortdaten – Aufbewahrung wird über den
retention-Container geregelt.
Vollständige Übersicht: Sicherheit und Datenschutz.
Start
Einrichtung & Referenz
Bedienung
- Erste Schritte
- Konvoi-Planung
- Fahrzeuge
- Live-Tracking
- Marschbefehl & Export
- Rollen & Berechtigungen
- Teilen
Betrieb & Sicherheit