Домен и сервер живут в двух разных системах, и связь между ними держится на паре строк в DNS. Разбираем, какую запись прописать - A или AAAA, - сколько реально ждать, пока она разойдётся по миру, зачем серверу открытые порты 80 и 443 и почему для HTTPS проще один раз поставить Caddy, чем собирать nginx с certbot и cron-задачей на продление.
Домен и сервер - это две независимые вещи, которые ничего не знают друг о друге, пока вы не свяжете их вручную. Привязать домен к серверу значит прописать DNS-запись, которая говорит миру: «за этим именем стоит вот такой IP». После этого остаётся, чтобы сам сервер согласился отвечать по этому домену и умел показывать сайт по HTTPS, а не голым http. В статье - какую запись выбрать, сколько реально ждать, пока она разойдётся, и как за десять минут поднять reverse proxy с сертификатом, который сам продлевается.
Коротко. В панели домена добавьте запись A с именем
@и значением - IPv4-адресом сервера, такую же дляwww; если у сервера есть IPv6, добавьте ещё пару AAAA. Подождите, пока записи разойдутся - обычно от нескольких минут до часа. На сервере поставьте Caddy: он умеет и раздавать сайт, и получать сертификат Let's Encrypt сам, без отдельного certbot и cron-задачи на продление. Проверьте результат запросомcurl -I https://ваш-домен.
Уровень 1 - DNS. Записи в зоне домена связывают имя с адресом. Запрос к site.ru сначала идёт на серверы имён домена, те возвращают IP из записи A (для IPv4) или AAAA (для IPv6), и только после этого браузер соединяется с самим сервером.
Уровень 2 - сервер. Запрос приходит с заголовком Host: site.ru. Веб-сервер или reverse proxy читает этот заголовок, решает, какой сайт отдавать, и обслуживает соединение - включая выпуск и продление TLS-сертификата для HTTPS.
Эти два уровня друг от друга не зависят, и это удобно: DNS-запись можно прописать заранее, до того как сервер настроен - домен просто будет указывать на адрес, где пока никто не отвечает, без ошибок и предупреждений.
Откройте сервер в панели my.hip.hosting, вкладка Информация, блок «Подключение» - тот же, что нужен для SSH-входа. Там указан IP-адрес и готовая строка ssh root@IP, из которой адрес можно просто скопировать (подробнее про сам вход - в статье Как подключиться к серверу HIP). Технически это IPv4. Отдельного IPv6 для всех тарифов и локаций HIP панель может не выдавать - если он у вашего сервера есть, ищите его на той же вкладке; если нет, ничего страшного, весь сценарий ниже работает и на одном IPv4.
Заодно стоит проверить, что на сервере вообще что-то слушает нужный порт. Подключитесь по SSH и выполните:
ss -tlnp
В выводе должны быть строки с :80 и :443 - если пока пусто, это нормально: веб-сервер появится в шаге 4, дальше по инструкции.
Зайдите в панель, где управляется DNS домена. Ниже - порядок на примере Cloudflare, у регистраторов поля называются так же или очень похоже.
Добавьте запись:
A@ (сам домен целиком, site.ru; часть панелей вместо @ просит оставить поле пустым или вписать имя домена полностью)Auto или 300 секунд на время настройкиМаленький TTL не ускорит появление именно этой, самой первой записи - он влияет только на будущее: если вы позже поменяете IP, новое значение разойдётся быстрее, потому что резолверы не будут долго держать в кеше старое.
Добавьте вторую запись A для www с тем же IP, чтобы сайт открывался и с приставкой www, и без неё. Если у сервера есть IPv6, добавьте ещё пару записей AAAA - для @ и для www - со значением IPv6-адреса.
Тип | Имя | Значение | Зачем |
|---|---|---|---|
A | | IPv4 сервера | домен без www по IPv4 |
A | | IPv4 сервера | домен с www по IPv4 |
AAAA | | IPv6 сервера | только если у сервера есть IPv6 |
AAAA | | IPv6 сервера | только если у сервера есть IPv6 |
Вместо второй A-записи можно использовать CNAME. Запись CNAME с именем www и значением site.ru говорит «www - это псевдоним основного домена», и тогда IP правится в одном месте. Для самого домена (@, корень зоны) CNAME по стандарту DNS ставить нельзя - только A или AAAA. У некоторых DNS-провайдеров, включая Cloudflare, есть собственная функция вроде CNAME-flattening, которая обходит это ограничение на своей стороне, но это уже особенность конкретного провайдера, а не общее правило DNS.
Новая запись видна не сразу - DNS-серверы по миру кешируют ответы на время TTL. Для только что добавленной записи обычно хватает от нескольких минут до часа, для смены серверов имён - дольше, иногда до суток, потому что там задействован ещё и реестр доменов верхнего уровня.
Проверьте со своего компьютера:
dig +short site.ru
nslookup site.ru
nslookup есть по умолчанию почти везде - в Windows, macOS, большинстве Linux.dig удобнее читается, но на Ubuntu и Debian его придётся поставить отдельно: sudo apt install dnsutils. На macOS он обычно уже есть.Как только в ответе появится IP вашего сервера - записи применились. Проверить сразу из разных стран можно на сайтах вроде dnschecker.org.
Приложение (сайт на Node.js, Python и так далее) обычно слушает локальный порт вроде 127.0.0.1:3000. Наружу по 80 и 443 его отдаёт reverse proxy - он же занимается сертификатом.
Если на сервере включён firewall - sudo ufw status покажет, так ли это, - разрешите на нём хотя бы порт 80 (без него не проходит стандартная проверка Let's Encrypt) и обязательно 443 для самого HTTPS-трафика после того, как сертификат уже выпущен. Сама установка веб-сервера порт наружу не открывает: она заставляет процесс слушать порт внутри сервера, а firewall - это отдельная настройка (подробно про неё - в статье Защита свежего VPS).
Мы бы поставили здесь Caddy, а не связку nginx плюс certbot. Разница не в мелочах: у Caddy получение и продление сертификата встроено в сам процесс, а у nginx это отдельная программа (certbot) плюс отдельная задача на продление, которую нужно один раз настроить и потом не забыть, что она вообще существует. Меньше движущихся частей - меньше того, что может сломаться через полгода, когда вы уже забудете, как это всё настраивали.
Caddy | nginx + certbot | |
|---|---|---|
Получение сертификата | встроено, срабатывает само при старте/reload | отдельная утилита certbot, отдельная команда |
Продление сертификата | Caddy следит сам | нужен systemd-таймер или cron-задача |
Минимальный конфиг | несколько строк в Caddyfile | server-блок nginx + настройка certbot поверх |
Когда разумнее выбрать | новый проект, хочется меньше шагов | nginx уже настроен под другие сайты или нужны специфичные директивы |
Установка Caddy на Ubuntu из официального репозитория:
sudo apt update
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install -y caddy
apt не знает, откуда брать пакет;systemd и остаётся работать в фоне.Откройте конфиг Caddy текстовым редактором:
sudo nano /etc/caddy/Caddyfile
Уберите содержимое по умолчанию и впишите свой домен:
site.ru, www.site.ru {
reverse_proxy 127.0.0.1:3000
}
Примените конфигурацию:
sudo systemctl reload caddy
Caddy запросит сертификат сразу после того, как примет новый конфиг - не тогда, когда кто-то впервые откроет сайт в браузере. Для этого нужны открытые порты 80 и 443 и уже разошедшаяся DNS-запись; если запись ещё не применилась или порт закрыт firewall, выпуск сертификата не пройдёт, и это будет видно в логе:
journalctl -u caddy -n 50
Проверьте результат:
curl -I https://site.ru
Успешный ответ - это заголовки вашего сайта без ошибки сертификата; конкретный код и версия протокола (HTTP/1.1, HTTP/2 или HTTP/3) зависят от того, как настроено само приложение за прокси.
Если доменов и поддоменов на сервере станет много и вы будете перевыпускать сертификаты часто, держите в голове реальный лимит Let's Encrypt: не больше 50 новых сертификатов на один зарегистрированный домен верхнего уровня в неделю и не больше 5 дублирующих сертификатов на один и тот же набор имён в неделю. Для одного-двух сайтов это не встретится никогда, но при автоматизации массового выпуска - вполне реальная стена.
Схема та же: DNS указывает на сервер, порты 80 и 443 открыты, конфиг связывает домен с локальным портом приложения. Разница только в том, что сертификат ставится отдельно через certbot --nginx, а reverse-proxy-конфиг пишется вручную в отдельном файле. Если у вас уже есть настроенный nginx с другими сайтами или нужна директива, которой в Caddy пока нет, - это разумный вариант. Подробный разбор конфига, заголовков прокси и firewall-правил под nginx - в статье nginx и ufw перед вашим приложением, а если хочется довести Caddy до более сложной конфигурации, чем один домен на один порт - в статье Caddy: веб-сервер с автоматическим HTTPS.
Каждый поддомен - это отдельная DNS-запись. Нужен api.site.ru - добавьте A с именем api и тем же IP (или CNAME на site.ru), а в Caddyfile - отдельный блок:
api.site.ru {
reverse_proxy 127.0.0.1:4000
}
Если телеграм-бот работает на вебхуках, ему нужен публичный HTTPS-адрес - обычно как раз поддомен вроде hook.site.ru, настроенный тем же способом. Боту на long polling (постоянных запросах к серверам Telegram вместо приёма входящих) домен вообще не нужен.
Запись A связывает имя с IP - это «прямая» зона. Запись PTR работает наоборот, связывает IP с именем, и нужна в основном для отправки почты: принимающие серверы её проверяют, и без неё письма чаще уходят в спам. Для обычного сайта по HTTPS она не требуется вовсе. Если у вас на этом сервере ещё и своя почта - подробный разбор PTR, включая как его прописать в панели HIP и как проверить командой dig -x, есть в статье Обратная DNS-запись и заказ дополнительного IPv4.
Только если вы хотите управлять DNS не у регистратора, а у стороннего провайдера вроде Cloudflare. Если записи правятся прямо в панели регистратора, NS трогать не нужно.
Обычно от нескольких минут до часа при небольшом TTL, иногда - до нескольких часов. Смена серверов имён может занять до суток, потому что кешируется на уровне реестра доменов, а не только у резолверов пользователей.
Нет для публичного сертификата от Let's Encrypt - удостоверяющий центр выпускает сертификат на конкретное имя и должен убедиться, что вы им владеете, а для этого имя должно резолвиться в ваш сервер. По голому IP можно только сгенерировать самоподписанный сертификат, и браузеры будут показывать его как небезопасный.
Да. У каждого домена - свои DNS-записи на тот же IP и свой блок в Caddyfile или конфиге nginx. Reverse proxy различает сайты по заголовку Host из запроса браузера.
IP, который сервер получает при заказе, как правило закреплён за ним и сам по себе не меняется - его можно спокойно прописывать в DNS. Меняется он обычно только при заказе нового сервера, а не при обычной работе или переустановке ОС на этом же сервере.
Можно, если нужна защита от DDoS и кеш статики, но тогда HTTPS на самом сервере всё равно обязателен, а режим SSL в Cloudflare нужно выставить Full (strict) - иначе участок между Cloudflare и вашим сервером останется незашифрованным. Без прокси (серое облако) - это просто DNS, всё работает так, как описано выше.