143 lines
6.1 KiB
Markdown
143 lines
6.1 KiB
Markdown
# 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
|
||
|
||
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.
|
||
|
||
### 6.2 Signierten Link erzeugen
|
||
|
||
Ein signierter Link besteht aus einem Hash über `Authentication Key + Pfad +
|
||
Ablaufzeitpunkt`. Das lässt sich einfach per kleinem Python-Snippet erzeugen,
|
||
z. B. lokal ausführen, wenn ein neuer Vorschau-Link für den Kunden gebraucht
|
||
wird:
|
||
|
||
```python
|
||
import hashlib
|
||
import base64
|
||
import time
|
||
|
||
security_key = "DEIN_AUTHENTICATION_KEY"
|
||
url_path = "/index.html" # z.B. Startseite, oder "/" je nach Setup
|
||
expires = int(time.time()) + 7 * 24 * 60 * 60 # 7 Tage gültig
|
||
|
||
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}")
|
||
```
|
||
|
||
Den ausgegebenen Link schickst du dem Kunden. Läuft die Gültigkeit ab, einfach
|
||
ein neues Snippet mit neuem `expires`-Wert ausführen und den frischen Link
|
||
verschicken.
|
||
|
||
### 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 den geteilten Link erreichbar.
|
||
- Sobald die Seite live gehen soll (echte Domain, öffentlich), wird Token
|
||
Authentication in der Pull Zone einfach wieder 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)
|
||
```
|
||
|