Architektur
NIE-SLA teilt Erfassung, Probes, Speicherung, Anzeige und Dritterweiterungen in Vertrauenszonen. Wer diese Grenzen versteht, verwechselt „VPS online", „von Cloudflare erreichbar" und „externe Latenz" nicht. Neu im Projekt? Beginnen Sie mit dem Überblick.
Komponenten
| Komponente | Laufumgebung | Aufgabe |
|---|---|---|
| Rust Agent | überwachte VPS | Sekunden-Sampling, TCP/HTTP-Probes, Batch-Uploads |
| Latency Agent | unabhängiger Linux-Knoten | prüft öffentliche TCP-Ziele aus anderen Netzen |
| Worker | Cloudflare Edge | Routing, Auth, Planung, Aggregation, Alarme, öffentliche API |
| Durable Objects | Cloudflare | regionale Probe-Koordination, Telemetrie-Puffer je Agent |
| D1 | Cloudflare | Konfiguration, Zustand, Aggregation, Ereignisse, Indizes |
| R2 | Cloudflare | Hochfrequenz-Historie, Snapshots, Archive, Theme-Pakete |
| Worker Static Assets | Cloudflare | öffentliche Statusseite, Admin-UI, Same-Origin-API |
Die Produktion ist ein einzelner Worker, der API und Static Assets von derselben Origin bedient; kein separates Pages-Projekt. Das öffentliche Ein-Klick-Repository ist eine entschärfte Veröffentlichungsquelle; halten Sie die Quellgrenzen von Worker, Frontend und Agent ein und überschreiben Sie Produktionsquellen niemals aus Archiven oder der öffentlichen Kopie.
Datenpfade
Rust Agent --scoped token--> Worker --> D1 / R2 --> Öffentlicher Status
|
Cloudflare-Probe --------------------+
|
Latency Agent --scoped token---------+Sampling, Upload, Ping und Update-Checks laufen auf getrennten Schedulern. Eine VPS kann jede Sekunde sampeln, während der Worker nur Batches erhält; ein langsames Netz blockiert das lokale Sampling nicht.
Vier Latenz- und Online-Zustände
| Quelle | Initiiert von | Beantwortet |
|---|---|---|
| Cloudflare-Checks | Worker / Durable Object | erreicht die Cloudflare-Edge das Ziel, mit welcher Latenz |
| Agent-Online-Zustand | überwachte VPS | meldet der Metrik-Agent weiterhin |
| Agent-Netzprobes | überwachte VPS | Netzqualität vom Host zu einem TCP/HTTP-Ziel |
| Externe Latenz | unabhängige Knoten | Latenz aus weiteren Regionen/Providern zu öffentlichen TCP-Zielen |
Clients müssen Quell-Labels behalten. Ein Online-Agent impliziert keinen erfolgreichen Cloudflare-Check, und ein offener Port impliziert keinen laufenden Metrik-Agent.
Speicherstrategie
Rohe Sekundenmetriken werden nicht nach D1 geschrieben:
- Aktueller Zustand und Indizes liegen in D1.
- Hochfrequente Historie geht zuerst nach R2.
- SLA-Historie wird in festen Buckets in D1 aggregiert.
- Traffic akkumuliert in der Zeile der aktuellen Periode; jeder Agent versiegelt pro Tag eine Tagesbuch-Zeile, und Änderungen am Reset-Tag werden aus dem Tagesbuch neu berechnet.
- Status-Endpunkte nutzen kurze Caches.
- Aufräumen läuft nach Zeitplan, nicht pro Anfrage.
So bleibt der öffentliche Status aktuell, während Worker-Anfragen, D1-Schreibvorgänge und R2-Operationen begrenzt bleiben.
Rohe Verlustdaten und optionaler Timeseries-Export
R2 hält die rohen Probe-Punkte, die Agents melden. Normale Latenzkurven werden gemäß den Grenzen der öffentlichen API heruntergesampelt; include_loss=1 liefert alle Verlustereignisse verlustfrei als kompakte Runs, sodass lange Ausfälle keine Sekunden-Objekte im Browser erfordern.
Der externe Timeseries-Export ist standardmäßig aus. Mit gesetztem TIMESERIES_EXPORT_URL exportiert der Worker Batches aus R2 je Agent und abgeschlossener Stunde; TIMESERIES_EXPORT_FORMAT ist victoriametrics (Standard) oder influx, mit optionalen Bearer-Zugangsdaten über TIMESERIES_EXPORT_TOKEN. Die URL muss HTTPS ohne eingebettete Zugangsdaten sein. Diese Werte kommen nur aus Worker Secrets oder der Deployment-Umgebung; sie gelangen nie in Frontend, Agent-Befehle, öffentliche API, Backups oder Quellcode.
Der Export nutzt einen begrenzten Retry-Marker. Bei Remote-Timeout, Drosselung oder Nichtverfügbarkeit bleiben R2-Archivierung und Agent-ACK erfolgreich; nach dem Retry-Limit wird nur dieser Exportversuch verworfen, nie die R2-Daten. Ohne konfigurierten Export werden keine externen Anfragen hinzugefügt, und der 100-VPS-Speicherpfad bleibt unverändert.
Schnittstellen und Vertrauensgrenzen
| Schnittstelle | Auth | Darf |
|---|---|---|
/api/v1/* | keine | entschärften öffentlichen Zustand und Historie lesen |
/api/agent/* | Scoped Token des Knotens | der passende Rust Agent meldet und liest Policy |
/api/latency-agent/* | Scoped Token des Knotens | Latenzknoten holt Ziele, meldet, aktualisiert |
| Admin-API | kurze Session, optional TOTP | Konfiguration ändern, Themes hochladen, Admin-Daten lesen |
Canvas-Themes und alternative Frontends dürfen nur die öffentliche v1-API nutzen. Geben Sie niemals Admin-Sessions, Passwörter, TOTP, das Agent-Master-Token oder Scoped Tokens von Knoten an ein Theme; der Plugin-Runtime ist nicht offen.
Passwörter und GitHub-OAuth-Tickets existieren nur für den Login. Nach dem Login nutzt die Admin-UI die kurzlebige x-admin-session; Passwörter dürfen nicht als API-Tokens gespeichert oder von alternativen Frontends weitergereicht werden. Agents und Latenzknoten verwenden pro Knoten gescopte Tokens, die bei deaktiviertem Knoten aufhören zu funktionieren.
NodeQuality-Bildgrenze
NQ Network- und Return-Route-Bilder werden nach Abschluss einer authentifizierten Aufgabe vom Worker gerendert und hochgeladen. Die Upload-Kette ist ein fester S3-Kanal mit leerem Ordner; Frontend, Agent und Admin-API können Upload-URL, Token, Kanal oder Ordner weder lesen noch überschreiben.
- Upload-URL, Token und optionaler Kanalname sind ausschließlich Worker Secrets.
- Nur Aufgaben, die ein Admin erstellt, die passende Agent-Identität übernimmt und die erfolgreich abschließen, lösen Uploads aus.
- Es gibt keine Browser-Einstellung, keinen Test-Upload und keinen Endpoint für beliebige Datei-Uploads.
- Öffentliches NQ-JSON liefert nur Same-Origin-Bildproxys; die echte Upstream-URL wird im Worker aufgelöst.
- Normale Backups schließen alte Image-Host-Metadaten aus; sensible Backups sind passwortverschlüsselt.
- Self-Hosted-Deployments rufen den festen offiziellen öffentlichen Broker ohne Image-Host-Zugangsdaten auf; geteilte Zugangsdaten existieren nur in den offiziellen Worker Secrets und gelangen nie in Quellcode, Build, Tutorials oder Broker-Anfragen.
Der Broker akzeptiert begrenzten network/route-Text, rendert SVG serverseitig neu und drosselt pro Quelle und global über D1. So erhalten Self-Hoster NQ-Bild-Backups ohne Konfiguration, ohne den geteilten Image-Host zu einer beliebigen Upload-API zu machen. Nicht-offizielle Instanzen können die feste öffentliche Kette nicht mit eigenen Secrets überschreiben.
Alle vier NQ-Tabs behalten den ursprünglichen ANSI-Inhalt. Network und Return Route nutzen den historischen Segment-Renderer, wenn der Originaltext existiert; Broker-Bilder füllen nur alte Daten ohne Text. Mobil wird eine feste kompakte Monospace-Größe verwendet, das Modal scrollt nur vertikal, breite Netzsegmente scrollen horizontal in ihrem Inhaltsbereich, und Return-Route-Hops nutzen ein responsives Grid. Öffentliche Seite und Admin-UI teilen dieselben Regeln.
Aktueller Zustand vs. Langzeit-SLA
Der Cron aktualisiert den aktuellen Probe- und Alarmzustand jede Minute; Langzeit-SLA und Tagesgitter bleiben bei 5-Minuten-Buckets. Mit deaktiviertem FAST_STATUS_ENABLED fällt der aktive Probe-Zustand auf Bucket-Granularität zurück.
„Neuester Zustand auf der öffentlichen Seite" und „eine neue Tagesgitter-Zelle" brauchen nicht dieselbe Frequenz. Integrationen sollten checked_at, updated_at und Quellfelder lesen, statt Lebendigkeit aus Array-Längen abzuleiten.
Theme-Runtime
CSS-Themes laden nur verifizierte Stylesheets. Canvas-Themes laufen in einer sandbox="allow-scripts"-Iframe ohne Same-Origin-Zugriff; die CSP blockiert direktes Netz, Formulare und Top-Level-Navigation, und Daten kommen über das eingeschränkte Nachrichtenprotokoll. Plugin-Upload-APIs und Plugin-Runtimes sind nicht offen. Siehe Theme-System und Sicherheit und Release.