ProjekteStatusdienst
Statusdienst
Ein selbst gehosteter Uptime- und Statusdienst in Go. Er prüft Websites, TCP-Ports und FiveM-Server, zeigt Verfügbarkeit und Antwortzeiten öffentlich an und meldet Ausfall und Wiederkehr per Mail.

Eckdaten
Stand
- Ziele
- 4 auf der öffentlichen Statusseite
- Verfügbarkeit seit Messbeginn am 17.09.
- Website 99,77 %, Bewerbungsportal 100,00 %, Bewerbungen-API 99,98 %, Quellen-Chat 100,00 %
- Tests
- 142 Testfunktionen in 31 Dateien
Ein Aussetzer ist noch kein Ausfall
Ein Vorfall beginnt erst nach mehreren Fehlschlägen in Folge. Wie viele es sein müssen, ist je Ziel einstellbar, voreingestellt sind drei. Ein einzelner Timeout bleibt ein Messpunkt und löst keinen Alarm aus.
Mit dem Vorfall geht eine Mail raus. Antwortet das Ziel wieder, endet er, und die zweite Mail nennt, wie lange der Ausfall gedauert hat.
Eine Goroutine pro Ziel
Jedes Ziel läuft in einer eigenen Goroutine mit eigenem Intervall. Ein zufälliger Versatz verhindert, dass alle Prüfungen im selben Moment starten. Mehr als acht laufen nie gleichzeitig, die übrigen warten auf einen freien Platz.
HTTP(S) prüft, ob der Statuscode im erlaubten Bereich liegt, auf Wunsch auch ein Stichwort im Antworttext. TCP prüft nur, ob der Port eine Verbindung annimmt.
Bei FiveM-Servern fragt der Dienst info.json und players.json des FXServers ab. Gespeichert werden Spielerzahl, Maximum und Version, Spielernamen nicht.
- Goroutine wartet ihr Intervall ab, mit zufälligem Versatz
- Platz wird frei, höchstens acht Prüfungen laufen gleichzeitig
- Prüfung per HTTP(S), TCP oder FiveM
- SQLite speichert Ergebnis und Antwortzeit
Statusseite und Verwaltung
Die Statusseite zeigt für jedes Ziel die Verfügbarkeit über 24 Stunden, 7 Tage und 30 Tage, eine Leiste der letzten 90 Stunden und den Verlauf der Antwortzeit. Adressen und Fehlertexte stehen dort nicht. Die Seite gibt es auf Deutsch und Englisch.
Die Diagramme entstehen als SVG auf dem Server. Rohdaten bleiben 30 Tage liegen und werden stündlich verdichtet.
Ziele und Vorfälle werden in einer eigenen Oberfläche hinter einem Login gepflegt.
Sicherheit
Der Dienst ruft Adressen auf, die in der Verwaltung eingetragen werden. Damit darüber niemand ins interne Netz kommt, zählt die IP nach der Namensauflösung, nicht der Hostname.
- Passwörter mit argon2id
- Session-Cookie mit dem Präfix __Host-
- CSRF-Schutz über Prüfung des Origin und ein maskiertes Token
- Begrenzung der Anmeldeversuche
- SSRF-Sperre auf die aufgelöste IP, auch gegen DNS-Rebinding
- Strenge Content-Security-Policy ohne Inline-Code
Technik
- Sprache
- Go mit net/http, html/template und embed aus der Standardbibliothek
- Daten
- SQLite ohne CGO über modernc.org/sqlite
- Diagramme
- SVG, auf dem Server erzeugt
- Betrieb
- ein Binary im Docker-Image auf Basis von distroless, Dateisystem schreibgeschützt
- CI
- GitHub Actions mit go test -race, golangci-lint und govulncheck
Live
- Adresse status.dmn-software.com
- Zugang Öffentlich, Verwaltung mit Login