Caddy представляет собой обратный прокси-сервер (обратный прокси-сервер). Написанный на языке Go, это полностью бесплатный проект с открытым исходным кодом с лицензией Apache 2.0.
Caddy поддерживает HTTP/2, HTTP и HTTPS, позволяет автоматически получать и обновлять сертификаты Let's Encrypt. Обладает кроссплатформенностью: можно установить на любую ОС, а также поддерживает разные архитектуры процессоров. Также Caddy можно использовать просто в Docker-контейнере.
Альтернативы Кэдди:
- Nginx (ТОП-1 в мире, большое сообщество, множество инструкций, выдерживает большую нагрузку, огромное количество функций и тонких настроек).
- Traefik (интересный проект, много интересных фишек для удобства и автоматизаций).
Основные особенности Caddy, на мой взгляд:
- Самая простая и понятная настройка, легко читается и пишется конфигурационный файл, минималистичность.
- Автоматическое получение и обновление SSL-сертификатов.
- Использует HTTPS по умолчанию.
- Настройка по API. Принимаем меры по настройке Caddy с помощью REST API запросов в JSON-формате. Хорошо подходит для настроек автоматизации и дает дополнительные возможности в конфигурации.
- Плагины. Из коробки Caddy работает со звуковым набором, адаптером для работы прокси-сервера, но с помощью плагинов можно легко внедрить дополнительные функции. Например, авторизация страниц, интеграция с DNS-провайдерами (Cloudflare) и т.п.
VDS и VPS
биллингом по всему миру: Россия, Азия и Европа.
Ознакомительный запуск
Для экспериментов я взял самый простой сервер на Timeweb Cloud c Ubuntu 22.04.
Установка по документации с официального сайта:
Проверяю активность сервиса:
Проверка версии:
> v2.7.4
Для проверки откройте в браузере страницу по IP-адресу хоста:
Далее пошагово выполним предложенные рекомендации Caddy по настройке.
Шаг 1. Создать доменное имя и направить на адрес сервера
Создаю в DNS доменное имя 2 уровня: caddy.akmalov.com.
Указываю ему «белый» IP-адрес созданного сервера.
Шаг 2. Изменить путь и использовать свои статические файлы для отображения
Для создания своего index.html по указанному пути /var/www/html/.
Добавляю картинку volk.jpg:
Шаг 3. В конфигурации измените порт :80 на свое доменное имя
Открываю для редактирования структуру файла:
Удаляю все лишнее, чтобы конфиг выглядел следующим образом:
Шаг 4. Перезапустить Caddy
Перезапускаю с помощью команды:
Открываю браузер по доменному имени caddy.akmalov.com.
Страница сразу открывается по HTTPS с доверенным сертификатом — и все это в четырех строках схемы, в которых все минимально, красиво и понятно.
Запуск Caddy в docker-compose
Допустим, нам нужно выделить сервис и перенаправить трафик.
Мне очень нравится использовать все в контейнерах, без установки дополнительных пакетов, зависимостей и запускать одной кнопкой. Поэтому удаляю сервис Caddy и устанавливаю Docker:
Для начала повторяю то же самое, что было выше, но уже использовалось в контейнере.
Создаю директорию по пути /srv/caddy и копирую туда статические файлы и конфигурацию файлов.
Создаю docker-compose.yml с такой конфигурацией:
Здесь я с помощью томов перекидываю файлы в те же знакомые каталоги, чтобы ничего не сохранить в конфигурации.
После этого запускаю и проверяю:
Также хочу показать, как еще можно защитить страницу, используя BasicAuth и пару строк конфигурации.
Для этого отредактируем Caddyfile следующим образом, добавив Basicauth * {логин-пароль}:
Логин и пароль пользователя можно сгенерировать в консоли или воспользоваться онлайн-генераторами .htpasswd (алгоритм по умолчанию: bcrypt).
Теперь при открытии страницы появляются окна аутентификации.
Теперь в docker-compose подниму какой-нибудь сервис с веб-интерфейсом, например, Grafana.
Порты закомментированы, т.к. Grafana и Caddy присоединяются к одной группе и могут общаться по имени сервисов, внешний проброс портов не нужен. Если необходимо обращаться не только по доменному имени, но и по локальному IP-хостеру и порту, то нужно раскомментировать эти строки.
Для сервиса Grafana создаю в DNS еще одно доменное имя второго уровня, например test.akmalov.com, и добавляю в конфигурацию Caddyfile:
Чтобы не запутаться, еще раз покажу структуру того, что получилось:
В директории сайта два файла:
- index.html (главная страница сайта).
- volk.jpg (картинка).
В docker-compose.yml поднимается два сервиса:
- Кэдди для проксирования и получения сертификатов.
- Grafana как отдельное веб-приложение.
Caddyfile (файл с конфигурацией) — через тома продаем внутренний контейнер по пути /etc/caddy/Caddyfile.
В формулировке таких правил:
- caddy.akmalov.com — выдаем статические файлы из директории сайта.
- test.akmalov.com — перенаправляем в Grafana.
Для проверки того, что новое доменное имя ведет на данном хосте, проверяем DNS-записи:
Если всё получится, можно проверить в браузере.
Проверка в браузере по доменному имени test.akmalov.com — открывается страница входа в панель Grafana).
Используйте Caddy на серверах Timeweb Cloud
477 ₽/мес
657 ₽/мес
Заключение
В этой статье я привел простейшие схемы для ознакомления, но в документации также можно почитать, например, про балансировку нагрузки для распределения трафика по разным хостам, а также добавление проверки работоспособности для проверки работоспособности хостов, как обрезать, добавить или изменить заголовки (заголовок) . ) в запросах и т.д.
Я не погружаюсь в конфигурацию слишком глубоко, так как для меня Кэдди — это в первую очередь про простоту. Конфигурации, показанные в статье, — очень удобные и понятные, и, казалось бы, куда проще. Но оказывается, есть куда.
Например , если на этой же облачной машине сервису мне потребовалось бы поднять только Grafana , сертификат получить и закрыть за прокси-сервером, тогда файл конфигурации Caddyfile выглядел бы так:
За две строки в источнике мы получаем полноценный прокси-сервер, с перенаправлением HTTP на HTTPS и автоматической генерацией SSL-сертификатов. Вот за это мне и нравится Кэдди.
И напоследок — интересные и полезные материалы:
- Тест производительности Traefik и Caddy 2 (2023 г.)
- Примеры github caddy (примеры конфигураций для разных случаев)
