Gérer les Custom Domains et le SSL dynamique avec Coolify et Traefik

By Hugo LassiègeDec 17, 20255 min read

J'ai récemment publié un article sur la gestion des certificats SSL pour une application multi-tenant sur Coolify.

Ok, ce titre peut faire peur, mais en gros, il permet à une application de gérer des tas des sous domaines (en HTTPS) dynamiquement pour ces utilisateurs. Par exemple :

  • https://hugo.writizzy.com
  • https://thomas-sanlis.writizzy.com

C'est une excellente base, mais vos utilisateurs en demandent souvent plus : les custom domains. C'est-à-dire la possibilité de personnaliser leur propre adresse, par exemple :

  • https://eventuallymaking.io
  • https://thomas-sanlis.com

Je vous propose donc de découvrir comment gérer des domaines personnalisés pour une application multi-tenant avec des certificats SSL dynamiques.

(J'ai l'impression de tenter le record du titre d'article le plus long du monde !)

Les custom domains

La première étape pour un domaine personnalisé consiste à envoyer le trafic lié à ce (sous-)domaine vers votre application (Writizzy dans mon cas).

Tout se joue au niveau des enregistrements DNS de l'utilisateur. En effet, lui seul peut configurer son domaine pour qu'il pointe vers le sous-domaine de votre application.
Plusieurs options s'offrent à lui : les enregistrements CNAME, ALIAS ou de type A.

1. Le CNAME (le plus simple)

Un CNAME est un alias pour un autre domaine. Il permet de dire, par exemple, que www.eventuallymaking.io est un alias de hugo.writizzy.com. Tout le trafic cherchant à résoudre l'adresse www sera automatiquement renvoyé vers votre domaine applicatif.

Limitation majeure : On ne peut pas utiliser de CNAME pour un domaine racine (par exemple eventuallymaking.io sans le www). L'ajout d'un CNAME sur un domaine "apex" poserait des soucis de coexistence avec les autres enregistrements (A, MX, TXT, etc.).

2. L'ALIAS

Certains fournisseurs DNS proposent l'enregistrement ALIAS (ou CNAME flattening). C'est en résumé un CNAME qui peut coexister avec d'autres enregistrements sur un domaine racine. C'est une excellente méthode si le provider de l'utilisateur le permet (ce n'est pas le cas d'OVH, par exemple).

3. L'enregistrement de type A

Ici, l'utilisateur renseigne directement l'adresse IP du serveur de Writizzy.

Attention : Cette méthode est risquée. Si vous changez de serveur (et donc d'IP), tous les domaines personnalisés de vos utilisateurs seront cassés jusqu'à ce qu'ils mettent à jour leur configuration. Pour utiliser cette méthode sereinement, il est indispensable d'avoir une IP flottante réattribuable à votre nouveau serveur ou à votre frontal web.

Ok, c'est très bien, mais si on s'arrête là, le résultat est très loin d'être parfait puisque le site ne fonctionnera pas en HTTPS.

Le HTTPS sur les custom domains

Dans le billet précédent, je montrais comment Traefik pouvait router tout le trafic arrivant sur les sous-domaines *.writizzy.com vers la même application grâce à ces lignes :

traefik.http.routers.https-custom.rule=HostRegexp(`^.+$`)
traefik.http.routers.https-custom.entryPoints=https
traefik.http.routers.https-custom.service=https-0-zgwokkcwwcwgcc4gck440o88
traefik.http.routers.https-custom.tls.certresolver=letsencrypt
traefik.http.routers.https-custom.tls=true
traefik.http.routers.https-custom.priority=1

Puisque la Regexp capte tout, on pourrait penser que le SSL suivra. Malheureusement, non. Traefik sait qu'il doit gérer un certificat Wildcard pour *.writizzy.io, mais il n'a aucune connaissance des domaines externes qu'il va devoir servir.

Il va falloir l'aider en lui fournissant dynamiquement la liste des domaines personnalisés.

Nos contraintes :

  • on ne veut évidemment pas redémarrer l'application
  • on veut le piloter programmatiquement

La configuration Traefik dynamique avec les file providers

C'est ici qu'entrent en scène les File Providers de Traefik.

Dans Coolify, cette fonctionnalité est active par défaut via les dynamic configurations. Sous le capot, Traefik surveille un répertoire spécifique :

- '--providers.file.directory=/traefik/dynamic/'
- '--providers.file.watch=true'

Si l'on dépose un fichier .yml définissant la règle pour un nouveau domaine, Traefik le prendra en compte à chaud et lancera le challenge HTTP auprès de Let's Encrypt pour obtenir le certificat SSL.

Exemple de configuration dynamique :

http:
  routers:
    eventuallymaking-https:
      rule: "Host(`eventuallymaking.io`)"
      entryPoints:
        - https
      service: https-0-writizzy
      tls:
        certResolver: letsencrypt
      priority: 10
    eventuallymaking-http:
      rule: "Host(`eventuallymaking.io`)"
      entryPoints:
        - http
      middlewares:
        - redirect-to-https@docker
      service: https-0-writizzy
      priority: 10

Donc avec cette méthode, on a résolu la première contrainte : ne pas redémarrer pour configurer un nouveau custom domain.

Maintenant, on veut faire sauter la seconde contrainte et le faire programmatiquement.

Automatisation via l'application

Pour piloter cela programmatiquement, l'idée est simple : l'application doit créer ces fichiers directement dans le répertoire surveillé par Traefik.

  1. Configuration Coolify : Allez dans Configuration -> Persistent Storage et ajoutez un Directory mount pour rendre le répertoire /traefik/dynamic/ visible par votre conteneur applicatif.

directory mount
directory mount

  1. Code (Kotlin dans mon cas) : L'application génère un fichier basé sur le template ci-dessus dès qu'un utilisateur configure son domaine.

💡 Note importante sur le timing : Si vous créez la configuration Traefik avant que l'utilisateur n'ait pointé son domaine vers votre IP, le challenge SSL échouera. Traefik réessaiera automatiquement (backoff), mais cela peut prendre du temps. L'idéal est de valider le pointage DNS (via un job en arrière-plan) avant de générer le fichier.

🔒 Note importante sur la sécurité : Le fichier créé contient une entrée utilisateur (le nom de domaine). Il est crucial de nettoyer et valider cette donnée pour éviter qu'un utilisateur malveillant n'injecte des directives Traefik arbitraires dans votre configuration.

Petit bilan

Ce billet conclut, je l'espère, une série utile pour les créateurs de SaaS multi-tenant sur Coolify. Nous avons couvert :

  1. La gestion des tenants (Nuxt) et configuration Traefik de base
  2. La gestion du SSL avec sous-domaines dynamiques
  3. La gestion des custom domains en SSL (ce billet)

On pourrait se demander si la solution va tenir la route avec des dizaines de milliers de sites utilisant tous un custom domain, notamment la capacité de Traefik de monitorer autant de fichier dans un répertoire. Je n'ai pas la réponse, Writizzy est pour l'instant loin de cet ordre de grandeur. Il existerait peut être d'autres solutions, notamment en utilisant Caddy à la place de Traefik dans Coolify mais c'est bien trop tôt pour l'instant.


Share this:

Written by Hugo Lassiège

Software engineer, ex-freelance, ex-cofounder, ex-CTO. I love building things, sharing knowledge and helping others.

Copyright © 2026
 Eventuallycoding
  •
Powered by Bloggrify