Zum Inhalt springen

Betrieb

Selbst hosten

Zwei Container, eine .env, ein Reverse Proxy. Das App-Image kommt fertig gebaut aus der GitHub Container Registry — ihr müsst nichts kompilieren. Kein Konto beim Hersteller, keine Lizenzschlüssel, keine Verbindung nach außen im laufenden Betrieb.

Was ihr braucht

Ein Server, ein Zertifikat, ein SSO

PostgreSQL bringt die Compose-Datei mit — als eigenen Container, dessen Daten neben der Anwendung liegen. Selbst besorgen müsst ihr nur den Rest.

Docker-Host

Ein kleiner Server genügt. Gremio ist für Gremien gebaut, nicht für Zehntausende gleichzeitige Zugriffe.

nginx mit TLS

Der Container liefert nur HTTP. Eine Beispielkonfiguration liegt unter deploy/ im Repository.

OIDC-Provider

Pflicht, nicht optional. Ohne ihn gibt es keinen internen Zugang — der öffentliche Teil funktioniert weiterhin.

Nextcloud

Optional und ausschließlich zur Archivierung abgeschlossener Vorgänge. Ohne sie fehlt nichts Wesentliches.

Installation

In drei Schritten betriebsbereit

Terminal
cp .env.example .env     # Werte eintragen, Secrets erzeugen
docker compose up -d     # zieht das Image, startet PostgreSQL + App
  1. 1

    OIDC-Client anlegen

    Gremio hat keine Passwörter — ohne Identity-Provider gibt es keinen internen Login. Legt dort einen Client an und notiert Issuer-URL, Client-ID und Secret. Unter ADMIN_USER tragt ihr den SSO-Benutzernamen ein, der beim ersten Login automatisch Administrationsrechte bekommt.

  2. 2

    .env ausfüllen

    cp .env.example .env, dann die Werte eintragen. AUTH_SECRET und ENCRYPTION_KEY müssen echte Zufallswerte sein — die mitgelieferten Platzhalter weist die App beim Start ab. Auch POSTGRES_PASSWORD ist Pflicht, ein schwaches Standardpasswort gibt es bewusst nicht.

  3. 3

    Starten und nginx davorsetzen

    docker compose up -d zieht das fertige Image und startet beide Dienste; die Datenbank-Migrationen laufen dabei automatisch. Der Container spricht nur HTTP auf 127.0.0.1:3010 — TLS terminiert euer nginx davor.

Konfiguration

Was in die .env gehört

Die Vorlage im Repository erklärt jedes Feld einzeln. Das hier sind die Werte, ohne die Gremio nicht startet.

  • APP_BASE_URL steht in jedem Status-Link und in der Eingangsbestätigung. Wird sie später geändert, zeigen bereits ausgegebene Links ins Leere.
  • AUTH_SECRET verschlüsselt die Session-Cookies, ENCRYPTION_KEY die hinterlegten Nextcloud-Zugangsdaten. Beide werden geprüft — Platzhalter lehnt die App ab.
  • ADMIN_USER bestimmt, welcher SSO-Benutzername beim Login zur Administration wird. Ohne ihn kommt niemand ins Admin-Panel.
Alle Felder erklärt
.env
APP_BASE_URL="https://gremio.example.org"

# Secrets — leer lässt die App nicht starten,
# die Platzhalter aus .env.example werden abgelehnt.
AUTH_SECRET=""      # openssl rand -base64 48   (mind. 32 Zeichen)
ENCRYPTION_KEY=""   # openssl rand -hex 32      (genau 64 Hex-Zeichen)

# SSO / OIDC — aus der Client-Registrierung
OIDC_ISSUER="https://id.example.org"
OIDC_CLIENT_ID=""
OIDC_CLIENT_SECRET=""

# Dieser SSO-Benutzername wird beim ersten Login zum Admin.
ADMIN_USER="admin"

POSTGRES_PASSWORD=""
AUTH_TRUST_HOST="true"

docker-compose.yml

Der Aufbau auf einen Blick

Zwei Dienste. Die Anwendung hält keinen Zustand im Container — Datenbank und Uploads liegen daneben im Dateisystem und überstehen jedes Update.

