# 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) ```