Skip to content

NodeFlow 2.0.0

Choose a tag to compare

@github-actions github-actions released this 24 Sep 13:24
· 7 commits to main since this release
26ee139

NodeFlow 2.0.0

Panel 2.0.0 · Node Agent 2.0.0 · HAProxy renderer v21

Первый крупный релиз после 1.0.8. Panel и Node Agent теперь выходят под одной версией. Panel поставляется готовым Docker-образом ghcr.io/nodeflow-dev/nodeflow-panel:2.0.0 (linux/amd64 и linux/arm64), а установщик больше ничего не собирает на сервере.

Главное

  • Несколько серверов на маршрут. До 16 серверов в режимах «Пул» (все активны) и «Основной + резервные» (переключение по порядку). Сервер-домен можно сделать DNS-пулом: HAProxy использует все его A/AAAA-адреса и исключает недоступные. Для DNS-пула в режиме «Основной + резервные» можно задать статичный основной IP (preferred_ip).
  • Фолбэк вместо any_tcp/destination_ip. Один режим «Фолбэк» для всего, что не совпало по SNI; старые значения принимаются и приводятся к fallback автоматически.
  • Алгоритмы балансировки. roundrobin, static-rr, random (1–5 выборок, по умолчанию 2), leastconn («Меньше соединений») и leastping («Меньше задержка», аналог Xray leastLoad). Для leastconn доля клиентов задаётся весом сервера и отдельного IP (например, вес 2 у сервера на 4 ядра против 2 ядер), для leastping есть ещё стоимость — множитель задержки. У обоих есть толерантность (balance_tolerance): серверы с близкой нагрузкой или задержкой считаются равными и делят клиентов по весу. Веса на лету выставляет Node Agent через runtime API HAProxy, без reload. Также: вес сервера, отдельные веса IP DNS-пула (ip_weights), плавный ввод после восстановления (slowstart).
  • Закрепление клиента. source — хеш IP клиента (consistent или map-based, hash-balance-factor, группировка IPv6 по префиксу); source_table — запоминание клиента на sticky_ttl в stick-table, которая переживает reload. Размер таблицы «Авто» подбирается от RAM ноды.
  • PROXY protocol от доверенных адресов. accept_proxy_from принимает IP, подсети и домены (до 32 доменов на маршрут; Node Agent резолвит их A/AAAA и обновляет ACL без reload), есть вариант «от всех». Health-check отправляет PROXY-заголовок (check-send-proxy).
  • Ограничение скорости в ядре. shaper_mode=kernel: лимиты на IP клиента применяет Node Agent через nftables, HAProxy сохраняет zero-copy splice.
  • IPv4-only клиенты. Поле маршрута client_ipv6=false строит таблицы клиентов только для IPv4 — для нод без IPv6.
  • Производительность. Splice-буферы 1 МиБ, если ядро это позволяет (Agent сам настраивает pipe-лимиты), иначе 256 КиБ; меньше аллокаций в heartbeat Agent; gzip, пакетные запросы и индексы в Panel; immutable-кеш статических файлов интерфейса.
  • Prometheus /metrics в Panel: состояние нод, маршруты, соединения, здоровье backend'ов, трафик за месяц, синхронизация ревизий. Выключено по умолчанию; нужен bearer-токен длиной от 32 символов, опционально allowlist адресов. Метрики помечены node (UUID) и node_name.
  • Интерфейс. Новый редактор маршрутов с живым предпросмотром конфигурации HAProxy, страница настроек на всю ширину, блок Node Agent с таблицей подписанных релизов и статус эндпоинта /metrics.
  • Поставка. Multi-arch образ Panel в ghcr.io; миграции БД встроены в образ (panel-api migrate); install.sh ставит и обновляет Panel без git и без сборки; в assets релиза — только install kit и бинарники Node Agent для linux/amd64 и linux/arm64.