docker-compose.yml
services:
  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: gremio
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?in .env setzen}
      POSTGRES_DB: gremio
    volumes:
      - ./pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U gremio -d gremio"]

  app:
    # Fertiges Image aus der GitHub Container Registry — kein lokaler Build.
    image: ghcr.io/leviora-studio/gremio:${GREMIO_TAG:-latest}
    pull_policy: always
    restart: unless-stopped
    env_file:
      - .env
    environment:
      DATABASE_URL: postgres://gremio:${POSTGRES_PASSWORD}@db:5432/gremio
      UPLOAD_DIR: /app/uploads
      AUTH_TRUST_HOST: "true"
    depends_on:
      db:
        condition: service_healthy
    volumes:
      - ./uploads:/app/uploads
    ports:
      # Nur lokal — nginx terminiert TLS und proxyt hierher.
      - "127.0.0.1:3010:3000"

Gekürzt um Kommentare und Healthchecks. Die vollständige Datei liegt im Repository.

Original ansehen

Zwei Verzeichnisse sichern

./pgdata und ./uploads liegen außerhalb des Images. Ein Backup, das nur eines von beiden umfasst, ist keins.

Version festnageln

Ohne Angabe zieht Compose :latest. Für planbare Updates eine Version pinnen: GREMIO_TAG=2.7.5.

Migrationen automatisch

Beim Start laufen die Datenbank-Migrationen von selbst. Beispieldaten werden nicht eingespielt — ihr startet mit einer leeren Instanz.

Worauf zu achten ist

Vier Dinge, die man nur einmal falsch macht

Steht ausführlicher im README. Diese vier betreffen die Sicherheit oder lassen sich später nur mühsam korrigieren.

Genau ein nginx davor

Die App vertraut den X-Forwarded-*-Kopfzeilen. Euer nginx muss deshalb fremde Host-Header abweisen — sonst ist Host-Header-Injection möglich. Die Beispielkonfiguration tut das bereits.

TLS ist Pflicht, nicht Kür

In Produktion muss der OIDC_ISSUER über https erreichbar sein — sonst bricht der Start ab. Dasselbe gilt für Nextcloud-Adressen, weil sonst Zugangsdaten im Klartext liefen.

Passwort vor der ersten Migration

POSTGRES_PASSWORD wirkt nur bei der Erstinitialisierung der Datenbank. Wer es später ändert, muss zusätzlich im laufenden Container nachziehen.

Eine Instanz

Die Ratenbegrenzung arbeitet im Arbeitsspeicher. Für horizontale Skalierung bräuchte es einen geteilten Speicher — für ein Gremium ist das kein Thema.

Anmeldung

Ohne Identity-Provider kein interner Zugang

Das ist keine Einschränkung, die sich abschalten lässt — Gremio hat bewusst keine eigene Passwortverwaltung. Der Login läuft über OIDC mit PKCE; Konten werden beim ersten Anmelden automatisch angelegt.

Der öffentliche Teil — Antragsformular, Feedback, Inventar und alle Statusseiten — bleibt davon unberührt und funktioniert ohne Anmeldung.

Empfohlen: Limen

Gremio spricht Standard-OIDC und läuft grundsätzlich mit jedem konformen Provider. Getestet und empfohlen wird Limen — ein eigenständiger Identity-Provider von Leviora Studio, ausgelegt auf dieselbe Betriebsweise: selbst gehostet, überschaubar, ohne Fremdanbieter.

Limen ansehen

Es gibt eine REST-Schnittstelle

Anträge, Vorgänge und Inventar lassen sich auch von außen abfragen — dokumentiert als OpenAPI-Spezifikation im Repository. Die Rechte der Schnittstelle sind eine Teilmenge der Web-Rechte: Über die API ist nie mehr möglich als in der Oberfläche.

API-Dokumentation

Lizenz: AGPL-3.0

Gremio steht unter der GNU Affero General Public License v3.0. Ihr dürft die Software einsetzen, anpassen und weitergeben. Wenn ihr eine veränderte Fassung als Netzwerkdienst anbietet, müsst ihr den Quellcode dieser Fassung ebenfalls offenlegen.

Für den normalen Fall — eine Hochschulgruppe oder ein Verein betreibt Gremio für sich selbst — entstehen daraus keine zusätzlichen Pflichten.

Loslegen

Repository klonen, .env ausfüllen, docker compose up. Das Image ist gebaut, die Migrationen laufen von selbst.

Freie Software unter der AGPL-3.0 · läuft vollständig auf eurer eigenen Infrastruktur