Status Page¶
URL: status.xynap.tech
Container: status-page
Port: 8090 (intern)
Version: 2.7.0
Die oeffentliche Status Page zeigt den aktuellen Zustand aller xynap-Dienste, eine 90-Tage-Uptime-Historie und aktive Stoerungsmeldungen. Sie ist ohne Login zugaenglich.
Features¶
| Feature | Beschreibung |
|---|---|
| Live-Status | Echtzeit-Status aller Komponenten via Docker-API |
| Uptime-Historie | 90-Tage-Balkendiagramm pro Komponente |
| Stoerungen | Aktuelle und vergangene Incidents mit Updates |
| E-Mail-Abo | Benachrichtigungen bei Stoerungen (Double Opt-in, i18n) |
| Incident-Notify | Automatischer Versand an Abonnenten bei neuen Updates |
| Mehrsprachig | Deutsch / Englisch (UI + API) |
| Dark Mode | Automatisch oder manuell umschaltbar |
| REST API | Vollstaendige API mit Swagger-Dokumentation |
Architektur¶
Browser ──▶ Traefik ──▶ status-page:8090 (FastAPI + Uvicorn)
│
├── Docker Socket (Container-Health)
├── /data/services.json (Konfiguration)
├── /data/incidents.json (Stoerungen)
├── /data/uptime.json (90-Tage-Historie)
├── /data/subscribers.db (SQLite)
└── /data/notified.json (Deduplizierung)
Der Service prueft alle 5 Minuten den Zustand der konfigurierten Container ueber die Docker-API und speichert die Ergebnisse in uptime.json.
Konfiguration¶
Umgebungsvariablen¶
| Variable | Default | Beschreibung |
|---|---|---|
SERVICES_FILE |
/data/services.json |
Komponentenkonfiguration |
INCIDENTS_FILE |
/data/incidents.json |
Stoerungsmeldungen |
UPTIME_FILE |
/data/uptime.json |
Uptime-Daten |
SUBSCRIBERS_DB |
/data/subscribers.db |
Abonnenten-Datenbank |
CHECK_INTERVAL |
300 |
Pruefintervall in Sekunden |
SMTP_HOST |
hosting-postfix |
SMTP-Server fuer E-Mails |
SMTP_PORT |
25 |
SMTP-Port |
MAIL_FROM |
status@xynap.tech |
Absender-Adresse |
BASE_URL |
https://status.xynap.tech |
Basis-URL fuer Links in E-Mails |
NOTIFIED_FILE |
/data/notified.json |
Deduplizierung gesendeter Benachrichtigungen |
services.json¶
Die Datei definiert die ueberwachten Komponenten:
{
"components": [
{
"id": "platform-api",
"name": "Platform API",
"name_en": "Platform API",
"container": "platform-api",
"group": "core"
},
{
"id": "mail-service",
"name": "E-Mail Dienst",
"name_en": "Email Service",
"container": "hosting-postfix",
"group": "hosting"
}
]
}
| Feld | Beschreibung |
|---|---|
id |
Eindeutige Kennung (URL-sicher) |
name |
Deutscher Anzeigename |
name_en |
Englischer Anzeigename |
container |
Docker-Container-Name fuer Health-Check |
group |
Optionale Gruppierung |
incidents.json¶
Stoerungsmeldungen werden manuell in dieser Datei verwaltet:
[
{
"id": "inc-2026-03-10-mail",
"title": "E-Mail Zustellung verzoegert",
"title_en": "Email delivery delayed",
"status": "resolved",
"severity": "minor",
"components": ["mail-service"],
"created_at": "2026-03-10T08:30:00Z",
"resolved_at": "2026-03-10T10:15:00Z",
"updates": [
{
"status": "investigating",
"message": "Wir untersuchen Verzoegerungen bei der E-Mail-Zustellung.",
"message_en": "We are investigating delays in email delivery.",
"timestamp": "2026-03-10T08:30:00Z"
},
{
"status": "resolved",
"message": "Problem behoben. Alle E-Mails werden normal zugestellt.",
"message_en": "Issue resolved. All emails are being delivered normally.",
"timestamp": "2026-03-10T10:15:00Z"
}
]
}
]
REST API¶
Die API ist unter https://status.xynap.tech/api/v1/ erreichbar.
Swagger-Dokumentation: status.xynap.tech/api/docs
Sprachsteuerung¶
Die API unterstuetzt Deutsch und Englisch:
?lang=de/?lang=en— Expliziter Parameter (hoechste Prioritaet)Accept-LanguageHeader — Automatisch vom Browser gesendet- Default: Englisch — Fuer API-Clients ohne Header (curl, Postman)
Endpunkte¶
Status¶
# Gesamtstatus aller Dienste
GET /api/v1/status?lang=de
# Antwort
{
"status": "operational",
"components": [...],
"incidents": [...],
"timestamp": "2026-03-12T14:30:00Z"
}
Komponenten¶
# Alle Komponenten
GET /api/v1/components
# Einzelne Komponente
GET /api/v1/components/{component_id}
Uptime¶
# 90-Tage-Uptime aller Komponenten
GET /api/v1/uptime
# Einzelne Komponente (Tage konfigurierbar: 1-90)
GET /api/v1/uptime/{component_id}?days=30
Stoerungen¶
# Alle Stoerungen (max 100)
GET /api/v1/incidents?limit=20
# Nach Status filtern
GET /api/v1/incidents?status=investigating
# Einzelne Stoerung
GET /api/v1/incidents/{incident_id}
Abonnement¶
# E-Mail abonnieren
POST /api/v1/subscribe
Content-Type: application/json
{"email": "user@example.com", "lang": "de"}
Die Bestaetigungs- und Abmelde-Links werden automatisch per E-Mail versendet (Double Opt-in).
E-Mail-Benachrichtigungen¶
Abo-Flow¶
- Anmeldung: Nutzer gibt E-Mail-Adresse auf der Status Page ein
- Bestaetigung: Double Opt-in per Bestaetigungs-E-Mail (in der Sprache der Anmeldung)
- Benachrichtigung: Automatisch bei neuen Incident-Updates (in der gespeicherten Sprache des Abonnenten)
- Abmeldung: Jede E-Mail enthaelt einen Abmelde-Link
Incident-Benachrichtigungen¶
Der Background-Task prueft alle 5 Minuten incidents.json auf neue Updates:
- Jedes Incident-Update wird per Hash (
incident_id:timestamp) identifiziert - Neue Updates werden an alle bestaetigten Abonnenten gesendet
- Jeder Abonnent erhaelt die Mail in seiner bei der Anmeldung gewaehlten Sprache (DE/EN)
- Bereits versendete Updates werden in
notified.jsongespeichert (keine Duplikate) - Beim ersten Start werden bestehende Updates als "bereits gesendet" markiert
SMTP
E-Mails werden ueber den internen Postfix (hosting-postfix) versendet. Absender: status@xynap.tech
Deployment¶
Der Container wird ueber den Docker-Stack verwaltet:
# Container neu bauen und starten
sudo docker compose -f /etc/xynap/stack/docker-compose.yml up -d --build status-page
# Logs anzeigen
sudo docker compose -f /etc/xynap/stack/docker-compose.yml logs -f status-page
# Bei Code-Aenderungen: Cache umgehen
sudo docker compose -f /etc/xynap/stack/docker-compose.yml build --no-cache status-page
sudo docker compose -f /etc/xynap/stack/docker-compose.yml up -d status-page
Docker Build Cache
Bei Aenderungen an app.py oder index.html muss der Build-Cache mit --no-cache umgangen werden, da Docker die COPY-Layer sonst aus dem Cache nimmt.
Dateien¶
| Pfad | Beschreibung |
|---|---|
/usr/local/xynap/status-page/app.py |
FastAPI-Backend |
/usr/local/xynap/status-page/static/index.html |
Frontend (Single-Page) |
/usr/local/xynap/status-page/Dockerfile |
Container-Definition |
/var/lib/xynap/status-page/ |
Persistente Daten (Volume) |
/var/lib/xynap/status-page/notified.json |
Gesendete Benachrichtigungs-Hashes |