Files
iwz/Umzug.md
T

8.0 KiB
Raw Blame History

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 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:

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.

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:

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)