HTTPS для IP-адрес від Let's Encrypt за допомогою FrankenPHP

Перекладено ШІ 0 Laravel News 19 серпня, 2026

Тепер ви можете налаштувати повноцінний HTTPS для IP-адрес без використання DNS завдяки інтеграції FrankenPHP та Let's Encrypt. Дізнайтеся, як нові Docker-образи від Server Side Up спрощують роботу зі стейджингами та внутрішніми API.

Docker-образи serversideup/php версії v4.6.0-beta1 отримали підтримку змінної CADDY_ACME_PROFILE. Вона дозволяє вибрати профіль shortlived від Let's Encrypt — наразі це єдиний спосіб отримати SSL-сертифікат для IP-адреси. Завдяки цьому контейнер із FrankenPHP, доступний лише за IP, може працювати через повноцінний HTTPS без налаштування DNS.

Джей Роджерс із Server Side Up анонсував це оновлення у бета-релізі:

Я довго працював над цим і нарешті досяг результату:

🔐 HTTPS для IP-адрес

Це справжній прорив для селф-хостерів. DNS більше не потрібен. Усе працює завдяки Let's Encrypt та FrankenPHP.

Окрім ентузіастів, які хостять проєкти самостійно, це рішення актуальне для командних середовищ: тимчасових стейджинг-серверів, внутрішніх API за VPN, демо-стендів для клієнтів або дашбордів черг на окремих дроплетах. Всі вони часто доступні лише за IP-адресою. Раніше це означало або використання самопідписаних сертифікатів із набридливими попередженнями браузера, або встановлення реверс-проксі перед сервером.

У січні Let's Encrypt зробив 6-денні та IP-сертифікати загальнодоступними. Caddy вже підтримує вибір профілів та IP-ідентифікатори, а оскільки FrankenPHP базується на Caddy (зараз версії v2.11.4), у новій беті просто додали відповідну змінну оточення та конфігураційні снипети.

# Як працює профіль Short-Lived

Змінна CADDY_ACME_PROFILE за замовчуванням має значення off, але приймає також shortlived, tlsserver або classic. Якщо встановити shortlived, Caddy запитуватиме сертифікати терміном на 160 годин (трохи менше семи діб) і оновлюватиме їх кожні два дні.

Такий термін дії відповідає визначенню «короткочасного сертифіката підписника» (Short-Lived Subscriber Certificate). Згідно з документацією Let's Encrypt, вони не потребують інформації про відкликання. Втім, профіль все одно посилається на список відкликаних сертифікатів (CRL), хоча для таких коротких термінів це менш критично — скомпрометований ключ стане недійсним вже за кілька днів.

Налаштування змінної додає у конфігурацію Caddyfile такий фрагмент:

cert_issuer acme {
 profile shortlived
}

Варто врахувати: використання будь-якого профілю Let's Encrypt вимикає резервний варіант із ZeroSSL, який зазвичай є в образах. Також оновлення кожні два дні залишає менше часу на реакцію: якщо через зміну фаєрволу контейнер втратить доступ до ACME API, у вас буде лише чотири з половиною дні до закінчення терміну дії сертифіката, тоді як звичайний 90-денний сертифікат дав би запас у кілька тижнів.

# Налаштування

Оскільки функція доступна лише у беті, потрібно використовувати відповідний тег образу замість стабільного 8.4-frankenphp. Ось приклад конфігурації Docker Compose:

services:
  php:
    image: serversideup/php:8.4-frankenphp-v4.6.0-beta1
    ports:
      - "80:8080"
      - "443:8443"
    volumes:
      - caddy-config:/config
      - caddy-data:/data
    environment:
      SSL_MODE: "full"
      CADDY_AUTO_HTTPS: "on"
      CADDY_ACME_PROFILE: "shortlived"
      CADDY_HTTPS_SERVER_ADDRESS: "https://203.0.113.10"
      CADDY_GLOBAL_OPTIONS: "default_sni example.com"
 
volumes:
  caddy-config:
  caddy-data:

Змінна CADDY_AUTO_HTTPS: "on" вмикає автоматичний HTTPS, SSL_MODE: "full" активує редирект з HTTP на HTTPS через 308-й код, а в CADDY_HTTPS_SERVER_ADDRESS вказується IP-адреса. Контейнер працює без привілеїв root, тому слухає порти 8080 та 8443 — вони мають бути відкриті для зовнішнього світу, щоб пройти перевірку ACME.

Важливий нюанс із SNI (Server Name Indication): коли браузер з'єднується за IP, він не надсилає ім'я хоста. Через це Caddy не знає, який сертифікат вибрати. Параметр CADDY_GLOBAL_OPTIONS: "default_sni example.com" дозволяє встановити ідентичність за замовчуванням для таких з'єднань.

Для роботи через IPv6 краще провести додаткові тести. Хоча Caddy v2.11.4 вже має відповідні виправлення, підтримка IPv4 наразі вважається стабільнішою.

Також обов'язково монтуйте директорії /config та /data у volumes. Там зберігаються стани ACME-акаунтів та самі сертифікати. Без цього контейнер запитуватиме новий сертифікат після кожного перезапуску, що швидко призведе до блокування через ліміти Let's Encrypt (дозволено лише 5 ідентичних сертифікатів на тиждень).

# Інші оновлення бети

У версії v4.6.0-beta1 змінна TRUSTED_PROXY тепер працює ідентично для FrankenPHP, NGINX та Apache. Це гарантує, що request()->ip() повертатиме IP відвідувача, а не проксі-сервера. Підтримуються значення cloudflare (за замовчуванням), sucuri, local або off. Також у FrankenPHP з'явилася директорія caddyfile-global.d для власних глобальних конфігурацій.

Для моніторингу Laravel Nightwatch додали скрипт healthcheck-nightwatch, який можна використовувати в HEALTHCHECK контейнера. А параметр AUTORUN_LARAVEL_SKIP_IF_NOT_FOUND дозволяє контейнеру з увімкненим AUTORUN_ENABLED коректно завершувати роботу, якщо Laravel ще не встановлено (наприклад, до першого composer install), замість того, щоб видавати помилку.

Оскільки це пререліз, не варто використовувати його на критично важливих проєктах. Детальніше про зміни можна дізнатися на сторінці релізу та в розділі налаштування SSL документації Server Side Up.

Популярні

Інше, що варто прочитати

79 Оновлено 26 червня, 2026

Laravel Boost — ваш стартовий набір для програмування з використанням штучного інтелекту

Вперше у світі Laravel з'являється можливість, яка значно спростить ваше повсякденне програмування завдяки новому пакету Laravel Boost. Читайте статтю, щоб дізнатися, як посилена інтеграція штучного інтелекту може підвищити ефективність вашої роботи та оптимізувати створення проектів у Laravel

19 Оновлено 26 червня, 2026

Intervention Image: потужний інструмент для роботи з зображеннями у Laravel

Досліджуйте потужний пакет Intervention Image для PHP, який виводить редагування зображень на новий рівень з оновленою версією 3. Чи готові ви дізнатися, які нові можливості та функції чекають на вас у цьому інструменті

10 Оновлено 26 червня, 2026

Остаточний посібник з вебхуків у Laravel

Сучасні веб-додатки вимагають миттєвого обміну інформацією, і вебхуки стають незамінними помічниками у цьому процесі. Пориньте у світ вебхуків у Laravel і дізнайтеся, як легко реалізувати цю технологію у своїх проєктах, забезпечуючи безпеку та продуктивність