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
cp .env.example .env # Werte eintragen, Secrets erzeugen
docker compose up -d # zieht das Image, startet PostgreSQL + App- 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_USERtragt ihr den SSO-Benutzernamen ein, der beim ersten Login automatisch Administrationsrechte bekommt. - 2
.env ausfüllen
cp .env.example .env, dann die Werte eintragen.AUTH_SECRETundENCRYPTION_KEYmüssen echte Zufallswerte sein — die mitgelieferten Platzhalter weist die App beim Start ab. AuchPOSTGRES_PASSWORDist Pflicht, ein schwaches Standardpasswort gibt es bewusst nicht. - 3
Starten und nginx davorsetzen
docker compose up -dzieht das fertige Image und startet beide Dienste; die Datenbank-Migrationen laufen dabei automatisch. Der Container spricht nur HTTP auf127.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.
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.
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 ansehenZwei 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 ansehenEs 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-DokumentationLizenz: 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