Диалог настроек ноды (шестерёнка), строка под переключателем «Логи соединений HAProxy»:
| Поле | Директива HAProxy | По умолчанию |
|---|---|---|
| maxconn | global maxconn |
автоматически (HAProxy) |
| nbthread | global nbthread |
автоматически (HAProxy) |
| timeout connect | defaults timeout connect |
5s |
| timeout client | defaults timeout client |
15m |
| timeout server | defaults timeout server |
15m |
Пустое поле — значение по умолчанию. Настройки действуют на все маршруты ноды: изменение публикует новую ревизию в той же транзакции, Agent применяет её reload без разрыва соединений. Обновлять Agent не нужно.
API: metadata.haproxy_settings в POST/PUT /api/v1/nodes (maxconn, nbthread, timeout_connect, timeout_client, timeout_server). Если ключ не передан — сохранённое значение не меняется, {} сбрасывает. Неизвестные поля, дробные и вне диапазона числа, неверные длительности → 400. Назначенный ручной конфиг настройки не меняют.
Кнопка «Конфигурация HAProxy» на странице ноды открывает /nodes/:id/haproxy — haproxy.cfg ноды целиком.
- Monaco (поставляется с Panel, грузится только на этой странице): подсветка HAProxy, миникарта, автодополнение.
- Подсказки на русском при наведении: секции, ~120 директив, параметры
server/bind,balance, fetch-функции. Опасные места подсвечиваются предупреждением. - Имена
nf_be_*/nf_srv_*помечены «не переименовывать»: по ним Panel считает статистику и применяет квоты. - Строка состояния: время последней проверки и «Конфиг валиден» или «N ошибок, M предупреждений» (клик — к первой проблеме), порты прослушивания из строк
bind.
Кнопки:
| Кнопка | Действие |
|---|---|
| Сохранить (Ctrl+S) | Новая ревизия без применения. |
| Всё равно сохранить | Только при ошибках линтера: сохранение с force. |
| Форматировать | Выравнивает отступы. |
| Применить на ноду | Сохраняет и назначает ревизию. Перед применением — diff с применённым конфигом; при ошибках линтера — дополнительное подтверждение. |
| История | Прежние ревизии ноды. |
| Загрузить из маршрутов | Подставляет конфиг, собранный из текущих маршрутов и настроек. |
| Вернуться к сборке из UI | POST /api/v1/nodes/{id}/generated-config: собирает конфиг из маршрутов и назначает его в одной транзакции. |
Пока назначен ручной конфиг, изменения маршрутов, требующие публикации, возвращают 409 advanced_config_active и откатываются. Ручные ревизии остаются в истории.
Разбор ручного текста обратно в формы маршрутов не выполняется. Квоты, статистика и план файрвола строятся по маршрутам; добавленные вручную listeners/backends этих функций не получают. Сертификаты и файлы, на которые ссылается конфиг, должны уже быть на ноде. Лимит — 512 КиБ. Не храните закрытые ключи в тексте конфига.
- Линтер в браузере — на каждое изменение.
POST /api/v1/nodes/{id}/config-lint— через 250 мс после изменения. Статическая проверка (в образе Panel нетhaproxy), ключевые слова сверены с исходниками HAProxy 2.8, 3.0 и 3.2: неизвестные секции, директивы,option, параметрыserver/bind, видыtimeout; директива не в той секции; лишние,/;(option tcplog,— ошибка на запятой); повторяющиеся имена proxy и серверов;use_backend/default_backendна несуществующий backend; неверные порты, адреса, длительности, значенияmode/balance/hash-type/log; несбалансированные.if/.endif; размер больше 512 КиБ.- Сохранение (
POST /api/v1/nodes/{id}/config-revisions,metadata.source=advanced_editor) повторяет проверку: с ошибками — 422config_lint_failedсо спискомissues,"force": trueсохраняет всё равно. В ревизии хранятсяrenderer=manual,listener_tcp_ports,lint: {errors, warnings}. Заголовок# Generated by NodeFlow. Do not edit.заменяется на# Edited manually in NodeFlow advanced editor., в конец добавляется перевод строки. haproxy -cна ноде перед применением — окончательная проверка. При ошибке Agent 2.1.0 передаёт строки[ALERT]/[WARNING](без строк сpassword/secret, до 1500 байт); они доступны вGET /api/v1/nodes/{id}/config-state→last_error_detailи показываются в редакторе со ссылками на строки. Старые Agent сообщают толькоvalidation_failed.
План файрвола ручной ревизии берёт порты из listener_tcp_ports. Для ручных ревизий, сохранённых до 2.1.0 без этого поля, текущие открытые порты сохраняются.
Формат ответов — docs/api-contract.md, раздел «Advanced editor: lint and manual revisions».