Обновление с 1.0.x

  1. Резервная копия. Установщик сам делает pg_dump и архив /opt/nodeflow (включая .env, tls/, pki/) в /var/backups/nodeflow/. При ручном обновлении сделайте это заранее.

  2. Panel. На сервере Panel повторно запустите установщик:

    curl -fsSL https://raw.githubusercontent.com/NodeFlow-dev/nodeflow/main/install.sh | sudo sh

    Найдя /opt/nodeflow/.env, он сохранит .env, tls/, pki/ и Caddy-сниппет, заменит compose.yaml на релизный, выполнит docker compose pull && docker compose up -d, дождётся ответа Panel 2.0.0 и удалит исходники 1.0.x (они остаются в архиве). При сбое возвращаются прежние compose.yaml и .env; дамп БД сохраняется.

    Вручную: возьмите compose.release.yaml из install kit (NodeFlow-Panel-2.0.0-Agent-2.0.0-install-kit.tar.gz) в /opt/nodeflow/compose.yaml, добавьте в .env строку NODEFLOW_VERSION=2.0.0 и выполните docker compose pull && docker compose up -d.

  3. Node Agent. Установщик публикует в Panel подписанные релизы Agent 2.0.0 для amd64 и arm64. В «Настройки → Node Agent» выберите ноду и нажмите «Обновить до 2.0.0» (или «Обновить» на странице ноды). Updater атомарно заменит бинарник и вернёт прежний, если новый Agent не запустится.

  4. Один раз на каждой ноде, установленной версией 1.0.x. Самообновление меняет только бинарник Agent, а systemd-юнит остаётся от 1.0.x и не даёт Agent записать pipe-лимиты ядра. Добавьте drop-in:

    sudo install -d /etc/systemd/system/nodeflow-node-agent.service.d
    printf '[Service]\nReadWritePaths=-/etc/sysctl.d -/proc/sys/fs/pipe-max-size -/proc/sys/fs/pipe-user-pages-soft\n' \
      | sudo tee /etc/systemd/system/nodeflow-node-agent.service.d/20-kernel-pipes.conf
    sudo systemctl daemon-reload && sudo systemctl restart nodeflow-node-agent

    Без drop-in всё работает, но splice остаётся на 256 КиБ. Другой вариант — «Переустановить Node Agent» в меню ноды: Panel 2.0.0 запишет новый юнит с этими правами. Ноды, добавленные Panel 2.0.0, получают их сразу.

Изменения поведения

  • Pipe-лимиты ядра. Agent 2.0.0 при старте и в каждом heartbeat поднимает fs.pipe-max-size до 1048576 (никогда не понижает), ставит fs.pipe-user-pages-soft = 0 и сохраняет их в /etc/sysctl.d/90-nodeflow-pipes.conf. Отключается переменной NODE_AGENT_TUNE_SYSCTL=off в /etc/nodeflow/node-agent.env — тогда Agent только сообщает текущие значения.
  • tune.pipesize 1048576 рендерится только для нод, где Agent подтвердил fs.pipe-max-size ≥ 1 МиБ и fs.pipe-user-pages-soft = 0; иначе 262144.
  • Размер «Авто» stick-table больше не фиксированные 100k: clamp(5 % RAM / 228 Б / N, 100k, 10m), где N — число включённых «Авто»-таблиц на ноде; RAM неизвестна — 1m. Память занимается по мере прихода клиентов. Явно заданные размеры не меняются.
  • Renderer v21. Нода без настроенных pipe-лимитов и без «Авто»-таблиц получает конфиг байт-в-байт как раньше (v20). Когда heartbeat меняет факты ноды (ядро настроено, RAM перешла в другой 256-МиБ-диапазон), Panel сама публикует новую ревизию маршрутов («node facts changed»). Ревизии, созданные администратором вручную, не трогаются.
  • DNS-пул без закрепления снова распределяет клиентов по balance source, как в 1.0.8.
  • Режим закрепления sni удалён: он балансировал целые домены, а не клиентов. Миграция 000052 переводит такие маршруты в source.
  • Функции, требующие нового Agent, отклоняются с кодом 422, пока нода не обновлена: kernel_shaper_requires_agent_1_1, leastping_requires_agent_1_1, ip_weights_requires_agent_1_1, leastconn_tolerance_requires_agent_1_1_1, pp_trusted_domains_requires_agent_1_1_3. Agent 2.0.0 проходит все проверки (версии сравниваются численно).
  • Удалён устаревший веб-интерфейс web/; Panel отдаёт только React-сборку.

