Skip to content

Installation

Robert Einsle edited this page Nov 8, 2026 · 4 revisions

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.

1. UpCloud-Konto anlegen

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.

2. Server anlegen

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).

3. Domains auf den Server zeigen lassen

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.

4. Coolify installieren

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 bash

Die 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.de eintragen 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.

5. Datenbank anlegen

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.

6. openwehr anlegen

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_KEY verschlüsselt Sitzungen und gespeicherte Schlüssel. Einmal erzeugen und nie wieder ändern: echo "base64:$(openssl rand -base64 32)"
  • DISPLAY_TOKEN ist 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 465 smtps. 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.

7. Erste Schritte in openwehr

  1. https://openwehr.ff-musterstadt.de/anmelden öffnen, die Adresse aus ADMIN_EMAILS eingeben und den Link aus der Mail öffnen.
  2. Oben rechts Admin → Einstellungen: Name und Kurzname der Wehr, Mail-Signatur und Logo hochladen.
  3. Kameraden anlegen (oder per Import), dazu Abteilungen und Funktionen. Wer die Funktion „Vorstand“ (oder eine Unterfunktion davon) hat, gehört zum Vorstand.
  4. Module: die gewünschten Module einschalten und über „x Kameraden“ freigeben oder „Neue Kameraden automatisch freischalten“ aktivieren. Rollen (z. B. Entscheider, Kassenwart) dort vergeben.
  5. Im Admin-Dashboard unter „Verbindungen“ prüfen, ob der Mailversand funktioniert.
  6. Den Kameraden die Adresse schicken. Sie melden sich selbst mit ihrer E-Mail-Adresse an.

8. Updates einspielen

Neue Versionen erscheinen unter Releases.

  1. In Coolify bei der Datenbank Backups → Backup Now – vor jedem Update.
  2. Bei der App den Tag auf die neue Version setzen (z. B. v0.8.2), Save, dann Redeploy.
  3. 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.

9. Sicherungen im Blick behalten

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.

Clone this wiki locally