Repository navigation
NodeFlow 2.0.0
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
-
Резервная копия. Установщик сам делает
pg_dumpи архив/opt/nodeflow(включая.env,tls/,pki/) в/var/backups/nodeflow/. При ручном обновлении сделайте это заранее. -
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. -
Node Agent. Установщик публикует в Panel подписанные релизы Agent 2.0.0 для amd64 и arm64. В «Настройки → Node Agent» выберите ноду и нажмите «Обновить до 2.0.0» (или «Обновить» на странице ноды). Updater атомарно заменит бинарник и вернёт прежний, если новый Agent не запустится.
-
Один раз на каждой ноде, установленной версией 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