Миграции базы данных

Применяются автоматически сервисом migrate в compose.yaml перед стартом Panel.

Миграция Что делает
000026 routes.accept_proxy_from — доверенные источники PROXY protocol
000027 таблица route_servers — несколько серверов на маршрут
000028 sticky_enabled (закрепление по IP)
000029 match_mode = fallback вместо any_tcp/destination_ip
000030 удаление sticky_table_size/sticky_expire
000031 balance_mode, route_servers.dns_pool, route_servers.preferred_ip
000040 индексы производительности (журнал аудита, токены, квоты)
000041 согласование route_servers и balance_mode
000050 shaper_mode (HAProxy или ядро)
000051 sticky_mode, sticky_ttl
000052 balance_algorithm и его параметры; вес, стоимость и ip_weights серверов
000053 произвольный размер таблицы (<n>k/<n>m), до 5 выборок random
000054 client_ipv6

Номера 000032–000039 и 000042–000049 не используются. Автоматического отката миграций нет — поэтому установщик перед обновлением делает pg_dump.

Известные ограничения

  • Домены в «Доверенных адресах» PROXY protocol перерезолвятся с фиксированным интервалом 30 с; TTL DNS-записей не учитывается. При сбое DNS остаётся последний известный набор адресов.
  • Автоматическая установка ноды из Panel поддерживает Ubuntu 24.04 и 26.04 (HAProxy 3.4 из официального репозитория HAProxy Performance) и Debian (пакет haproxy из репозитория дистрибутива, если HAProxy ещё не установлен). На Debian 12 это HAProxy 2.6 — заранее поставьте HAProxy 3.x.
  • Для разработчиков: четыре интеграционных теста PostgreSQL падают на устаревших фикстурах и в CI пока выполняются как неблокирующие; на работу Panel это не влияет.

Файлы релиза

  • NodeFlow-Panel-2.0.0-Agent-2.0.0-install-kit.tar.gz — install kit: install.sh, compose.release.yaml, шаблон nodeflow.env.example, scripts/install-node.sh, scripts/prepare-node-firewall.sh, scripts/init-mtls-pki.sh, scripts/init-update-signing-key.sh, systemd-юнит Agent, инструкции docs/install/ и SHA256SUMS файлов комплекта. Распакуйте и запустите sudo ./install.sh.
  • nodeflow-node-agent-2.0.0-linux-amd64, nodeflow-node-agent-2.0.0-linux-arm64 — бинарники Node Agent для публикации в Panel («Настройки → Node Agent») и для install-node.sh.

Panel (API, веб-интерфейс, миграции и updater нод) поставляется только образом ghcr.io/nodeflow-dev/nodeflow-panel:2.0.0 (digest — на странице пакета в GitHub Packages).

Контрольные суммы

GitHub публикует SHA-256 каждого asset'а (поле digest в API релиза, также видно на странице релиза). install.sh и install-node.sh сверяют с ним каждый скачанный файл и прерываются, если digest отсутствует или не совпадает. Проверка вручную:

curl -fsSL https://api.github.com/repos/NodeFlow-dev/nodeflow/releases/tags/v2.0.0 | jq -r '.assets[] | "\(.digest | ltrimstr("sha256:"))  \(.name)"' > SHA256SUMS
sha256sum -c SHA256SUMS --ignore-missing