Caddy est un serveur web HTTP/2 avec une gestion de HTTPS automatique. Il permet de servir des fichiers statiques mais il peut aussi être utilisé comme reverse-proxy pour une application Node.js par exemple. De plus la configuration de ce dernier est très simple. Vous pouvez visiter cette page pour voir l'ensemble des fonctionnalités.

Dans cet article nous allons voir plusieurs exemples d'utilisation :

  • Utilisation pour un site statique.
  • Utilisation pour une application Node.js.
  • Utilisation pour un site statique qui communique avec une application Node.js

Nous verrons comment l'utiliser avec Docker, dans un environnement local mais aussi comment l'utiliser sur un serveur avec un domaine et le https.

Avant de commencer nous allons créer un dossier CaddySamples qui contiendra nos différents exemples :

mkdir CaddySamples

Utilisation pour un site statique qui communique avec une application Node.js

Maintenant nous allons mettre en place les deux exemples précédents ensembles et les faire communiquer entre eux la page statique fera un appel http à notre api qui lui répondra.

La page statique sera accessible via localhost:80 (gsagnard.fr) et l'api via localhost:8080 (api.gsagnard.fr).

Pour ce faire dans le dossier CaddySamples créez un dossier static-website-and-node-sample ensuite ajoutez dedans un dossier web .

mkdir static-website-and-node-sample && cd static-website-and-node-sample
mkdir web

Dans le dossier web copiez le fichier index.html du premier exemple. Ensuite dans le dossier static-website-and-node-sample copier le dossier api de l'exemple précédent.

Maintenant nous allons modifier notre page html pour ajouter le script qui fera une requête http à notre api. Dans la page index.html ajoutez le script suivant avant la fin du body :

<div style="background-color:green" id="data"></div>
<script>
  fetch('http://localhost:8080/test')
    .then(data => {
      return data.json()
    })
    .then(jsonData => {
      var element = document.getElementById('data')
      element.innerHTML = JSON.stringify(jsonData)
      console.log(jsonData)
    })
    .catch(err => {
      alert(err)
    })
</script>

Puis nous ajoutons la route test à notre serveur dans le fichier server.js :

app.get('/test', (req, res) => {
  res.header('Access-Control-Allow-Origin', '*')
  res.header(
    'Access-Control-Allow-Headers',
    'Origin, X-Requested-With, Content-Type, Accept'
  )
  res.send({ hello: 'world' })
})

Passons à la configuration du fichier Caddyfile

gsagnard.fr {
}

api.gsagnard.fr {
  proxy /  api:3000
}

Ici on remarque que le fichier contient les configurations de chacun des exemples précédents.

Puis le fichier docker-compose.yml

version: '2'
services:
  api:
    build: ./api
    container_name: 'node-api'
    restart: always
    ports:
      - '3000:3000'
  server:
    image: abiosoft/caddy
    container_name: caddy
    ports:
      - '80:80'
      - '8080:8080'
    volumes:
      - './Caddyfile:/etc/Caddyfile'
      - './web:/srv'

Maintenant lorsque vous lancer vos services avec docker il seront respectivement disponibles sur les ports 80 et 8080.

port 80
Certificat Caddy 
port 8080
Certificat OK
yes :)

Voila nous avons vu une petite partie des fonctionnalités de Caddy Server.

Essayer avec une autre application NodeJS