Un domaine personnalisé pour un projet du playground
Un projet publié sur le playground (https://jumphp.net) peut avoir sa propre adresse, par exemple monapp.example.org, servie
comme le fait bin/jumphp deploy : le site du projet (site/) à la racine ({{DOMAIN}} = le domaine), le jeu ou l'application
dans /play/. Le certificat HTTPS est obtenu tout seul, à la première visite.
Pour le propriétaire du projet
- Studio → le projet → Domaine personnalisé → le domaine → Ajouter le domaine.
- Chez l'hébergeur DNS du domaine, deux enregistrements (le studio les affiche, prêts à copier) :
monapp.example.org. CNAME apps.jumphp.net. _jumphp.monapp.example.org. TXT "jumphp-verify=<le jeton du studio>"- le CNAME pointe vers le serveur ; sans proxy (chez Cloudflare : nuage gris, « DNS seul ») : le serveur doit voir la connexion TLS pour obtenir le certificat ;
- le TXT prouve que le domaine est à vous ;
- un domaine racine (
example.orgsans sous-domaine) ne peut pas avoir de CNAME : donnez-lui les mêmes adresses IP (A / AAAA) queapps.jumphp.net.
- Vérifier le DNS (la propagation peut prendre quelques minutes ; le studio dit ce qui manque : le TXT, ou le CNAME).
- Selon la configuration du playground, l'administrateur approuve le domaine (état « En attente de l'administrateur »), ou il est en ligne dès la vérification.
- Ouvrez
https://monapp.example.org/: la première visite fait le certificat (quelques secondes).
Désactiver le domaine le coupe aussitôt (plus de certificat, plus de réponse) ; Activer le remet. Une nouvelle vérification qui échoue (le CNAME retiré) le met hors ligne. Le domaine sert toujours la version publiée (pas de brouillon, pas d'ancienne version), et rien du portail : ni studio, ni connexion, ni cookie.
Le jeu y demande ses tickets TCP à sa propre origine (https://monapp.example.org/api/tcp/ticket) et ouvre le pont
wss://monapp.example.org/tcp : rien à régler.
Pour l'administrateur du playground
Administration → Sites partenaires et domaines : tous les domaines, leur état, Vérifier le DNS, Approuver / retirer l'approbation, Bloquer (le propriétaire ne peut pas le rétablir), Supprimer.
Comment c'est servi
visiteur ──TLS (SNI monapp.example.org)──► Traefik :443 ──passthrough──► Caddy du conteneur app
(routeurs lus sur │ certificat à la demande
/api/domains/traefik) │ (on_demand_tls, ask → /api/domains/ask)
▼
Symfony : CustomDomainController (/ = site, /play/ = le projet)
- Traefik ne passe au Caddy du playground que les domaines servis : son fournisseur HTTP lit
http://jumphp-playground-internal:9180/api/domains/traefik(routeur TCPHostSNI(...)en passthrough vers le servicejumphp-playground-tls@docker, et routeur HTTP du port 80 versjumphp-playground-http@dockerpour le défi ACME HTTP et la redirection). Pas de routeurHostSNI(*)de priorité basse : dans Traefik les routeurs TCP passent avant les routeurs HTTP d'un même point d'entrée, un attrape-tout prendrait le TLS de tous les autres sites de ce Traefik. - Caddy (
docker/Caddyfile) : un blochttps://(variableCUSTOM_DOMAINS_SITE) avectls { on_demand }, eton_demand_tls { ask http://127.0.0.1:9180/api/domains/ask }: il ne demande un certificat que si le playground répond 200. L'écoute interne:9180ne répond qu'à/api/domains/asket/api/domains/traefiket n'est publiée nulle part. - Le playground :
/api/domains/ask?domain=xrépond 200 pour un domaine servi (vérifié, actif, non bloqué, approuvé si l'approbation est exigée, projet publié), 404 sinon. Les requêtes d'un domaine servi passent par leur propre pare-feu (pas de session), sans les redirections de langue du portail.
Variables (deploy/.env) :
| Variable | Défaut | |
|---|---|---|
CUSTOM_DOMAINS_SITE |
https://custom-domains.localhost (rien de servi) |
https:// pour activer |
CUSTOM_DOMAINS_TARGET |
apps.jumphp.net |
le nom vers lequel pointent les CNAME |
CUSTOM_DOMAINS_APPROVAL |
1 |
1 : l'administrateur approuve chaque domaine ; 0 : la vérification DNS suffit |
TRAEFIK_ENTRYPOINT, TRAEFIK_HTTP_ENTRYPOINT |
les points d'entrée nommés dans /api/domains/traefik |
Mise en place (une fois) : l'enregistrement apps.jumphp.net A <IP du serveur> en DNS seul, le fournisseur HTTP dans la
configuration statique de Traefik :
providers:
http:
endpoint: "http://jumphp-playground-internal:9180/api/domains/traefik"
pollInterval: "15s"
puis CUSTOM_DOMAINS_SITE=https:// dans deploy/.env et un redéploiement du playground (migrations au démarrage).