Перейти к содержимому
Melinhost

Обратный прокси с автоматическим HTTPS на Caddy: много приложений, один файл

Публикуйте несколько приложений на одном сервере под своими доменами; Caddy сам получает и продлевает сертификаты.

Руководства · 1 мин чтения

caddy-reverse-proxy-https

Если на одном сервере работает несколько веб-приложений, обратный прокси публикует их все на портах 80 и 443 и маршрутизирует по доменному имени. Caddy делает это одним коротким файлом и сам получает и продлевает HTTPS-сертификаты.

Архитектура обратного прокси
Интернет приходит на Caddy по 443; Caddy передаёт запрос нужному приложению по доменному имени.

Требования

  • Docker и Compose (см. Установка Docker).
  • Домен или поддомен для каждого приложения, A-запись которого указывает на IP сервера (см. DNS-записи).
  • Открытые порты 80 и 443 в брандмауэре: sudo ufw allow 80,443/tcp

1. Файл Compose

Когда Caddy и приложения находятся в одном проекте Compose, они обращаются друг к другу по имени сервиса; публиковать порты приложений наружу не нужно.

services:
  caddy:
    image: caddy:2
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data
      - caddy_config:/config

  app:
    image: traefik/whoami
    restart: unless-stopped

volumes:
  caddy_data:
  caddy_config:

2. Caddyfile

app.yourdomain.com {
    reverse_proxy app:80
}

# тот же шаблон для второго приложения:
# git.yourdomain.com {
#     reverse_proxy gitea:3000
# }

Каждый блок — это доменное имя, а цель reverse_proxy — имя контейнера и порт в той же сети.

3. Запустите

docker compose up -d
docker compose logs -f caddy

Caddy автоматически получает сертификат при первом запросе (Let’s Encrypt); в журнале появится «certificate obtained successfully». Откройте https://app.yourdomain.com в браузере.

Добавление нового приложения

  1. Добавьте сервис приложения в файл Compose (порт на хосте публиковать не нужно).
  2. Добавьте в Caddyfile новый блок домена.
  3. Перезагрузите конфигурацию: docker compose exec caddy caddy reload --config /etc/caddy/Caddyfile

Если приложение вне вашего проекта Compose, создайте общую сеть Docker и подключите к ней и Caddy, и приложение (docker network create proxy и networks: [proxy] у каждого сервиса).

Полезные дополнения

ЗадачаCaddyfile
Перенаправить www на основной доменwww.yourdomain.com { redir https://yourdomain.com{uri} }
Сжатиеencode zstd gzip
Базовая аутентификацияbasicauth (с хэшем bcrypt)
Только определённые IPсопоставление через @allowed remote_ip 203.0.113.0/24

Решение проблем

  • Не удалось получить сертификат: проверьте A-запись и открытые порты 80/443 (см. Изменение DNS не вступило в силу).
  • 502 Bad Gateway: целевой контейнер не запущен или неверны имя/порт: проверьте docker compose ps и цель reverse_proxy.
  • Ограничения: у Let’s Encrypt есть лимиты на выпуск сертификатов; не удаляйте и не добавляйте домен снова и снова при экспериментах.

Начните с Melinhost

Для нескольких приложений удобным стартом станет облачный сервер с 4 vCPU и 8 ГБ RAM.

Похожие записи

err-ssl-version-or-cipher-mismatch

· Руководства

Ошибка ERR_SSL_VERSION_OR_CIPHER_MISMATCH: причины и решение

Браузер не может установить защищённое соединение: как найти и исправить устаревшие версии TLS, несовместимые шифры, отсутствие сертификата и неверные настройки виртуального хоста.

Читать далее →

Настройки cookie

Мы используем необходимые cookie. Аналитические и маркетинговые cookie включаются только с вашего согласия. Политика использования cookie