Skip to content

Ноды

Нода — сервер с агентом и Xray. Backend хранит её описание и желаемое состояние; агент поддерживает соответствие (см. Архитектуру).

Поле Назначение
name Отображаемое имя (nl-1)
public_address Адрес, который попадает в клиентские конфиги и аутбаунды соседних хопов
block_torrent Политика торрент-трафика на ноде, см. Трафик
desired_revision Монотонный счётчик желаемого состояния
applied_revision Последняя ревизия, подтверждённая агентом

Поля, которые нода сообщает сама (агент → backend, backend только отображает): версия агента и Xray, ОС, IP-адреса, системные метрики, время последнего контакта.

Два независимых измерения — административное состояние (управляется админом и enrollment-процессом) и связность (наблюдаемый факт):

stateDiagram-v2
    direction LR
    [*] --> provisioning : создана в панели
    provisioning --> active : агент прошёл enrollment
    active --> disabled : выключена админом
    disabled --> active
    active --> [*] : удалена
Административное Значение
provisioning Создана, enrollment-токен выдан, агент ещё не подключался
active Агент зарегистрирован; нода участвует в рендере конфигов и подписок
disabled Исключена из подписок и цепочек; агент может подключаться, но desired state пуст
Связность Значение
online gRPC-стрим агента открыт
offline Стрим закрыт; фиксируется last_seen_at

Связность не хранится как колонка-состояние — она выводится из наличия живого стрима и last_seen_at. Дополнительно наблюдаемый сигнал: applied_revision < desired_revision дольше порога — нода не может применить конфигурацию (ошибка применения приходит в статус-отчёте агента).

  1. Создание. Админ задаёт name и public_address. Backend генерирует одноразовый enrollment-токен (TTL 24 ч), показывает команду установки агента.
  2. Enrollment. Агент на сервере предъявляет токен, отправляет CSR, получает клиентский mTLS-сертификат и открывает стрим. Детали — Безопасность агента.
  3. Эксплуатация. Любое изменение, затрагивающее ноду, инкрементирует desired_revision; агент применяет и подтверждает.
  4. Отключение. disabled: backend рендерит ноде пустое состояние (Xray без клиентских инбаундов), подписки перестают включать её адрес. Обратимо.
  5. Удаление. Запрещено, пока нода входит в активную цепочку (Мультихоп) — сначала цепочка перестраивается. Инбаунды ноды удаляются каскадно. Суточная статистика трафика (агрегирована по подпискам) сохраняется; теряется только почасовая детализация этой ноды за последние 30 дней (Трафик).

desired_revision инкрементируется в той же транзакции, что и изменение данных, влияющих на рендер: инбаунды ноды, клиенты с доступом к ним, сертификаты этих инбаундов, цепочки с участием ноды, флаг торрентов. Рендер выполняется при отправке, а не при записи: хранится только счётчик, сам снапшот не материализуется в БД (нет хранения вычисляемых данных, нечему рассинхронизироваться).

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