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