﻿﻿{"id":2549,"date":"2026-03-18T17:17:40","date_gmt":"2026-03-18T16:17:40","guid":{"rendered":"https:\/\/elearningsamba.com\/index.php\/faites-tourner-les-cloudflare-workers-directement-chez-vous\/"},"modified":"2026-03-18T17:17:40","modified_gmt":"2026-03-18T16:17:40","slug":"faites-tourner-les-cloudflare-workers-directement-chez-vous","status":"publish","type":"page","link":"https:\/\/elearningsamba.com\/index.php\/faites-tourner-les-cloudflare-workers-directement-chez-vous\/","title":{"rendered":"Faites tourner les Cloudflare Workers directement chez vous"},"content":{"rendered":"<p>Pour faire tourner du JavaScript c\u00f4t\u00e9 serveur, y&#8217;a pas que Node.js dans la vie. Y&#8217;a maintenant<br \/>\n<a href=\"https:\/\/github.com\/cloudflare\/workerd\">workerd<\/a><br \/>\n(prononcez &#8220;worker-dee&#8221;), qui est le runtime open source de Cloudflare, celui-l\u00e0 m\u00eame qui fait tourner les Workers en prod (le service tourne depuis 2017, le runtime est open source depuis 2022), et que vous pouvez l&#8217;installer sur votre Debian, votre Mac ou m\u00eame votre PC Windows avec un simple <code>npx<\/code>.<\/p>\n<p>Mais alors pourquoi s&#8217;emb\u00eater avec un \u00e9ni\u00e8me runtime JS ?<\/p>\n<p>H\u00e9 bien parce que celui-ci n&#8217;est pas un runtime g\u00e9n\u00e9raliste. C&#8217;est un vrai serveur HTTP pur et dur, bas\u00e9 sur le moteur V8 de Chrome, con\u00e7u pour recevoir des requ\u00eates et y r\u00e9pondre. Pas de filesystem, pas d&#8217;acc\u00e8s disque sauvage&#8230; ici, votre code vit dans un isolate V8, bien cloisonn\u00e9, et communique avec l&#8217;ext\u00e9rieur uniquement via des bindings explicites qu&#8217;on appelle des &#8220;capabilities&#8221;. En gros, votre Worker ne peut acc\u00e9der qu&#8217;aux ressources qu&#8217;on lui a branch\u00e9es dans son fichier de config<br \/>\n<a href=\"https:\/\/capnproto.org\/\">Cap&#8217;n Proto<\/a><br \/>\n.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/korben.info\/cdn-cgi\/image\/width=1200,fit=scale-down,quality=90,f=avif\/workerd-cloudflare-runtime-javascript\/workerd-cloudflare-runtime-javascript-2.png\" alt=\"\" loading=\"lazy\"><\/p>\n<p>Et cela a plein d&#8217;avantages ! Par exemple, les attaques SSRF classiques c&#8217;est mort ! Et n&#8217;oubliez pas que c&#8217;est du JavaScript pur, donc y&#8217;a pas d&#8217;affreux <code>require('fs')<\/code> ni de <code>child_process<\/code> qui tra\u00eene.<\/p>\n<p>Et le concept qui tue, ce sont les nanoservices. En fait, faut imaginer des microservices, mais qui tournent tous dans le m\u00eame processus Linux, sur le m\u00eame thread. Comme \u00e7a quand un nanoservice en appelle un autre, y&#8217;a z\u00e9ro latence TCP, c&#8217;est un juste appel de fonction local !<\/p>\n<p>Et vous pouvez en faire tourner des centaines sur un seul serveur parce que les API sont impl\u00e9ment\u00e9es en C++ natif et tous les isolates V8 partagent le m\u00eame code compil\u00e9 en m\u00e9moire. C&#8217;est carr\u00e9ment pas intuitif, mais visiblement, \u00e7a tient la route.<\/p>\n<p>C\u00f4t\u00e9 r\u00e9trocompatibilit\u00e9, c&#8217;est cool puisque chaque Worker d\u00e9clare une &#8220;date de compatibilit\u00e9&#8221; dans son fichier <code>.capnp<\/code>. Comme \u00e7a, vous fixez <code>compatibilityDate = \"2024-06-15\"<\/code> et le runtime vous garantit que les API <code>fetch()<\/code> et <code>WebCrypto<\/code> se comporteront toujours comme \u00e0 cette date-l\u00e0, m\u00eame si le binaire a \u00e9t\u00e9 recompil\u00e9 200 fois depuis. Des releases sortant tous les jours, cette garantie n&#8217;est pas anecdotique !<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/korben.info\/cdn-cgi\/image\/width=1200,fit=scale-down,quality=90,f=avif\/workerd-cloudflare-runtime-javascript\/workerd-cloudflare-runtime-javascript-3.png\" alt=\"\" loading=\"lazy\"><\/p>\n<p>Cap&#8217;n Proto, un format de s\u00e9rialisation binaire cr\u00e9\u00e9 par Kenton Varda, le m\u00eame gars qui est derri\u00e8re Protocol Buffers chez Google (excusez du peu). C&#8217;est un poil d\u00e9routant au d\u00e9but si vous \u00eates habitu\u00e9s au YAML ou au JSON, mais c&#8217;est tr\u00e8s efficace et hyper rapide. Et pour ceux qui bossent d\u00e9j\u00e0 avec<br \/>\n<a href=\"https:\/\/korben.info\/cloudflare-calls-plateforme-webrtc-serverless-apps-temps-reel.html\">l&#8217;\u00e9cosyst\u00e8me Cloudflare<\/a><br \/>\nparce que vous avez l&#8217;Am\u00e9rique qui coule dans les veines, sachez le runtime s&#8217;int\u00e8gre nickel avec l&#8217;outil CLI Wrangler pour le dev local.<\/p>\n<p>Par contre, attention, ce n&#8217;est PAS un sandbox s\u00e9curis\u00e9. Cloudflare le dit cash : si vous faites tourner du code potentiellement malveillant, faudra l&#8217;isoler dans une VM KVM ou un conteneur Docker. H\u00e9 oui les amis, en prod chez Cloudflare, y&#8217;a des couches de s\u00e9curit\u00e9 suppl\u00e9mentaires (isolation kernel Linux, patching V8 en urgence, segmentation par profil de risque) que le runtime seul ne fournit pas.<\/p>\n<p>Le probl\u00e8me, c&#8217;est surtout Spectre et les bugs du moteur V8&#8230; car \u00e7a reste du code C++ compil\u00e9 avec clang derri\u00e8re. Apr\u00e8s, pour du self-hosting de vos propres Workers sur votre VPS Ubuntu, c&#8217;est largement suffisant.<\/p>\n<p>Maintenant pour tester concr\u00e9tement c&#8217;est mui rapido.<\/p>\n<div class=\"highlight\">\n<pre class=\"chroma\"><code class=\"language-fallback\" data-lang=\"fallback\"><span class=\"line\"><span class=\"cl\">npx workerd serve config.capnp\n<\/span><\/span><\/code><\/pre>\n<p>Vous \u00e9crivez un petit <code>hello.js<\/code> avec un <code>addEventListener(\"fetch\")<\/code>, et hop, vous avez un serveur HTTP pr\u00eat \u00e0 r\u00e9pondre sur le port 8080 de votre localhost. Et le truc sympa, c&#8217;est qu&#8217;on peut aussi l&#8217;utiliser comme proxy HTTP programmable !<\/p>\n<p>Comme \u00e7a, au lieu de configurer des r\u00e8gles nginx ou Apache absconses, vous \u00e9crivez du JavaScript standard avec des <code>Request<\/code> et <code>Response<\/code> pour intercepter et router vos requ\u00eates. Franchement, pour du reverse proxy avec de la logique m\u00e9tier, c&#8217;est quand m\u00eame plus lisible que du <code>location ~ ^\/api\/(.*)$<\/code>. ^^<\/p>\n<p>D&#8217;ailleurs, c\u00f4t\u00e9 API, tout est bas\u00e9 sur les standards W3C : <code>fetch()<\/code>, <code>URL<\/code>, <code>WebCrypto<\/code>, <code>TextEncoder<\/code>, les classiques quoi. Donc si vous savez \u00e9crire du JS pour Firefox ou Chrome, vous savez \u00e9crire pour le moteur des Workers. Pas de modules propri\u00e9taires bizarres, contrairement \u00e0 Node.js et tous ses packages <code>http<\/code>, <code>net<\/code>, <code>stream<\/code>&#8230;<\/p>\n<p>Bref, c&#8217;est costaud, c&#8217;est gratuit, et \u00e7a tourne partout, avec un dossier <code>samples\/<\/code> plein de configs pr\u00eates \u00e0 l&#8217;emploi.<\/p>\n<p>Allez, je vous lib\u00e8re,<br \/>\n<a href=\"https:\/\/blog.cloudflare.com\/workerd-open-source-workers-runtime\/\">vous pouvez foncer tester \u00e7a !!<\/a>\n<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Pour faire tourner du JavaScript c\u00f4t\u00e9 serveur, y&#8217;a pas que Node.js dans la vie. Y&#8217;a maintenant workerd (prononcez &#8220;worker-dee&#8221;), qui est le runtime open source de Cloudflare, celui-l\u00e0 m\u00eame qui fait tourner les Workers en prod (le service tourne depuis 2017, le runtime est open source depuis 2022), et que vous pouvez l&#8217;installer sur votre Debian, votre Mac ou m\u00eame votre PC Windows avec un simple npx. Mais alors pourquoi s&#8217;emb\u00eater avec un \u00e9ni\u00e8me runtime JS ? H\u00e9 bien parce que celui-ci n&#8217;est pas un runtime g\u00e9n\u00e9raliste. C&#8217;est un vrai serveur HTTP pur et dur, bas\u00e9 sur le moteur V8 de Chrome, con\u00e7u pour recevoir des requ\u00eates et y r\u00e9pondre. Pas de filesystem, pas d&#8217;acc\u00e8s disque sauvage&#8230; ici, votre code vit dans un isolate V8, bien cloisonn\u00e9, et communique avec l&#8217;ext\u00e9rieur uniquement via des bindings explicites qu&#8217;on appelle des &#8220;capabilities&#8221;. En gros, votre Worker ne peut acc\u00e9der qu&#8217;aux ressources qu&#8217;on lui a branch\u00e9es dans son fichier de config Cap&#8217;n Proto . Et cela a plein d&#8217;avantages ! Par exemple, les attaques SSRF classiques c&#8217;est mort ! Et n&#8217;oubliez pas que c&#8217;est du JavaScript pur, donc y&#8217;a pas d&#8217;affreux require(&#8216;fs&#8217;) ni de child_process qui tra\u00eene. Et le concept qui tue, ce sont les nanoservices. En fait, faut imaginer des microservices, mais qui tournent tous dans le m\u00eame processus Linux, sur le m\u00eame thread. Comme \u00e7a quand un nanoservice en appelle un autre, y&#8217;a z\u00e9ro latence TCP, c&#8217;est un juste appel de fonction local ! Et vous pouvez en faire tourner des centaines sur un seul serveur parce que les API sont impl\u00e9ment\u00e9es en C++ natif et tous les isolates V8 partagent le m\u00eame code compil\u00e9 en m\u00e9moire. C&#8217;est carr\u00e9ment pas intuitif, mais visiblement, \u00e7a tient la route. C\u00f4t\u00e9 r\u00e9trocompatibilit\u00e9, c&#8217;est cool puisque chaque Worker d\u00e9clare une &#8220;date de compatibilit\u00e9&#8221; dans son fichier .capnp. Comme \u00e7a, vous fixez compatibilityDate = &#8220;2024-06-15&#8221; et le runtime vous garantit que les API fetch() et WebCrypto se comporteront toujours comme \u00e0 cette date-l\u00e0, m\u00eame si le binaire a \u00e9t\u00e9 recompil\u00e9 200 fois depuis. Des releases sortant tous les jours, cette garantie n&#8217;est pas anecdotique ! Cap&#8217;n Proto, un format de s\u00e9rialisation binaire cr\u00e9\u00e9 par Kenton Varda, le m\u00eame gars qui est derri\u00e8re Protocol Buffers chez Google (excusez du peu). C&#8217;est un poil d\u00e9routant au d\u00e9but si vous \u00eates habitu\u00e9s au YAML ou au JSON, mais c&#8217;est tr\u00e8s efficace et hyper rapide. Et pour ceux qui bossent d\u00e9j\u00e0 avec l&#8217;\u00e9cosyst\u00e8me Cloudflare parce que vous avez l&#8217;Am\u00e9rique qui coule dans les veines, sachez le runtime s&#8217;int\u00e8gre nickel avec l&#8217;outil CLI Wrangler pour le dev local. Par contre, attention, ce n&#8217;est PAS un sandbox s\u00e9curis\u00e9. Cloudflare le dit cash : si vous faites tourner du code potentiellement malveillant, faudra l&#8217;isoler dans une VM KVM ou un conteneur Docker. H\u00e9 oui les amis, en prod chez Cloudflare, y&#8217;a des couches de s\u00e9curit\u00e9 suppl\u00e9mentaires (isolation kernel Linux, patching V8 en urgence, segmentation par profil de risque) que le runtime seul ne fournit pas. Le probl\u00e8me, c&#8217;est surtout Spectre et les bugs du moteur V8&#8230; car \u00e7a reste du code C++ compil\u00e9 avec clang derri\u00e8re. Apr\u00e8s, pour du self-hosting de vos propres Workers sur votre VPS Ubuntu, c&#8217;est largement suffisant. Maintenant pour tester concr\u00e9tement c&#8217;est mui rapido. npx workerd serve config.capnp Vous \u00e9crivez un petit hello.js avec un addEventListener(&#8220;fetch&#8221;), et hop, vous avez un serveur HTTP pr\u00eat \u00e0 r\u00e9pondre sur le port 8080 de votre localhost. Et le truc sympa, c&#8217;est qu&#8217;on peut aussi l&#8217;utiliser comme proxy HTTP programmable ! Comme \u00e7a, au lieu de configurer des r\u00e8gles nginx ou Apache absconses, vous \u00e9crivez du JavaScript standard avec des Request et Response pour intercepter et router vos requ\u00eates. Franchement, pour du reverse proxy avec de la logique m\u00e9tier, c&#8217;est quand m\u00eame plus lisible que du location ~ ^\/api\/(.*)$. ^^ D&#8217;ailleurs, c\u00f4t\u00e9 API, tout est bas\u00e9 sur les standards W3C : fetch(), URL, WebCrypto, TextEncoder, les classiques quoi. Donc si vous savez \u00e9crire du JS pour Firefox ou Chrome, vous savez \u00e9crire pour le moteur des Workers. Pas de modules propri\u00e9taires bizarres, contrairement \u00e0 Node.js et tous ses packages http, net, stream&#8230; Bref, c&#8217;est costaud, c&#8217;est gratuit, et \u00e7a tourne partout, avec un dossier samples\/ plein de configs pr\u00eates \u00e0 l&#8217;emploi. Allez, je vous lib\u00e8re, vous pouvez foncer tester \u00e7a !!<\/p>\n","protected":false},"author":1,"featured_media":2550,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"give_campaign_id":0,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_kadence_starter_templates_imported_post":false,"footnotes":""},"class_list":["post-2549","page","type-page","status-publish","has-post-thumbnail","hentry"],"campaignId":"","_links":{"self":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages\/2549","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/comments?post=2549"}],"version-history":[{"count":0,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages\/2549\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/media\/2550"}],"wp:attachment":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/media?parent=2549"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}