Caddy — простой и легкий reverse proxy

    Команда Simple-Server
    03.06.2026
    8 мин

    Материал подготовлен командой 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.

    VPS для проекта

    VPS с root-доступом, NVMe и поддержкой 24/7 на Simple-Server.

    StarterVDS

    490

    в месяц

    1 ядро

    1 ГБ RAM

    20 ГБ NVMe

    • 1 IPv4
    • KVM
    • Root-доступ
    • Безлимитный трафик
    Заказать VPS
    Рекомендуем

    PerformanceVDS

    1190

    в месяц

    2 ядра

    4 ГБ RAM

    60 ГБ NVMe

    • 1 IPv4
    • KVM
    • Root-доступ
    • Базовая DDoS-защита
    Заказать VPS

    Нужна другая конфигурация или чистый VPS без панели?

    Все тарифы VPS

    Похожие статьи, которые могут быть вам интересны