Skip to content

Платформа дополнений ​

Дополнение — это отдельная программа: свой процесс или контейнер, своя база данных и свой интерфейс. Панель никогда не запускает его код, никогда не показывает его страницы внутри своих и не хранит его данные. Панель регистрирует дополнение, выдаёт ему ровно тот доступ, который вы одобрили, и следит за ним. Эта страница объясняет, как это устроено. Установка описана в Установка дополнения и Страница дополнений, разработка — в Создание дополнения.

Что можно выдать дополнению ​

Две вещи, и ничего больше:

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

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

Манифест ​

Каждое дополнение описывает себя в манифесте: идентификатор, название и версия, запрашиваемые права с причиной для каждого, нужные события, пути настройки, вебхука и проверки состояния, лимит запросов для его токена и способ установки. Тот же файл лежит в публичном репозитории дополнения, где его читают каталог и форма установки, и отдаётся работающим дополнением, где его читает регистрация. Полный формат описан в Манифест дополнения.

Подписи и доверие ​

Манифесту доверяют только по подписи:

ВидКем подписанКак регистрируется
Официальноеключом Nexoraпо коду привязки
Проверенноеключом своего разработчика, за который ручается каталог дополненийпо коду привязки; экран согласия называет разработчика
Неподписанное или неофициальноеникем, кому доверяет панельвручную, как ваше собственное дополнение

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

Регистрация по коду привязки ​

  1. Дополнение запускается с одноразовым кодом привязки, который оно показывает в своём журнале или на своей странице. Когда дополнение устанавливает панель, она сама создаёт код и уже его знает.
  2. Панель читает манифест по адресу дополнения, проверяет подпись и показывает экран согласия: каждое право с причиной, каждое событие, лимит запросов и кто подписал манифест.
  3. Вы одобряете. Панель снова читает манифест и проверяет, что это тот самый документ, который показывал экран, затем создаёт ровно этот токен и этот вебхук и передаёт их на путь настройки дополнения вместе с кодом привязки.
  4. Дополнение принимает их только со своим кодом. Если оно отвечает чем-либо, кроме успеха (например, код неверный), панель удаляет только что созданное. Неудавшаяся регистрация ничего после себя не оставляет.

Панель отправляет дополнению действующий токен, поэтому говорит с ним по обычному http://, только когда каждый адрес, в который оно разрешается, находится на этом сервере, в частной сети или в сети контейнеров. В любом другом случае дополнение должно работать на https://.

Выданные права принадлежат строке дополнения ​

После регистрации токен и вебхук принадлежат строке дополнения на странице Сервисы → Дополнения:

  • Они видны в Токены API и Вебхуки с пометкой названия дополнения, и там их нельзя изменить, заменить или удалить.
  • Токен привязан к владельцу панели, а не к тому, кто нажал одобрение, поэтому он продолжает работать, когда этот администратор уходит, и переходит вместе с правом владения, если вы его передадите.
  • Удалить сначала сообщает дополнению, затем удаляет его токен и вебхук. То, что дополнение хранило о ваших пользователях в своей базе, остаётся там, поэтому повторная регистрация это найдёт.

Проверка состояния ​

Если манифест указывает путь проверки состояния, панель обращается к нему каждую минуту. Ответ 200 означает, что всё в порядке.

  • Две неудачные проверки подряд помечают дополнение как неисправное с последней ошибкой и один раз создают panel.addon_unhealthy.
  • Следующий ответ 200 возвращает его и создаёт panel.addon_recovered.

Состояние хранится в базе, поэтому перезапуск панели не повторяет ни одно из событий. Дополнение без пути проверки состояния не опрашивается.

Приостановка ​

Приостановить останавливает дополнение, не удаляя его: его токен сразу перестаёт работать, а вебхук перестаёт получать события. События, созданные, пока оно приостановлено, для него не сохраняются. Приостановленное дополнение не опрашивается о состоянии. Возобновить включает и то и другое обратно.

Обновления никогда сами не расширяют права ​

Панель заново читает манифест подписанного дополнения каждый час и когда вы нажимаете Проверить обновление.

  • Версия, которая не просит ничего сверх того, что у дополнения уже есть, применяется сама.
  • Версия, которая просит больше прав, событий или более высокий лимит запросов, ждёт. Дополнение сохраняет ровно то, что у него есть, его строка показывает Ждёт обновление, один раз создаётся panel.addon_update_waiting, а при просмотре перечисляется только то, что добавляет обновление, с причиной для каждого пункта, чтобы вы его одобрили.
  • Версию, которая просит токен или вебхук, которых у дополнения никогда не было, нельзя одобрить на месте: для этих учётных данных нужен код привязки, который дополнение уже израсходовало. Удалите дополнение и зарегистрируйте его заново.

Сертификаты от панели ​

Дополнение, которое обслуживает HTTPS, может брать сертификат из хранилища панели, а не получать его само. Панель выпускает и продлевает его; дополнение забирает его каждые несколько минут, до регистрации по коду привязки, а после — по своему токену, и хранит копию, чтобы подниматься с HTTPS, даже пока панель недоступна. Тогда ему не нужны свои порты 80 и 443, и несколько дополнений могут делить сервер с панелью.

Дополнению на другом сервере предлагаются только сертификаты, которые сервер панели не подтверждал: выпущенные через проверку DNS, самоподписанные или загруженные. Собственный HTTPS-сертификат панели никогда не передаётся дополнению на другом сервере, потому что его ключ позволил бы этому серверу выдать себя за панель. Это проверяется заново при каждом получении. См. Выпуск и продление сертификатов.

Установка на собственный сервер панели ​

Когда панель работает прямо на Linux-сервере (не в контейнере), она может установить дополнение рядом с собой без SSH: она запускает скрипт установки дополнения от root, предварительно сверив выпуск с его подписанными контрольными суммами, а дополнение берёт сертификат у панели. При установке по SSH на другой сервер действуют те же проверки; ключ хоста сервера запоминается при первом подключении, а пароль или ключ SSH никогда не сохраняется.

Текст и изображения — CC BY 4.0.