Caddy представляет собой обратный прокси-сервер (обратный прокси-сервер). Написанный на языке Go, это полностью бесплатный проект с открытым исходным кодом с лицензией Apache 2.0.
Caddy поддерживает HTTP/2, HTTP и HTTPS, позволяет автоматически получать и обновлять сертификаты Let's Encrypt. Обладает кроссплатформенностью: можно установить на любую ОС, а также поддерживает разные архитектуры процессоров. Также Caddy можно использовать просто в Docker-контейнере.
Альтернативы Кэдди:
Основные особенности Caddy, на мой взгляд:
cloud
Для экспериментов я взял самый простой сервер на Timeweb Cloud c Ubuntu 22.04.
Установка по документации с официального сайта:
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
Проверяю активность сервиса:
systemctl status caddy
Проверка версии:
caddy version
> v2.7.4
Для проверки откройте в браузере страницу по IP-адресу хоста:
Далее пошагово выполним предложенные рекомендации Caddy по настройке.
Создаю в DNS доменное имя 2 уровня: caddy.akmalov.com.
Указываю ему «белый» IP-адрес созданного сервера.
Для создания своего index.html по указанному пути /var/www/html/.
Добавляю картинку volk.jpg:
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>Шапка</title>
</head>
<body>
<header>
<h1>Самый простой index файл для демо</h1>
</header>
<main>
<h2>План чек-лист по Caddy</h2>
<p>Сам ничего не придумал, поэтому пойдем по документации:</p>
<ul>
<li>DNS сделать</li>
<li>Конфиг поменять</li>
<li>сервер перезапустить</li>
<li>пресс качат</li>
<li>анжумания вечером</li>
</ul>
<img src="volk.jpg" alt="volchara">
</main>
</body>
</html>
nano /etc/caddy/Caddyfile
# The Caddyfile is an easy way to configure your Caddy web server.
#
# Unless the file starts with a global options block, the first
# uncommented line is always the address of your site.
#
# To use your own domain name (with automatic HTTPS), first make
# sure your domain's A/AAAA DNS records are properly pointed to
# this machine's public IP, then replace ":80" below with your
# domain name.
:80 {
# Set this path to your site's directory.
root * /usr/share/caddy
# Enable the static file server.
file_server
# Another common task is to set up a reverse proxy:
# reverse_proxy localhost:8080
# Or serve a PHP site through php-fpm:
# php_fastcgi localhost:9000
}
# Refer to the Caddy docs for more information:
# https://caddyserver.com/docs/caddyfile
Удаляю все лишнее, чтобы конфиг выглядел следующим образом:
caddy.akmalov.com {
root * /var/www/html
file_server
}
Перезапускаю с помощью команды:
systemctl reload caddy
Открываю браузер по доменному имени caddy.akmalov.com.
Страница сразу открывается по HTTPS с доверенным сертификатом — и все это в четырех строках схемы, в которых все минимально, красиво и понятно.
Допустим, нам нужно выделить сервис и перенаправить трафик.
Мне очень нравится использовать все в контейнерах, без установки дополнительных пакетов, зависимостей и запускать одной кнопкой. Поэтому удаляю сервис Caddy и устанавливаю Docker:
systemctl stop caddy
apt remove caddy
apt install docker.io docker-compose
Для начала повторяю то же самое, что было выше, но уже использовалось в контейнере.
Создаю директорию по пути /srv/caddy и копирую туда статические файлы и конфигурацию файлов.
mkdir -p /srv/caddy/site
cp -r /var/www/html /srv/caddy/site
cp /etc/caddy/Caddyfile /srv/caddy/Caddyfile
Создаю docker-compose.yml с такой конфигурацией:
version: '3.8'
services:
caddy:
image: caddy:2.7.4
restart: always
ports:
- 80:80
- 443:443
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./site:/var/www/html
Здесь я с помощью томов перекидываю файлы в те же знакомые каталоги, чтобы ничего не сохранить в конфигурации.
После этого запускаю и проверяю:
docker-compose up -d
Также хочу показать, как еще можно защитить страницу, используя BasicAuth и пару строк конфигурации.
Для этого отредактируем Caddyfile следующим образом, добавив Basicauth * {логин-пароль}:
caddy.akmalov.com {
basicauth * {
volk $2y$10$v8t9CqkLFEon3UTYKUsRs.8zhMMLFX5.9WyDERzd7ESRT75PICkiW
}
root * /var/www/html
file_server
}
Логин и пароль пользователя можно сгенерировать в консоли или воспользоваться онлайн-генераторами .htpasswd (алгоритм по умолчанию: bcrypt).
docker-compose restart
Теперь при открытии страницы появляются окна аутентификации.
Теперь в docker-compose подниму какой-нибудь сервис с веб-интерфейсом, например, Grafana.
version: '3.8'
caddy:
image: caddy:2.7.4
restart: always
ports:
- 80:80
- 443:443
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./site:/var/www/html
grafana:
image: grafana/grafana:10.0.5-ubuntu
container_name: grafana
# ports:
# - 3000:3000
environment:
GF_SECURITY_ADMIN_USER: 'admin'
GF_SECURITY_ADMIN_PASSWORD: 'volk'
Порты закомментированы, т.к. Grafana и Caddy присоединяются к одной группе и могут общаться по имени сервисов, внешний проброс портов не нужен. Если необходимо обращаться не только по доменному имени, но и по локальному IP-хостеру и порту, то нужно раскомментировать эти строки.
Для сервиса Grafana создаю в DNS еще одно доменное имя второго уровня, например test.akmalov.com, и добавляю в конфигурацию Caddyfile:
caddy.akmalov.com {
root * /var/www/html
file_server
}
test.akmalov.com {
reverse_proxy grafana:3000
}
Чтобы не запутаться, еще раз покажу структуру того, что получилось:
В директории сайта два файла:
В docker-compose.yml поднимается два сервиса:
Caddyfile (файл с конфигурацией) — через тома продаем внутренний контейнер по пути /etc/caddy/Caddyfile.
В формулировке таких правил:
Для проверки того, что новое доменное имя ведет на данном хосте, проверяем DNS-записи:
nslookup test.akmalov.com
Если всё получится, можно проверить в браузере.
Проверка в браузере по доменному имени test.akmalov.com — открывается страница входа в панель Grafana).
Используйте Caddy на серверах Timeweb Cloud
В этой статье я привел простейшие схемы для ознакомления, но в документации также можно почитать, например, про балансировку нагрузки для распределения трафика по разным хостам, а также добавление проверки работоспособности для проверки работоспособности хостов, как обрезать, добавить или изменить заголовки (заголовок) . ) в запросах и т.д.
Я не погружаюсь в конфигурацию слишком глубоко, так как для меня Кэдди — это в первую очередь про простоту. Конфигурации, показанные в статье, — очень удобные и понятные, и, казалось бы, куда проще. Но оказывается, есть куда.
Например , если на этой же облачной машине сервису мне потребовалось бы поднять только Grafana , сертификат получить и закрыть за прокси-сервером, тогда файл конфигурации Caddyfile выглядел бы так:
test.akmalov.com
reverse_proxy grafana:3000
За две строки в источнике мы получаем полноценный прокси-сервер, с перенаправлением HTTP на HTTPS и автоматической генерацией SSL-сертификатов. Вот за это мне и нравится Кэдди.
И напоследок — интересные и полезные материалы: