Auf Verwaltung → Domains prüft ein Knopf Prüfen je Eintrag vier Dinge und zeigt das Ergebnis als Bericht unter der Karte:
Schritt
Beispielmeldung
DNS
löst auf 203.0.113.10
Zertifikat
gültig bis 27.10.2026, ausgestellt von SSL Corporation
Erreichbar
HTTP 200 nach 84 ms
Ziel
diese Installation
Der letzte Schritt ist der eigentliche Wert: Die Anwendung ruft unter der Domain /api/domain-check?nonce=… auf und lässt sich einen HMAC über eine frische Zufallszahl zurückgeben. Das Geheimnis dafür entsteht beim ersten Check, liegt in InstanceSetting und verlässt den Server nie. So unterscheidet sich „die Domain zeigt irgendwohin“ von „die Domain zeigt hierher“.
Grenzen — stehen so auch im Bericht
Der Aufruf startet dort, wo der Container läuft. Bei internem DNS oder Hairpin-NAT kann er scheitern, obwohl von außen alles stimmt.
Geprüft wird ausschließlich ein Hostname aus der Datenbank. Ein Hostname aus der Anfrage würde die Route zum Werkzeug machen, mit dem sich vom Server aus beliebige Adressen abklopfen lassen.
Auslösen darf nur, wer instance:manage hat.
Die Beweis-Route ist ohne Anmeldung erreichbar — der Aufruf kommt von außen und trägt keine Sitzung. Preisgegeben wird nichts.
Scheitert schon DNS, fallen die drei Folgeschritte ausdrücklich aus, statt dreimal dasselbe zu melden.
Trägt der Eintrag einen Port (Entwicklungsbetrieb), wird das Zertifikat übersprungen und über http geprüft.
Migration: 20260821010000_domain_check — eine Spalte checkSecret (nullable, entsteht beim ersten Check).
Geprüft mit einer eigenen Testreihe: 38 von 38 — Beweis-Route (fehlende, zu kurze, krumme Zufallszahl, Wiederholbarkeit), eigene Adresse (alle vier Schritte grün), Domain ohne DNS-Eintrag, fremder Server mit gültigem Zertifikat aber falschem Ziel, Oberfläche, Handy-Breite.
Auf **Verwaltung → Domains** prüft ein Knopf **Prüfen** je Eintrag vier Dinge und zeigt das Ergebnis als Bericht unter der Karte:
| Schritt | Beispielmeldung |
| --- | --- |
| DNS | `löst auf 203.0.113.10` |
| Zertifikat | `gültig bis 27.10.2026, ausgestellt von SSL Corporation` |
| Erreichbar | `HTTP 200 nach 84 ms` |
| Ziel | `diese Installation` |
Der letzte Schritt ist der eigentliche Wert: Die Anwendung ruft unter der Domain `/api/domain-check?nonce=…` auf und lässt sich einen **HMAC** über eine frische Zufallszahl zurückgeben. Das Geheimnis dafür entsteht beim ersten Check, liegt in `InstanceSetting` und verlässt den Server nie. So unterscheidet sich „die Domain zeigt irgendwohin“ von „die Domain zeigt hierher“.
**Grenzen — stehen so auch im Bericht**
- Der Aufruf startet dort, wo der Container läuft. Bei internem DNS oder Hairpin-NAT kann er scheitern, obwohl von außen alles stimmt.
- Geprüft wird ausschließlich ein Hostname **aus der Datenbank**. Ein Hostname aus der Anfrage würde die Route zum Werkzeug machen, mit dem sich vom Server aus beliebige Adressen abklopfen lassen.
- Auslösen darf nur, wer `instance:manage` hat.
- Die Beweis-Route ist ohne Anmeldung erreichbar — der Aufruf kommt von außen und trägt keine Sitzung. Preisgegeben wird nichts.
- Scheitert schon DNS, fallen die drei Folgeschritte ausdrücklich aus, statt dreimal dasselbe zu melden.
- Trägt der Eintrag einen Port (Entwicklungsbetrieb), wird das Zertifikat übersprungen und über `http` geprüft.
**Migration**: `20260821010000_domain_check` — eine Spalte `checkSecret` (nullable, entsteht beim ersten Check).
**Geändert**
- `src/lib/domain-check.ts` (neu) — DNS, TLS, Aufruf, Beweis
- `src/app/api/domain-check/route.ts` (neu) — die öffentliche Beweis-Route
- `src/app/api/admin/domains/[id]/check/route.ts` (neu)
- `src/components/domain-bericht.tsx` (neu) — die Darstellung
- `src/components/domain-admin.tsx` — Knopf und Bericht
- `prisma/schema.prisma`, Migration, `README.md`, `docs/sicherheit.md`
Geprüft mit einer eigenen Testreihe: 38 von 38 — Beweis-Route (fehlende, zu kurze, krumme Zufallszahl, Wiederholbarkeit), eigene Adresse (alle vier Schritte grün), Domain ohne DNS-Eintrag, fremder Server mit gültigem Zertifikat aber falschem Ziel, Oberfläche, Handy-Breite.
Closes #7
Eine Domain zu registrieren ist der kleinste Teil der Arbeit — DNS,
Reverse Proxy und Zertifikat liegen ausserhalb dieser Anwendung. Fehlt
dort etwas, merkt man es am gedruckten Code, der nicht aufgeht.
Der Knopf "Pruefen" geht den Weg der Scanner nach: Namen aufloesen,
Zertifikat ansehen, Adresse aufrufen — und sich beweisen lassen, dass am
anderen Ende diese Installation steht. Der Beweis ist ein HMAC ueber eine
frische Zufallszahl; das Geheimnis dafuer entsteht beim ersten Check und
verlaesst den Server nie.
Geprueft wird nur ein Hostname aus der Datenbank, nie einer aus der
Anfrage — sonst waere die Route ein Werkzeug zum Abklopfen fremder
Adressen. Scheitert schon DNS, fallen die drei Folgeschritte aus, statt
dreimal dasselbe zu melden.
Die Grenze der Aussage steht im Bericht selbst: Der Aufruf startet dort,
wo der Container laeuft.
Refs #7
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Auf Verwaltung → Domains prüft ein Knopf Prüfen je Eintrag vier Dinge und zeigt das Ergebnis als Bericht unter der Karte:
löst auf 203.0.113.10gültig bis 27.10.2026, ausgestellt von SSL CorporationHTTP 200 nach 84 msdiese InstallationDer letzte Schritt ist der eigentliche Wert: Die Anwendung ruft unter der Domain
/api/domain-check?nonce=…auf und lässt sich einen HMAC über eine frische Zufallszahl zurückgeben. Das Geheimnis dafür entsteht beim ersten Check, liegt inInstanceSettingund verlässt den Server nie. So unterscheidet sich „die Domain zeigt irgendwohin“ von „die Domain zeigt hierher“.Grenzen — stehen so auch im Bericht
instance:managehat.httpgeprüft.Migration:
20260821010000_domain_check— eine SpaltecheckSecret(nullable, entsteht beim ersten Check).Geändert
src/lib/domain-check.ts(neu) — DNS, TLS, Aufruf, Beweissrc/app/api/domain-check/route.ts(neu) — die öffentliche Beweis-Routesrc/app/api/admin/domains/[id]/check/route.ts(neu)src/components/domain-bericht.tsx(neu) — die Darstellungsrc/components/domain-admin.tsx— Knopf und Berichtprisma/schema.prisma, Migration,README.md,docs/sicherheit.mdGeprüft mit einer eigenen Testreihe: 38 von 38 — Beweis-Route (fehlende, zu kurze, krumme Zufallszahl, Wiederholbarkeit), eigene Adresse (alle vier Schritte grün), Domain ohne DNS-Eintrag, fremder Server mit gültigem Zertifikat aber falschem Ziel, Oberfläche, Handy-Breite.
Closes #7