Aller au contenu principal

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ù :

  1. Cloudflare (notre DNS) répond que project.formuleets.ca correspond à 142.137.247.115, notre IP publique.
  2. Le navigateur contacte cette IP. Elle est portée par OPNsense, sur son interface DMZ, et c'est Caddy qui répond.
  3. 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é. Pour project, c'est OpenProject sur 10.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)
ServiceAdresse publiqueCaddy l'envoie vers
GitLabgitlab.formuleets.ca, gitlab2.formuleets.cahttp://192.168.1.10:80
Registry Docker de GitLabregistry.gitlab.formuleets.cahttp://192.168.1.10:5050
GitLab Pagespages.formuleets.ca, *.pages.formuleets.cahttp://192.168.1.10:80
Cette documentation (GitLab Pages, domaine personnalisé)doc.formuleets.cahttp://192.168.1.10:8091
OpenProjectproject.formuleets.cahttp://10.194.24.48:8080
Vaultwardenbitwarden.formuleets.cahttp://10.194.24.45:8000
Authentik (SSO)auth.formuleets.cahttp://10.194.24.61:9000
OpenProject et Vaultwarden sont joignables depuis Internet

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​

OngletCe qu'on y trouve
Paramètres générauxCaddy activé, adresse courriel pour Let's Encrypt
Fournisseur de DNSCloudflare, le jeton d'API, Résolveurs = 1.1.1.1
Proxy inversé → DomainesUn domaine par nom public, tous en https:// avec Défi DNS-01 coché
Proxy inversé → ManipulateursPour chaque domaine, vers quelle machine et quel port envoyer les requêtes
Proxy inversé → AccèsLa liste interne (10.0.0.0/8, 192.168.0.0/16) qui protège /admin de Vaultwarden
Proxy inversé → En-têtesL'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 de bitwarden. 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.
  • /admin bloqué depuis l'extérieur. Un 2ᵉ manipulateur sur bitwarden.formuleets.ca, avec le chemin /admin*, n'accepte que la liste d'accès interne. Depuis Internet, la connexion est coupée. Caddy traite toujours le chemin le plus précis en premier : /admin passe 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.com
  • javier.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 vers formuleets.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.
Ne passe pas formuleets.ca ni mail en Proxied

Ça couperait la réception des courriels de toute l'équipe.

Enregistrements existants​

NomTypeCibleUsage
formuleets.caA173.209.32.99Site web (WHC)
www, mail, ftpCNAMEformuleets.caSite, courriel, FTP (WHC)
cpanel, whm, webmail, webdisk, cpcalendars, cpcontactsA173.209.32.99Services de l'hébergement WHC
formuleets.caMXformuleets.caRéception des courriels
formuleets.ca, default._domainkey, _cpanel-dcv-test-recordTXT—SPF, DKIM, validation cPanel
projectA142.137.247.115OpenProject via Caddy
bitwardenA142.137.247.115Vaultwarden via Caddy
gitlab, registry.gitlabA142.137.247.115GitLab et son registry Docker, via Caddy
gitlab2, registry.gitlab2A142.137.247.115Ancien nom de GitLab, gardé pour les clones existants
pages, *.pagesA142.137.247.115GitLab Pages, via Caddy
docA142.137.247.115Cette documentation (GitLab Pages), via Caddy
_gitlab-pages-verification-code.docTXTcode donné par GitLabPreuve pour GitLab que doc nous appartient : à garder, GitLab revérifie régulièrement
authA142.137.247.115Authentik (SSO), via Caddy
portailA173.209.32.99Site hébergé chez WHC (à ajouter dans Cloudflare, tâche OpenProject #139)

Le DNSSEC n'est pas activé sur le domaine.

Enregistrements oubliés lors du passage à Cloudflare

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.
À compléter

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.

À compléter

La liste des proxy hosts encore présents dans NPM, pour savoir s'il sert autre chose avant de l'éteindre.