# Caddy

> Веб-сервер и обратный прокси на Go с автоматическим HTTPS по умолчанию — сам получает и продлевает сертификаты, поддерживает HTTP/3 и настраивается простым Caddyfile или JSON API.

Источник: https://llmdocs.ru/wiki/caddy/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Тип**: веб-сервер и обратный прокси
- **Автор**: Мэтт Холт
- **Первый выпуск**: 2015
- **Caddy 2**: май 2020
- **Язык**: Go
- **Лицензия**: Apache 2.0
- **Ключевая особенность**: автоматический HTTPS (ACME) по умолчанию
- **Конфигурация**: Caddyfile, JSON, REST API администрирования
**Caddy** — веб-сервер и [обратный прокси](https://llmdocs.ru/wiki/reverse-proxy.md), написанный на [Go](https://llmdocs.ru/wiki/go.md). Его главная особенность — **автоматический HTTPS**: достаточно указать в конфигурации доменное имя, и Caddy сам получит сертификат по протоколу ACME (по умолчанию у [Let's Encrypt](https://llmdocs.ru/wiki/lets-encrypt-acme.md) и ZeroSSL), настроит [TLS](https://llmdocs.ru/wiki/tls.md) с безопасными параметрами, включит перенаправление с HTTP на HTTPS и будет продлевать сертификат без участия человека.[2]

Caddy ценят за простую конфигурацию и разумные значения по умолчанию: HTTP/2 и HTTP/3, современные шифры, сжатие — всё работает «из коробки». Он распространяется как один бинарный файл без зависимостей.

## История

Мэтт Холт выпустил Caddy в 2015 году; это был первый веб-сервер, включавший HTTPS автоматически и по умолчанию. В мае 2020 года вышла полностью переписанная версия **Caddy 2** с модульной архитектурой, внутренней конфигурацией в формате JSON и API для изменения настроек на лету.[6] Проект распространяется под лицензией Apache 2.0.

## Caddyfile

Основной способ настройки — файл **Caddyfile** с лаконичным синтаксисом:[3]

```caddyfile
# статический сайт с автоматическим HTTPS
example.com {
    root * /var/www/example
    file_server
    encode zstd gzip
}

# обратный прокси к приложению с балансировкой
api.example.com {
    reverse_proxy 127.0.0.1:8001 127.0.0.1:8002 {
        lb_policy least_conn
        health_uri /health
    }
}

# несколько путей на одном домене
app.example.com {
    handle /api/* {
        reverse_proxy localhost:8000
    }
    handle {
        root * /srv/frontend
        try_files {path} /index.html      # одностраничное приложение
        file_server
    }
}
```

Сравните с аналогичной конфигурацией [nginx](https://llmdocs.ru/wiki/nginx.md): не нужно указывать пути к сертификатам, слушать порт 80 для перенаправления и вручную передавать заголовки `X-Forwarded-*` — `reverse_proxy` делает это сам.[4]

```bash
caddy run --config Caddyfile       # запуск в терминале
caddy reload --config Caddyfile    # применить изменения без простоя
caddy fmt --overwrite Caddyfile    # отформатировать файл
caddy reverse-proxy --from example.com --to localhost:8000   # прокси одной командой
```

## Автоматический HTTPS

Для каждого публичного доменного имени в конфигурации Caddy:

1. получает сертификат по ACME — через проверку HTTP-01 или TLS-ALPN-01, а при подключённом модуле DNS-провайдера — DNS-01 (нужно для wildcard);
2. хранит сертификаты и ключи в своём каталоге данных;
3. продлевает их заранее и повторяет попытки при сбоях;
4. включает перенаправление HTTP → HTTPS и HSTS-подобные настройки.

Для `localhost` и внутренних имён Caddy создаёт **собственный локальный центр сертификации** и выпускает доверенные сертификаты для разработки, предложив установить корневой сертификат в систему. Режим **On-Demand TLS** выпускает сертификаты в момент первого обращения — удобно для платформ, где клиенты подключают свои домены.

Условие для публичного сертификата — домен должен указывать на сервер ([запись A или AAAA](https://llmdocs.ru/wiki/dns-records.md)), а порты 80 и 443 должны быть доступны из интернета.

## JSON и API

Внутри Caddy вся конфигурация — документ JSON; Caddyfile лишь преобразуется в него адаптером. Через административный API на `localhost:2019` конфигурацию можно читать и менять на лету, без перезапуска, что удобно для автоматизации и платформ.[5]

```bash
curl localhost:2019/config/                 # текущая конфигурация
caddy adapt --config Caddyfile --pretty     # посмотреть JSON, полученный из Caddyfile
```

## Модули

Возможности расширяются модулями на Go, которые вкомпилировываются в бинарный файл с помощью утилиты xcaddy или выбираются на странице загрузки: DNS-провайдеры для ACME, ограничение частоты запросов, аутентификация, кэш, интеграция с [Docker](https://llmdocs.ru/wiki/docker.md) через метки контейнеров.

```bash
xcaddy build --with github.com/caddy-dns/cloudflare
```

## Caddy и nginx

| | Caddy | nginx |
|---|---|---|
| HTTPS | автоматически | вручную или через Certbot |
| Конфигурация | короткий Caddyfile, JSON API | развитый, но многословный синтаксис |
| HTTP/3 | по умолчанию | требует настройки |
| Изменение на лету | API | reload с перечитыванием файлов |
| Экосистема и примеры | меньше | огромная |
| Производительность | высокая, обычно достаточная | максимальная, особенно для статики |

Caddy — удачный выбор для небольших и средних проектов, личных серверов, сред разработки и платформ с множеством доменов; nginx — когда нужна максимальная производительность, тонкая настройка или совместимость с существующей инфраструктурой. Полное описание — в документации Caddy.[1]

## См. также

- [nginx](https://llmdocs.ru/wiki/nginx.md)
- [Обратный прокси (reverse proxy)](https://llmdocs.ru/wiki/reverse-proxy.md)
- [Let's Encrypt и ACME](https://llmdocs.ru/wiki/lets-encrypt-acme.md)
- [TLS](https://llmdocs.ru/wiki/tls.md)
- [QUIC](https://llmdocs.ru/wiki/quic.md)

## Источники

1. [Caddy — документация](https://caddyserver.com/docs/)
2. [Caddy — Automatic HTTPS](https://caddyserver.com/docs/automatic-https)
3. [Caddy — The Caddyfile](https://caddyserver.com/docs/caddyfile)
4. [Caddy — reverse_proxy directive](https://caddyserver.com/docs/caddyfile/directives/reverse_proxy)
5. [Caddy — API](https://caddyserver.com/docs/api)
6. [caddyserver/caddy — GitHub](https://github.com/caddyserver/caddy)
