Установка Caddy на сервер как обратного прокси: коротко и с данными
Конспект страницы: 7 разделов коротко, данные на 14 октября 2026 и ответы на 4 вопроса. Полный разбор с примерами: Установка Caddy на сервер как обратного прокси.
Коротко
Установка Caddy на сервер нужна, чтобы приложение в контейнере получило HTTPS без отдельной программы для сертификатов: Caddy сам выпускает сертификат Let's Encrypt, продлевает его и переводит посетителей с HTTP на HTTPS. Обратный прокси, то есть сервер, который принимает запросы из интернета и передаёт их приложению, занимает в его конфиге три строки. Для одного-трёх приложений берите Caddy: домен, строка reverse_proxy и открытые порты 80 и 443.
Конспект по разделам
Что делает Caddy перед приложением в контейнере
Caddy это веб-сервер с открытым кодом под лицензией Apache 2.0, написанный на Go и поставляемый одним файлом. На сервере его ставят как обратный прокси: он слушает порты 80 и 443, а приложение прячется за ним и принимает запросы только от Caddy. Главное отличие от Nginx: HTTPS включён по умолчанию.
Установка Caddy в Docker: compose-файл и Caddyfile
Контейнер whoami нужен для проверки: он отвечает списком заголовков запроса. Когда схема заработает, замените его своим приложением и укажите его порт. Имя whoami работает, потому что Caddy и приложение лежат в одной сети compose.
- Направьте A-запись домена, например app.example.com, на IP сервера.
- Откройте порты 80 и 443.
- Создайте рядом два файла: compose.yaml и Caddyfile.
- Запустите docker compose up -d и откройте адрес в браузере.
Как Caddy выпускает и продлевает сертификат для домена
По документации Caddy сертификат выпустится сам, если выполнены пять условий: A или AAAA-запись домена указывает на сервер, порты 80 и 443 открыты снаружи, Caddy может занять эти порты, каталог данных доступен для записи и не пропадает, а домен упомянут в конфиге. Проверка владения идёт двумя способами: через порт 80 (HTTP-проверка) или через порт 443 (TLS-ALPN). Оба включены по умолчанию.
Ошибки Caddy: 502, неверный Host и закрытый порт 80
Про локальный адрес в Docker: внутри контейнера Caddy слово 127.0.0.1 означает сам Caddy, а не сервер. Если приложение работает на хосте, добавьте в сервис extra_hosts: ["host.docker.internal:host-gateway"] и пишите reverse_proxy host.docker.internal:3000. Если приложение в compose, пишите имя его сервиса.
Несколько сайтов и пароль на панель в одном Caddyfile
Каждый домен это отдельный блок. WebSocket, нужные таким приложениям, как n8n, Caddy проксирует без дополнительных настроек. Для панелей без своего входа добавьте пароль директивой basic_auth, хэш получают командой caddy hash-password.
Caddy, Traefik или Nginx: какой прокси поставить
Выбор зависит от того, сколько у вас приложений и какой конфиг уже есть. Ответьте на два вопроса ниже. Два ответа, и подсказка назовёт программу с готовой страницей на этом сайте
Запустите свой сервер за пару минут
Почасовая оплата: тестовый стенд на сутки стоит десятки рублей, а не месячный тариф.
- NVMe-диски и гарантированная доля процессора
- Root-доступ и любой софт, от Docker до игровых серверов
- Маркетплейс: 91 приложение в один клик
- Бесплатный перенос проекта силами специалистов
Данные
| Кто | Порт | Откуда доступен |
|---|---|---|
| Caddy | 80 и 443 | из интернета |
| Приложение | например 3000 | только с самого сервера или из сети Docker |
| Что видите | Причина | Что проверить |
|---|---|---|
| 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 и сравните с ожиданиями приложения |
Данные на 14 октября 2026.
Вопросы и ответы
Нужен ли 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, и пустите к нему трафик через первый.