Repository navigation
Installation
Diese Anleitung bringt openwehr auf einen eigenen Server: eine virtuelle Maschine bei UpCloud, darauf Coolify als Verwaltungsoberfläche, darin eine PostgreSQL-Datenbank und die App mit eigener Domain und HTTPS. Programmieren muss dafür niemand; gebraucht werden ein UpCloud-Konto, eine Domain (bzw. Zugriff auf die DNS-Einträge der Wehr-Domain), ein Postfach zum Versenden der Mails und etwa eine Stunde Zeit.
Die Beispiele verwenden die Wehr „FF Musterstadt“ mit der Domain ff-musterstadt.de. Die App soll unter openwehr.ff-musterstadt.de laufen, Coolify unter coolify.ff-musterstadt.de.
UpCloud ist ein europäischer Cloud-Anbieter mit Rechenzentrum in Frankfurt; abgerechnet wird stundengenau.
Konto über den Empfehlungslink anlegen: https://signup.upcloud.com/?promo=R5F4K3 (Empfehlungscode R5F4K3)
- Du bekommst bei der Anmeldung über den Link oder Code 25 € Startguthaben.
- Wir bekommen für jedes neue Konto, das über den Code angelegt wird und mindestens zwei erfolgreiche Einmalzahlungen leistet, 28 Tage nach der ersten Zahlung 50 € Guthaben. Damit wird der Betrieb von openwehr für die örtliche Freiwillige Feuerwehr unterstützt – danke!
Nach der Anmeldung im UpCloud-Hub die Zahlungsdaten hinterlegen und unter Account → SSH keys deinen öffentlichen SSH-Schlüssel eintragen. Wer noch keinen hat, erzeugt ihn auf dem eigenen Rechner mit ssh-keygen -t ed25519 und kopiert den Inhalt von ~/.ssh/id_ed25519.pub.
Im UpCloud-Hub Servers → Deploy server:
| Einstellung | Wert |
|---|---|
| Standort | DE-FRA1 (Frankfurt) – die Daten bleiben in Deutschland |
| Plan | mindestens 2 CPU-Kerne und 4 GB RAM. Das reicht für Coolify, die Datenbank und openwehr; gebaut wird auf dem Server nichts, das fertige Image kommt von GitHub. |
| Speicher | 50 GB oder mehr (Belege und Fotos liegen in der Datenbank) |
| Betriebssystem | Ubuntu Server 24.04 LTS |
| Anmeldung | den SSH-Schlüssel aus Schritt 1, kein Passwort |
| Hostname | z. B. openwehr
|
| Backups | tägliche Sicherung des ganzen Servers einschalten (Simple Backups) |
Nach ein bis zwei Minuten läuft der Server. Seine öffentliche IPv4- und IPv6-Adresse steht in der Serverübersicht.
Firewall: Unter dem Server → Firewall nur eingehende Verbindungen auf den Ports 22 (SSH), 80 (HTTP) und 443 (HTTPS) erlauben, alles andere sperren. Die Oberfläche von Coolify (Port 8000) bleibt damit von außen zu; für die Ersteinrichtung reicht ein SSH-Tunnel (Schritt 4).
Beim Anbieter der Domain (oder bei dem, der die Domain der Wehr verwaltet) zwei Einträge anlegen:
| Name | Typ | Ziel |
|---|---|---|
openwehr.ff-musterstadt.de |
A (und AAAA) | IPv4 (und IPv6) des Servers |
coolify.ff-musterstadt.de |
A (und AAAA) | IPv4 (und IPv6) des Servers |
Alternativ ein Platzhalter-Eintrag *.ff-musterstadt.de, dann sind alle Unterdomains sofort erreichbar. Bis die Einträge überall bekannt sind, kann es einige Minuten dauern; prüfen lässt sich das mit ping openwehr.ff-musterstadt.de.
Zweite Adresse und Cloudflare (optional). Soll openwehr zusätzlich unter einer weiteren Adresse erreichbar sein (z. B. einer gemeinsamen Domain mehrerer Wehren), beide Adressen in Coolify unter Domains eintragen, die eigene Domain der Wehr als APP_URL und die weitere als APP_ALIAS_URLS (siehe Konfiguration). Läuft der Server hinter Cloudflare und lässt die Firewall Port 80/443 nur noch für Cloudflare zu, ist eine Domain, die nicht im eigenen Cloudflare-Konto liegt, direkt nicht mehr erreichbar. Dann hilft Cloudflare for SaaS (SSL/TLS → Custom Hostnames, im Free-Plan 100 Domains inklusive): im eigenen Cloudflare-Konto einen Eintrag fallback (A/AAAA auf den Server, Proxy an) als Fallback Origin und einen Eintrag kunden (CNAME auf fallback, Proxy an) anlegen, die Domain der Wehr als Custom Hostname hinzufügen und bei der Wehr openwehr.ff-musterstadt.de als CNAME auf kunden.<eigene Domain> eintragen (statt des A-Eintrags). Cloudflare bestätigt die Domain und stellt das Zertifikat aus, sobald der CNAME ankommt; das kann je nach Gültigkeit des alten Eintrags bis zu einem Tag dauern. SSL-Modus in Cloudflare: „Full“. Wer openwehr unter der bisherigen Adresse auf den Startbildschirm gelegt hat, landet nach dem Wechsel einmal kurz auf „Keine Verbindung“ oder einer leeren Seite: die App räumt dabei ihren alten Speicher für diese Adresse auf. Beim nächsten Öffnen geht es weiter zur neuen Adresse; danach die App am besten einmal neu unter der neuen Adresse auf den Startbildschirm legen.
Coolify ist eine freie Oberfläche, mit der sich Apps und Datenbanken per Klick betreiben lassen; sie kümmert sich auch um die HTTPS-Zertifikate (Let's Encrypt).
ssh root@<IP-des-Servers>
curl -fsSL https://cdn.coollabs.io/coolify/install.sh | sudo bashDie Installation dauert einige Minuten. Danach auf dem eigenen Rechner einen SSH-Tunnel öffnen:
ssh -L 8000:localhost:8000 root@<IP-des-Servers>und im Browser http://localhost:8000 aufrufen. Sofort das Admin-Konto anlegen – bis dahin könnte das jeder mit Zugang zum Server. Danach in Coolify:
-
Settings → General → Instance's Domain:
https://coolify.ff-musterstadt.deeintragen und speichern. Ab dann ist Coolify ohne Tunnel über diese Adresse erreichbar, mit HTTPS. - Profil → Two-factor authentication einschalten.
- Settings → Notifications: E-Mail einrichten, damit Coolify bei fehlgeschlagenen Deployments oder Backups Bescheid gibt.
Projects → + Add → Name z. B. FF Musterstadt. Im Projekt + New → Database → PostgreSQL:
-
Image:
postgres:18-alpine - Datenbankname und Benutzer z. B.
openwehr, das Passwort von Coolify erzeugen lassen - Keinen öffentlichen Port freigeben – die App erreicht die Datenbank intern
- Start klicken
Unter der Datenbank steht die interne Verbindung (Postgres URL, internal). Daraus werden für die App gebraucht: der Hostname (eine lange Zeichenkette), Benutzer und Passwort. Die Erweiterung btree_gist, die openwehr braucht, legt die App beim ersten Start selbst an.
Backups der Datenbank (dringend empfohlen): Bei der Datenbank → Backups einen täglichen Zeitplan anlegen, z. B. 0 3 * * *. Sicherer als auf dem Server selbst liegen die Sicherungen in einem S3-Speicher, z. B. UpCloud Managed Object Storage: Bucket anlegen, in Coolify unter Settings → S3 Storages eintragen (Endpoint, Bucket, Access Key, Secret Key, mit Validate prüfen) und beim Backup als Ziel wählen. Aufbewahrung z. B. 30 Tage.
Im selben Projekt + New → Docker Image:
| Feld | Wert |
|---|---|
| Image | ghcr.io/roberteinsle/openwehr |
| Tag | eine feste Version aus den Releases, z. B. v0.8.1. (latest ist immer der neueste Stand von main und eher für Test-Instanzen gedacht.) |
| Ports Exposes | 8080 |
| Domains |
https://openwehr.ff-musterstadt.de (mehrere Adressen mit Komma trennen) |
| Health Check | Pfad /up, Port 8080
|
Noch nicht deployen – erst die Umgebungsvariablen eintragen (Environment Variables, am bequemsten über Developer view):
APP_NAME="FF Musterstadt"
APP_ENV=production
APP_DEBUG=false
APP_KEY=base64:...
APP_URL=https://openwehr.ff-musterstadt.de
APP_TIMEZONE=Europe/Berlin
APP_LOCALE=de
APP_FALLBACK_LOCALE=de
DB_CONNECTION=pgsql
DB_HOST=<interner Hostname aus Schritt 5>
DB_PORT=5432
DB_DATABASE=openwehr
DB_USERNAME=openwehr
DB_PASSWORD=<Passwort aus Schritt 5>
SESSION_DRIVER=database
SESSION_LIFETIME=129600
CACHE_STORE=database
QUEUE_CONNECTION=database
MAIL_MAILER=smtp
MAIL_SCHEME=smtps
MAIL_HOST=smtp.example.com
MAIL_PORT=465
MAIL_USERNAME=openwehr@ff-musterstadt.de
MAIL_PASSWORD=<Passwort des Postfachs>
MAIL_FROM_ADDRESS="openwehr@ff-musterstadt.de"
MAIL_FROM_NAME="FF Musterstadt"
ADMIN_EMAILS=wehrfuehrer@ff-musterstadt.de
DISPLAY_TOKEN=<zufälliger Schlüssel>
MAGIC_LINK_TTL_MINUTES=15-
APP_KEYverschlüsselt Sitzungen und gespeicherte Schlüssel. Einmal erzeugen und nie wieder ändern:echo "base64:$(openssl rand -base64 32)" -
DISPLAY_TOKENist der Schlüssel für den Wachen-Monitor und den Termin-Monitor ohne Login:openssl rand -hex 24. Leer lassen, wenn kein Monitor gebraucht wird. -
E-Mail: Ohne funktionierenden Mailversand kann sich niemand anmelden – die Login-Links kommen per Mail. Am einfachsten ist ein eigenes Postfach der Wehr beim Domain-Anbieter. Für Port 587 gilt
MAIL_SCHEME=smtp, für Port 465smtps. Zum Ausprobieren ohne Versand:MAIL_MAILER=log(die Mails stehen dann im Log der App). -
ADMIN_EMAILS: eine oder mehrere Adressen (mit Komma getrennt), die bei jedem Start als aktive Admins angelegt werden.
Jetzt Deploy klicken. Coolify lädt das Image, die App legt beim ersten Start alle Tabellen an und holt das HTTPS-Zertifikat. Wenn der Status auf Running (healthy) steht, ist openwehr unter https://openwehr.ff-musterstadt.de erreichbar.
-
https://openwehr.ff-musterstadt.de/anmeldenöffnen, die Adresse ausADMIN_EMAILSeingeben und den Link aus der Mail öffnen. - Oben rechts Admin → Einstellungen: Name und Kurzname der Wehr, Mail-Signatur und Logo hochladen.
- Kameraden anlegen (oder per Import), dazu Abteilungen und Funktionen. Wer die Funktion „Vorstand“ (oder eine Unterfunktion davon) hat, gehört zum Vorstand.
- Module: die gewünschten Module einschalten und über „x Kameraden“ freigeben oder „Neue Kameraden automatisch freischalten“ aktivieren. Rollen (z. B. Entscheider, Kassenwart) dort vergeben.
- Im Admin-Dashboard unter „Verbindungen“ prüfen, ob der Mailversand funktioniert.
- Den Kameraden die Adresse schicken. Sie melden sich selbst mit ihrer E-Mail-Adresse an.
Neue Versionen erscheinen unter Releases.
- In Coolify bei der Datenbank Backups → Backup Now – vor jedem Update.
- Bei der App den Tag auf die neue Version setzen (z. B.
v0.8.2), Save, dann Redeploy. - Datenbank-Änderungen laufen beim Start automatisch. Die Version steht im Admin-Bereich oben klein hinter dem Titel.
Wie oft? Mindestens monatlich, und sofort, wenn ein Release als Sicherheitsupdate gekennzeichnet ist. Wer „Watch → Custom → Releases“ beim Repository einschaltet, bekommt jede neue Version per Mail.
Zurück auf die vorige Version geht genauso über den alten Tag. Die Datenbank wird dabei nicht zurückgedreht; macht ein Update Probleme, das Backup aus Schritt 1 einspielen.
| Was | Wo | Wie oft |
|---|---|---|
| Datenbank | Coolify → S3-Speicher | täglich |
| ganzer Server | UpCloud Simple Backups | täglich |
| Coolify-Einstellungen | Coolify → Settings → Backup → S3-Speicher | täglich |
Damit openwehr das Alter des letzten Backups kennt (Admin → Analyse → Backups), lässt man den Backup-Job nach jedem Lauf die dort angezeigte Webhook-Adresse aufrufen (curl -fsS -X POST <Adresse>, bei Fehler mit ?status=failed) – oder bestätigt die Prüfung dort von Hand mit „Heute geprüft“. Ist das letzte gemeldete Backup älter als 26 Stunden, bekommen die Admins morgens eine Mail.
Einmal im Quartal ausprobieren, ob sich ein Datenbank-Backup wirklich einspielen lässt – am besten in eine zweite, leere Instanz.
openwehr V.0.9.6.6 · freie Software unter der AGPL-3.0 · www.openwehr.de · Fehler oder Wünsche: Issues
Einstieg
Module