Domaines, reverse proxy et certificats
Cette page explique comment un nom comme project.formuleets.ca mène à un service qui tourne sur nos serveurs, et pourquoi chaque pièce est configurée comme elle l'est. Lis-la avant de toucher au DNS, au reverse proxy ou aux certificats.
Pour exposer un nouveau service, suis plutôt Ajouter un sous-domaine. En cas de problème, va voir Dépannage réseau.
Vue d'ensemble
Depuis le 2026-11-05, tous nos sites passent par Caddy, un plugin d'OPNsense. Quand quelqu'un ouvre https://project.formuleets.ca, depuis l'école ou de n'importe où :
- Cloudflare (notre DNS) répond que
project.formuleets.cacorrespond à142.137.247.115, notre IP publique. - Le navigateur contacte cette IP. Elle est portée par OPNsense, sur son interface DMZ, et c'est Caddy qui répond.
- Caddy présente le certificat Let's Encrypt de
project.formuleets.ca, puis transmet la requête en HTTP au bon service selon le nom demandé. Pourproject, c'est OpenProject sur10.194.24.48:8080.
Internet / école ──► 142.137.247.115 (OPNsense, interface DMZ)
│
├─ 80, 443 ─► Caddy (sur OPNsense) ─► GitLab, OpenProject, Vaultwarden
└─ 22 ──────► GitLab (SSH git, redirection directe)
| Service | Adresse publique | Caddy l'envoie vers |
|---|---|---|
| GitLab | gitlab.formuleets.ca, gitlab2.formuleets.ca | http://192.168.1.10:80 |
| Registry Docker de GitLab | registry.gitlab.formuleets.ca | http://192.168.1.10:5050 |
| GitLab Pages | pages.formuleets.ca, *.pages.formuleets.ca | http://192.168.1.10:80 |
| Cette documentation (GitLab Pages, domaine personnalisé) | doc.formuleets.ca | http://192.168.1.10:8091 |
| OpenProject | project.formuleets.ca | http://10.194.24.48:8080 |
| Vaultwarden | bitwarden.formuleets.ca | http://10.194.24.45:8000 |
| Authentik (SSO) | auth.formuleets.ca | http://10.194.24.61:9000 |
Avant le 2026-11-05, ils n'étaient accessibles que depuis le réseau de l'école. Ils sont maintenant publics, comme GitLab. Les inscriptions libres de Vaultwarden sont fermées (on n'entre que sur invitation) et son interface d'administration /admin est bloquée depuis l'extérieur. Il reste à imposer la double authentification (tâche OpenProject #143).
Caddy sur OPNsense
Caddy est configuré dans l'interface web d'OPNsense, menu Services → Caddy Web Server. Cette interface n'est joignable que depuis les postes admin, sur le port 8443 : https://10.194.24.56:8443. Les ports 80 et 443 d'OPNsense sont réservés à Caddy.
Les réglages
| Onglet | Ce qu'on y trouve |
|---|---|
| Paramètres généraux | Caddy activé, adresse courriel pour Let's Encrypt |
| Fournisseur de DNS | Cloudflare, le jeton d'API, Résolveurs = 1.1.1.1 |
| Proxy inversé → Domaines | Un domaine par nom public, tous en https:// avec Défi DNS-01 coché |
| Proxy inversé → Manipulateurs | Pour chaque domaine, vers quelle machine et quel port envoyer les requêtes |
| Proxy inversé → Accès | La liste interne (10.0.0.0/8, 192.168.0.0/16) qui protège /admin de Vaultwarden |
| Proxy inversé → En-têtes | L'en-tête X-Real-IP envoyé à Vaultwarden |
Après une modification, clique sur Appliquer en bas de la page : rien ne change tant que tu ne l'as pas fait.
Pourquoi le résolveur 1.1.1.1
Avant de valider un certificat, Caddy vérifie que l'enregistrement de validation est bien visible dans le DNS. En interrogeant directement Cloudflare (1.1.1.1), il ne dépend ni du DNS de l'école ni de celui d'OPNsense, et évite les échecs « propagation timeout ».
Vaultwarden : la vraie IP et /admin
- La vraie IP des visiteurs. Vaultwarden lit l'IP du client dans l'en-tête
X-Real-IP. Caddy l'ajoute (header_up X-Real-IP {remote_host}) sur les deux manipulateurs debitwarden. Sans lui, Vaultwarden verrait l'IP d'OPNsense pour tout le monde, et son blocage contre les essais de mots de passe bloquerait tous les membres d'un coup. /adminbloqué depuis l'extérieur. Un 2ᵉ manipulateur surbitwarden.formuleets.ca, avec le chemin/admin*, n'accepte que la liste d'accèsinterne. Depuis Internet, la connexion est coupée. Caddy traite toujours le chemin le plus précis en premier :/adminpasse par cette ligne, tout le reste par la ligne générale.
GitLab derrière Caddy
GitLab ne gère plus son HTTPS : il écoute en HTTP sur le port 80 (et 5050 pour le registry), et fait confiance à l'en-tête X-Forwarded-For envoyé par OPNsense (192.168.1.1) pour connaître la vraie IP des visiteurs. Voir GitLab.
Le DNS chez Cloudflare
Le domaine formuleets.ca est enregistré chez Web Hosting Canada, mais ses serveurs de noms sont ceux de Cloudflare :
aisha.ns.cloudflare.comjavier.ns.cloudflare.com
Tous les enregistrements DNS se gèrent donc dans Cloudflare (menu DNS → Records), plus dans le panneau WHC.
Pourquoi Cloudflare
Caddy obtient ses certificats par validation DNS : il crée temporairement un enregistrement TXT _acme-challenge pour prouver à Let's Encrypt qu'on contrôle le domaine. C'est la seule méthode pour le certificat *.pages.formuleets.ca (un wildcard), et elle permet d'obtenir les certificats avant d'ouvrir un service sur Internet.
WHC n'a pas d'API qui permette de créer cet enregistrement automatiquement. Cloudflare en a une, gratuite, que Caddy prend en charge directement. C'est ce qui permet le renouvellement automatique.
Pourquoi tout est en « DNS only »
Tous les enregistrements sont en DNS only (nuage gris), aucun en Proxied (nuage orange).
- Les courriels de l'équipe sont hébergés chez WHC (
173.209.32.99). Le MX pointe versformuleets.ca. Si cet enregistrement était proxifié, il pointerait vers Cloudflare, qui ne relaie pas les courriels : plus aucun courriel ne serait reçu. - FTP, cPanel et WHM ne passent pas non plus par le proxy de Cloudflare.
- Le SSH git de GitLab (port 22) ne passe pas par le proxy de Cloudflare.
- Les IP privées (
10.x) ne peuvent pas être proxifiées de toute façon. Cloudflare affiche DNS only - reserved IP.
Ça couperait la réception des courriels de toute l'équipe.
Enregistrements existants
| Nom | Type | Cible | Usage |
|---|---|---|---|
formuleets.ca | A | 173.209.32.99 | Site web (WHC) |
www, mail, ftp | CNAME | formuleets.ca | Site, courriel, FTP (WHC) |
cpanel, whm, webmail, webdisk, cpcalendars, cpcontacts | A | 173.209.32.99 | Services de l'hébergement WHC |
formuleets.ca | MX | formuleets.ca | Réception des courriels |
formuleets.ca, default._domainkey, _cpanel-dcv-test-record | TXT | — | SPF, DKIM, validation cPanel |
project | A | 142.137.247.115 | OpenProject via Caddy |
bitwarden | A | 142.137.247.115 | Vaultwarden via Caddy |
gitlab, registry.gitlab | A | 142.137.247.115 | GitLab et son registry Docker, via Caddy |
gitlab2, registry.gitlab2 | A | 142.137.247.115 | Ancien nom de GitLab, gardé pour les clones existants |
pages, *.pages | A | 142.137.247.115 | GitLab Pages, via Caddy |
doc | A | 142.137.247.115 | Cette documentation (GitLab Pages), via Caddy |
_gitlab-pages-verification-code.doc | TXT | code donné par GitLab | Preuve pour GitLab que doc nous appartient : à garder, GitLab revérifie régulièrement |
auth | A | 142.137.247.115 | Authentik (SSO), via Caddy |
portail | A | 173.209.32.99 | Site hébergé chez WHC (à ajouter dans Cloudflare, tâche OpenProject #139) |
Le DNSSEC n'est pas activé sur le domaine.
Avant Cloudflare, le DNS était chez WHC. Les noms de GitLab, de Pages et portail n'avaient pas été recopiés : ils ont continué de marcher grâce aux caches, puis sont tombés le 2026-11-04. Les anciens serveurs de WHC (ns1.whc.ca) répondent encore et permettent de retrouver ce qui manque. Pour comparer, la liste complète est dans le Zone Editor du cPanel WHC.
Jeton d'API Cloudflare
Caddy utilise un jeton d'API Cloudflare pour créer et renouveler les certificats. Il est saisi dans Services → Caddy Web Server → Paramètres généraux → onglet Fournisseur de DNS → Clé de l'API.
- Permission : Zone → DNS → Edit, limitée à la zone
formuleets.ca(modèle Edit zone DNS de Cloudflare) - Expiration : aucune. Le jeton sert à chaque renouvellement. S'il expirait, les renouvellements échoueraient sans prévenir.
- Filtrage IP : aucun. Si l'IP publique changeait, un filtrage casserait les renouvellements.
L'emplacement du jeton et des identifiants du compte Cloudflare dans Vaultwarden (collection Général a priori), et si Caddy utilise le même jeton que Nginx Proxy Manager ou un jeton à lui.
Remplacer le jeton
Si le jeton est perdu ou a fuité, va dans Cloudflare, puis My Profile → API Tokens. Sur la ligne du jeton, clique sur ⋮ → Roll. Colle le nouveau jeton dans OPNsense (onglet Fournisseur de DNS), puis clique sur Appliquer.
Cloudflare n'affiche un jeton qu'une seule fois, à sa création : range-le tout de suite dans Vaultwarden.
Les certificats
Caddy obtient un certificat Let's Encrypt par nom (gitlab.formuleets.ca, project.formuleets.ca…), plus un wildcard *.pages.formuleets.ca pour les sites GitLab Pages.
Pourquoi un vrai certificat
L'appli mobile OpenProject et les applis Bitwarden refusent les certificats auto-signés ou émis par l'autorité interne de l'AD. Avant Caddy, bitwarden.formuleets.ca utilisait un certificat de l'AD (FormuleSAE-AD-FSAE-CA) : il n'était reconnu que par les postes du domaine. Let's Encrypt est reconnu par tous les appareils, sans avertissement.
Renouvellement
Les certificats sont valides 90 jours. Caddy les renouvelle seul, environ 30 jours avant l'expiration. Il n'y a rien à faire tant que le jeton Cloudflare reste valide.
Pour vérifier un certificat depuis un poste :
echo | openssl s_client -connect 142.137.247.115:443 -servername project.formuleets.ca 2>/dev/null | openssl x509 -noout -issuer -enddate
La date notAfter doit avancer régulièrement.
Nginx Proxy Manager (ancien)
Avant Caddy, Nginx Proxy Manager (NPM, 10.194.24.51) servait project et bitwarden avec un certificat wildcard *.formuleets.ca. Depuis le 2026-11-05, plus aucun enregistrement DNS ne pointe vers lui pour ces deux services. Il sera éteint une fois vérifié qu'il ne sert plus rien.
La liste des proxy hosts encore présents dans NPM, pour savoir s'il sert autre chose avant de l'éteindre.