HilfeHelp Center

Was wird benötigt?

Um Ember selbst zu betreiben, brauchst du:

Server mit Docker

Ein Linux-Server (VPS oder dediziert) mit Docker und Docker Compose. Mindestens 1 GB RAM empfohlen.

PostgreSQL-Datenbank

Ember speichert alle Daten in PostgreSQL. Version 14 oder neuer.

E-Mail-Server (SMTP)

Für Einladungen, Passwort-Reset und Benachrichtigungen. Jeder SMTP-Anbieter funktioniert.

Domain mit HTTPS

Eine eigene Domain mit SSL-Zertifikat (z.B. über Let's Encrypt). Pflicht für sicheren Betrieb.

In einem Befehl installieren

Das Installationsskript fragt die Handvoll Dinge ab, die sich zwischen Installationen unterscheiden, schreibt die Compose-Datei, startet alles und zeigt am Ende die Zugangsdaten des angelegten Administrators:

curl -fsSL https://ember-panel.de/install.sh | bash

Wer lieber klickt als tippt, stellt die Installation vorher zusammen und nimmt nur einen kurzen Code mit auf den Server.

Installation zusammenstellen

Erzeugt einen Code, den das Skript einlöst

Installation mit Docker

Ember besteht aus zwei Containern: dem Backend (Java API) und dem Frontend (Nuxt SSR). Der einfachste Weg ist Docker Compose. Das folgende Beispiel enthält Traefik-Labels für automatisches HTTPS:

services: postgres: image: postgres:17-alpine environment: POSTGRES_DB: ember POSTGRES_USER: ember POSTGRES_PASSWORD: sicher-aendern volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ember"] interval: 5s timeout: 3s retries: 10 ember: image: ghcr.io/rainbowdashlabs/ember-backend:latest environment: DB_HOST: postgres DB_PORT: "5432" DB_USER: ember DB_PASSWORD: sicher-aendern DB_DATABASE: ember DB_SCHEMA: ember_schema volumes: - ./config:/app/config - ./data:/app/data depends_on: postgres: condition: service_healthy labels: traefik.enable: "true" traefik.http.routers.ember-api.rule: > Host(`ember.example.com`) && PathPrefix(`/api`) traefik.http.routers.ember-api.entrypoints: websecure traefik.http.routers.ember-api.tls.certresolver: letsencrypt traefik.http.services.ember-api.loadbalancer.server.port: "8080" frontend: image: ghcr.io/rainbowdashlabs/ember-frontend:latest depends_on: - ember labels: traefik.enable: "true" traefik.http.routers.ember-web.rule: > Host(`ember.example.com`) traefik.http.routers.ember-web.entrypoints: websecure traefik.http.routers.ember-web.tls.certresolver: letsencrypt traefik.http.routers.ember-web.priority: "1" traefik.http.services.ember-web.loadbalancer.server.port: "3000" volumes: pgdata:

Ersetze ember.example.com durch deine Domain. Der API-Router hat eine höhere Priorität, sodass /api-Anfragen ans Backend gehen und alles andere ans Frontend. Starte alles mit docker compose up -d. Beim ersten Start wird automatisch eine Konfigurationsdatei unter config/ erstellt und ein Admin-Konto mit zufälligem Passwort generiert (in der Konsole sichtbar).

Erster Start

Beim ersten Start legt Ember ein Konto an, das die Instanz verwaltet, und schreibt in die Konsole, womit du dich anmeldest: den Benutzernamen admin und ein zufälliges Passwort. Eine E-Mail-Adresse hat das Konto noch nicht, denn welche das sein soll, weißt nur du.

  • Melde dich mit dem Benutzernamen und dem Passwort aus der Konsole an. Das Passwort gilt nur für diese eine Anmeldung, du wirst sofort nach einem neuen gefragt.
  • Danach fragt Ember nach einer E-Mail-Adresse, unter der du wirklich erreichbar bist. Erst wenn sie hinterlegt ist, kommst du in die Anwendung.
  • Richte anschließend den Mailversand ein, damit die Adresse auch etwas nützt: ohne Mailversand erreicht dich weder eine Passwortzurücksetzung noch eine Sicherheitsmeldung.
Die Adresse ist Pflicht, weil ein Konto, an das niemand schreiben kann, im Ernstfall nichts wert ist: keine Passwortzurücksetzung, keine Warnung, keine Benachrichtigung. Aus dem gleichen Grund wird eine erfundene Adresse abgewiesen. Ändern kannst du sie später jederzeit unter Konto.

Solange kein Mailversand eingerichtet ist

Rückfragen, die Ember sonst per E-Mail stellt, kann es dann nicht stellen. Statt auf eine Antwort zu warten, die nie kommen kann, führt Ember die Handlung sofort aus: ein neues Konto gilt als bestätigt, eine geänderte Adresse wird direkt übernommen, und eine Wache wird ohne Rückfrage gelöscht. Sobald ein Mailversand eingerichtet ist, wird wieder nachgefragt. Links zum Setzen eines Passworts sind davon nicht betroffen: sie übergeben ein Passwort, statt etwas zu bestätigen, und werden weiterhin nur per E-Mail verschickt.

Konfiguration

Die vollständige Liste aller Einstellungen und Umgebungsvariablen ist auf einer eigenen Seite zusammengefasst:

Konfiguration & Umgebungsvariablen

Alle Einstellungen der config.yml und ihre passenden Umgebungsvariablen.

Datenverzeichnis

Das data/ Verzeichnis im Container (im Beispiel oben auf ./data des Hosts gemappt) enthält alle Dateien, die nicht in der Datenbank gespeichert werden:

  • data/documents/ - Rechtliche Dokumente (Datenschutz, Einwilligung, Nutzungsbedingungen, Impressum) als Markdown. Werden beim ersten Start aus dem Container kopiert und können auf dem Host mit einem Editor bearbeitet werden.
  • data/station/<id>/ - Alle Wachen-Dateien - Seiten-Anhänge, Wiki-Dateien, Board-Anhänge, Fundsachen-Bilder, Quiz-Bilder, Wiki-Icons und -Bilder. Eine Wache pro Unterordner.
  • data/account/<id>/ - Konto-bezogene Dateien - derzeit nur Profilbilder. Pro Konto ein Unterordner.
  • data/inst/ - Instanz-weite Dateien - Logo-Fragmente und ähnliche Branding-Bilder.
  • data/discovery/ - Schlüsselpaar für die Föderation. Geht der private Schlüssel verloren, müssen alle Partner-Wachen die Verbindung neu aufbauen.
  • data/maps/ - Karten-Tile-Cache. Reine Caches, dürfen verloren gehen - werden bei Bedarf neu geladen.

Beim ersten Start werden Vorlagen für die rechtlichen Dokumente automatisch aus dem Container kopiert, wenn sie noch nicht vorhanden sind.

Wache-Inhalte können wahlweise auf einem entfernten Speicher (S3, SMB, SFTP) liegen statt auf der lokalen Festplatte. Dann sind die Dateien dort und nicht im data/ Verzeichnis. Die Einstellung erfolgt entweder über die Admin-Oberfläche (Instanz-Standard) oder pro Wache durch deren Verwalter.

Reverse Proxy

Ember läuft standardmäßig auf Port 8080. Für den Produktivbetrieb solltest du einen Reverse Proxy davor schalten:

  • Nginx, Caddy oder Traefik als Reverse Proxy verwenden.
  • HTTPS mit SSL-Zertifikat (z.B. Let's Encrypt) einrichten.
  • WebSocket-Verbindungen durchleiten (für Echtzeit-Updates).

Sicherheitshinweise

Ember verarbeitet personenbezogene Daten von Minderjährigen. Stelle sicher, dass dein Server aktuell und sicher konfiguriert ist. Verwende starke Passwörter, halte das System aktuell und erstelle regelmäßige Backups.

Updates

Ember wird als Docker-Image bereitgestellt. Zum Aktualisieren:

Ziehe das neueste Image mit docker compose pull und starte neu mit docker compose up -d. Datenbank-Migrationen laufen automatisch beim Start.

Backups

Sichere regelmäßig die folgenden Bereiche. Ein vollständiges Backup besteht aus allen vieren - fehlt einer, kann der Stand nach einem Crash nicht wiederhergestellt werden.

  • Datenbank: Die PostgreSQL-Datenbank, am einfachsten mit pg_dump (oder einem Volumen-Snapshot des pgdata-Volumens, wenn der Container gestoppt ist). Enthält Konten, Mitglieder, Termine, Anwesenheit, Inventar - der Großteil der Anwendungsdaten.
  • Konfigurations-Ordner: Der auf den Container gemappte config/ Ordner. Enthält die config.yml mit allen Einstellungen sowie verschlüsselte Anmeldedaten für ausgelagerten Speicher (S3, SMB, SFTP), falls die Admin-Oberfläche zum Setzen verwendet wurde.
  • Daten-Ordner: Der auf den Container gemappte data/ Ordner. Enthält alles aus dem Datenverzeichnis oben - rechtliche Dokumente, hochgeladene Dateien (sofern lokal gespeichert), den Föderations-Schlüssel und Logo-Fragmente. Wenn Wache-Dateien auf S3/SMB/SFTP liegen, brauchst du zusätzlich ein Backup beim jeweiligen Anbieter.
  • Geheime Umgebungsvariablen: STORAGE_CREDENTIALENCRYPTIONKEY und AUTH_TOKENPEPPER an einem sicheren Ort außerhalb des Servers (z.B. Passwort-Manager). Geht der Verschlüsselungsschlüssel verloren, sind alle in der Datenbank gespeicherten Speicher-Anmeldedaten nicht mehr lesbar; ohne den Token-Pepper sind alle bestehenden Anmelde-Sitzungen ungültig.

Hinweis: Wenn Wache-Dateien auf einem entfernten Speicher (S3, SMB, SFTP) liegen, sind sie nicht im data/ Ordner. Sorge dafür, dass der Anbieter dort sein eigenes Backup hat oder erstelle es selbst.

Teste Updates und Backup-Wiederherstellung zuerst in einer Testumgebung, bevor du dich im Notfall darauf verlassen musst.