Selbsthosting
Dasselbe Image läuft auf Ihrem Host oder auf unserem. Diese Seite ist die Sicht des Betreibers: was zu setzen ist, was davor gehört und wie es weiterläuft, ohne dass etwas das Gebäude verlässt.
Aufbau
- Ein Python-Prozess betreibt den Chat-Listener, den Scheduler und die API mit dem Dashboard in einer einzigen Ereignisschleife.
- Der Container lauscht nur auf der Loopback-Schnittstelle; ein Reverse-Proxy (Nginx oder Caddy) terminiert TLS und leitet an ihn weiter.
- Der Zustand liegt in einem Datenverzeichnis: die SQLite-Datenbank, Uploads, GeoIP-Daten, erzeugte Schlüssel und Modellgewichte. Richten Sie DATABASE_URL für Deployments über mehrere Hosts auf Postgres; der additive Migrationssatz funktioniert auf beiden.
- Der Chat-Server (Synapse oder ein anderer Matrix-Homeserver) kann überall erreichbar sein.
Umgebung
| MATRIX_HOMESERVER, MATRIX_USER_ID, MATRIX_ACCESS_TOKEN | das Bot-Konto |
|---|---|
| MATRIX_STANDUP_ROOM_ID | der Standard-Standup-Raum |
| MATRIX_ADMIN_TOKEN | Homeserver-Admin-Token für Bereitstellung und Abfragen; nur in der Umgebung, nie persistiert |
| SECRET_KEY | eine zufällige Zeichenfolge mit 64+ Zeichen, die Dashboard-Sitzungen signiert |
| DATABASE_URL | standardmäßig sqlite oder eine Postgres-URL |
| BOOTSTRAP_ADMIN_MATRIX_ID | der erste Admin, beim Start befördert |
| AI_PROVIDER und der Anbieterschlüssel | siehe KI-Anbieter |
| INTEGRATION_VAULT_KEY | der Schlüssel, der gespeicherte Integrationszugangsdaten verschlüsselt |
| TZ, MAX_BODY_BYTES, AI_REASONING_MODEL | optional |
Reverse-Proxy
- Leiten Sie X-Forwarded-For und X-Forwarded-Proto weiter; ohne Letzteres kann das Produkt HTTP nicht von HTTPS unterscheiden und lässt den HSTS-Header weg.
- Aktivieren Sie Kompression für weitergeleitete Antworten und HTTP/2; das Dashboard lädt bei einem Kaltstart Dutzende Assets.
- Komprimieren oder puffern Sie nie den Ereignisstrom-Endpunkt; Live-Updates sind Server-Sent Events.
- Ratenbegrenzung je IP ist Aufgabe des Proxys; das Produkt begrenzt Code-Anfragen und Anmeldungen selbst.
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; gzip_proxied any; http2 on;
Sicherheitsheader und Grenzen
Jede Antwort trägt nosniff, eine Frame-Verweigerung, eine No-Referrer-Richtlinie, eine restriktive Permissions-Policy, ein zweijähriges HSTS bei TLS und eine Content-Security-Policy. Anfragekörper sind standardmäßig auf 5 MiB begrenzt. Jede Eingabe wird per Schema validiert, bevor ein Handler läuft; Chat-IDs werden vor jedem Homeserver-Aufruf per Regex geprüft; ausgehendes HTTP ist auf den Homeserver und den konfigurierten Anbieter-Host festgelegt.
Betrieb
- Upgrade: Pull, Rebuild, Neustart. Migrationen laufen beim Start und überspringen, was bereits existiert.
- Sichern Sie das Datenverzeichnis nächtlich; für Postgres verwenden Sie pg_dump.
- Gesundheit: ein schneller, nicht authentifizierter Liveness-Endpunkt für die Containerprüfung und ein Admin-gesperrter detaillierter mit Betriebszeit, Datenbankgröße und Anbieterstatus.
- GeoIP: Führen Sie das Aktualisierungsskript wöchentlich aus (schlüsselloses db-ip Lite oder MaxMind mit kostenlosem Schlüssel); eine Kopie im Datenvolume wird beim Neustart ohne Konfiguration übernommen.
- Der Scheduler betreibt den Arbeitstag: Präsenzabfragen alle fünf Minuten, Abwesenheitsprüfungen alle fünfzehn, nächtliche Zusammenfassungen und Bewertungsmaterialisierung, Zusammenfassungen und Berichte in ihren Kadenzen.
docker compose up -d --build docker exec inroots sqlite3 /app/data/standup.db ".backup /tmp/backup.db" GEO_DATA_DIR=/app/data/geo scripts/update_geoip.sh
Abgeschottet
Mit einem selbst gehosteten Matrix-Server, Ollama als Anbieter, einer lokalen IP-Datenbank auf dem Host, ausgeschalteten gesprochenen Antworten und ohne aktivierte Integrationen benötigt das Produkt überhaupt kein Internet. Es gibt keine Telemetrie, kein Nutzungssignal und keinen nach außen meldenden Crash-Reporter; kein Byte verlässt das System, sofern Sie kein Ziel konfigurieren.