Главная/Разработка/Caddy
Установка Caddy на сервер как обратного прокси
Установка Caddy на сервер нужна, чтобы приложение в контейнере получило HTTPS без отдельной программы для сертификатов: Caddy сам выпускает сертификат Let's Encrypt, продлевает его и переводит посетителей с HTTP на HTTPS. Обратный прокси, то есть сервер, который принимает запросы из интернета и передаёт их приложению, занимает в его конфиге три строки.
Ответ за 30 секунд
Для одного-трёх приложений берите Caddy: домен, строка reverse_proxy и открытые порты 80 и 443. Каталог /data должен переживать пересоздание контейнера: если сертификаты потеряются, Caddy запросит их заново и может упереться в лимиты Let's Encrypt.
Caddy занимает мало памяти: для старта хватит младшего тарифа, почасовая оплата позволяет проверить схему за сутки.
Caddy, Traefik или Nginx: какой прокси поставить80 и 443порты, которые нужно открыть
3 строкихватает на сайт с HTTPS
/dataкаталог сертификатов в Docker
01 · 1 мин
Что делает Caddy перед приложением в контейнере#
Caddy это веб-сервер с открытым кодом под лицензией Apache 2.0, написанный на Go и поставляемый одним файлом. На сервере его ставят как обратный прокси: он слушает порты 80 и 443, а приложение прячется за ним и принимает запросы только от Caddy.
| Кто | Порт | Откуда доступен |
|---|---|---|
| Caddy | 80 и 443 | из интернета |
| Приложение | например 3000 | только с самого сервера или из сети Docker |
02 · 1 мин
Установка Caddy в Docker: compose-файл и Caddyfile#
- Направьте A-запись домена, например
app.example.com, на IP сервера. Без этого сертификат не выдадут. - Откройте порты 80 и 443. UDP-порт 443 нужен для HTTP/3, но сайт работает и без него.
- Создайте рядом два файла:
compose.yamlиCaddyfile. - Запустите
docker compose up -dи откройте адрес в браузере.
services:
caddy:
image: caddy:2
restart: unless-stopped
ports: ["80:80", "443:443", "443:443/udp"]
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
whoami:
image: traefik/whoami
restart: unless-stopped
volumes:
caddy_data:
caddy_config:
app.example.com {
reverse_proxy whoami:80
}
Контейнер whoami нужен для проверки: он отвечает списком заголовков запроса. Когда схема заработает, замените его своим приложением и укажите его порт. Имя whoami работает, потому что Caddy и приложение лежат в одной сети compose.
Без Docker Caddy ставится пакетом из официального репозитория (инструкция для Debian и Ubuntu на caddyserver.com/docs/install). Конфиг лежит в /etc/caddy/Caddyfile, а sudo systemctl reload caddy применяет правки без остановки сайта. Приложение тогда публикуют на локальном адресе, 127.0.0.1:3000:3000, и в Caddyfile пишут reverse_proxy 127.0.0.1:3000.
03 · 1 мин
Как Caddy выпускает и продлевает сертификат для домена#
По документации Caddy сертификат выпустится сам, если выполнены пять условий: A или AAAA-запись домена указывает на сервер, порты 80 и 443 открыты снаружи, Caddy может занять эти порты, каталог данных доступен для записи и не пропадает, а домен упомянут в конфиге.
Проверка владения идёт двумя способами: через порт 80 (HTTP-проверка) или через порт 443 (TLS-ALPN). Оба включены по умолчанию. Продление Caddy делает в фоне сам, а при сбое пробует снова: сначала другой тип проверки, потом второго издателя (Let's Encrypt, затем ZeroSSL), затем с нарастающей паузой до 30 дней.
Пока вы отлаживаете настройку, переключите Caddy на тестовый сервер Let's Encrypt, у которого нет жёстких лимитов. Браузер покажет такой сертификат как недоверенный, это нормально:
{
acme_ca https://acme-staging-v02.api.letsencrypt.org/directory
}
app.example.com {
reverse_proxy whoami:80
}
Том caddy_data нельзя терять
В нём лежат сертификаты и ключи. Если запускать Caddy без тома или удалять его при каждом обновлении, он каждый раз заказывает сертификаты заново, а лимиты Let's Encrypt могут закрыть выпуск на срок до недели.
04 · 1 мин
Ошибки Caddy: 502, неверный Host и закрытый порт 80#
| Что видите | Причина | Что проверить |
|---|---|---|
| 502 Bad Gateway | Caddy не дозвонился до приложения: оно не запущено, порт другой, или в Docker указан 127.0.0.1 | docker compose logs caddy, затем curl -I на адрес приложения из контейнера Caddy |
| Сертификат не выпускается, в журнале timeout или connection refused | Порты 80 и 443 закрыты файрволом или DNS-запись ведёт на другой IP | sudo ufw status и dig +short app.example.com |
| Caddy не стартует: address already in use | Порт 80 уже занял Nginx или Apache, поставленный вместе с системой | sudo ss -tlnp | grep ':80 ', затем остановите чужую службу |
| Приложение отвечает 404 или чужой страницей | Ему нужен другой заголовок Host | Выведите заголовки через whoami и сравните с ожиданиями приложения |
Про локальный адрес в Docker: внутри контейнера Caddy слово 127.0.0.1 означает сам Caddy, а не сервер. Если приложение работает на хосте, добавьте в сервис extra_hosts: ["host.docker.internal:host-gateway"] и пишите reverse_proxy host.docker.internal:3000. Если приложение в compose, пишите имя его сервиса.
Заголовок Host Caddy передаёт приложению в том виде, в каком его прислал браузер. Если внешний сервис за прокси требует свой адрес, добавьте строку header_up Host {upstream_hostport} внутри блока reverse_proxy. Заголовки X-Forwarded-For и X-Forwarded-Proto Caddy выставляет сам.
Если порт 80 закрыт, но 443 открыт, сертификат всё равно может выпуститься через TLS-ALPN, а вот переход с HTTP на HTTPS работать не будет. Проверить файл перед перезагрузкой можно командой caddy validate --config /etc/caddy/Caddyfile, в Docker перечитать его без остановки: docker compose exec caddy caddy reload --config /etc/caddy/Caddyfile.
05 · 1 мин
Несколько сайтов и пароль на панель в одном Caddyfile#
Каждый домен это отдельный блок. WebSocket, нужные таким приложениям, как n8n, Caddy проксирует без дополнительных настроек. Для панелей без своего входа добавьте пароль директивой basic_auth, хэш получают командой caddy hash-password.
n8n.example.com {
reverse_proxy n8n:5678
}
panel.example.com {
basic_auth {
admin ВСТАВЬТЕ_ХЭШ
}
reverse_proxy 127.0.0.1:9000
}
Если контейнеров много и они меняются каждый день, ручной список надоест: тогда подойдёт Traefik, который берёт маршруты из меток контейнеров.
Инструмент · 1 мин
Caddy, Traefik или Nginx: какой прокси поставить#
Выбор зависит от того, сколько у вас приложений и какой конфиг уже есть. Ответьте на два вопроса ниже.
Caddy, Traefik или Nginx для вашего сервера
Два ответа, и подсказка назовёт программу с готовой страницей на этом сайте
07 · 1 мин
Вопросы об установке Caddy#
Нужен ли Certbot, если на сервере стоит Caddy?
Нет. Caddy сам запрашивает сертификат у Let's Encrypt или ZeroSSL и продлевает его, пока работает и видит порты 80 и 443. Certbot нужен только Nginx или Apache.
Почему Caddy в Docker выдаёт 502 для приложения на localhost?
В контейнере localhost указывает на сам Caddy. Укажите имя сервиса из compose-файла или адрес host.docker.internal с записью host-gateway в extra_hosts.
Как проверить, что Caddy выпустил сертификат?
Откройте домен в браузере или выполните curl -I https://домен: должен прийти ответ без ошибки сертификата. Причину отказа ищите в журнале командой docker compose logs caddy.
Можно ли держать Caddy и Nginx на одном сервере?
Да, но порты 80 и 443 займёт только один из них. Второй переведите на другой порт, например 8080, и пустите к нему трафик через первый.
Почему этому можно верить
Как мы проверяли
Источники цифр на этой странице: VPS и VDS серверы Таймвеб Клауд, timeweb.cloud/services/vds-vps, проверено 14 октября 2026; Маркетплейс приложений Таймвеб Клауд, timeweb.cloud/marketplace, проверено 14 октября 2026; Документация Caddy: Automatic HTTPS, caddyserver.com/docs/automatic-https, проверено 15 октября 2026.
Запустите свой сервер за пару минут
Почасовая оплата: тестовый стенд на сутки стоит десятки рублей, а не месячный тариф.
- NVMe-диски и гарантированная доля процессора
- Root-доступ и любой софт, от Docker до игровых серверов
- Маркетплейс: 91 приложение в один клик
- Бесплатный перенос проекта силами специалистов