# Лицензионный ключ и обновления

Страница для того, кто эксплуатирует установку. Ключ прописывается в настройках
при установке, и от его состояния зависит поведение админки — значит владелец
установки обязан знать, как это устроено.

## Что такое ключ

Лицензионный ключ прописывается в окружении установки (`LICENSE_KEY`). В нём
подписаны три вещи:

- **домен** школы;
- **срок поддержки** — до какой даты установка получает обновления;
- **набор модулей** — сейчас один на всех, докупаемых модулей нет.

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

Установка сверяется с сервером лицензий при старте и раз в сутки фоновой задачей.
Тем же каналом мы получаем список установок с версиями — без него невозможно
выкатывать обновления на N школ.

## Смена домена

Ключ выписан на домен. При смене домена нужен новый ключ — замена в пределах
срока поддержки.

Пока ключ не заменён, действует та же отсрочка, что и при недоступности сервера:
установка работает, предупреждение висит в админке.

## Недоступность сервера лицензий

Связь может пропасть у вас, сервер может лежать у нас. Поведение задано так,
чтобы школа при этом работала:

| Что происходит | Поведение |
|---|---|
| Проверка не прошла | Установка **продолжает работать**, в админке появляется предупреждение |
| Проверки не проходят до 14 дней | То же: работа не ограничивается |
| Проверки не проходят дольше 14 дней | Админка переходит **в режим чтения** |
| В любом из случаев | **Ученики не затрагиваются**: учатся и платят |

Отсрочка — 14 дней. Ограниченный режим снимается сразу, как только проверка
пройдёт.

Ученики не затрагиваются никогда, и это не оговорка на будущее, а свойство
механизма: блокировка доступа к оплаченному курсу ударила бы по вашему клиенту.

## Копия без ключа

Копия установки без ключа **работает**. Она остаётся на той версии, на которой её
скопировали: без исправлений, без новых возможностей и без изменений под
законодательство — а требования к фискализации и к персональным данным меняются
ежегодно.

Отдельно и честно: код на вашем сервере — это код у вас. Он читаемый,
не обфусцированный, и проверку лицензии из него технически можно вырезать.
Мы это знаем. Защиты от целенаправленного вмешательства здесь нет: любая такая
защита разбирается тем, кто держит машину в руках, и при этом ломается у честных
установок на ровном месте.

Что следует из этого практически для вас: **правки в коде вы делать можете**,
но каждая правка — ваша забота при обновлении. Изменённый файл при обновлении
либо перезапишется, либо потребует ручного слияния, и знать об этом лучше
до того, как правка сделана.

## Как приходят обновления

Установка ходит за обновлениями к нам, предъявляя ключ.

**Обновление — ваше событие, а не наше.** Оно не приходит само и не ставится само:
его надо поставить, проверить и при необходимости откатить. Порядок —
на странице [Установка](/start/install/).

Что перестаёт приходить по истечении срока поддержки: исправления, новые
возможности и изменения под законодательство. Работать установка не перестаёт.

## Состояние на сегодня

**Проверка лицензии выключена целиком** — ни подписи, ни домена, ни срока.
Сервера лицензий пока не существует, а механизм, который ещё не запущен,
не должен мешать работе.

Включается одним флагом развёртывания (`LICENSE_ENFORCE`), когда сервер появится.
До этого момента предупреждений о лицензии в админке быть не может ни при каких
данных.

## Доступ к вашей установке

Отдельной учётной записи для нас в установке **нет** — ни постоянной, ни сервисной.

Установка создаёт одного владельца и выдаёт **временный пароль** тому, кто ставил.
При первом входе владелец обязан его сменить — это шаг, который нельзя пропустить.
Пока пароль не сменён, в админке висит напоминание, что доступ известен третьей
стороне. Смена пароля пишется в журнал: ею передача установки и считается
завершённой.

Практическое следствие для порядка работ: **первый вход делает тот, кто останется
владельцем школы**, а не подрядчик, который ставит. См. предупреждение
на странице [Установка](/start/install/).
