Skip to content

Cloudflare Workers

Cloudflare Workers permet d’exécuter du code JavaScript/TypeScript sur le réseau edge de Cloudflare, idéal pour les API, le traitement de requêtes et les fonctions serverless.


  1. Concepts
  2. Prérequis
  3. Initialisation d’un projet
  4. Configuration Wrangler
  5. Développement local
  6. Déploiement
  7. CI/CD avec Gitea Actions
  8. Environnements
  9. Bindings et Storage
  10. Troubleshooting

AspectWorkersPages
UsageAPI, fonctions serverlessSites statiques, SSG
RuntimeV8 isolatesV8 isolates (pour SSR)
Entréefetch handlerFichiers statiques
Commandewrangler deploywrangler pages deploy
flowchart LR
    subgraph Client
        Browser[Navigateur]
        Mobile[App Mobile]
    end

    subgraph Edge["Cloudflare Edge (200+ PoPs)"]
        Worker[Worker<br/>api.mindlet.app]
        KV[(KV Store)]
        D1[(D1 Database)]
        R2[(R2 Storage)]
    end

    subgraph Origin["Origin (optionnel)"]
        Backend[API Backend]
        DB[(Database)]
    end

    Browser --> Worker
    Mobile --> Worker
    Worker --> KV
    Worker --> D1
    Worker --> R2
    Worker -.->|proxy| Backend

Terminal window
# Avec bun (recommandé)
bun add -d wrangler
# Avec npm
npm install -D wrangler
Terminal window
bun wrangler login
Terminal window
bun wrangler whoami

Terminal window
bun wrangler init <nom-du-worker>

Exemple :

Terminal window
bun wrangler init mindlet-api

Options interactives :

  • Would you like to use TypeScript? → Yes
  • Would you like to create a Worker at…? → Fetch handler
  • Would you like to use git? → Yes
mindlet-api/
├── src/
│ └── index.ts # Point d'entrée du Worker
├── wrangler.toml # Configuration Wrangler
├── package.json
└── tsconfig.json
src/index.ts
export default {
async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
const url = new URL(request.url);
if (url.pathname === '/api/health') {
return Response.json({ status: 'ok' });
}
return new Response('Hello World!');
},
};

wrangler.toml
name = "mindlet-api"
main = "src/index.ts"
compatibility_date = "2026-01-17"
compatibility_flags = ["nodejs_compat"]
[observability]
enabled = true
# Environnement de production
[env.production]
name = "mindlet-api"
routes = [
{ pattern = "api.mindlet.app", zone_name = "mindlet.app" }
]
# Environnement de staging
[env.staging]
name = "mindlet-api-staging"
routes = [
{ pattern = "api-staging.mindlet.app", zone_name = "mindlet.app" }
]
OptionDescriptionExemple
nameNom du Worker"mindlet-api"
mainFichier d’entrée"src/index.ts"
compatibility_dateDate de compatibilité"2026-01-17"
routesRoutes personnaliséesVoir ci-dessus
varsVariables d’environnement{ API_URL = "..." }
[vars]
API_VERSION = "v1"
PUBLIC_URL = "https://api.mindlet.app"
[env.staging.vars]
PUBLIC_URL = "https://api-staging.mindlet.app"

5.1. Démarrer le serveur de développement

Section titled “5.1. Démarrer le serveur de développement”
Terminal window
bun wrangler dev

Output :

⎔ Starting local server...
[wrangler:inf] Ready on http://localhost:8787
Terminal window
# Port personnalisé
bun wrangler dev --port 3000
# Mode remote (exécute sur Cloudflare)
bun wrangler dev --remote
# Avec un environnement spécifique
bun wrangler dev --env staging

Wrangler recharge automatiquement le Worker à chaque modification de fichier.


Terminal window
bun wrangler deploy

Ou avec un environnement spécifique :

Terminal window
bun wrangler deploy --env production
bun wrangler deploy --env staging
⛅️ wrangler 4.x.x
Total Upload: 45.67 KiB / gzip: 12.34 KiB
Uploaded mindlet-api (1.23 sec)
Published mindlet-api (2.34 sec)
https://mindlet-api.username.workers.dev
api.mindlet.app
Current Deployment ID: abc123...
Terminal window
# Lister les déploiements
bun wrangler deployments list
# Rollback vers une version précédente
bun wrangler rollback <deployment-id>

