Zum Inhalt

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:

  1. ?lang=de / ?lang=en — Expliziter Parameter (hoechste Prioritaet)
  2. Accept-Language Header — Automatisch vom Browser gesendet
  3. 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

  1. Anmeldung: Nutzer gibt E-Mail-Adresse auf der Status Page ein
  2. Bestaetigung: Double Opt-in per Bestaetigungs-E-Mail (in der Sprache der Anmeldung)
  3. Benachrichtigung: Automatisch bei neuen Incident-Updates (in der gespeicherten Sprache des Abonnenten)
  4. 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.json gespeichert (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