Домены, Caddy и Cloudflare
Как устроено
Наружу смотрит только Caddy (порты 80 и 443). Он сам получает и продлевает HTTPS-сертификаты и раздаёт адреса:
| Адрес | Что там |
|---|---|
example.com | Сайт для клиентов и его API. Пути /admin и админский API здесь отвечают «не найдено» |
admin.example.com | Админка. Открыта только разрешённым адресам |
docs.example.com | Этот сайт документации. Ставится вместе с движком; без записи DNS docs сайт и админка работают, но Caddy будет повторять попытки получить сертификат для него |
Конфиг Caddy проверяется до перезапуска: если в нём ошибка, обновление остановится, а сайт продолжит работать на старом конфиге.
Cloudflare
Рекомендуем держать домен за прокси Cloudflare (оранжевое облако): он скрывает IP сервера и защищает от DDoS.
- Добавьте домен в Cloudflare и смените NS-серверы у регистратора.
- DNS: записи A —
@иadmin(иdocs, если нужна документация) на IP сервера, прокси включён. - SSL/TLS → Overview: режим Full (strict).
- SSL/TLS → Edge Certificates: «Always Use HTTPS» выключить — Caddy сам перенаправляет на HTTPS, а с этой опцией первый сертификат не выпустится.
Настоящий IP клиента
За Cloudflare сервер видит адреса Cloudflare, а не клиентов. Caddy берёт настоящий IP из заголовка CF-Connecting-IP и только от адресов Cloudflare — подделать его в обход прокси нельзя. Страну клиента (CF-IPCountry) тоже принимаем только от Cloudflare. От настоящего IP зависят лимиты, баны, доступ к админке и журнал.
Список адресов Cloudflare зашит в конфиг Caddy. Cloudflare меняет его редко (cloudflare.com/ips); при изменении он приходит с обновлением движка.
Без Cloudflare
Движок работает и без Cloudflare: записи A без прокси, сертификаты Caddy получит сам. Заголовки Cloudflare в этом случае просто не используются — IP клиента берётся из соединения.
Заголовки безопасности
На всех адресах Caddy отдаёт HSTS (год, с поддоменами), X-Content-Type-Options: nosniff, Referrer-Policy и скрывает свою версию. Админка закрыта от поисковиков (X-Robots-Tag: noindex), документация — открыта.