# Подключение своего домена

В этой статье мы подробно расскажем как подключить к платформе Tuna собственный домен и опубликовать локальный сайт в интернет без публичного IP, сложных конфигураций сети вроде VPN и без публикации кода на какой либо сервер или хостинг.

Публикация на собственном домене может быть интересна для Демо стендов, когда вы презентуете какое-то решение заказчику. Клиент видит законченное решение при этом вы не потратили и минуты на подготовку окружения, а также можете править какое-то мелочи прямо на ходу. Впрочем кейсов применения может быть значительно больше.

## Подключение домена

### Покупка домена

Для начала вам понадобится собственный домен (если у вас его нет), вы можете купить его например у [Рег.ру](https://www.reg.ru/?utm_source=tuna.am) или [namecheap](https://www.namecheap.com/?utm_source=tuna.am) или любого другого регистратора доменов. Для примеров в этой статье мы используем домен `tuna-dev.ru`.

### Подключение к Tuna и получение настроек

Перейдите на [страницу управления доменами](https://my.tuna.am/domains) в личном кабинете и нажмите **Добавить домен** cправа вверху.

![](/docs/img/connect-self-domain/add-domain.png)

Выберите тип **Свой домен** и в поле **Домен** введите свой домен. В нашем случае это `api.tuna-dev.ru`. Если у вас Unicode домен например в одной из таких зон `.РФ, .ДЕТИ, .ҚАЗ`, то нужно указывать конвертированный [punycode](https://www.reg.ru/web-tools/punycode?utm_source=tuna.am) вариант.

![](/docs/img/connect-self-domain/adding-in-my.png)

После указания своего домена вы увидите нужные настройки для DNS.

### Настройка DNS

Перейдите в панель управления DNS-записями и создайте запись, которую показал кабинет. Для поддомена вроде `api.tuna-dev.ru` это **CNAME**: он указывает на инфраструктуру Tuna целиком, а не на конкретный сервер, поэтому домен работает с [отказоустойчивостью](https://tuna.am/blog/high-availability.md). Корневой домен вроде `tuna-dev.ru` через CNAME не подключить, для него есть [отдельный вариант](#apex). Если у вас указана **AAAA** запись для выбранного домена, то её нужно удалить, так как работа по IPv6 пока не поддерживается.

![](/docs/img/connect-self-domain/add-cname.png)

### Ожидание подтверждения

После создания DNS записи, можно вернуться в личный кабинет и нажать **Добавить**, домен перейдёт в режим проверки.

![](/docs/img/connect-self-domain/check-status.png)

Валидация обычно занимает от 15 минут до 2 часов, но может растянуться и на пару дней, зависит от TTL на DNS запись. Процесс проверки ограничен **24 часами**, и разбит на 2 основных этапа:

* **Проверка DNS** - проверяем, что ваш домен настроен корректно
* **Проверка TLS** - выпускаем [Let's Encrypt](https://letsencrypt.org/?utm_source=tuna.am) сертификат для вашего домена

Если процесс добавления завершился ошибкой DNS, [проверьте](https://www.reg.ru/nettools/dig?utm_source=tuna.am), что вы верно создали DNS запись и она указывает на нужный сервер. Если всё корректно, возможно ещё не обновился DNS кэш и нужно ждать, тогда просто возобновите проверку. Если процесс добавления завершился ошибкой TLS, проверьте нет ли явных ошибок в настройке DNS: AAAA записи, рекурсивно зацикленные указатели. Если самостоятельно разобраться не получается, обратитесь в [поддержку](mailto:info@tuna.am).

### Использование

После успешной верификации домена, вы получите письмо с уведомлением.

![](/docs/img/connect-self-domain/domain-verified.png)

Теперь его можно начать использовать, для этого к команде `tuna http <ваш_порт>` укажите флаг `--domain` или его короткий вариант `-d` или [переменную окружения](https://tuna.am/docs/guides/environment-variables.md) и ваш домен, например:

```shell
tuna http 8080 --domain=api.tuna-dev.ru

```

```shell
tuna http 8080 -d api.tuna-dev.ru

```

```shell
export TUNA_DOMAIN=api.tuna-dev.ru
tuna http 8080

```

## Корневой домен

Корневой домен — это сам домен без поддомена: `example.com`, а не `www.example.com`. По правилам DNS на него нельзя поставить CNAME, только A-записи на конкретные адреса. Такой домен работает, но без отказоустойчивости: если один из адресов сменится или станет недоступен, часть посетителей не откроет сайт.

Поэтому, когда вы добавляете корневой домен, кабинет предлагает выбрать способ подключения.

### Сайт на поддомене, с отказоустойчивостью

Этот вариант мы рекомендуем. Туннель работает на поддомене: по умолчанию это `www.example.com`, но можно выбрать свой, например `shop.example.com`. Поддомен подключается через CNAME, корень — через A-записи. Когда оба домена пройдут проверку DNS, Tuna сама создаст [шлюз](https://tuna.am/docs/gateways.md) с постоянным перенаправлением (код 308) с `example.com` на поддомен. Путь страницы сохраняется: `example.com/catalog` откроет `www.example.com/catalog`.

![Форма добавления корневого домена: выбран вариант «Сайт на поддомене, с отказоустойчивостью»](/docs/img/connect-self-domain/apex-create-site.webp)

После добавления кабинет покажет DNS-записи для обоих доменов и команду для запуска туннеля на поддомене:

![Окно «Новые домены»: CNAME-запись для www.example.com и A-записи для example.com](/docs/img/connect-self-domain/apex-created.webp)

```shell
tuna http 8080 --domain=www.example.com

```

Когда оба домена пройдут проверку, у корня в списке появится пометка о перенаправлении:

![Список доменов: example.com перенаправляется на www.example.com](/docs/img/connect-self-domain/apex-list.webp)

Пара доменов занимает два места в лимите своих доменов. Если свободно только одно, вариант с поддоменом недоступен, а рядом появится ссылка на расширение подписки.

Что стоит знать о перенаправлении:

* Строка запроса при перенаправлении не сохраняется: `example.com/catalog?utm_source=mail` откроет `www.example.com/catalog`. Ссылки с UTM-метками давайте сразу на поддомен.
* Шлюз перенаправления виден в разделе [Шлюзы](https://my.tuna.am/gateways). Если его удалить, перенаправление выключится, а в карточке корневого домена появится кнопка, чтобы включить его снова.
* Пока на корне работает шлюз, туннель на `example.com` не запустится: сервер ответит `Domain already reserved by gateway`.
* Если удалить поддомен, шлюз корня останется и продолжит перенаправлять на удалённый адрес. Удалите его в разделе **Шлюзы** вручную.

### Только корневой домен

Корень подключается A-записями на каждый адрес [ячейки](https://tuna.am/docs/guides/corporate-network.md#firewall-addresses), туннель запускается на `example.com`. Отказоустойчивости у такого домена нет, и кабинет об этом предупреждает.

![Форма добавления корневого домена: выбран вариант «Только example.com» с пометкой «Без отказоустойчивости»](/docs/img/connect-self-domain/apex-only.webp)

### Как перевести уже подключённый домен

Корневые домены, подключённые раньше, и поддомены на A-записях помечены в списке значком предупреждения.

![Список доменов: у example.com рядом со статусом значок предупреждения](/docs/img/connect-self-domain/apex-warning.webp)

Для корневого домена в карточке есть пошаговый переезд:

1. **Добавьте поддомен для сайта.** Кабинет покажет CNAME-запись, которую нужно создать у регистратора.
2. **Запустите туннель на поддомене** вместо корня. Туннель на корне остановите: пока он работает, перенаправление не включится.
3. **Включите перенаправление на поддомен.** Кнопка станет доступна, когда поддомен пройдёт проверку DNS. Перенаправление начинает работать примерно через минуту.

![Карточка корневого домена: три шага переезда на поддомен](/docs/img/connect-self-domain/apex-migration.webp)

Старые ссылки продолжат работать: посетители с `example.com` попадут на те же страницы поддомена.

Если поддомен подключён A-записями, менять туннель и настройки не нужно. Замените A-записи одной CNAME-записью из карточки домена. Предупреждение пропадёт после ближайшей перепроверки DNS, она проходит раз в сутки.

![Карточка поддомена на A-записях: предложение заменить их одной CNAME-записью](/docs/img/connect-self-domain/subdomain-a-record.webp)
