OpenSlides auf dem eigenen Server: Meine Installation auf dem „Cube“

OpenSlides ist für digitale Versammlungen, Abstimmungen und strukturierte Entscheidungsprozesse eine kraftvolle Plattform. Viele Organisationen nutzen externe Hosting-Angebote, doch für meine Arbeitsweise war klar: Die Installation läuft auf meinem eigenen Server, vollständig unter meiner Kontrolle, mit einer klaren und transparenten Dokumentation.

Im Folgenden beschreibe ich Schritt für Schritt, wie ich OpenSlides 4 auf meinem Home-Server cube eingerichtet habe. Der Server läuft mit Ubuntu, Docker und docker-compose und ist über die Domain openslides.terruhn.it erreichbar. Der gesamte Stack ist sauber getrennt, wartbar und schnell aktualisierbar.

Ziel und Architektur

Die Installation folgt einem übersichtlichen Konzept:

  • Hostsystem: Ubuntu-Server („cube“)
  • Orchestrierung: docker-compose
  • Dienste: vollständiger OpenSlides-Stack aus Proxy, Client, Backend-Diensten, Datenbank und Redis
  • Zugriff von außen über HTTPS
  • automatische Let’s Encrypt-Zertifikate via Auto-HTTPS
  • klare Trennung der Bereiche für Konfiguration, Secrets und Daten

Damit entsteht eine robuste Grundlage für Veranstaltungen jeder Größenordnung.

Vorbereitung auf dem Server

System aktualisieren

sudo apt update
sudo apt upgrade

Docker und docker-compose bereitstellen

sudo apt install docker.io docker-compose
sudo systemctl enable docker
sudo systemctl start docker

Erster Projektstart in /opt: Git-Clone und INSTALL.md

Die Installation begann nicht sofort in /srv, sondern früher in /opt. Dort liegt heute der ursprüngliche Projektstand, mit dem der gesamte Prozess begonnen hat:

/opt/OpenSlides
/opt/openslides-venv
/opt/containerd

Der Einstieg sah so aus:

cd /opt
sudo git clone https://github.com/OpenSlides/OpenSlides.git

Damit entstand das Verzeichnis:

/opt/OpenSlides

Innerhalb des Repositories lag auch die Datei:

/opt/OpenSlides/INSTALL.md

Diese Datei enthält die ersten Hinweise zum Aufbau der OpenSlides-Architektur, zu den Komponenten und zu den Deploy-Skripten. Auf Basis dieser Anleitung ging es weiter.

Die produktiven Konfigurationsdateien befinden sich im Repository unter:

/opt/OpenSlides/deploy/docker-compose/

Dort liegen unter anderem:

  • docker-compose.yml
  • config.yml
  • Vorlagen für Secrets
  • Hinweise zur Struktur der Container

Für den produktiven Betrieb habe ich anschließend ein sauberes Projektverzeichnis unter /srv/openslides angelegt und die relevanten Dateien dorthin übernommen:

