ADR-007: Неймспейс движка без generic-абстракции
Status: Accepted · Date: 2026-07-03
Контекст
Section titled “Контекст”Предложение: спроектировать Astral как универсальный оркестратор сетевых сервисов (Provider → Protocol → Resource → Deployment), где Xray — один из движков наряду с будущими WireGuard, sing-box, Hysteria.
Решение
Section titled “Решение”Generic-абстракция движков не вводится. Вместо этого покупается опциональность двумя дешёвыми мерами:
- Xray-специфика контракта изолирована в поле
NodeConfig.xray(gRPC API) — второй движок станет аддитивным полем, а не v2 контракта. - Синтаксис Xray в backend знает единственный пакет
controlplane/render/xray(Структура backend) — второй движок станет вторым пакетом рендера.
Отклонённые альтернативы
Section titled “Отклонённые альтернативы”Универсальный оркестратор сейчас. Абстракция, спроектированная по одной реализации, почти всегда неправильная: WireGuard устроен фундаментально иначе (обмен ключами вместо секретов в конфиге, kernel-модуль, нет per-user-счётчиков в процессе, нет TLS-маскировки). «Generic Resource», придуманный глядя только на Xray, пришлось бы ломать при первой же реальной второй реализации — оплата за слой дважды. Принцип: abstract over things that have already proven to be the same, not merely similar.
Последствия
Section titled “Последствия”- (+) Транспорт и структура backend не мешают появлению второго движка; стоимость подготовки — одно поле proto и одно правило импорта.
- (+) Общая модель движков будет извлечена из двух реальных реализаций, когда вторая появится (новый ADR).
- (−) До этого момента доменная модель (профили, инбаунды, креденшелы) Xray-центрична — осознанно.