Что публично
Эти поверхности покрыты семантическим версионированием и политикой устаревания на той же странице. Ломающее изменение любой из них — это мажорная версия и запись вCHANGELOG.md, а не молчаливая смена поведения.
Что внутреннее
Опираться на любое из этого можно — это ваша установка, — но обещаний совместимости здесь нет, и уведомление об устаревании не полагается./v1/panelи/v1/account. Они существуют, чтобы обслуживать две панели, и меняются вместе с экранами. Они привязаны к сессии с CSRF, так что скрипту с ними в любом случае неудобно. Используйте/v1/admin.- Схема базы данных. Миграции только вперёд, а таблицы перестраиваются, когда этого требует функция. Читайте с реплики, если необходимо; писать — только через API. Прямая запись обходит идемпотентность, аудит и правила «только-для-добавления», которые и делают финансовые записи достоверными.
- Пакеты Go. Каждый пакет лежит под
internal/, поэтому компилятор гарантирует, что ничто вне этого модуля их не импортирует. Это намеренно: так сопровождающие свободны менять внутренности, а «расширение» никогда не превращается в «кто-то зависит от сигнатуры этой функции». - Каталоги сообщений, внутренности компонентов и сгенерированные клиенты. Они перегенерируются.
- Схема River и полезная нагрузка заданий. Аргументы задания — деталь реализации того процесса, который его ставит.
Расширение без правки кода
Четыре точки интеграции принимают выбранную вами точку входа, и вклад в репозиторий не нужен. Именно поэтому плагинного рантайма нет, а не «он ещё не готов»: то, что людям действительно хочется подключить, — это внешние сервисы, а внешнему сервису нужны URL и учётные данные, а не механизм загрузки кода.
Ещё три — это конфигурация уже вкомпилированных адаптеров: платёжные провайдеры,
шлюз цифровых товаров и подключение к Remnawave. Вы выбираете, какие включены, с
какими учётными данными и какими возможностями, но не то, на каком протоколе они
говорят.
Добавление адаптера
Платёжный провайдер, шлюз цифровых товаров или провайдер моделей, говорящий на четвёртой форме, — это вклад в репозиторий. Интерфейсы намеренно небольшие, и адаптер, остающийся внутри них, — это ограниченное ревью. Платёжный адаптер реализует шесть методов —Name, Capabilities, Create,
Poll, Refund и VerifyWebhook — и объявляет, что он на самом деле умеет,
через Capabilities, а не через флаг в конфигурации. Три необязательных
интерфейса подхватываются, если реализованы: списание с сохранённого метода без
присутствия клиента, восстановление намерения, чья ссылка потеряна, и объявление
поддерживаемых валют. Адаптер, который не объявляет валюты, принимает ту, что
несёт заказ.
На чём ревью будет настаивать в любом случае:
- Идемпотентность — забота адаптера тоже. Каждый изменяющий вызов несёт ключ идемпотентности, и повторный вызов не должен подвинуть деньги дважды. Адаптер, который не может его соблюсти, обязан об этом сказать, и конвейер трактует неоднозначный исход как случай для человека, а не повторяет попытку, — ровно так сегодня и поступает шлюз цифровых товаров.
- Возможности объявляются, а не предполагаются. Кнопка возврата у провайдера, который не умеет возвращать, — это будущее обращение в поддержку.
- Проверка вебхука выполняется раньше всего остального, по сырому телу, с ограничением размера, и неуспешная проверка всё равно записывается.
- Ни один секрет не попадает в лог, в ошибку, показанную браузеру, или в набор диагностики. Текст ошибки провайдера может вернуть запрос обратно — поэтому адаптеры моделей возвращают статус и ничего больше.
- Вместе с ним поставляются тесты путей отказа и идемпотентности, а также фикстуры воспроизведения для форм вебхуков.
ROADMAP.md прямо говорит, что дополнительные платёжные
провайдеры добавляются, когда об этом просит оператор, а не ради их количества.
Что намеренно нерасширяемо
- Нет плагинного рантайма. Нет хоста WASM, нет динамической загрузки и нет точки расширения, выполняющей сторонний код в процессе Omniflow. Песочница возможностей — кандидат после 1.0, и ей нужен проект безопасности, а не библиотека.
- Нет второго места, решающего, что позволено роли. Каталог прав доступа и
сопоставление ролей вкомпилированы в
internal/rbac, поэтому ни файл конфигурации, ни строка в базе, ни интеграция не могут расширить доступ. - Никаких записей в хранилище Remnawave и никакого управления Xray — ничем, включая адаптер. См. запись 0004.
- Ни AI, ни MCP не могут обойти RBAC, подтверждение, идемпотентность или журнал аудита. Инструмент сопоставлен с правом доступа, которое у оператора уже есть, а значимое изменение требует человека.
Смежное
Интеграция с API
Bearer-токен, ключи идемпотентности, курсоры, ответы об ошибках и известные пробелы контракта.
Совместимость и обновления
Матрица версий, окно обновления и политика устаревания, на которую опирается эта страница.
Процесс выпуска
Как изменение становится версией и что публикует выпуск.
Архитектурные решения
Записи, ограничивающие то, чем расширению позволено быть.