sudo mkdir /srv/openslides
sudo cp /opt/OpenSlides/deploy/docker-compose/* /srv/openslides/

Dort entstanden dann die finalen Strukturen, die mit docker-compose laufen und alle Dienste bereitstellen.

Verzeichnisstruktur der Installation

OpenSlides liegt auf meinem Server im Verzeichnis /srv/openslides. Dort befinden sich alle Dateien und Ordner, die der Stack benötigt.

Vollständiger Inhalt des Ordners

rene@cube:/srv/openslides$ ls -la
total 14920
drwxr-xr-x 4 root root     4096 Nov 30 06:02 .
drwxr-xr-x 4 root root     4096 Nov 30 08:12 ..
-rw-r--r-- 1 root root      663 Nov 20 04:06 config.yml
drwxr-xr-x 3 root root     4096 Nov 15 10:02 db-data
-rw-r--r-- 1 root root     7162 Nov 30 06:02 docker-compose.yml
-rw------- 1 root root       52 Nov 19 19:21 .env
-rwxr-xr-x 1 root root 15242264 Dez 13  2022 openslides
drwxr-x--- 2 root root     4096 Nov 15 10:01 secrets

Diese Struktur ist klar getrennt:

  • config.yml – zentrale Laufzeit-Konfiguration
  • docker-compose.yml – vollständiger Container-Stack
  • .env – sensible Variablen
  • db-data/ – persistente Postgres-Daten
  • secrets/ – Schlüsselmaterial und Passwörter
  • openslides – ausführbare Helper-Komponente

config.yml – zentrale OpenSlides-Konfiguration

Die Datei config.yml steuert die wichtigsten Eigenschaften der Installation. Sie wird vom Proxy und verschiedenen Backend-Diensten genutzt. Entscheidend sind Auto-HTTPS, Domain-Einstellungen und Mail-Konfiguration.

Die config.yml komplett:

comfig.yml

Wesentliche Punkte:

  • Auto-HTTPS ist aktiv
  • Lokales HTTPS bleibt ausgeschaltet
  • Externe Adresse: openslides.terruhn.it
  • Mailserver ist eingebunden
  • Passwörter werden nicht im Klartext in dieser Datei gespeichert

Die Datei ist damit leicht nachvollziehbar und gut wartbar.

docker-compose.yml – der komplette OpenSlides-Stack

Die Datei docker-compose.yml bildet den gesamten Multi-Service-Stack ab. OpenSlides 4 bringt viele einzelne Dienste mit, die als Container zusammenarbeiten:

  • Proxy (mit Auto-HTTPS)
  • Client (Frontend)
  • Backend Action
  • Backend Presenter
  • Backend Manage
  • Auth
  • Autoupdate
  • Media
  • Vote
  • Redis
  • PostgreSQL
  • Datastore Reader und Writer

Die docker-compose.yml komplett:

docker-compose.yml

Der Proxy veröffentlicht Port 80 und Port 443. Alle anderen Dienste bleiben im internen Netzwerk geschützt sichtbar. Zertifikate holt der Proxy automatisch, sobald die Domain korrekt gesetzt ist.

Die Datei ist vollständig mit Secrets verknüpft, sodass keine sensiblen Zugangsdaten im Klartext stehen.

.env – sensible Variablen

Die .env-Datei enthält vertrauliche Werte wie Mailpasswörter oder spezielle Tokens. Sie wird beim Start automatisch eingelesen und bleibt lokal geschützt. Die Rechte sind bewusst streng gesetzt:

-rw------- 1 root root 52 .env

Diese Datei gehört in kein Repository und in keine Backups außerhalb des Servers.

db-data – persistente Datenbank

Der Ordner db-data/ enthält alle Daten der PostgreSQL-Datenbank:

  • Benutzerkonten
  • Anträge
  • Tagesordnungspunkte
  • Dateien (in DB-basierten Media-Konfigurationen)
  • Abstimmungsergebnisse

Dieser Ordner ist entscheidend für Backups und für die langfristige Stabilität der Installation.

secrets – Schlüsselmaterial und interne Passwörter

Im Ordner secrets/ liegen alle sicherheitsrelevanten Dateien, zum Beispiel:

  • Token- und Cookie-Schlüssel
  • interne Passwortdateien
  • Superadmin-Zugang
  • Postgres-Passwortdatei

Die Rechte sind restriktiv:

drwxr-x--- 2 root root 4096 secrets

Nur Root und der Docker-Dienst greifen darauf zu. Die Verknüpfung erfolgt über docker secrets.

Start der Installation

Der Start der gesamten Installation funktioniert mit zwei Befehlen:

cd /srv/openslides
sudo docker-compose pull
sudo docker-compose up -d

Der Stack fährt hoch, der Proxy besorgt Zertifikate, der Client wird geladen, und die Dienste verbinden sich automatisch miteinander.

Status prüfen:

sudo docker-compose ps

Domain und Erreichbarkeit

Die Domain openslides.terruhn.it zeigt direkt auf den Anschluss. Die FritzBox leitet das HTTPS-Port weiter:

  • 443 extern → 443 intern

Port 80 wird ebenfalls durch den Proxy bedient, sodass Weiterleitungen und Zertifikatsanforderungen zuverlässig funktionieren.

Wartung, Updates und Logs

Logs ansehen

sudo docker-compose logs -f

Stack aktualisieren

sudo docker-compose pull
sudo docker-compose up -d

Updates laufen durch die Trennung von Konfiguration, Secrets und Daten reibungslos durch.

Performance-Prognose und mögliche Engpässe

Die Leistungsfähigkeit der Installation ergibt sich aus mehreren Faktoren. OpenSlides erzeugt auf dem Cube selbst nur moderate Last, da die Dienste überwiegend leichtgewichtige JSON-Daten austauschen. Die Berechnung erfolgt größtenteils im Browser der Teilnehmenden, während der Server vor allem kurze strukturierte Anfragen beantwortet. PostgreSQL verarbeitet gut indexierte Datensätze, und Redis liefert viele Antworten direkt aus dem Speicher. Dadurch bleibt der Ressourcenbedarf im Cube begrenzt.

Auf dieser Grundlage ergibt sich eine vorsichtige Einschätzung:

  • bis ca. 200 Teilnehmende
    Der Betrieb läuft voraussichtlich stabil. Die JSON-Updates werden zuverlässig verteilt und die Container behalten Reserven für typische Vorgänge wie Abstimmungen und Anträge.
  • bis ca. 400 Teilnehmende
    Die Installation bleibt wahrscheinlich nutzbar, reagiert allerdings empfindlicher auf gleichzeitige Aktionen großer Gruppen. Für diesen Bereich empfiehlt sich später ein gezielter Lasttest.

Viele potenzielle Engpässe entstehen nicht im Server, sondern in der Umgebung der Teilnehmenden:

  • Endgeräte
    Browser-basierte Anwendungen verteilen einen großen Teil der Last auf die Geräte der Nutzenden. Schwächere oder ausgelastete Hardware kann die Darstellung der JSON-Daten verzögern.
  • WLAN-Infrastruktur vor Ort
    In Räumen mit vielen verbundenen Geräten begrenzt das lokale WLAN die Geschwindigkeit stärker als der Server. Live-Updates können dadurch langsamer ankommen.
  • Upload-Bandbreite des Anschlusses
    Die parallele Übertragung an alle Teilnehmenden nutzt dieselbe Upload-Strecke. JSON-Pakete sind klein, doch die Summe aller Updates bleibt ein relevanter Faktor.
  • Spitzenlasten
    Gleichzeitiges Öffnen großer Tagesordnungspunkte oder das Starten einer Abstimmung erzeugen kurzfristig höhere Last, vor allem im Presenter- und Datenbankdienst.

Ein weiterer Punkt betrifft die Zukunftstauglichkeit:
Der Cube ist technisch solide, jedoch im Home-Setup nur begrenzt erweiterbar. Mehr CPU-Kerne, schnellere Storage-Systeme oder höhere garantierte Upload-Bandbreite lassen sich dort nur schwer umsetzen. Sollte eine Versammlung dauerhaft jenseits der genannten Größen stattfinden oder eine höhere Ausfallsicherheit benötigt werden, führt der Weg langfristig zu einem Hosted-Server oder einer dedizierten Cloud-Instanz. Dort lässt sich die Leistung flexibel skalieren, ohne dass sich die Architektur der Installation ändern müsste.

Technisches Fazit

Mit dieser Struktur läuft OpenSlides auf meinem Server klar getrennt, zuverlässig und gut nachvollziehbar:

  • Containerarchitektur mit sauberer Orchestrierung
  • automatische Zertifikate durch Auto-HTTPS
  • getrennte Bereiche für Konfiguration, Secrets und Daten
  • transparente Ordnerstruktur
  • einfacher Update-Prozess

Die Installation zeigt, wie ein komplexes System auf eigener Hardware stabil betrieben wird, bei voller Kontrolle über Sicherheit, Daten und Wartung.

Rechtliche Einordnung für den Betrieb meiner OpenSlides-4-Instanz

Für OpenSlides existiert ein rechtsverbindliches Gutachten der GOB Legal Rechtsanwaltsgesellschaft mbH vom 25.03.2021. Dieses Gutachten bestätigt, dass OpenSlides 3 – unter definierten technischen und organisatorischen Voraussetzungen – für geheime elektronische Abstimmungen und Wahlen geeignet ist.

Mit dem aktuellen Schreiben vom 3. Juni 2024 stellt die Intevation GmbH klar, dass dieses Gutachten unverändert auch für OpenSlides 4 gilt.

Damit gelten alle im Gutachten beschriebenen technischen Anforderungen, Sicherheitsmechanismen und Wahlverfahren ebenso für die Version 4, die ich auf meinem Server betreibe.

Gleichzeitig macht das Gutachten sehr deutlich, unter welchen übergeordneten Bedingungen der rechtskonforme Betrieb steht. Diese Punkte betreffen nicht die Software selbst, sondern die organisatorische und infrastrukturelle Umgebung. Für meine eigene Installation auf dem Cube ergibt sich daraus folgende Einschätzung.

Was meine OpenSlides-4-Instanz technisch erfüllt

Die folgenden Anforderungen erfüllt OpenSlides 4 bereits durch seine Architektur und durch meine konkrete Installation:

  • TLS-gesicherte Kommunikation über Auto-HTTPS
  • Trennung von Stimmberechtigung und Stimminhalt
  • Anonymisierte Speicherung nicht-namentlicher Stimmen
  • Verhinderung mehrfacher Stimmabgaben durch Transaktionen
  • Tokenbasierte Stimmabgabe ohne Rückschluss auf die Person
  • Keine Übermittlung einer „Quittung“ an Teilnehmende
  • JSON-basierter Datenaustausch ohne Speicherung sensibler Metadaten im System

Diese Punkte entsprechen den Anforderungen des Gutachtens an das technische System und decken sich vollständig mit der Funktionsweise von OpenSlides 4.

Was meine Instanz nicht erfüllt und warum das rechtlich relevant ist

Das Gutachten basiert auf Hosting durch die Intevation GmbH, also durch einen externen, vertraglich gebundenen Dienstleister in zertifizierten Rechenzentren (ISO/IEC 27001).

Meine Installation weicht davon in mehreren Punkten ab:

1. Kein externer Betreiber

Ich betreibe die Instanz selbst, nicht als externer Dienstleister.

→ Das Gutachten setzt voraus, dass der Betreiber nicht Teil der abstimmenden Organisation ist und über eine qualifizierte Verschwiegenheitsklausel gebunden ist.
Diese Voraussetzung erfülle ich naturgemäß nicht.

2. Kein professionelles Rechenzentrum

Der Cube steht in einer privaten Infrastruktur, nicht in einem zertifizierten RZ.

→ Es fehlen die im Gutachten angenommenen Rahmenbedingungen wie

  • Zutrittskontrolle
  • Redundanz und Backup-RZ
  • Notfallplanung
  • dokumentierte IT-Prozesse

3. Keine formale Verpflichtung Dritter

Im Gutachten werden Administrator*innen arbeits- bzw. dienstvertraglich zur Verschwiegenheit verpflichtet.

→ Bei einem privaten Heimserver entfällt diese organisatorische Absicherung.

4. Satzungsrechtliche Grundlage

Ob eine Organisation geheime elektronische Wahlen zulässt, bestimmt ihre Satzung. Das gilt unabhängig von der verwendeten Technik.

→ Dies muss im Einzelfall geprüft werden, da es außerhalb des technischen Setups liegt.

Fazit für den Einsatz meiner Instanz

OpenSlides 4 erfüllt technisch alle Voraussetzungen, die das Gutachten beschreibt.
Meine Installation erfüllt jedoch nicht alle organisatorischen Randbedingungen, die das Gutachten als Voraussetzung für rechtsverbindliche geheime Wahlen nennt.

Das bedeutet:

  • Für interne Arbeitsprozesse, informelle Abstimmungen und nicht-strittige Entscheidungen ist die Instanz gut geeignet.
  • Für offiziell geheime Wahlen mit Anfechtungsrisiko wäre zusätzlich erforderlich:
    • Hosting in einer professionellen Infrastruktur
    • Betrieb durch einen externen, zur Verschwiegenheit verpflichteten Dienstleister
    • dokumentierte Sicherheitsprozesse
    • klare, satzungsgemäße Erlaubnis der Organisation

Damit ist transparent nachvollziehbar, wo OpenSlides 4 rechtlich abgesichert ist und wo eine private Installation – auch bei technisch korrektem Betrieb – nicht die vom Gutachten vorausgesetzten Rahmenbedingungen erfüllt.

Zuletzt aktualisiert am 9. Dezember 2025.