Les images Docker serversideup/php sont sorties en v4.6.0-beta1 avec la variable CADDY_ACME_PROFILE. Réglée sur shortlived, elle sélectionne le profil de certificats de courte durée de Let's Encrypt, le seul profil sous lequel l'autorité délivre des certificats pour des adresses IP. Un conteneur FrankenPHP joignable uniquement par IP peut donc servir du HTTPS réel sans aucun enregistrement DNS. Jay Rogers de Server Side Up a annoncé la fonctionnalité avec la bêta.

Les cas d'usage typiques : serveurs de staging, API internes derrière un VPN, serveurs de démonstration, tableaux de bord auto-hébergés. Jusqu'ici, cela signifiait des certificats auto-signés avec avertissement navigateur ou un reverse proxy détenant le vrai certificat. Let's Encrypt a rendu les certificats de 6 jours et les certificats IP généralement disponibles en janvier. Caddy gère la sélection de profil et les identifiants IP, et FrankenPHP embarque Caddy, actuellement v2.11.4.

CADDY_ACME_PROFILE est désactivée par défaut et accepte shortlived, tlsserver ou classic. Avec shortlived, Caddy demande des certificats valides 160 heures et les renouvelle tous les deux jours. Ces certificats courts n'ont pas besoin d'informations de révocation selon le CA/Browser Forum, même si le profil pointe encore vers une CRL. Activer un profil supprime le repli ZeroSSL. Le cycle de renouvellement de deux jours laisse aussi moins de marge : si un pare-feu bloque l'accès à l'API ACME, le certificat expire en quatre jours et demi environ au lieu de plusieurs semaines.

La fonctionnalité n'existe que dans les tags bêta, il faut donc épingler serversideup/php:8.4-frankenphp-v4.6.0-beta1. La configuration Compose utilise SSL_MODE: "full", CADDY_AUTO_HTTPS: "on", CADDY_ACME_PROFILE: "shortlived", CADDY_HTTPS_SERVER_ADDRESS avec l'IP et CADDY_GLOBAL_OPTIONS: "default_sni example.com". Le conteneur tourne sans privilèges sur 8080 et 8443, donc les ports 80 et 443 doivent être mappés et accessibles pour le défi ACME. Le repli default_sni est nécessaire car un client qui se connecte à une IP n'envoie pas de SNI, laissant Caddy sans nom pour choisir le certificat.

Pour IPv6, testez avant de vous y fier. Caddy n'a corrigé la gestion IPv6 des certificats IP que dans l'issue #7399, fermée en avril ; v2.11.4 inclut le correctif, mais l'IPv4 fonctionne depuis plus longtemps. Montez /config et /data en volumes : certificats et état du compte ACME y résident, et les perdre déclenche de nouvelles demandes à chaque redémarrage. Let's Encrypt autorise cinq certificats par ensemble d'identifiants sur sept jours, quelques redéploiements peuvent épuiser la semaine.

La bêta harmonise aussi TRUSTED_PROXY entre FrankenPHP, NGINX et Apache, de sorte que request()->ip() renvoie le visiteur plutôt que le proxy. Valeurs acceptées : cloudflare (défaut), sucuri, local, off, avec les plages internes de Docker également fiables. FrankenPHP gagne un répertoire caddyfile-global.d, Laravel Nightwatch un script healthcheck-nightwatch exécutant php artisan nightwatch:status, et AUTORUN_LARAVEL_SKIP_IF_NOT_FOUND permet au conteneur de se terminer proprement quand Laravel n'est pas encore installé. En tant que prerelease, cette version doit rester loin de tout ce que vous ne pouvez pas vous permettre de casser.