Introduction
Selon Wikipedia :
Cloudflare, Inc. est une entreprise américaine qui fournit un réseau de distribution de contenu, des services de sécurité Internet et des services de serveurs de noms de domaine distribués, placés entre le visiteur et le fournisseur d’hébergement de l’utilisateur de Cloudflare, agissant comme proxy inverse pour les sites web.
Workers est basé sur un moteur d’exécution léger basé sur Node.js (ce n’est pas Node.js directement). C’est beaucoup plus rapide et pratique que d’utiliser un FaaS sur Aliyun FC ou Amazon Lambda pour déployer des applications comme ce blog réalisé avec Astro, bien que chaque technologie ait ses avantages et ses inconvénients. Un avantage de Workers est la rapidité de son exécution. Un autre est son coût.
Ce guide montre comment déployer une application Svelte+SvelteKit sur Cloudflare Workers (free).
1) Quoi faire dans Cloudflare (dashboard)
- Créer/utiliser un compte Cloudflare (plan Free).
- Aller dans
Développement -> Workers et Pageset activer Workers sur le compte. - (Recommandé) Créer un API Token pour le déploiement depuis la CLI :
- Aller dans
Gérer le compte -> Tokens API de compte. - Sous
Account Resources :sélectionner votre compte. Créer un token- Utiliser le modèle Edit Cloudflare Workers (il possède les permissions minimales requises)
- Si vous utilisez un domaine personnalisé :
Zone -> DNS -> ModifierZone -> Routes Workers -> Modifier(ou utiliser Custom Domain depuis l’interface)
- Sélectionner les
Ressources de zoneselon les zones que le token couvrira. - Cliquer sur Continue to summary → Create Token.
-
Si vous utilisez un domaine personnalisé :
- Avoir la zone (
votredomaine.com) dans Cloudflare. - Sur le Worker déployé :
Settings -> Domains & Routes -> Add Custom Domain
- Avoir la zone (
-
Le nouveau token peut être testé :
curl "https://api.cloudflare.com/client/v4/accounts/xxx123/tokens/verify" \-H "Authorization: Bearer cfat_ABCD_my_token"2) Quoi configurer dans le projet
Le projet doit être aligné sur un Worker pur :
- `main = "build/_worker.js"` - `[assets] directory = "build", binding = "ASSETS"`Si vous n’avez pas l’account_id, ajoutez-le :
account_id = "votre_account_id"L’account_id se trouve dans le tableau de bord Cloudflare, dans la barre latérale droite de votre domaine, ou avec :
bunx wrangler whoamiIl est, bien sûr, très important d’utiliser l’adapter-cloudflare :
import adapter from '@sveltejs/adapter-cloudflare';Prérequis locaux
- Dépendances :
- Node/npm, ou Bun (recommandé)
- Wrangler CLI
(via
npx wrangleroubunx wranglerfonctionne aussi)
- Configurer le token dans votre environnement local
export CLOUDFLARE_API_TOKEN=cfat_ABCD_my_tokenOu de façon permanente dans ~/.bashrc, ~/.zshrc ou le fichier approprié pour votre shell :
echo 'export CLOUDFLARE_API_TOKEN=votre_token_ici' >> ~/.bashrcAlternativement avec wrangler :
bunx wrangler loginCeci ouvre un navigateur pour OAuth. Personnellement, je n’aime pas ça.
Si vous préférez un token direct :
bunx wrangler config3) Variables et secrets (important)
Dans votre application actuelle
Si import.meta.env.VITE_* (build-time) est utilisé, cela signifie que :
- Les variables doivent exister avant
npm run buildoubun run build(.env, variables CI, etc). - Elles ne sont pas lues dynamiquement depuis l’
envdu Worker à l’exécution.
Des exemples critiques pourraient être :
VITE_APIVITE_API_KEY- Autres
VITE_*pour le tracking/auth/etc.
Secrets runtime (optionnel)
Si vous souhaitez ensuite ajouter des secrets à l’exécution :
bunx wrangler secret put NOM_VARIABLEet les lire depuis env.NOM_VARIABLE.
4) Build + deploy (étape par étape)
Dans les étapes suivantes, vous pouvez remplacer npm par bun dans les commandes :
- Installer les dépendances :
npm ci- Configurer le token :
export CLOUDFLARE_API_TOKEN=votre_token-
Préparer le
.envde build (avec vosVITE_*correctes). -
Build :
make build# npm run build# bun run build- Vérifier la sortie :
build/_worker.jsbuild/_app/...
- Tester le Worker localement :
make preview# bunx wrangler dev- Déployer :
make deploy# bunx wrangler deploy- Tester le Worker, qui sera disponible à :
https://example-frontend.votre-sous-domaine.workers.dev
ou sur votre domaine personnalisé si vous le configurez dans le tableau de bord.
5) Configuration OIDC (Zitadel ou un autre fournisseur) pour la production
Si vous utilisez un fournisseur OIDC comme Zitadel, vous devez enregistrer les endpoints requis auprès du fournisseur :
- Redirect URI(s) (callback de connexion).
- Post-logout redirect URI(s).
- Web origins du frontend.
6) Vérifications post-déploiement
Pour voir les logs :
npx wrangler tail7) Limites de Workers Free à considérer (vérifiées le 7 avril 2026)
- 100 000 requêtes/jour.
- CPU 10ms par requête.
- 50 sous-requêtes externes par requête.
- 128 Mo de mémoire.
- Taille du Worker : 3 Mo.
- Assets statiques par version : jusqu’à 20 000 fichiers.
Si vous dépassez ces limites, vous obtiendrez des erreurs de type 1027/quota.
8) Erreurs typiques
Cannot read properties of undefined (reading 'fetch')
- Cause courante : binding
ASSETSmanquant ou déploiement exécuté en mauvais mode (Pages vs Worker). - Dans votre état actuel, cela est déjà corrigé pour Worker.
- Variables
VITE_*vides en production
- Construit sans le
.envcorrect.
- Connexion Zitadel échoue en prod
- Redirect URI / origins non enregistrés pour le domaine final.
9) Déploiement sur domaine personnalisé
Il y a 2 façons de le faire, en supposant que le domaine se trouve dans Cloudflare :
A. En utilisant wrangler.toml
Configurer les routes :
routes = [ { pattern = "www.example.com/*", zone_name = "example.com" }]Puis effectuer le déploiement normal :
bunx wrangler deployB. Dans le tableau de bord Cloudflare
- Aller dans Workers & Pages → votre worker → Settings → Triggers
- Cliquer sur Add Custom Domain
- Saisir
www.example.com - Cloudflare crée automatiquement l’enregistrement DNS et le certificat TLS
Domaine hors de Cloudflare
Si le domaine n’est pas dans Cloudflare :
Vous devez d’abord ajouter le domaine à Cloudflare (ou au moins utiliser un enregistrement DNS externe) :
Dans le DNS de votre registrar, créez un enregistrement CNAME :
Dans tinydns, par exemple :
Cwww:votre-projet.votre-sous-domaine.workers.dev:86400Ensuite dans Cloudflare, allez dans le worker et dans Triggers cliquez sur Add Custom Domain et ajoutez www.example.com.
Différence entre routes et custom_domain
| Caractéristique | routes | custom_domain |
|---|---|---|
| Nécessite zone dans CF | Oui | Oui |
| Configurable dans toml | Oui | Oui |
| TLS automatique | Manuel (déjà existant) | Automatique |
| Partagé avec d’autres workers | Oui (par motif) | Non |
Pour un sous-domaine dédié au worker, custom_domain est l’option la plus propre :
routes = [ { pattern = "ssr.example.com/*", custom_domain = true, zone_name = "example.com" }]Ou la syntaxe alternative :
[[env.production.routes]]pattern = "ssr.example.com/*"zone_name = "example.com"Bonus : Règles Makefile utiles
deploy: bunx wrangler deploy
preview: bunx wrangler dev
build: @echo "Building with $(DOTENV_FILE)" DOTENV_FILE=$(DOTENV_FILE) bun run buildSources officielles utilisées
- 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:
