Cluster – mehrere Nodes abgleichen
Betreibst du mehr als eine Node64 – etwa den Raspberry Pi im Keller, eine VM auf dem Server und eine Node bei den Eltern –, verbindest du sie zu einem Cluster. Die Nodes gleichen Einstellungen und Einträge dann direkt untereinander ab: verschlüsselt, auch über verschiedene Netze und auch ganz ohne ipv64.net.
Der Cluster ist die frühere „lokale Gruppe“. Er hat jetzt einen eigenen Menüpunkt Cluster (Seite /cluster). Er ist immer optional: Ohne Mitglieder gibt es keinen Verkehr zwischen Nodes.
Wozu ein Cluster?
- Ein Bild auf allen Nodes: Checks, Wartungsfenster, Benachrichtigungs-Einstellungen und weitere Bereiche sind auf jeder Node gleich – ändern kannst du überall.
- Mehrere Messstellen: Ein Check kann von mehreren Nodes gemessen werden; jede Node erscheint als eigene Messstelle. Benachrichtigt wird trotzdem genau einmal.
- Zertifikate verteilen: Zertifikate, ACME-Konto, DNS-Zugänge und eigene CAs einmal einrichten und auf allen Nodes nutzen.
- Unabhängig von der Cloud: Ein Cluster ohne ipv64-Account funktioniert vollständig lokal – auch Healthchecks mit eigener Bewertung und Benachrichtigung.
- Kein zusätzlicher Port: Die Nodes sprechen über den normalen Web-Port miteinander.
Voraussetzungen
- Derselbe ipv64-Account oder keiner: Alle Nodes eines Clusters haben denselben ipv64-Account – oder alle keinen. Gemischt geht nicht.
- Erreichbarkeit: Die Nodes müssen sich gegenseitig unter ihrer Adresse und dem Web-Port erreichen, im Heimnetz oder über verschiedene Netze (z. B. per VPN oder Portfreigabe).
- Richtige Uhrzeit: Die Uhren der Hosts sollten per NTP stimmen – die Anfragen zwischen den Nodes sind mit Zeitstempel signiert.
- Gleiche Version: Am besten alle Nodes auf demselben Stand halten; eine zu alte Node wird ausgesetzt.
So sieht das aus
# Drei Nodes desselben Accounts (oder alle ohne Account)
┌───────────────┐ HTTPS, Web-Port ┌───────────────┐
│ Node64 „Pi“ │◄──────────────────────►│ Node64 „NAS“ │
│ Heimnetz │ signiert │ Heimnetz │
└──┬────────────┘ └────────┬──────┘
│ ▲ ▲
│ │ Checks · Zertifikate · Messwerte │
│ │ ┌───────────────┐ │
│ └───────────►│ Node64 „Büro“ │◄─────────────┘
│ │ anderes Netz │
│ └───────────────┘
│ ausgehend, HTTPS 443 (optional)
▼
┌───────────────┐
│ ipv64.net │ Healthchecks laufen weiter über die ipv64-Server;
└───────────────┘ der Cluster ist ein zusätzlicher Weg
Eine weitere Node aufnehmen
Auf einer Node, die schon im Cluster ist (oder der ersten Node), klickst du unter Cluster auf Code für eine weitere Node.
- Die Node zeigt einen 8-stelligen Code (z. B.
ABCD-EFGH) und ihre eigene Adresse an. - Der Code gilt 10 Minuten und nur einmal; du kannst ihn jederzeit verwerfen.
Einem Cluster beitreten
Auf der neuen Node öffnest du Cluster → Einem Cluster beitreten und füllst drei Felder aus:
- Adresse einer Node des Clusters
mithttps://, z. B.https://node64-pi.lan:8080. - Code
den Code von dort. - Adresse dieser Node
so, wie die anderen sie erreichen. Vorgeschlagen isthttps://plus die Adresse, unter der du die Seite gerade aufrufst; istNODE64_HTTPS_PORTgesetzt, mit diesem Port.
Danach erscheint die Node bei allen Mitgliedern. Jede Node kann den Cluster auch selbst wieder verlassen – die anderen erfahren es automatisch.
Verbindung immer per HTTPS
- Die Nodes sprechen immer verschlüsselt miteinander. Einen eigenen HTTPS-Port brauchst du nicht: Der normale Web-Port (
NODE64_HTTP_PORT, Standard 8080) spricht auch TLS. - Das Zertifikat muss nicht gültig sein – ein selbst signiertes genügt. Schutz gegen Mitlesen und gegen einen Mittelsmann bietet die Bindung an die Schlüssel, die bei der Kopplung ausgetauscht werden.
- Ein Proxy dazwischen, der TLS aufbricht, funktioniert deshalb nicht (die Node wird mit dem Grund
tls_bindingausgesetzt). Sprich die Nodes direkt an.
Was wird abgeglichen?
Unter Was wird abgeglichen gibt es je Modul einen Schalter und darunter je Bereich einen eigenen:
| Modul | Bereiche | Standard |
|---|---|---|
| Healthchecks | Checks (mit Messwerten), Wartungsfenster | an |
| Benachrichtigungen | Einstellungen (Ruhezeiten, Drossel, Bündeln) | an |
| Zertifikate | Zertifikate, ACME (Konto und CAs), DNS-Anbieter, eigene CAs | aus |
| DNS64 | Einstellungen, Blocklisten, Freigaben, eigene Einträge (mit Zonen), Weiterleitungen (mit Umschreiben), Gerätegruppen, Mitglieder der Gruppen – siehe DNS64 im Cluster | aus |
| weitere Module | PROXY64 folgt | aus |
- Ein Bereich wird nur mit Nodes abgeglichen, bei denen er ebenfalls an ist – also nur, wenn er auf beiden Nodes an ist.
- Module, die auf dieser Node nicht laufen, sind ausgegraut.
- Konflikte: Ändern zwei Nodes dasselbe, gewinnt die jüngere Änderung. Gelöschtes bleibt gelöscht.
- Benachrichtigungskanäle bleiben die eigene Einstellung jeder Node.
- Zertifikate: Erneuert wird nur von einer Node – der, die zuletzt ausgestellt hat. Eine andere übernimmt erst, wenn ein Drittel der Erneuerungsfrist verstrichen ist (bei Let's Encrypt 10 Tage). Löschen auf einer Node löscht überall.
- Mitglieder ohne eingeschaltetes Modul Healthchecks und ausgesetzte Nodes zählen nicht für Messwerte, Benachrichtigungen und das Weiterreichen an ipv64.
- Geschaltet wird nur hier auf der Seite Cluster. Die Seite Healthchecks-Sync zeigt nur noch an, ob der Abgleich an oder aus ist, und verweist hierher.
In Planung: PROXY64
PROXY64 soll später ebenfalls über den Cluster abgeglichen werden können – mit Schaltern je Bereich wie bei den anderen Modulen. Umgesetzt wird das, sobald die Nachfrage hoch genug ist; der Cluster ist dafür bereits vorbereitet. Geplant ist zum Beispiel:
- PROXY64: Proxy-Hosts und Zugriffslisten gemeinsam auf allen Nodes – das Ziel eines Hosts darf je Node abweichen, und ein Host lässt sich auf einer Node gezielt ausschalten (Dienst nur an einem Standort).
- Statistiken werden nicht kopiert, sondern live von jeder Node abgefragt und mit Node-Namen und als Summe angezeigt.
Bewusst nie abgeglichen werden DynDNS (zwei Nodes würden dieselbe Domain abwechselnd überschreiben), Anmeldung, Zwei-Faktor, Passkeys, SSO und API-Keys sowie Ports, Logging, Backup und Updates.
Mitglieder verwalten
Oben steht, ob diese Node zu einem ipv64-Account gehört („Diese Node gehört zum ipv64-Account #…“) oder keinen hat. Darunter die Liste aller Mitglieder:
| Angabe | Bedeutung |
|---|---|
| Zustand | online, offline, abgelehnt (Fehler) oder ausgesetzt |
| Name, Version | wie in den Einstellungen der jeweiligen Node |
| Abzeichen „ipv64“ | die Node ist selbst mit ipv64.net verknüpft |
| Adresse | änderbar, z. B. wenn sich die IP geändert hat |
| zuletzt erreicht | wann die Node zuletzt geantwortet hat |
| Abgleich dort | die Bereiche, die dort an sind: grün = auch hier an, wird abgeglichen; grau = hier aus. Bei einer älteren Version „unbekannt“. |
Mit Aus dem Cluster nehmen entfernst du eine Node; alle anderen erfahren es.
Ausgesetzte Nodes
Ändert sich an einer Node etwas Grundlegendes, wird sie ausgesetzt: Die anderen sprechen nicht mehr mit ihr, arbeiten untereinander aber normal weiter.
| Grund | Bedeutung |
|---|---|
account_changed | Der eigene ipv64-Account hat sich geändert (keiner → einer, Wechsel oder wieder keiner). |
account_mismatch | Der Account der anderen Node passt nicht. |
identity_changed | Schlüssel bzw. Kennung der Node haben sich geändert, z. B. nach einer Neuinstallation. |
tls_binding | Ein Proxy dazwischen bricht TLS auf. |
version_too_old | Die andere Node ist zu alt – dort aktualisieren. Nach dem Update wird sie von selbst wieder aktiv; so lassen sich die Nodes nacheinander aktualisieren. |
Außer bei version_too_old wird eine Node nur von Hand mit Wieder aufnehmen zurückgeholt. Dabei wird erneut geprüft; passt es noch nicht, bleibt sie ausgesetzt und die Oberfläche nennt den Grund.
Wenn eine Node weg ist
- Offline, nicht ausgesetzt
Die anderen pingen sie weiter alle 30 Sekunden; nach 2 Minuten ohne Antwort gilt sie als offline (in der Liste mit letztem Fehler). Sie wird weder ausgesetzt noch entfernt – offline ist kein Grund dafür. - Die anderen arbeiten weiter
Die übrigen Nodes gleichen normal untereinander ab. - Benachrichtigen
Misst sie einen Check zusammen mit anderen, übernimmt die nächste erreichbare messende Node die Meldungen – ohne Doppelmeldung. Misst nur sie einen Check, wird er nach 3 Intervallen (mindestens 5 Minuten) ohne Messung „nicht überwacht“. - Weiterreichen an ipv64
War sie die Node, die Änderungen an ipv64 weiterreicht, übernimmt die nächste verknüpfte und erreichbare Node. - Sie kommt zurück
Beide Seiten holen ab ihrem letzten Stand alles nach, was sich in der Zwischenzeit geändert hat – auch Änderungen, die auf ihr selbst gemacht wurden –, Messwerte ebenso. Dauerhaft entfernt wird eine Node nur mit Aus dem Cluster nehmen.
Meldung: Ist eine Node länger als 5 Minuten nicht erreichbar oder ausgesetzt, kommt über deine Benachrichtigungskanäle „🔴 Cluster: Node … nicht erreichbar“ (mit dem letzten Fehler bzw. dem Grund fürs Aussetzen), bei ihrer Rückkehr „🟢 … wieder erreichbar“ – jeweils mit Link auf die Cluster-Seite. Es meldet genau eine Node: die mit der kleinsten Kennung unter den erreichbaren; die Entwarnung schickt, wer gemeldet hat. Das Dashboard zeigt dann oben einen Hinweis, und die Kachel Cluster (nur mit Mitgliedern) zeigt den Zustand jeder Node.
Split-Brain: Teile des Clusters länger getrennt
Es gibt keinen Anführer und keine Mehrheitsregel: Ist die Verbindung zwischen Teilen des Clusters weg, arbeitet jeder Teil allein weiter, nichts wird gesperrt. Nach der Wiederverbindung holt jede Node ab ihrem letzten Stand alles nach, und alle landen beim selben Ergebnis:
| Was | Während der Trennung | Nach der Wiederverbindung |
|---|---|---|
| Eintrag nur auf einer Seite geändert oder neu | normal | kommt überall an |
| derselbe Eintrag auf beiden Seiten geändert | jede Seite hat ihren Stand | die jüngere Änderung gewinnt, als Ganzes (kein Zusammenführen einzelner Felder); die ältere geht verloren |
| auf einer Seite gelöscht, auf der anderen geändert | – | die jüngere gewinnt: eine Änderung nach dem Löschen holt den Eintrag zurück, sonst bleibt er gelöscht |
| Löschvermerke | Checks und Wartungsfenster dauerhaft; Zertifikate 30 Tage | Trennung länger als 30 Tage: ein gelöschtes Zertifikat kann von der anderen Seite zurückkommen |
| Messwerte | jede Node misst selbst | werden nachgeholt (Messwerte gehören je einer Node, kein Konflikt) |
| Benachrichtigungen | jede Seite meldet für sich – Checks, die auf beiden Seiten gemessen werden, können doppelt gemeldet werden (nicht bei Verknüpfung mit ipv64, dann bewertet und meldet ipv64) | wieder genau eine Node |
| Meldung „Node nicht erreichbar“ | jede Seite meldet die Nodes der anderen | Entwarnung von denselben Nodes |
| Zertifikate | ist die zuständige Node auf der anderen Seite, erneuert diese Seite ab einem Drittel der Frist selbst | das jüngere Zertifikat gewinnt überall (höchstens einmal doppelt bestellt) |
| Mitglieder aufnehmen oder entfernen | erreicht nur die eigene Seite | wird nicht automatisch nachgeholt – eine entfernte Node ggf. auch auf der anderen Seite entfernen |
A und B gleichen weiter untereinander ab und melden als Paar (A meldet „C nicht erreichbar“); C arbeitet allein und meldet „A“ und „B nicht erreichbar“. Checks, die nur C misst, meldet C; Checks, die A/B und C messen, melden beide Seiten. Nach der Wiederverbindung bekommt C alles von A und B und umgekehrt. Bei Änderungen am selben Eintrag gewinnt die jüngere – auch wenn sie von C, der Minderheit, kommt. Die Uhrzeit entscheidet, daher NTP auf allen Hosts; bei mehr als 5 Minuten Abweichung sprechen die Nodes ohnehin nicht miteinander.
Wer benachrichtigt?
- Misst nur eine Node einen Check, benachrichtigt diese Node – oder ipv64, wenn sie verknüpft ist.
- Messen mehrere Nodes des Clusters einen Check, benachrichtigt genau eine. Fällt sie aus, übernimmt die nächste – ohne doppelte Meldung.
- Auf der Detailseite eines Checks steht unter Benachrichtigt, wer meldet.
Zusammenspiel mit ipv64.net
- Healthchecks laufen für verknüpfte Nodes weiter über die ipv64-Server; der Cluster ist ein zusätzlicher Weg.
- Eine verknüpfte Node reicht Änderungen der Nodes ohne eigenen Healthchecks-Sync an ipv64 weiter.
- Ist keine verknüpfte Node erreichbar, bleiben Änderungen und Meldungen einfach im Cluster.
Mehr dazu unter Mit ipv64.net verknüpfen.
Sicherheit
- Jede Node hat einen eigenen Ed25519-Schlüssel, der verschlüsselt in ihrer Datenbank liegt.
- Jede Anfrage und jede Antwort zwischen den Nodes ist signiert – über Methode, Pfad, Zeit, Account, eine Einmal-Kennung, den Inhalt und eine Kennung der TLS-Verbindung. Ein Mittelsmann hätte zu beiden Seiten andere Verbindungen und wird abgelehnt, bevor Daten fließen.
- Wiederholte Anfragen werden erkannt und abgelehnt.
- Der Beitritt ist nur mit dem einmaligen Code möglich (10 Minuten, nach 5 Fehlversuchen verworfen).
- Ändern sich Account oder Schlüssel einer Node, wird sie automatisch ausgesetzt.
- Die Endpunkte für die Nodes liegen auf dem normalen Web-Port unter
/peer/; sie nehmen nur signierte Anfragen von Mitgliedern bzw. den Beitrittscode an.
Technik: Port, Endpunkte, Zeiten
Port und Verbindung
| Was | Wert |
|---|---|
| Port | der normale Web-Port NODE64_HTTP_PORT (Standard 8080, spricht auch TLS); ist NODE64_HTTPS_PORT gesetzt, dieser |
| Protokoll | nur HTTPS (TLS 1.2 oder neuer); Klartext-HTTP an /peer/ wird mit 426 Upgrade Required abgelehnt |
| Zertifikat | wird nicht geprüft (selbst signiert genügt), kein Pinning – ein Zertifikatswechsel ändert nichts |
| Richtung | jede Node fragt die anderen ab (Pull); beide Seiten müssen die jeweils andere unter ihrer Mitglieds-Adresse erreichen |
| Proxy dazwischen | nur ohne TLS-Aufbruch (TCP-Weiterleitung, Portfreigabe, VPN); ein TLS-terminierender Proxy führt zu tls_binding |
| Uhrzeit | Hosts per NTP; erlaubte Abweichung ±5 Minuten |
| Andere Ports | keine; ausgehend zu ipv64 nur, wenn eine Node verknüpft ist (unabhängig vom Cluster) |
Endpunkte
Auf dem Web-Port, ohne Anmeldung in der Oberfläche – sie nehmen nur signierte Anfragen von Mitgliedern bzw. den Beitrittscode an:
| Methode | Pfad | Zweck |
|---|---|---|
| POST | /peer/v1/pair | Beitritt mit Code (der Code geht nie im Klartext über die Leitung) |
| GET | /peer/v1/ping | Erreichbarkeit, Version, Account, eingeschaltete Bereiche |
| POST | /peer/v1/members | Mitglieder weitergeben (Beitritt, Entfernen, Austritt) |
| GET | /peer/v1/changes | Änderungen von Healthchecks und Benachrichtigungen |
| POST | /peer/v1/poke | „bei mir gibt es Neues“ – sofort abholen |
| GET | /peer/v1/measurements | Messwerte der anderen Node |
| GET | /peer/v1/relay | Daten einer verknüpften Node für nicht verknüpfte |
| GET | /peer/v2/sync | Abgleich der übrigen Module (Zertifikate; später PROXY64, DNS64) |
Zeiten und Grenzen
| Was | Wert |
|---|---|
| Ping an jedes Mitglied | alle 30 Sekunden |
| Mitglied gilt als offline | nach 2 Minuten ohne Antwort |
| Abholen | alle 15 Sekunden, bei Änderungen sofort (gebündelt, höchstens alle 0,5 Sekunden) |
| Zeitlimit je Anfrage | 10 s (Ping und Anstoß 5 s), Änderungen 20 s, Messwerte und Abgleich 30 s |
| Erstes Abholen der Messwerte | die letzten 24 Stunden |
| Healthchecks bei der anderen Node aus | 5 Minuten Ruhe statt alle 15 Sekunden (ein Anstoß holt trotzdem sofort) |
| Uhrzeit | höchstens ±5 Minuten Abweichung |
| Beitrittscode | 10 Minuten gültig, einmal verwendbar, nach 5 Fehlversuchen verworfen |
| Größe einer Anfrage | höchstens 8 MiB (Beitritt 1 MiB) |
| Konflikte | die jüngere Änderung gewinnt (auf die Millisekunde) |
| Löschvermerke | 30 Tage |
| Bereich neu eingeschaltet | Abholen ab Anfang (doppelt schadet nicht, die jüngere Änderung gewinnt) |
API
Der Bereich heißt in der API-Referenz „Cluster“; die Pfade beginnen weiter mit /api/group.
| Methode | Pfad | Zweck |
|---|---|---|
| GET | /api/group | Mitglieder mit state (active/suspended), reason, sync; dazu sync_modules und https_port |
| POST / DELETE | /api/group/code | Code für eine weitere Node erzeugen bzw. verwerfen |
| POST | /api/group/join | beitreten (addr, code, self_url) |
| POST | /api/group/leave | Cluster verlassen |
| PUT / DELETE | /api/group/members/{id} | Adresse eines Mitglieds ändern bzw. Mitglied entfernen |
| POST | /api/group/members/{id}/resume | ausgesetzte Node wieder aufnehmen (204; 409, wenn sie ausgesetzt bleibt) |
| PUT | /api/group/sync | Abgleich je Modul/Bereich schalten, z. B. {"module":"certs","item":"certificates","enabled":true} oder {"module":"notifications","item":"settings","enabled":false} |
Jede Änderung steht im Audit-Log (Bereich Cluster). Für das Monitoring gibt es Prometheus-Werte zu den Mitgliedern – siehe Prometheus.
Beobachten
- Dashboard: Kachel Cluster mit dem Zustand jeder Node und ein Hinweis oben, wenn eine Node weg oder ausgesetzt ist; dazu die Meldung nach 5 Minuten.
- Oberfläche Cluster und
GET /api/group– je Mitglied online, Zustand, Grund, Bereiche, zuletzt erreicht und letzter Fehler. - Prometheus:
node64_group_members,node64_group_members_onlineundnode64_group_member_up{node_id,node_name}– siehe Prometheus. - Log (Bereich
peer): „cluster member suspended/resumed“, „peer request rejected“, „cluster entries updated“; Abholfehler auf Debug. Im Audit-Log steht alles im Bereich Sync.
Etwas unklar, fehlt etwas oder hast du eine Frage zu Node64? Frag im offiziellen Forum v64.tech.