iducationducation
IndexArticlesFormationsProfilOutilsBibliothech
N°014 — 2026
Navigation
01Index02Articles03Formations04Profil05Outils06Bibliothech
N°014 — 2026
iducationducation
IndexArticlesFormationsProfilOutilsBibliothech
N°014 — 2026
Navigation
01Index02Articles03Formations04Profil05Outils06Bibliothech
N°014 — 2026
Formations
TypeScript · Avancé

OpenCaddyHost

Construire un dashboard Nuxt 4 pour piloter Caddy via son Admin API — authentification JWT, reverse proxy CRUD, import/export, et déploiement Docker Compose.

Nuxt 4Vue 3TypeScriptPiniaCaddyDocker
GitHub
01Setup et configuration02L'API Admin de Caddy03Server routes Nuxt 404Authentification JWT05Client Caddy et gestion des proxies06Interface et composants Vue07Déploiement Docker Compose
Chapitre 2·25 min

L'API Admin de Caddy

Caddy expose une API REST complète pour lire et modifier sa configuration à chaud, sans redémarrage. C'est la fondation d'OpenCaddyHost.

Ce que fait l'Admin API

Par défaut, Caddy écoute sur 127.0.0.1:2019 pour les requêtes d'administration. Toute modification de configuration passe par cette API — y compris ce que fait la CLI caddy reload.

Endpoints principaux :

MéthodeEndpointRôle
GET/config/Lire la configuration complète
POST/loadRemplacer toute la configuration
PATCH/config/apps/http/serversModifier une section spécifique
GET/id/{id}Accéder à un élément par son @id
DELETE/id/{id}Supprimer un élément par son @id

Structure d'une configuration Caddy (JSON)

Un reverse proxy Caddy en JSON ressemble à ça :

{
  "apps": {
    "http": {
      "servers": {
        "srv0": {
          "listen": [":443"],
          "routes": [
            {
              "@id": "proxy-mon-app",
              "match": [{ "host": ["mon-app.example.com"] }],
              "handle": [
                {
                  "handler": "reverse_proxy",
                  "upstreams": [{ "dial": "localhost:8080" }]
                }
              ]
            }
          ]
        }
      }
    }
  }
}

Le champ @id est crucial : il permet d'accéder à une route précise via /id/proxy-mon-app pour la modifier ou la supprimer sans toucher au reste de la config.

Lire la configuration actuelle

Terminal
curl http://127.0.0.1:2019/config/ | jq .

Sur une instance fraîche, la réponse est null — Caddy n'a aucune config chargée.

Créer un premier proxy via l'API

Terminal
curl -X POST http://127.0.0.1:2019/load \
  -H "Content-Type: application/json" \
  -d '{
    "apps": {
      "http": {
        "servers": {
          "srv0": {
            "listen": [":80"],
            "routes": [
              {
                "@id": "proxy-test",
                "match": [{ "host": ["test.localhost"] }],
                "handle": [
                  {
                    "handler": "reverse_proxy",
                    "upstreams": [{ "dial": "localhost:3000" }]
                  }
                ]
              }
            ]
          }
        }
      }
    }
  }'

Réponse : HTTP 200 sans corps = configuration chargée. Le proxy est actif immédiatement.

Supprimer un proxy par son ID

Terminal
curl -X DELETE http://127.0.0.1:2019/id/proxy-test

Un seul appel. Caddy retire la route de la configuration active sans toucher aux autres proxies.

Activer le HTTPS automatique

Caddy gère Let's Encrypt automatiquement. Changer le port :80 en :443 dans la config JSON suffit :

{
  "handle": [
    {
      "handler": "reverse_proxy",
      "upstreams": [{ "dial": "localhost:8080" }]
    }
  ],
  "match": [{ "host": ["mon-app.example.com"] }],
  "terminal": true
}

Caddy détecte le nom de domaine, contacte Let's Encrypt, et obtient le certificat. Aucune config SSL à écrire.

Headers personnalisés

{
  "handler": "reverse_proxy",
  "upstreams": [{ "dial": "localhost:8080" }],
  "headers": {
    "request": {
      "set": {
        "X-Real-IP": ["{http.request.remote.host}"],
        "X-Forwarded-Proto": ["https"]
      }
    }
  }
}

{http.request.remote.host} est une variable de template Caddy — elle est résolue au moment de la requête, pas à la configuration.

Port de l'Admin API en production

Par défaut, l'Admin API est sur 127.0.0.1:2019 — accessible uniquement en local. Dans le docker-compose.yml d'OpenCaddyHost, elle est remappée sur 2020 pour éviter les conflits :

docker-compose.yml
caddy:
  ports:
    - "2020:2019"  # Admin API exposée sur le port 2020 de l'hôte

CADDY_ADMIN_URL=http://caddy:2019 dans le conteneur dashboard — les deux services parlent via le réseau Docker interne, pas via l'hôte.

Vérifier la santé de Caddy

Terminal
curl http://127.0.0.1:2019/config/
# 200 → API active
# Connection refused → Caddy arrêté ou Admin API désactivée

OpenCaddyHost expose un endpoint /api/caddy/health qui fait cette vérification et la renvoie au dashboard.

Précédent
Setup et configuration
Suivant
Server routes Nuxt 4

Développeur fullstack passionné. J'apprends en construisant et je documente tout — front, back, outils. Le code s'apprend mieux en public.

Naviguer

IndexTous les articlesFormationsProfilOutilsBibliothech

Ailleurs

GitHub RSS

Newsletter

Les articles, libs et découvertes. Une fois par semaine, pas plus.

© 2026 William LoreeConçu & codé à la main