Exposer son site web statique globalement et gratuitement avec Cloudflare Workers ...
Tags: scaleway, serverless, node, cloudflare
Published: 2020-04-06 18:58:26

![](https://telegra.ph/file/07972e5740389611da0b5.png)

Je pars pour cette expérience d'une petite instance Ubuntu 18.04 ARM 64 Bits dans Scaleway :

![](https://telegra.ph/file/e6d1b5a7b13c55c8ea6e0.jpg)

Et j'y déploie la version LTS de Node.js accompagné de PM2 de Keymetrics qui est configuré pour être lié à un dashboard de monitoring sur [https://pm2.io/ :](https://pm2.io/)

![](https://telegra.ph/file/cc9c0c1d5812ac7df7dff.png)

![](https://telegra.ph/file/a5d0b56dc95d8f5722365.jpg)

J'y installe Serve pour exposer localement du contenu statique : <https://www.npmjs.com/package/serve>

![](https://telegra.ph/file/4d5e9654e456b6546024e.jpg)

![](https://telegra.ph/file/4f36f9ee980fc9b8c9937.png)

Je récupère une page HTML unique représentant mon site web :

![](https://telegra.ph/file/0f4390423e26ae4067374.png)

que je vais exposer localement via Serve et PM2 :

![](https://telegra.ph/file/fcbd86c16c4e15523d3f3.png)

et je lance le script :

![](https://telegra.ph/file/af957651c705bf1d07a2a.png)

![](https://telegra.ph/file/e77acd233938a27e75e13.jpg)

avec des métriques de base sur les processus en cours dans le dashboard de PM2.io :

![](https://telegra.ph/file/e690f8b7a80469b8e6235.jpg)

Et le site web est disponible à partir de l'adresse IP publique de l'instance :

![](https://telegra.ph/file/bcba39770616d7d4e62d4.jpg)

![](https://telegra.ph/file/64f695a3d08a57707150e.jpg)

Je vais alors utiliser Cloudflare Workers qui permet de créer des applications sans serveur sur le réseau cloud mondial de Cloudflare s'étendant sur 200 villes dans plus de 90 pays. Cloudflare Workers fournit un environnement d'exécution JavaScript léger qui permet aux développeurs de renforcer les applications existantes ou d'en créer de toutes nouvelles sans avoir à configurer ou à maintenir l'infrastructure ...

<https://workers.cloudflare.com/>

![](https://telegra.ph/file/837f0cd7797d45a829f87.jpg)

![](https://telegra.ph/file/07fb83cfe2be0fab2a256.png)

Je crée mon premier Worker depuis le dashboard client de Cloudflare :

![](https://telegra.ph/file/66d056a971e9994bca87d.jpg)

Je reprends un des template de Cloudflare pour charger depuis l'instance ARM 64 Bits dans Scaleway l'unique page HTML par ce worker via ce template type : <https://developers.cloudflare.com/workers/templates/>

```javascript
async function handleRequest(request) {
  const init = {
    headers: {
      'content-type': 'text/html;charset=UTF-8',
    },
  }
  const response = await fetch(url, init)
  const results = await gatherResponse(response)
  return new Response(results, init)
}
addEventListener('fetch', event => {
  return event.respondWith(handleRequest(event.request))
})
/**
 * gatherResponse awaits and returns a response body as a string.
 * Use await gatherResponse(..) in an async function to get the response body
 * @param {Response} response
 */
async function gatherResponse(response) {
  const { headers } = response
  const contentType = headers.get('content-type')
  if (contentType.includes('application/json')) {
    return await response.json()
  } else if (contentType.includes('application/text')) {
    return await response.text()
  } else if (contentType.includes('text/html')) {
    return await response.text()
  } else {
    return await response.text()
  }
}
/**
 * Example someHost at url is set up to respond with HTML
 * Replace url with the host you wish to send requests to
 *  */
const someHost = 'https://workers-tooling.cf/demos'
const url = someHost + '/static/html'
```

que je personnalise de la sorte :

![](https://telegra.ph/file/2256e209961faaf5d705a.png)

![](https://telegra.ph/file/cd802dafd69e064b1173a.jpg)

![](https://telegra.ph/file/265f74ac54c75480990f7.jpg)

Et la page web est accessible :

![](https://telegra.ph/file/e460ab436fe1f039c3a7d.jpg)

Je crée un second worker qui lui n'aura pas besoin de se connecter à l'instance car il portera directement la page HTML sur la base de ce template type (remplacer la partie HTML par sa page web) :

![](https://telegra.ph/file/6e256bf19c7d56d2cdda8.png)

```javascript
async function handleRequest(request) {
  const init = {
    headers: {
      'content-type': 'text/html;charset=UTF-8',
    },
  }
  return new Response(someHTML, init)
}
addEventListener('fetch', event => {
  return event.respondWith(handleRequest(event.request))
})
const someHTML =  `<!DOCTYPE html>
<html>
  <body>
  <h1>Hello World</h1>
  <p>This is all generated using a Worker</p>
  <iframe
      width="560"
      height="315"
      src="https://www.youtube.com/embed/dQw4w9WgXcQ"
      frameborder="0"
      allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
      allowfullscreen
  ></iframe>
  </body>
</html>
`
```
Prévisualisation dans le dashboard de Cloudflare avant publication :

![](https://telegra.ph/file/81574a946ef7b961cd054.jpg)

![](https://telegra.ph/file/5d50d9be0b71944e0084f.jpg)

Et la page web est accessible également avec ce second worker :

![](https://telegra.ph/file/30264b6b7e0019b6de1f5.jpg)

![](https://telegra.ph/file/5cc8dda28c34a1372f96b.jpg)

Comme ceci est gratuit, on est limité au nombre de requêtes sur ces Workers (100000) :

![](https://telegra.ph/file/bafd811b8db3fd4832704.jpg)

![](https://telegra.ph/file/a2c4718f5f6c519066cd4.jpg)

En fait Cloudflare propose Cloudflare Workers Sites qui exploitent la puissance des Workers et Workers KV en permettant aux développeurs de télécharger leurs sites directement au plus près des utilisateurs finaux.

<https://blog.cloudflare.com/workers-sites/>

![](https://telegra.ph/file/e8e0e8bcf6f34229f86c7.png)

Les Workers Sites sont déployés avec quelques commandes de terminal et peuvent servir un site généré par n'importe quel générateur de site statique, tel que Hugo, Gatsby ou Jekyll mais moyennant une souscription ...

![](https://telegra.ph/file/8aa8a16216af2e9df2713.jpg)

À suivre ! ...

![](https://telegra.ph/file/1f943a883bb66e742a234.png)