English | Русский
Установка · Обновление · Скриншоты · Что нового в 2.3.0 · Issues · Поддержка
NodeFlow — панель управления парком HAProxy-нод для TCP- и SNI-маршрутизации. Panel (Go API + React UI + PostgreSQL) хранит маршруты и неизменяемые ревизии конфигурации, а Node Agent на каждой ноде сам подключается к Panel по mTLS, проверяет и применяет конфиг HAProxy, сообщает метрики и обновляется по подписанным релизам. Ручного редактирования haproxy.cfg и входящего доступа к нодам для управления не требуется.
- SNI-маршрутизация и фолбэк. Общие listener'ы на порт, несколько SNI на маршрут, «Фолбэк» для всего, что не совпало; IP-, доменные и Unix-socket backend'ы.
- Несколько серверов и DNS-пулы. До 16 серверов на маршрут в режимах «Пул» и «Основной + резервные»; домен как DNS-пул (все A/AAAA-адреса, с исключением недоступных), отдельные веса для IP пула.
- Балансировка.
roundrobin,static-rr,random,leastconnиleastping(«Меньше задержка»). Вес сервера и отдельного IP DNS-пула, дляleastping— ещё стоимость (множитель задержки); толерантность: близкие по нагрузке или задержке серверы делят клиентов по весу, веса на лету выставляет Agent через runtime API, без reload. - Закрепление клиента. Хеш IP (consistent или map-based, группировка IPv6 по префиксу) или таблица с TTL, переживающая reload; размер «Авто» подбирается от RAM ноды.
- PROXY protocol. Приём от доверенных IP, подсетей и доменов (Agent резолвит их и обновляет ACL без reload), вариант «от всех»; health-check с PROXY-заголовком.
- Ограничение скорости. Лимиты upload/download на IP клиента — фильтрами HAProxy или в ядре через nftables (
shaper_mode=kernel), без потери splice. - Производительность. Zero-copy splice в обе стороны; Agent поднимает
fs.pipe-max-size, и Panel рендерит буферы 1 МиБ вместо 256 КиБ. - Квоты и учёт трафика. Помесячный трафик нод, backend'ов и маршрутов, квоты на маршрут.
- Безопасное применение. Desired/actual-ревизии, полная проверка
haproxy -cдо замены конфига, graceful reload с откатом. - Редактор
haproxy.cfg. Страница ноды → «Конфигурация HAProxy»: Monaco с подсветкой и автодополнением, подсказки по директивам при наведении, проверка на лету (неизвестные директивы и опции, лишние символы, порты, ссылки на backend), diff перед применением и история ревизий. Ошибкаhaproxy -cс ноды показывается текстом со ссылками на строки; одна кнопка возвращает к сборке из маршрутов. - Настройки HAProxy ноды.
maxconn,nbthreadи таймаутыconnect/client/server— в настройках ноды, применяются ко всем маршрутам reload без разрыва соединений; там же выключаются логи соединений. - Prometheus
/metricsв Panel: состояние нод и маршрутов, соединения, трафик, синхронизация ревизий (bearer-токен, allowlist CIDR). - Подписанные обновления Agent. Ed25519 + SHA-256, монотонная последовательность, атомарная активация и автооткат.
- mTLS. Отдельный клиентский сертификат на ноду, ротация и staged renewal; локальный API Agent доступен только с loopback.
- UFW. Правила listener-портов строятся из применённой ревизии, чужие правила не трогаются.
Agent сам открывает соединение с Panel: получает ревизии и команды, отправляет heartbeat с метриками. SSH нужен один раз — для первичной установки Agent.
- Panel: Ubuntu 22.04+/Debian 12+ (amd64 или arm64), 2 vCPU, 2 ГБ RAM, 15 ГБ диска, домен с A/AAAA-записью на сервер, открытые
80,443и4200/tcp. Docker Engine с Compose и Caddy установщик поставит сам. - Ноды: Linux amd64 или arm64 с systemd и HAProxy 3.x. Автоматическая установка из Panel поддерживает Ubuntu 24.04 (noble) и 26.04 (resolute) — Panel ставит HAProxy 3.4 из официального репозитория HAProxy Performance и не понижает более новый установленный HAProxy — и Debian: если HAProxy ещё нет, ставится пакет
haproxyиз репозитория дистрибутива (в Debian 12 это 2.6, поэтому HAProxy 3.x поставьте заранее). nftables — для ограничения скорости в ядре. SSH-доступ root или пользователем с sudo, по паролю или ключу.
На чистом сервере:
curl -fsSL https://raw.githubusercontent.com/NodeFlow-dev/nodeflow/main/install.sh | sudo shУстановщик:
- спросит домен и проверит, что его DNS указывает на этот сервер;
- предложит режим доступа: Caddy cookie-gate (ссылка активации ставит защищённую cookie) или без него — токен администратора Panel нужен в любом случае;
- установит Docker и Caddy — Caddy сам получит сертификат Let's Encrypt и будет проксировать HTTPS на Panel, которая слушает только
127.0.0.1:8080; - скачает install kit последнего релиза, проверит его по SHA-256, который GitHub публикует для каждого asset релиза, возьмёт из него
compose.release.yaml, сгенерирует.env, CA, сертификат mTLS и ключ подписи обновлений в/opt/nodeflow; - выполнит
docker compose pull && docker compose up -dс образомghcr.io/nodeflow-dev/nodeflow-panel:2.3.0— на сервере ничего не собирается, миграции БД применяет сам образ; - опубликует подписанные релизы Node Agent (amd64 и arm64) и сохранит реквизиты входа в
~/nodeflow-credentials.txt(права0600).
Файрвол установщик не меняет. Для автоматизации без вопросов передайте переменные NODEFLOW_DOMAIN, NODEFLOW_AUTH_MODE=cookie|none и при необходимости NODEFLOW_VERSION=2.3.0 (по умолчанию — последний релиз):
curl -fsSL https://raw.githubusercontent.com/NodeFlow-dev/nodeflow/main/install.sh \
| sudo NODEFLOW_DOMAIN=panel.example.com NODEFLOW_AUTH_MODE=cookie shУстановщик есть и в install kit (NodeFlow-Panel-<версия>-Agent-<версия>-install-kit.tar.gz в assets релиза): распакуйте его и запустите sudo ./install.sh — тогда compose.release.yaml берётся из комплекта, а из GitHub скачиваются только бинарники Agent для публикации в Panel.
Assets релиза — ровно три файла: install kit (установщики, compose.release.yaml, шаблон .env, скрипты PKI и ноды, systemd-юнит Agent, инструкции) и бинарники nodeflow-node-agent-<версия>-linux-amd64 / -linux-arm64. Panel поставляется только образом ghcr.io/nodeflow-dev/nodeflow-panel. Отдельного SHA256SUMS нет: установщики сверяют каждый скачанный файл с SHA-256, который GitHub публикует для asset'а (поле digest в API релиза), и прерываются при расхождении или отсутствии digest.
В Panel: Ноды → Добавить ноду → IP, SSH-порт, пользователь и пароль или ключ → сверьте fingerprint хоста → «Установить Node Agent». Panel один раз подключится по SSH, установит подписанный Agent, updater и mTLS-сертификат ноды; дальше нода управляется только через исходящий mTLS-канал на 4200/tcp.
Для восстановления без Panel есть install-node.sh: он скачивает Agent для архитектуры ноды из последнего релиза (или из NODEFLOW_VERSION) и проверяет его по SHA-256 asset'а из GitHub API; systemd-юнит встроен в скрипт. Нужны curl, jq или python3 и установленный HAProxy:
curl -fsSL https://raw.githubusercontent.com/NodeFlow-dev/nodeflow/main/scripts/install-node.sh -o install-node.sh
sudo NODE_AGENT_TOKEN=<токен> bash install-node.shТот же скрипт лежит в install kit: scripts/install-node.sh.
Команды выполняются от root (sudo -i): каталог /opt/nodeflow закрыт для остальных пользователей.
v=2.3.0
kit=NodeFlow-Panel-$v-Agent-$v-install-kit
curl -fsSLO "https://github.com/NodeFlow-dev/nodeflow/releases/download/v$v/$kit.tar.gz"
# сверьте с digest asset'а на странице релиза или в API:
curl -fsSL "https://api.github.com/repos/NodeFlow-dev/nodeflow/releases/tags/v$v" \
| jq -r --arg n "$kit.tar.gz" '.assets[] | select(.name == $n) | .digest'
sha256sum "$kit.tar.gz"
tar -xzf "$kit.tar.gz" && cd "$kit" && sha256sum -c SHA256SUMS
install -d -m 0750 /opt/nodeflow
install -m 0644 compose.release.yaml /opt/nodeflow/compose.yaml
install -m 0600 nodeflow.env.example /opt/nodeflow/.env # заполните секреты и домен
install -d /opt/nodeflow/scripts && install -m 0755 scripts/init-*.sh /opt/nodeflow/scripts/
/opt/nodeflow/scripts/init-mtls-pki.sh panel.example.com /opt/nodeflow # CA, mTLS, ключ подписи
cd /opt/nodeflow && docker compose pull && docker compose up -d
curl -fsS http://127.0.0.1:8080/healthzПеред Panel нужен HTTPS reverse proxy: готовые примеры для Caddy и Nginx — в docs/install/reverse-proxy. Порт 4200 не проксируется: ноды подключаются к нему напрямую.
Повторно запустите тот же установщик на сервере Panel:
curl -fsSL https://raw.githubusercontent.com/NodeFlow-dev/nodeflow/main/install.sh | sudo shНайдя /opt/nodeflow/.env, он работает как апгрейдер: делает pg_dump и архив конфигурации в /var/backups/nodeflow/, сохраняет .env, tls/, pki/ и Caddy-сниппет /etc/caddy/conf.d/nodeflow-panel.caddy, переводит установку со сборки из исходников на образ ghcr.io, запускает миграции и проверяет, что Panel отвечает новой версией. При ошибке возвращаются прежние compose.yaml и .env; дамп БД остаётся (миграции автоматически не откатываются).
Затем в Настройки → Node Agent обновите ноды до 2.3.0 — updater заменит Agent атомарно и откатит его при неудачном запуске. Самообновление не меняет systemd-юнит, поэтому на нодах, установленных версиями 1.0.x, один раз добавьте права на настройку pipe-буферов ядра (без этого splice остаётся на 256 КиБ) — или переустановите Agent из меню ноды:
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Подробности, изменения поведения и список миграций — в заметках к релизу 2.0.0.
Нужны Go 1.25+ и Node.js 22+.
git clone https://github.com/NodeFlow-dev/nodeflow.git && cd nodeflow
(cd frontend && npm ci && npm run build)
./scripts/build-panel.sh # panel-api со встроенным UI
go build -trimpath -o node-agent ./cmd/node-agent
go build -trimpath -o node-updater ./cmd/node-updater
go test ./...Локальный стенд: cp .env.example .env, заполните секреты и выполните docker compose up -d --build — compose.yaml в корне собирает образ из Dockerfile.panel. Интеграционные тесты PostgreSQL включаются переменной NODEFLOW_TEST_DATABASE_URL.
- Заметки к релизам 2.3.0, 2.2.0, 2.1.0, 2.0.1 и 2.0.0, CHANGELOG
- API Panel
- Настройки HAProxy ноды и редактор конфига
- Архитектура
- Первичная установка ноды
- Самообновление Agent
- Установка вручную
- Node Agent не публикуется в интернет: локальный API принимает только loopback-трафик, управление идёт по исходящему mTLS-каналу.
- Для каждой ноды выпускается отдельный клиентский сертификат.
- Релизы Agent проверяются по подписи Ed25519, SHA-256, платформе и последовательности версий.
- Panel по умолчанию слушает только
127.0.0.1; публикация HTTP наружу требует явногоALLOW_INSECURE_HTTP=true. - Действия с повышенными правами пишутся в журнал аудита.
Об уязвимостях сообщайте по SECURITY.md, не через публичные Issues.
Баг-репорты, идеи и вопросы по установке — в Issues. Укажите версии Panel/Agent, ОС и HAProxy ноды, шаги воспроизведения и обезличенные логи — без токенов, ключей, сертификатов и IP-адресов клиентов. Правила для PR — в CONTRIBUTING.md.
Поддержка проекта очень важна для продолжения обновлений NodeFlow.
Tron: TNUe93tFxeHj4avBY8s3NWzjaiyZfPWD9T
© 2026 NodeFlow. Все права защищены. Исходный код открыт для ознакомления, самостоятельной установки пользователями NodeFlow и внесения вклада в этот репозиторий. Распространение, в том числе изменённых версий, и коммерческое использование кода требуют письменного разрешения правообладателя. Полный текст — в LICENSE.






