Caddy: автоматический HTTPS
Caddy — веб-сервер, который сам получает и продлевает TLS-сертификаты Let's Encrypt, без certbot и ручных cron-заданий. В этой статье вы установите Caddy на свой VPS ForestsNet Cloud, опишете сайт в Caddyfile с автоматическим HTTPS и настроите reverse_proxy, чтобы Caddy принимал HTTPS-трафик снаружи и передавал его вашему приложению.
Что понадобится
- VPS ForestsNet Cloud на Linux: Ubuntu 22.04/24.04, Debian 11/12 или AlmaLinux/Rocky Linux 8/9.
- Доступ по SSH — под root или пользователем с sudo.
- Доменное имя, у которого A-запись указывает на IP-адрес сервера (VPS ForestsNet Cloud работают только по IPv4, поэтому AAAA-запись не нужна).
- Открытые порты 80 и 443 — без них Caddy не сможет получить сертификат (подробнее — в шаге 2).
Шаг 1. Проверьте, что домен указывает на сервер
Автоматический HTTPS работает только тогда, когда удостоверяющий центр (Let's Encrypt или ZeroSSL) может достучаться до сервера именно по этому домену — значит, DNS должен указывать на него ещё до запуска Caddy.
- Узнайте IP-адрес сервера — в панели VMmanager 6 / my.forestsnet.cloud, либо прямо на сервере:
``bash curl -4 ifconfig.me ``
- Проверьте, куда указывает домен (замените
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 ``
- Сравните результат
digс IP-адресом сервера — они должны совпадать.
⚠️ Важно: если вы только что поменяли DNS-запись, обновление может занять от нескольких минут до пары часов. Пока домен не указывает на сервер, Caddy не выпустит сертификат — не пытайтесь запускать Caddy до этого момента.
Шаг 2. Откройте порты 80 и 443
Порт 80 нужен для HTTP-01-проверки домена и автоматического редиректа с HTTP на HTTPS, порт 443 — для самого HTTPS и TLS-ALPN-проверки. Оба порта Caddy использует по умолчанию, в самом Caddy ничего дополнительно настраивать не нужно — но их должен пропускать файрвол сервера.
Ubuntu и Debian (ufw)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcpAlmaLinux и Rocky Linux (firewalld)
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
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 caddyAlmaLinux и Rocky Linux
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. Включите автозапуск и проверьте статус:
sudo systemctl enable --now caddy
sudo systemctl status caddy✅ Готово: если статус — active (running), Caddy установлен и работает (пока с пустой конфигурацией).
Шаг 4. Минимальный Caddyfile с автоматическим HTTPS
Конфигурация Caddy — это файл /etc/caddy/Caddyfile. Откройте его редактором:
sudo nano /etc/caddy/CaddyfileЗамените содержимое на минимальный блок сайта — доменное имя в заголовке блока и есть всё, что нужно Caddy, чтобы включить автоматический HTTPS:
example.com {
respond "Caddy on ForestsNet Cloud works over HTTPS!"
}Замените example.com на свой домен (тот же, что проверяли в шаге 1) и сохраните файл. Никакого certbot, отдельных сертификатов или cron для продления не нужно — при первом обращении к сайту Caddy сам получит сертификат от Let's Encrypt (а если не получится — попробует ZeroSSL) и будет продлевать его до истечения срока.
ℹ️ Совет: чтобы получать от Let's Encrypt уведомления на почту о проблемах с сертификатом, добавьте перед блоком сайта глобальный блок опций { email [email protected] } — он должен идти самым первым в файле, до всех блоков сайтов.
Как применить изменения и проверить результат — в шагах 6 и 7 ниже.
Шаг 5. Пример reverse_proxy — проксирование на приложение
Если на сервере уже работает своё приложение (Node.js, Python, Java и т.д.), слушающее локальный порт, замените блок из шага 4 на такой:
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 сначала проверьте синтаксис, затем перечитайте конфигурацию без остановки сервиса:
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddyvalidate находит ошибки конфигурации до её применения, а reload подхватывает изменения на лету — без разрыва уже открытых соединений и без простоя сайта, в отличие от restart.
Если что-то пошло не так, посмотрите логи сервиса:
sudo journalctl -u caddy -f⚠️ Важно: не используйте sudo systemctl stop caddy, а затем start, чтобы применить правки, — это вызовет простой сайта. Для изменения конфигурации всегда используйте reload.
Шаг 7. Проверьте, что HTTPS работает
curl -I https://example.comОжидаемый результат — ответ вида HTTP/2 200 без ошибок сертификата. При самом первом обращении Caddy может на несколько секунд задержать ответ, пока получает сертификат.
✅ Готово: если браузер показывает замок рядом с адресом сайта, а curl не жалуется на сертификат, — автоматический HTTPS настроен и работает.
Что дальше
В /etc/caddy/Caddyfile можно добавлять новые блоки для других доменов — каждый со своим reverse_proxy или другими директивами, и Caddy так же автоматически выпустит сертификат для каждого из них. После любой правки повторяйте шаг 6 (validate + reload). Порты для новых сайтов, если они отличаются от 80/443, открывайте так же, как в шаге 2, — подробнее в статье «Настройка файрвола UFW».