MHOSTMHOST

Caddy: автоматический HTTPS

Caddy — веб-сервер, который сам получает и продлевает TLS-сертификаты Let's Encrypt, без certbot и ручных cron-заданий. В этой статье вы установите Caddy на свой VPS mHost, опишете сайт в Caddyfile с автоматическим HTTPS и настроите reverse_proxy, чтобы Caddy принимал HTTPS-трафик снаружи и передавал его вашему приложению.

Что понадобится

  • VPS mHost на Linux: Ubuntu 22.04/24.04, Debian 11/12 или AlmaLinux/Rocky Linux 8/9.
  • Доступ по SSH — под root или пользователем с sudo.
  • Доменное имя, у которого A-запись указывает на IP-адрес сервера (VPS mHost работают только по IPv4, поэтому AAAA-запись не нужна).
  • Открытые порты 80 и 443 — без них Caddy не сможет получить сертификат (подробнее — в шаге 2).

Шаг 1. Проверьте, что домен указывает на сервер

Автоматический HTTPS работает только тогда, когда удостоверяющий центр (Let's Encrypt или ZeroSSL) может достучаться до сервера именно по этому домену — значит, DNS должен указывать на него ещё до запуска Caddy.

  1. Узнайте IP-адрес сервера — в панели VMmanager 6 / my.mhost.ee, либо прямо на сервере:

``bash curl -4 ifconfig.me ``

  1. Проверьте, куда указывает домен (замените example.com на свой):

``bash dig +short example.com A ``

Если команды dig нет, установите пакет с DNS-утилитами:

``bash sudo apt install -y dnsutils # Ubuntu/Debian sudo dnf install -y bind-utils # AlmaLinux/Rocky ``

  1. Сравните результат dig с IP-адресом сервера — они должны совпадать.
Важно: если вы только что поменяли DNS-запись, обновление может занять от нескольких минут до пары часов. Пока домен не указывает на сервер, Caddy не выпустит сертификат — не пытайтесь запускать Caddy до этого момента.

Шаг 2. Откройте порты 80 и 443

Порт 80 нужен для HTTP-01-проверки домена и автоматического редиректа с HTTP на HTTPS, порт 443 — для самого HTTPS и TLS-ALPN-проверки. Оба порта Caddy использует по умолчанию, в самом Caddy ничего дополнительно настраивать не нужно — но их должен пропускать файрвол сервера.

Ubuntu и Debian (ufw)

bash
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

AlmaLinux и Rocky Linux (firewalld)

bash
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
Важно: подробный разбор команд ufw и логики файрвола — в статье «Настройка файрвола UFW». Если перед сервером есть ещё один файрвол (у провайдера или в панели), порты 80 и 443 нужно открыть и там тоже.

Шаг 3. Установите Caddy

Готового рецепта VMmanager 6 для Caddy нет, поэтому ставим пакет вручную из официального репозитория. Полный список того, что можно поставить в один клик, — в статье «Готовые рецепты VMmanager 6».

Ubuntu и Debian

bash
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo chmod o+r /usr/share/keyrings/caddy-stable-archive-keyring.gpg
sudo chmod o+r /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

AlmaLinux и Rocky Linux

bash
sudo dnf install -y dnf-plugins-core
sudo dnf copr enable @caddy/caddy
sudo dnf install caddy
Совет: команды dnf copr enable и dnf install могут спросить подтверждение на включение стороннего репозитория и импорт его GPG-ключа — отвечайте y.

Пакет сам создаёт systemd-сервис и уже запускает Caddy. Включите автозапуск и проверьте статус:

bash
sudo systemctl enable --now caddy
sudo systemctl status caddy
Готово: если статус — active (running), Caddy установлен и работает (пока с пустой конфигурацией).

Шаг 4. Минимальный Caddyfile с автоматическим HTTPS

Конфигурация Caddy — это файл /etc/caddy/Caddyfile. Откройте его редактором:

bash
sudo nano /etc/caddy/Caddyfile

Замените содержимое на минимальный блок сайта — доменное имя в заголовке блока и есть всё, что нужно Caddy, чтобы включить автоматический HTTPS:

caddyfile
example.com {
    respond "Caddy on mHost works over HTTPS!"
}

Замените example.com на свой домен (тот же, что проверяли в шаге 1) и сохраните файл. Никакого certbot, отдельных сертификатов или cron для продления не нужно — при первом обращении к сайту Caddy сам получит сертификат от Let's Encrypt (а если не получится — попробует ZeroSSL) и будет продлевать его до истечения срока.

Совет: чтобы получать от Let's Encrypt уведомления на почту о проблемах с сертификатом, добавьте перед блоком сайта глобальный блок опций { email admin@example.com } — он должен идти самым первым в файле, до всех блоков сайтов.

Как применить изменения и проверить результат — в шагах 6 и 7 ниже.

Шаг 5. Пример reverse_proxy — проксирование на приложение

Если на сервере уже работает своё приложение (Node.js, Python, Java и т.д.), слушающее локальный порт, замените блок из шага 4 на такой:

caddyfile
example.com {
    reverse_proxy localhost:3000
}

Замените 3000 на порт, на котором реально слушает ваше приложение. Caddy будет принимать HTTPS-трафик снаружи и пересылать его на этот порт по обычному HTTP внутри сервера. Сохраните файл и переходите к шагу 6, чтобы применить изменения.

Совет: пусть приложение слушает 127.0.0.1 (localhost), а не 0.0.0.0, — тогда до него можно будет достучаться только через Caddy, а не напрямую по порту в обход HTTPS.

Шаг 6. Проверьте конфигурацию и перечитайте её (reload)

После любого изменения /etc/caddy/Caddyfile сначала проверьте синтаксис, затем перечитайте конфигурацию без остановки сервиса:

bash
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy

validate находит ошибки конфигурации до её применения, а reload подхватывает изменения на лету — без разрыва уже открытых соединений и без простоя сайта, в отличие от restart.

Если что-то пошло не так, посмотрите логи сервиса:

bash
sudo journalctl -u caddy -f
Важно: не используйте sudo systemctl stop caddy, а затем start, чтобы применить правки, — это вызовет простой сайта. Для изменения конфигурации всегда используйте reload.

Шаг 7. Проверьте, что HTTPS работает

bash
curl -I https://example.com

Ожидаемый результат — ответ вида HTTP/2 200 без ошибок сертификата. При самом первом обращении Caddy может на несколько секунд задержать ответ, пока получает сертификат.

Готово: если браузер показывает замок рядом с адресом сайта, а curl не жалуется на сертификат, — автоматический HTTPS настроен и работает.

Что дальше

В /etc/caddy/Caddyfile можно добавлять новые блоки для других доменов — каждый со своим reverse_proxy или другими директивами, и Caddy так же автоматически выпустит сертификат для каждого из них. После любой правки повторяйте шаг 6 (validate + reload). Порты для новых сайтов, если они отличаются от 80/443, открывайте так же, как в шаге 2, — подробнее в статье «Настройка файрвола UFW».