Selbst hosten

Wer niemandem vertrauen möchte, betreibt die Software selbst. Sie läuft als Docker-Compose-Stack mit App, PostgreSQL und optional Caddy für HTTPS.

Voraussetzungen

  • Ein Server mit Docker und Docker Compose (ab Version 2.24)
  • Eine Domain, die auf den Server zeigt
  • Ein SMTP-Zugang für den Mailversand; der Mailserver braucht ein gültiges TLS-Zertifikat, weil die Verbindung geprüft wird

Konfiguration

Kopiere .env.example nach .env und trage Datenbankpasswort, geheimen Schlüssel (mindestens 32 Zeichen), öffentliche URL und SMTP-Zugang ein. Impressum und Datenschutz werden über die LEGAL_*-Variablen befüllt. Für eine öffentlich erreichbare Instanz setze außerdem ADMIN_EMAIL: Dann starten neue Logen im Testmodus und werden erst nach deiner Freigabe für größere Abstimmungen zugelassen.

cp .env.example .env
python3 -c "import secrets;print(secrets.token_urlsafe(32))"

Variante A: Eigenständig mit automatischem HTTPS

Die mitgelieferte Caddy-Konfiguration besorgt und erneuert Zertifikate selbst und schreibt keine Zugriffsprotokolle. Trage SITE_ADDRESS (deine Domain) in der .env ein und starte:

docker compose -f docker-compose.yml -f docker-compose.standalone.yml up -d --build

Variante B: Hinter einem eigenen Reverse-Proxy

Starte nur die Anwendung und lass deinen Proxy (z. B. Nginx Proxy Manager) auf Port 8000 des App-Containers zeigen. Wichtig:

  • Aktiviere HTTPS.
  • Schließe die Pfade /v/ und /auth/ vom Access-Log aus.
  • Setze FORWARDED_ALLOW_IPS auf die IP des Proxys, damit Rate-Limits die echte Client-IP sehen.
  • Port 8000 ist standardmäßig nur auf 127.0.0.1 erreichbar. Läuft der Proxy als Container, hänge beide in ein gemeinsames Docker-Netz; sonst APP_BIND=0.0.0.0 setzen und den Port per Firewall auf den Proxy beschränken.
docker compose -f docker-compose.yml up -d --build

Hinweise zum Betrieb

  • Betreibe genau einen App-Prozess; Wartungslauf und Rate-Limits liegen im Prozess.
  • Sichere das Datenbank-Volume. Stimmen enthalten keine Personenbezüge, Einladungen schon – Backups also wie personenbezogene Daten behandeln.
  • Der Container führt beim Start die Datenbank-Migrationen aus.
  • Eine Gesundheitsprüfung steht unter /healthz bereit.
  • Der Server versendet höchstens eine E-Mail pro Sekunde (MAIL_MIN_INTERVAL_SECONDS).