Déployer une API derrière un proxy inverse avec Caddy et Go

19 mai 2026

Déployer une API derrière un proxy inverse avec Caddy et Go

Un ami m’a demandé un exemple de comment mettre en ligne une API en utilisant un proxy inverse avec le langage Go. Ci-dessous, j’expose un petit guide.

Tout d’abord, démarrez un serveur et enregistrez votre IP auprès du fournisseur de DNS. Associez l’IP à un nom afin de créer un certificat HTTPS pour la machine.

Configurez le pare-feu de la machine et n’ouvrez que les ports 22 (SSH), 80 (HTTP) et 443 (HTTPS).

Caddy

J’utilise le serveur HTTP Caddy. Il est pratique et génère automatiquement des certificats HTTPS. Par défaut, il redirige les requêtes HTTP vers HTTPS.

Pour installer Caddy sur votre système d’exploitation, suivez les instructions sur https://caddyserver.com/docs/install.

Après l’installation, éditez le fichier /etc/caddy/Caddyfile et ajoutez la configuration suivante :

example.com {
    # Define um arquivo para registrar o log do servidor
    log {
        output file /var/log/caddy/example.com.log
    }

    # Configura o servidor para servir páginas estáticas
    root * /var/www/html
    file_server

    # Redireciona chamadas iniciadas com o endpoint /api
    route /api* {
        reverse_proxy 127.0.0.1:8080
    }
}

Le Caddy prendra le domaine configuré à la place de example.com, interrogera le serveur DNS pour vérifier s’il correspond à l’IP du serveur et créera les certificats TLS pour vous.

Cette configuration suppose que vous souhaitez servir des fichiers statiques. Si vous préférez que le code Go fournisse la base du serveur, retirez les configurations du chemin root et modifiez la route comme dans l’exemple suivant :

route /* {
    reverse_proxy 127.0.0.1:8080
}

API

Pour cet exemple, nous créerons un serveur HTML simple. Il écoutera sur le port 8080 et répondra « Hello, world ! » aux requêtes.

package main

import (
    "io"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "Hello, world!")
}

func main() {
    http.HandleFunc("https://imasters.com.br/", handler)
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        panic(err)
    }
}

Ce code sert uniquement à démontrer que le redirection de port via le proxy inverse avec Caddy fonctionne.

tmux

Le tmux est présent dans toutes les distributions Linux. Comme GNU Screen, on peut l’utiliser pour maintenir un serveur en fonctionnement pendant les tests, même si la connexion se coupe. Ce n’est pas une bonne pratique d’employer tmux pour des services en production. Néanmoins, lors du débogage, examiner les sorties affichées à l’écran aide énormément. Si vous ne connaissez pas tmux, cela vaut la peine d’apprendre cet outil.

Supervisor

Pour l’environnement de production, une excellente manière de gérer votre service est d’utiliser le supervisor.

Pour l’installation sur Debian ou Ubuntu, utilisez la commande :

apt-get install supervisor

Ensuite, créez un fichier api.conf dans le répertoire /etc/supervisor/conf.d/. (Le chemin peut varier selon la distribution Linux)

Voici un exemple simple de fichier de configuration pour lancer notre service :

[program:api]
command=/path/api
directory=/path
autostart=true

Le supervisor utilisera l’exécutable /path/api pour démarrer le service. Vous pouvez ajouter d’autres réglages, comme un redémarrage automatique en cas d’erreur ou la redirection des journaux.

Après avoir créé le fichier de configuration, rechargez le supervisor avec la commande :

supervisorctl reread # recarrega a configuração
supervisorctl update # executa as mudanças

Vous pouvez voir l’état de votre service avec la commande suivante :

supervisorctl status api

Pour démarrer le service, utilisez :

supervisorctl start api

Et pour arrêter le service, utilisez :

supervisorctl stop api

Il existe de très nombreuses autres commandes. Utilisez man supervisorctl pour en apprendre davantage à leur sujet.

Conclusion

Voici un aperçu simplifié de la manière de mettre en ligne une application écrite en Go de façon maîtrisée, avec des certificats TLS et une capacité d’évolution sans compromettre la simplicité. À mesure que votre système se développe, vous ajouterez probablement davantage de services et de routes dans Caddy, mais cela ne deviendra pas plus compliqué.

Cette méthode permet de déployer une application Go en tant qu’utilisateur ordinaire sur un port élevé. Le Caddy s’occupera du proxy inverse et des certificats TLS. Le supervisor veillera sur le service en production.

Éventuellement, vous pourriez avoir besoin de workers pour des tâches asynchrones. Pour cela, utilisez le crontab et de petits exécutables. Cela restera facile à maintenir.

Fabien Delpont

Auteur

Fabien Delpont

Fabien Delpont, développeur et créateur du site Python Doctor.