Files
iwz/Umzug.md

179 lines
8.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Bunny.net – Ersteinrichtung und Vorab-Veröffentlichung
Ziel: `iwz-ferienwohnungen` bei Bunny.net anlegen, eine erste Fassung der Hugo-Seite
online stellen und den Zugriff darauf auf dich + den Kunden beschränken (Vorschau,
bevor die Seite öffentlich unter der echten Domain läuft).
> Hinweis: Dieser Weg ersetzt den früher geplanten Cloudflare-Pages-Ansatz.
> Details zum alten Cloudflare/IONOS-Plan siehe weiter unten im Abschnitt
> "Alt: Cloudflare-Variante (nicht mehr aktuell)".
## 1. Bunny.net-Account anlegen
1. Auf [bunny.net](https://bunny.net) registrieren (E-Mail + Passwort, keine
Kreditkarte für den Start nötig, Abrechnung erfolgt nach Traffic/Storage).
2. E-Mail-Adresse bestätigen und einloggen ins Dashboard.
## 2. Storage Zone anlegen (Ablage für die gebauten Hugo-Dateien)
1. Im Dashboard-Menü **Storage** → **Add Storage Zone**.
2. Name vergeben, z. B. `iwz-ferienwohnungen`.
3. **Main Region**: Region wählen, die am nächsten an euch/den Besuchern liegt
(z. B. Frankfurt/Falkenstein, Europa).
4. Replikations-Regionen optional dazuwählen, falls später Besucher aus anderen
Kontinenten erwartet werden (für die Vorschau-Phase nicht nötig).
5. Zone erstellen.
## 3. Zugangsdaten der Storage Zone notieren
1. Storage Zone öffnen → Reiter **FTP & API Access**.
2. **Hostname**, **Username** und **Password** (nicht das Read-only-Passwort!)
notieren – diese werden später für den Upload per `deploy.bat`/`deploy.py`
gebraucht (als `BUNNY_STORAGE_ZONE` und `BUNNY_API_KEY`, siehe CLAUDE.md).
3. Zugangsdaten **nicht** ins Git-Repo einchecken (z. B. in `.env` oder als
Windows-Umgebungsvariable ablegen).
## 4. Erste Fassung hochladen
Lokal die Seite bauen und die `public/`-Inhalte in die Storage Zone hochladen:
```powershell
hugo --gc --minify
```
Für den allerersten Test kann der Upload manuell per **File Manager** im Bunny-
Dashboard (Storage Zone → Files → Drag & Drop von `public/`) erfolgen. Sobald
`deploy.bat`/`deploy.py` entsprechend erweitert ist, übernimmt das Skript diesen
Schritt automatisch (Ordnerinhalt von `public/` 1:1 in die Storage Zone spiegeln).
## 5. Pull Zone anlegen (macht die Storage Zone über HTTPS erreichbar)
1. In der Storage Zone → **Connected Pull Zones** → **Connect Pull Zone**
(oder im Menü **CDN → Add Pull Zone** und als Origin die Storage Zone wählen).
2. Namen vergeben, z. B. `iwz-ferienwohnungen`.
3. Zonen für die Auslieferung wählen (Europa reicht für die Vorschau).
4. Pull Zone erstellen → Bunny vergibt automatisch eine Test-URL:
`https://iwz-ferienwohnungen.b-cdn.net`
5. HTTPS ist auf dieser `b-cdn.net`-URL automatisch aktiv, kein eigenes
Zertifikat nötig.
Damit ist die Seite technisch live – als nächstes wird sie geschützt, bevor der
Link an den Kunden geht.
## 6. Zugriff beschränken: nur du + der Kunde
> **Wichtige Einschränkung (Stand: getestet):** Das Bunny-Dashboard zeigt in der
> Security-Seite der Pull Zone nur die **Basic** Token Authentication (Felder:
> "Token authentication", "Token IP validation", "Url token authentication Key").
> Diese Basic-Methode signiert immer einen **exakten Pfad** – es gibt dabei
> **kein** Path-Prefix-/Wildcard-/Verzeichnis-Token. Ein Token für `/` ist damit
> nur für `/` gültig, nicht für `/ferienwohnungen/` oder andere Unterseiten
> (führt zu 403 auf allen anderen Seiten). Verzeichnis-weite Tokens gibt es bei
> Bunny nur über die separate "Advanced" Token-Methode (HS256, i. d. R. anderer
> Tarif/Reiter) – die in diesem Projekt bisher nicht verfügbar/eingerichtet ist.
>
> **Für die aktuelle Vorschau-Phase deshalb:** Token Authentication ist
> deaktiviert. Die `b-cdn.net`-Test-URL ist damit frei erreichbar (kein
> Passwortschutz, aber auch nicht in Suchmaschinen o. ä. auffindbar/verlinkt) –
> ausreichend für eine kurze, informelle Abstimmung mit dem Kunden. Die
> folgenden Abschnitte 6.1–6.3 bleiben als Referenz stehen, falls später doch
> ein Advanced-Token-Setup eingerichtet wird oder Bunny die Basic-Methode um
> Prefix-Matching erweitert.
Bunny.net Pull Zones bieten dafür **Token Authentication**: Requests an die
Pull Zone werden nur ausgeliefert, wenn die URL einen gültigen, signierten Token
enthält. Es gibt keinen klassischen Basic-Auth-Login-Dialog im Browser –
stattdessen bekommt der Kunde einen fertigen Link mit Token, der bis zu einem
festgelegten Ablaufzeitpunkt gültig ist.
### 6.1 Token Authentication aktivieren
1. Pull Zone öffnen → Reiter **Security**.
2. **Token Authentication** aktivieren.
3. Den angezeigten **Authentication Key** kopieren und sicher aufbewahren
(nicht ins Git-Repo, nicht per unverschlüsselter Mail verschicken) – wer
diesen Key kennt, kann selbst gültige Links erzeugen.
Ab jetzt liefert die Pull Zone **nichts mehr aus**, ohne gültigen Token in der
URL – das ist der eigentliche Zugriffsschutz. Mit der Basic-Methode gilt das
aber **pro exaktem Pfad** (siehe Hinweis oben) – für mehrere Seiten braucht es
entsprechend mehrere Links, siehe 6.2.
### 6.2 Signierten Link je Seite erzeugen
Ein signierter Link besteht aus einem Hash über `Authentication Key + Pfad +
Ablaufzeitpunkt`. Da die Basic-Methode keine Verzeichnis-Tokens kennt, braucht
jede Seite ihren eigenen Link. Lokal ausführen, wenn neue Vorschau-Links für
den Kunden gebraucht werden:
```python
import hashlib
import base64
import time
security_key = "DEIN_AUTHENTICATION_KEY"
expires = int(time.time()) + 7 * 24 * 60 * 60 # 7 Tage gültig
# Alle Pfade eintragen, die der Kunde ansehen soll:
url_paths = [
"/",
"/ferienwohnungen/",
"/ferienwohnungen/fewo1/",
"/ferienwohnungen/fewo2/",
"/ferienwohnungen/fewo3/",
"/preise/",
"/ausflugsziele/",
"/kontakt/",
"/impressum/",
"/datenschutz/",
]
for url_path in url_paths:
hashable = f"{security_key}{url_path}{expires}"
token_hash = hashlib.sha256(hashable.encode()).digest()
token = base64.urlsafe_b64encode(token_hash).decode().rstrip("=")
print(f"https://iwz-ferienwohnungen.b-cdn.net{url_path}?token={token}&expires={expires}")
```
Die ausgegebenen Links schickst du dem Kunden (z. B. als Liste). Läuft die
Gültigkeit ab, einfach das Snippet mit neuem `expires`-Wert erneut ausführen.
### 6.3 Praktisch für Vorschau-Zwecke
- Länge der Gültigkeit (`expires`) nach Bedarf wählen – z. B. 7 Tage für eine
kurze Abstimmungsrunde, oder wenige Stunden für einen einzelnen Termin.
- Ohne gültigen Token bekommt jeder andere Besucher einen Fehler von Bunny –
die Seite ist damit faktisch nur über die geteilten Links erreichbar.
- Da pro Seite ein eigener Token nötig ist, taugt dieser Weg nur für wenige,
fest bekannte Seiten – nicht für eine frei navigierbare Vorschau. Für eine
frei klickbare Vorschau (aktueller Stand) bleibt Token Authentication
vorerst deaktiviert (siehe Hinweis oben).
- Sobald die Seite live gehen soll (echte Domain, öffentlich), bleibt Token
Authentication in der Pull Zone ohnehin deaktiviert.
## 7. Domain-Anbindung (später, für den echten Umzug)
Noch offen und erst relevant, wenn die Seite final ist:
- Eigene Domain (`iwz-ferienwohnungen.de`) als Custom Hostname in der Pull Zone
hinterlegen.
- Entweder DNS bei IONOS per CNAME auf die Bunny-Pull-Zone zeigen lassen, oder
DNS komplett zu Bunny.net DNS umziehen (Nameserver-Wechsel bei IONOS,
ähnlich wie ursprünglich für Cloudflare geplant).
- SSL-Zertifikat für die eigene Domain wird von Bunny automatisch ausgestellt,
sobald der Hostname verifiziert ist.
- Domain-Registrar bleibt in jedem Fall IONOS.
## Zusammenfassung des Stacks (aktuell)
```
Domain-Registrar: IONOS (bleibt so)
DNS: noch offen (IONOS bleibt vorerst / später ggf. Bunny.net DNS)
Hosting: Bunny.net (Storage Zone + Pull Zone/CDN)
Vorschau-Schutz: Bunny Token Authentication (signierte, befristete Links)
Code/Content: Gitea (eigene Instanz, kein CI/CD-Workflow)
Deploy: manuell per deploy.bat / deploy.py (hugo build + Upload zur Storage Zone)
Buchungskalender: webplanner.de (bleibt so, extern)
```