> ## Documentation Index
> Fetch the complete documentation index at: https://faq.exode.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Домен школы

> Базовый поддомен exode и подключение собственного домена: настройка, проверка и как система резолвит школу по домену.

## Два типа домена

Школа доступна по собственному адресу. Платформа поддерживает два типа домена
(`SchoolDomainType`):

```typescript theme={null}
export enum SchoolDomainType {
    Base = 'Base',
    Custom = 'Custom'
}
```

| Тип                          | Адрес                 | Кому подходит                 | Как включается               |
| ---------------------------- | --------------------- | ----------------------------- | ---------------------------- |
| `Base` — базовый поддомен    | `ваш-домен.exode.biz` | Всем по умолчанию             | Доступен сразу               |
| `Custom` — собственный домен | `school.example.com`  | Своя доменная зона / брендинг | Подключается через поддержку |

Тип домена выбирается в панели управления: **Настройки школы → Домен школы**.

<img src="https://mintlify.s3.us-west-1.amazonaws.com/exode-faq/images/online-schools/school-creation/domain-type.png" alt="Выбор типа домена: базовый или собственный" />

## Базовый поддомен

Базовый домен вы задаёте ещё при создании школы, а потом можете изменить в настройках. Итоговый
адрес — `<baseDomain>.exode.biz`.

<Steps>
  <Step title="Откройте раздел «Домен школы»">
    В настройках выберите вариант «Базовый домен».
  </Step>

  <Step title="Введите поддомен">
    Впишите желаемый поддомен (3–20 символов, латиница, цифры и дефис). Поле проверяет
    доступность домена в реальном времени с задержкой \~0.5 сек.
  </Step>

  <Step title="Сохраните">
    Пока домен не сохранён, доступны кнопки «Сохранить» и «Отмена». После сохранения адрес
    сразу становится актуальным.
  </Step>
</Steps>

<Note>
  Проверка доступности выполняется запросом `schoolManageCheckDomain`: если домен занят или
  некорректен, поле подсветится ошибкой и сохранение будет заблокировано. Минимальная длина для
  запуска проверки — 3 символа.
</Note>

## Собственный домен

Собственный домен (Custom) позволяет открывать школу на вашем адресе, например
`learn.company.com`, без упоминания `exode.biz`.

<img src="https://mintlify.s3.us-west-1.amazonaws.com/exode-faq/images/online-schools/school-creation/custom-domain.png" alt="Настройка собственного домена и принудительного редиректа" />

<Warning>
  Собственный домен нельзя подключить самостоятельно из интерфейса. Если для школы он ещё не
  заведён, вариант «Собственный домен» отображается как недоступный, а клик по нему открывает
  Telegram-поддержку exode.biz. Настройка DNS и привязка домена выполняются вместе с поддержкой.
</Warning>

### Принудительный редирект на собственный домен

Когда собственный домен подключён, появляется переключатель
**«Перенаправлять на собственный домен»** (`config.serve.forceRedirectToCustomDomain`).
Если он включён, обращения к базовому поддомену автоматически перенаправляются на
собственный домен:

```
ваш-домен.exode.biz  →  learn.company.com
```

Это удобно, чтобы у школы был единый «правильный» адрес.

## Как система определяет школу по домену

Резолвинг школы по домену происходит на сервере при отрисовке страницы (SSR), в
`server/Platform.tsx`. Логика упрощённо такая:

<Steps>
  <Step title="Разбор адреса запроса">
    Сервер определяет, что это школьная платформа: либо запрос пришёл на собственный домен
    школы (`isCustomSchoolDomain`), либо на поддомен `*.exode.biz` (`isBaseSchoolSubdomain`).
  </Step>

  <Step title="Поиск школы">
    Вызывается `getSchoolByDomain(...)` — GraphQL-запрос `schoolFindOneByDomain(domain)`,
    который возвращает школу по её домену (для custom передаётся хост, для base — поддомен).
  </Step>

  <Step title="Проверка актуального адреса">
    Метод `getActualSchoolRequestUrl` вычисляет «правильный» адрес для школы исходя из её
    `domainType`, `baseDomain` и `customDomain`.
  </Step>

  <Step title="Редирект при необходимости">
    Если фактический адрес не совпадает с актуальным (или включён
    `forceRedirectToCustomDomain`), сервер отдаёт временный редирект (307) на нужный домен.
  </Step>

  <Step title="Рендер или «школа не найдена»">
    Если школа найдена — страница рендерится с её конфигом; если нет — отдаётся страница
    «школа не найдена».
  </Step>
</Steps>

Серверный запрос поиска школы:

```graphql theme={null}
query SchoolFindOneByDomain($domain: String!) {
    schoolFindOneByDomain(domain: $domain) {
        ...SchoolFragment
        customCode {
            js
            css
        }
    }
}
```

Правило вычисления актуального адреса по типу домена:

```javascript theme={null}
switch (school.domainType) {
    case SchoolDomainType.Base:
        // адрес приводится к <baseDomain>.exode.biz
        break;

    case SchoolDomainType.Custom:
        // адрес приводится к school.customDomain
        break;
}
```

<Tip>
  Если вы сменили тип домена в настройках, страница перезагружается автоматически — так
  применяется новый способ резолвинга и школа открывается уже на актуальном адресе.
</Tip>

## Итоговая шпаргалка

| Задача                      | Где                               | Действие                                       |
| --------------------------- | --------------------------------- | ---------------------------------------------- |
| Задать / изменить поддомен  | Настройки → Домен школы → Базовый | Ввести поддомен, сохранить                     |
| Подключить свой домен       | Поддержка exode.biz               | Оставить заявку, настроить DNS                 |
| Выбрать активный тип домена | Настройки → Домен школы           | Переключить Base / Custom                      |
| Всегда открывать свой домен | Настройки → Домен школы (Custom)  | Включить «Перенаправлять на собственный домен» |
