Обратный прокси с автоматическим HTTPS на Caddy: много приложений, один файл
Публикуйте несколько приложений на одном сервере под своими доменами; Caddy сам получает и продлевает сертификаты.
Руководства · 1 мин чтения
Если на одном сервере работает несколько веб-приложений, обратный прокси публикует их все на портах 80 и 443 и маршрутизирует по доменному имени. Caddy делает это одним коротким файлом и сам получает и продлевает HTTPS-сертификаты.

Требования
- 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 в браузере.
Добавление нового приложения
- Добавьте сервис приложения в файл Compose (порт на хосте публиковать не нужно).
- Добавьте в Caddyfile новый блок домена.
- Перезагрузите конфигурацию:
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.