Главная/Разработка/Caddy

Установка Caddy на сервер как обратного прокси

Установка Caddy на сервер нужна, чтобы приложение в контейнере получило HTTPS без отдельной программы для сертификатов: Caddy сам выпускает сертификат Let's Encrypt, продлевает его и переводит посетителей с HTTP на HTTPS. Обратный прокси, то есть сервер, который принимает запросы из интернета и передаёт их приложению, занимает в его конфиге три строки.

6 мин чтенияДанные проверены 16 октября 2026

Ответ за 30 секунд

Для одного-трёх приложений берите Caddy: домен, строка reverse_proxy и открытые порты 80 и 443. Каталог /data должен переживать пересоздание контейнера: если сертификаты потеряются, Caddy запросит их заново и может упереться в лимиты Let's Encrypt.

Caddy занимает мало памяти: для старта хватит младшего тарифа, почасовая оплата позволяет проверить схему за сутки.

Caddy, Traefik или Nginx: какой прокси поставить

01 · 1 мин

Что делает Caddy перед приложением в контейнере#

Caddy это веб-сервер с открытым кодом под лицензией Apache 2.0, написанный на Go и поставляемый одним файлом. На сервере его ставят как обратный прокси: он слушает порты 80 и 443, а приложение прячется за ним и принимает запросы только от Caddy.

КтоПортОткуда доступен
Caddy80 и 443из интернета
Приложениенапример 3000только с самого сервера или из сети Docker

Главное отличие от Nginx: HTTPS включён по умолчанию. Если в конфиге есть публичное доменное имя, Caddy получает сертификат у Let's Encrypt или ZeroSSL, продлевает его и отправляет HTTP-запросы на HTTPS. Программа вроде Certbot рядом не нужна.

02 · 1 мин

Установка Caddy в Docker: compose-файл и Caddyfile#

  1. Направьте A-запись домена, например app.example.com, на IP сервера. Без этого сертификат не выдадут.
  2. Откройте порты 80 и 443. UDP-порт 443 нужен для HTTP/3, но сайт работает и без него.
  3. Создайте рядом два файла: compose.yaml и Caddyfile.
  4. Запустите 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 GatewayCaddy не дозвонился до приложения: оно не запущено, порт другой, или в Docker указан 127.0.0.1docker compose logs caddy, затем curl -I на адрес приложения из контейнера Caddy
Сертификат не выпускается, в журнале timeout или connection refusedПорты 80 и 443 закрыты файрволом или DNS-запись ведёт на другой IPsudo 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.

SBРедакция SelfBase · обновлено 16 октября 2026

Запустите свой сервер за пару минут

Почасовая оплата: тестовый стенд на сутки стоит десятки рублей, а не месячный тариф.

  • NVMe-диски и гарантированная доля процессора
  • Root-доступ и любой софт, от Docker до игровых серверов
  • Маркетплейс: 91 приложение в один клик
  • Бесплатный перенос проекта силами специалистов
Что выбрать