SecretDescription
CLOUDFLARE_API_TOKENToken API avec permissions Workers
CLOUDFLARE_ACCOUNT_IDID de votre compte Cloudflare
.gitea/workflows/ci-cd.yml
name: CI/CD
on:
push:
branches: [main, staging, dev]
pull_request:
branches: [main, staging, dev]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: "22"
- uses: oven-sh/setup-bun@v1
with:
bun-version: latest
- name: Install dependencies
run: bun install --frozen-lockfile
- name: Run tests
run: bun run test
- name: Type check
run: bun run typecheck
deploy-staging:
needs: test
if: gitea.ref == 'refs/heads/staging' && gitea.event_name == 'push'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v1
with:
bun-version: latest
- run: bun install --frozen-lockfile
- name: Deploy to Staging
run: bunx wrangler deploy --env staging
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
deploy-production:
needs: test
if: gitea.ref == 'refs/heads/main' && gitea.event_name == 'push'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v1
with:
bun-version: latest
- run: bun install --frozen-lockfile
- name: Deploy to Production
run: bunx wrangler deploy --env production
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}

wrangler.toml
# Configuration par défaut (dev)
name = "mindlet-api-dev"
main = "src/index.ts"
[vars]
ENVIRONMENT = "development"
# Staging
[env.staging]
name = "mindlet-api-staging"
[env.staging.vars]
ENVIRONMENT = "staging"
# Production
[env.production]
name = "mindlet-api"
[env.production.vars]
ENVIRONMENT = "production"
interface Env {
ENVIRONMENT: string;
API_KEY: string; // Secret
}
export default {
async fetch(request: Request, env: Env): Promise<Response> {
console.log(`Running in ${env.ENVIRONMENT}`);
return new Response(`Environment: ${env.ENVIRONMENT}`);
},
};
Terminal window
# Ajouter un secret
bun wrangler secret put API_KEY
# Entrez la valeur de manière interactive
# Pour un environnement spécifique
bun wrangler secret put API_KEY --env production
# Lister les secrets
bun wrangler secret list

wrangler.toml
[[kv_namespaces]]
binding = "CACHE"
id = "xxxxx"
[env.production]
[[env.production.kv_namespaces]]
binding = "CACHE"
id = "yyyyy"
// Utilisation
export default {
async fetch(request: Request, env: Env): Promise<Response> {
// Écrire
await env.CACHE.put('key', 'value', { expirationTtl: 3600 });
// Lire
const value = await env.CACHE.get('key');
return Response.json({ value });
},
};
[[d1_databases]]
binding = "DB"
database_name = "mindlet-db"
database_id = "xxxxx"
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const { results } = await env.DB.prepare(
'SELECT * FROM users WHERE id = ?'
).bind(1).all();
return Response.json(results);
},
};
[[r2_buckets]]
binding = "BUCKET"
bucket_name = "mindlet-files"
export default {
async fetch(request: Request, env: Env): Promise<Response> {
// Upload
await env.BUCKET.put('file.txt', 'content');
// Download
const object = await env.BUCKET.get('file.txt');
return new Response(object?.body);
},
};

Symptôme : Error: Script too large

Cause : Le bundle dépasse 1 MB (limite Workers).

Solution :

Terminal window
# Analyser la taille du bundle
bun wrangler deploy --dry-run --outdir=dist
# Optimisations :
# 1. Utiliser des imports dynamiques
# 2. Externaliser les gros modules
# 3. Minifier le code

Symptôme : Le Worker ne répond pas sur le domaine configuré.

Solution :

# Vérifier la configuration des routes
[env.production]
routes = [
{ pattern = "api.mindlet.app/*", zone_name = "mindlet.app" }
]

Symptôme : env.SECRET est undefined.

Cause : Le secret n’est pas configuré pour cet environnement.

Solution :

Terminal window
# Vérifier les secrets
bun wrangler secret list --env production
# Ajouter le secret manquant
bun wrangler secret put MY_SECRET --env production

Symptôme : Error: Exceeded CPU time limit

Cause : Le Worker dépasse 50ms de CPU (free) ou 30s (paid).

Solution :

  • Optimiser le code
  • Utiliser ctx.waitUntil() pour les opérations non-bloquantes
  • Passer au plan Workers Paid pour plus de CPU

RessourceLien
Workers Docshttps://developers.cloudflare.com/workers/
Wrangler CLIhttps://developers.cloudflare.com/workers/wrangler/
Workers KVhttps://developers.cloudflare.com/kv/
D1 Databasehttps://developers.cloudflare.com/d1/
R2 Storagehttps://developers.cloudflare.com/r2/