Einführung
Laut Wikipedia:
Cloudflare, Inc. ist ein amerikanisches Unternehmen, das ein Content Delivery Network, Internet-Sicherheitsdienste und verteilte Domain-Name-Server-Dienste bereitstellt, die zwischen dem Besucher und dem Hosting-Anbieter des Cloudflare-Nutzers stehen und als Reverse Proxy für Websites fungieren.
Workers basiert auf einer leichtgewichtigen Ausführungsumgebung auf Basis von Node.js (nicht Node.js direkt). Es ist viel schneller und praktischer als die Verwendung eines FaaS auf Aliyun FC oder Amazon Lambda für das Deployen von Anwendungen wie diesem mit Astro erstellten Blog, obwohl jede Technologie ihre eigenen Vor- und Nachteile hat. Ein Vorteil von Workers ist die Ausführungsgeschwindigkeit. Ein weiterer ist der Preis.
Diese Anleitung zeigt, wie man eine Svelte+SvelteKit-Anwendung auf Cloudflare Workers (free) deployt.
1) Was in Cloudflare (Dashboard) zu tun ist
- Ein Cloudflare-Konto erstellen/verwenden (Free-Plan).
- Zu
Entwicklung -> Workers und Pagesgehen und Workers im Konto aktivieren. - (Empfohlen) Ein API Token für das Deployen von der CLI erstellen:
- Zu
Konto verwalten -> Konto-API-Tokengehen. - Unter
Account Resources:das eigene Konto auswählen. Token erstellen- Die Vorlage Edit Cloudflare Workers verwenden (sie hat die minimal erforderlichen Berechtigungen)
- Bei Verwendung einer eigenen Domain:
Zone -> DNS -> BearbeitenZone -> Worker-Routen -> Bearbeiten(oder Custom Domain über die UI verwenden)
- Die
Zone-Ressourcenentsprechend den Zonen auswählen, die der Token abdecken soll. - Auf Continue to summary → Create Token klicken.
-
Bei Verwendung einer eigenen Domain:
- Die Zone (
ihredomain.com) in Cloudflare haben. - Beim deployteten Worker:
Settings -> Domains & Routes -> Add Custom Domain
- Die Zone (
-
Der neue Token kann getestet werden:
curl "https://api.cloudflare.com/client/v4/accounts/xxx123/tokens/verify" \-H "Authorization: Bearer cfat_ABCD_my_token"2) Was im Projekt zu konfigurieren ist
Das Projekt muss auf einen reinen Worker ausgerichtet sein:
- `main = "build/_worker.js"` - `[assets] directory = "build", binding = "ASSETS"`Falls die account_id fehlt, hinzufügen:
account_id = "ihre_account_id"Die account_id findet man im Cloudflare-Dashboard, in der rechten Seitenleiste der Domain, oder mit:
bunx wrangler whoamiEs ist natürlich sehr wichtig, den adapter-cloudflare zu verwenden:
import adapter from '@sveltejs/adapter-cloudflare';Lokale Anforderungen
- Abhängigkeiten:
- Node/npm, oder Bun (empfohlen)
- Wrangler CLI
(via
npx wrangleroderbunx wranglerfunktioniert auch)
- Token in der lokalen Umgebung konfigurieren
export CLOUDFLARE_API_TOKEN=cfat_ABCD_my_tokenOder dauerhaft in ~/.bashrc, ~/.zshrc oder der entsprechenden Datei für die Shell:
echo 'export CLOUDFLARE_API_TOKEN=ihr_token_hier' >> ~/.bashrcAlternativ mit wrangler:
bunx wrangler loginDies öffnet einen Browser für OAuth. Persönlich mag ich das nicht.
Bei Präferenz für direkten Token:
bunx wrangler config3) Variablen und Geheimnisse (wichtig)
In der aktuellen App
Bei Verwendung von import.meta.env.VITE_* (Build-Zeit) bedeutet das:
- Variablen müssen vor
npm run buildoderbun run buildexistieren (.env, CI-Variablen, etc). - Sie werden zur Laufzeit nicht dynamisch aus dem
envdes Workers gelesen.
Kritische Beispiele könnten sein:
VITE_APIVITE_API_KEY- Andere
VITE_*für Tracking/Auth/etc.
Laufzeit-Geheimnisse (optional)
Wenn Sie später Geheimnisse zur Laufzeit hinzufügen möchten:
bunx wrangler secret put VARIABLENNAMEund sie von env.VARIABLENNAME lesen.
4) Build + Deploy (Schritt für Schritt)
In den folgenden Schritten kann npm durch bun in den Befehlen ersetzt werden:
- Abhängigkeiten installieren:
npm ci- Token konfigurieren:
export CLOUDFLARE_API_TOKEN=ihr_token-
Build-
.envvorbereiten (mit den korrektenVITE_*-Werten). -
Build:
make build# npm run build# bun run build- Ausgabe überprüfen:
build/_worker.jsbuild/_app/...
- Worker lokal testen:
make preview# bunx wrangler dev- Deployen:
make deploy# bunx wrangler deploy- Den Worker testen, der verfügbar sein wird unter:
https://example-frontend.ihre-subdomain.workers.dev
oder unter Ihrer benutzerdefinierten Domain, wenn Sie diese im Dashboard konfigurieren.
5) OIDC-Konfiguration (Zitadel oder ein anderer Anbieter) für die Produktion
Bei Verwendung eines OIDC-Anbieters wie Zitadel müssen die erforderlichen Endpunkte beim Anbieter registriert werden:
- Redirect URI(s) (Login-Callback).
- Post-logout redirect URI(s).
- Web origins des Frontends.
6) Post-Deploy-Überprüfungen
Zum Anzeigen von Logs:
npx wrangler tail7) Free-Workers-Limits, die zu beachten sind (überprüft am 7. April 2026)
- 100.000 Anfragen/Tag.
- CPU 10ms pro Anfrage.
- 50 externe Subanfragen pro Anfrage.
- 128 MB Arbeitsspeicher.
- Worker-Größe: 3 MB.
- Statische Assets pro Version: bis zu 20.000 Dateien.
Bei Überschreitung dieser Limits werden 1027/Quota-Fehler auftreten.
8) Typische Fehler
Cannot read properties of undefined (reading 'fetch')
- Häufige Ursache: fehlendes
ASSETS-Binding oder Deploy im falschen Modus ausgeführt (Pages vs. Worker). - Im aktuellen Zustand ist dies bereits für Worker korrigiert.
- Leere
VITE_*-Variablen in der Produktion
- Build ohne korrektes
.envdurchgeführt.
- Zitadel-Login schlägt in der Produktion fehl
- Redirect URI / Origins nicht für die finale Domain registriert.
9) Deploy auf eigener Domain
Es gibt 2 Möglichkeiten, dies zu tun, vorausgesetzt die Domain befindet sich in Cloudflare:
A. Mit wrangler.toml
Routen konfigurieren:
routes = [ { pattern = "www.example.com/*", zone_name = "example.com" }]Dann normales Deployen:
bunx wrangler deployB. Im Cloudflare-Dashboard
- Zu Workers & Pages → Ihr Worker → Settings → Triggers gehen
- Auf Add Custom Domain klicken
www.example.comeingeben- Cloudflare erstellt automatisch den DNS-Eintrag und das TLS-Zertifikat
Domain außerhalb von Cloudflare
Falls die Domain nicht in Cloudflare ist:
Zunächst muss die Domain zu Cloudflare hinzugefügt werden (oder zumindest ein externer DNS-Eintrag verwendet werden):
Im DNS des Registrars einen CNAME-Eintrag erstellen:
In tinydns zum Beispiel:
Cwww:ihr-projekt.ihre-subdomain.workers.dev:86400Dann in Cloudflare zum Worker gehen und unter Triggers auf Add Custom Domain klicken und www.example.com hinzufügen.
Unterschied zwischen routes und custom_domain
| Merkmal | routes | custom_domain |
|---|---|---|
| Zone in CF erforderlich | Ja | Ja |
| In toml konfigurierbar | Ja | Ja |
| Automatisches TLS | Manuell (bereits vorhanden) | Automatisch |
| Mit anderen Workers geteilt | Ja (nach Muster) | Nein |
Für eine dem Worker gewidmete Subdomain ist custom_domain die sauberste Option:
routes = [ { pattern = "ssr.example.com/*", custom_domain = true, zone_name = "example.com" }]Oder die alternative Syntax:
[[env.production.routes]]pattern = "ssr.example.com/*"zone_name = "example.com"Bonus: Nützliche Makefile-Regeln
deploy: bunx wrangler deploy
preview: bunx wrangler dev
build: @echo "Building with $(DOTENV_FILE)" DOTENV_FILE=$(DOTENV_FILE) bun run buildVerwendete offizielle Quellen
- Workers limits: https://developers.cloudflare.com/workers/platform/limits/
- Workers pricing: https://developers.cloudflare.com/workers/platform/pricing/
- Wrangler config (
assets): https://developers.cloudflare.com/workers/wrangler/configuration/ - Static assets binding: https://developers.cloudflare.com/workers/static-assets/binding/
- Environment vars/secrets:
- Routing/domains:
