# Notfallzettel — CloakDrop

**Ausdrucken und neben den Laptop legen.** Eine Datei auf demselben Rechner
hilft nicht in dem Fall, in dem der Rechner das Problem ist.

Stand: 30. Juli 2026, alle Angaben an diesem Abend selbst gemessen.

| | |
|---|---|
| Projekt | `cloakdrop` (Cloudflare Pages) |
| Konto | `0d9ee4afc1592afe9f778c57d554f4bb` |
| Arbeitsordner | `C:\Users\roman\Downloads\CLOAKDROP` |
| Kontakt | `hello@cloakdrop.com` |
| PIN und Secret | `tasks/_gate-credentials.txt` — **nie** in Git, **nie** ins Archiv |

---

## Die vier Griffe

### 1 · Seite muss sofort weg

Cloudflare → Domain `cloakdrop.com` → **DNS** → **Records** → beim Eintrag für
`cloakdrop.com` und `www` die orange Wolke auf **grau** oder den Eintrag löschen.

Wirkt in Minuten. **Rückweg dauert bis zu 30 Minuten**, weil ein Resolver sich
„gibt es nicht" für die Dauer des SOA-Minimums merkt (1800 s, nachgesehen).
Also nur greifen, wenn es wirklich brennt.

**Nicht** stattdessen die Custom Domain im Pages-Projekt löschen: der
DNS-Eintrag bliebe stehen und `cloakdrop.com` lieferte danach eine
Cloudflare-Fehlerseite. Sichtbar kaputt ist schlechter als sauber abgeschaltet.

### 2 · Seite soll nur zu, nicht weg

```
python tasks/build_dist.py
npx wrangler pages deploy dist --project-name=cloakdrop
```

Ohne `--offen` geht `functions/` mit, und damit steht die PIN-Wand. Danach
kommt überall die PIN-Seite (401), außer unter `/.well-known/`.

Kontrolle:
```
curl -s -o /dev/null -w "%{http_code}\n" https://cloakdrop.com/
```
Muss **401** sein.

Voraussetzung: `GATE_PIN` und `GATE_SECRET` sind im Projekt gesetzt. Sind sie
es (Stand 30.07.: ja, Production und Preview), reicht der Deploy.

### 3 · Wieder öffnen

```
python tasks/build_dist.py --offen
npx wrangler pages deploy dist --project-name=cloakdrop
```

`--offen` lässt `functions/` weg — die Wand ist dann nicht abgeschaltet,
sondern nicht vorhanden. Prüfen: Seite muss **200** liefern.

### 4 · Alter Stand

**Es gibt keinen Rollback-Punkt mehr.** Die beiden früheren Deployments wurden
am 30.07. gelöscht, weil jedes seine eigene dauerhaft erreichbare Adresse
behält und damit die PIN-Wand umging (gemessen: beide lieferten 200).

Der Weg zurück führt deshalb über den Quellstand:

```
git log --oneline          # gewünschten Stand suchen
git checkout <hash>
python tasks/build_headers.py
python tasks/build_dist.py
npx wrangler pages deploy dist --project-name=cloakdrop
git checkout master        # danach nicht vergessen
```

Wenn künftig ein Deployment als Rollback-Punkt bleiben soll: daran denken,
dass es ohne Wand erreichbar ist, solange es nicht gelöscht wird.

---

## Wenn etwas komisch aussieht

| Symptom | Wahrscheinliche Ursache | Griff |
|---|---|---|
| Seite lädt, aber ohne Stil / Schaltflächen tot | CSP-Hash passt nicht mehr zum Inhalt | `python tasks/build_headers.py`, neu bauen, neu ausliefern |
| Mailadresse steht als `[email protected]` da | Email Address Obfuscation in der Zone | Zone → **Scrape Shield** → aus |
| Konsole meldet blockiertes Skript von `/cdn-cgi/` | Rocket Loader oder Scrape Shield | beide in der Zone aus |
| Zertifikat rot / Warnseite | Custom Domain noch nicht `Active` | im Pages-Projekt unter **Custom domains** nachsehen, warten |
| Direkt nach einem Deploy antworten Seiten unterschiedlich | Ausrollverzögerung am Edge, dauert Sekunden | nachmessen statt eingreifen |
| Fehler 1027 | Tageslimit für Worker-Aufrufe gerissen | mit `--offen` ausliefern; ohne `functions/` gibt es kein Limit |

---

## Was man im Eifer falsch macht

- **`npx wrangler pages deploy .`** — der Punkt lädt `tasks/` mit hoch, samt
  PIN-Datei. Fällt nicht auf, weil die Seite danach normal aussieht.
  Immer `dist`.
- **`git add -A`** — nimmt Arbeitsstände und `.wrangler/` mit. Dateien einzeln
  hinzufügen.
- **Konto-E-Mail auf `hello@cloakdrop.com` ändern** — dieses Postfach hängt an
  genau dem Konto, das man damit wiederherstellen wollte.
- **SPF von `~all` auf `-all` ändern** — Email Routing verwaltet den Eintrag
  selbst, Handänderungen kippen den Routing-Status.

---

## Status-Board (status.cloakdrop.com)

Eigener Worker, eigenes Deployment, eigener Speicher — absichtlich getrennt von
der Website. Ein kaputter Deploy von cloakdrop.com betrifft ihn nicht.

| Fall | Griff |
|---|---|
| Board zeigt „Noch keine Messung" | Cron steht. `npx wrangler deploy --config status-worker/wrangler.toml` |
| Board soll oeffentlich werden | `npx wrangler secret delete GATE_PIN --config status-worker/wrangler.toml` |
| Board soll wieder zu | `npx wrangler secret put GATE_PIN --config status-worker/wrangler.toml` |
| Messwerte ansehen | Cloudflare → Storage → KV → `cloakdrop-status`, Schluessel `verlauf` |

**Wichtig:** Das Board zeigt bei ausbleibender Messung **nicht** Gruen, sondern
„Unbekannt". Eine Status-Seite, die bei stehendem Messwerk Gruen meldet, ist
gefaehrlicher als gar keine.

**Vor jedem Deploy des Boards:**
```
python tasks/build_status_assets.py   # Zeichen und Schrift einbetten
node tasks/verify_status.mjs          # rendert es in allen Datenlagen?
npx wrangler deploy --config status-worker/wrangler.toml
python tasks/verify_status_live.py    # sitzt es im Browser auch richtig?
```
Der zweite Test prueft das Markup, der vierte das Ergebnis. Beide braucht es:
der teuerste Fehler dieses Umbaus war ein Kaskadenkonflikt — Markup richtig,
Darstellung falsch.

---

## Pruefer, und was jeder findet

| Befehl | Findet |
|---|---|
| `node tasks/verify_gate.mjs` | Wand durchlaessig, www-Umleitung, /.well-known |
| `python tasks/verify_csp.py` | CSP-Hash passt nicht zum Inhalt (lokal, ohne Wand) |
| `python tasks/verify_drop.py` | Ablauffrist und Loeschen — geprueft in IndexedDB |
| `python tasks/verify_live.py` | was nur live auftritt: 401 auf Unterressourcen, Fremdinhalt, fehlende Kopfzeilen, kaputte Vorschau |
| `node tasks/verify_status.mjs` | Status-Markup in allen Datenlagen |
| `python tasks/verify_status_live.py` | Status-Darstellung im Browser |

`verify_csp.py` laeuft lokal und sieht die Wand nicht — deshalb gibt es
`verify_live.py`. Der Manifest-Fehler (401, weil Browser Manifeste ohne
Cookies holen) war lokal unsichtbar und in jeder echten Konsole rot.
