Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.
Кратко о задаче
Для экспериментов я взял самый простой сервер на Simple-Server c Ubuntu 22.04.
Установка по документации с официального сайта:
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-httpsПроверяю активность сервиса:
Для проверки откройте в браузере страницу по IP-адресу хоста:
Далее пошагово выполним предложенные рекомендации Caddy по настройке.
Шаг 1. Создать доменное имя и направить на адрес сервера
Создаю в DNS доменное имя 2 уровня: caddy.akmalov.com.
Указываю ему «белый» IP-адрес созданного сервера.
Шаг 2. Изменить путь и использовать свои статические файлы для отображения
Для создания своего 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>Шаг 3. В конфигурации измените порт :80 на свое доменное имя
Открываю для редактирования структуру файла:
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/supportУдаляю все лишнее, чтобы конфиг выглядел следующим образом:
caddy.akmalov.com {
root * /var/www/html
file_server
}Шаг 4. Перезапустить Caddy
Перезапускаю с помощью команды:
Открываю браузер по доменному имени caddy.akmalov.com.
Страница сразу открывается по HTTPS с доверенным сертификатом — и все это в четырех строках схемы, в которых все минимально, красиво и понятно.
Запуск Caddy в docker-compose
Допустим, нам нужно выделить сервис и перенаправить трафик.
Мне очень нравится использовать все в контейнерах, без установки дополнительных пакетов, зависимостей и запускать одной кнопкой. Поэтому удаляю сервис 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Здесь я с помощью томов перекидываю файлы в те же знакомые каталоги, чтобы ничего не сохранить в конфигурации.
После этого запускаю и проверяю:
Также хочу показать, как еще можно защитить страницу, используя BasicAuth и пару строк конфигурации.
Для этого отредактируем Caddyfile следующим образом, добавив Basicauth * {логин-пароль} :
caddy.akmalov.com {
basicauth * {
volk $2y$10$v8t9CqkLFEon3UTYKUsRs.8zhMMLFX5.9WyDERzd7ESRT75PICkiW
}
root * /var/www/html
file_server
}Логин и пароль пользователя можно сгенерировать в консоли или воспользоваться онлайн-генераторами .htpasswd(алгоритм по умолчанию: bcrypt).
Теперь при открытии страницы появляются окна аутентификации.
Теперь в 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
}Чтобы не запутаться, еще раз покажу структуру того, что получилось:
В директории сайта два файла:
- index.html(главная страница сайта).
- volk.jpg(картинка).
В docker-compose.yml поднимается два сервиса:
- Кэдди для проксирования и получения сертификатов.
- Grafana как отдельное веб-приложение.
Caddyfile(файл с конфигурацией) — через тома продаем внутренний контейнер по пути /etc/caddy/Caddyfile.
В формулировке таких правил:
- caddy.akmalov.com — выдаем статические файлы из директории сайта.
- test.akmalov.com — перенаправляем в Grafana.
Для проверки того, что новое доменное имя ведет на данном хосте, проверяем DNS-записи:
nslookup test.akmalov.comЕсли всё получится, можно проверить в браузере.
Проверка в браузере по доменному имени test.akmalov.com — открывается страница входа в панель Grafana).
Нужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.