Changed the step attribute for NumberField components in the VpsEditSheet to "any" for vCPU, RAM, and disk inputs. Updated the vpsSchema to accept real numbers for vCPU, diskGb, and bandwidthTb. Adjusted database schema to store vCPU, diskGb, and bandwidthTb as REAL instead of INTEGER for better precision.
9.8 KiB
name, overview, todos, isProject
| name | overview | todos | isProject | ||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| EvoFW classic policy | Классическая цепочка deny→allow→default_action (без white/blacklist). Страница агента по layout DNA solution-agents-3. Multi-set preview. EvoBGP community autocomplete/refresh. |
|
false |
Классическая политика EvoFirewall (без white/blacklist)
Решение по white/blacklist
White/blacklist как режимы не нужны. Правила уже несут deny/allow; exclusive mode, который применял только один мешок CIDR, — ошибка модели.
Остаётся одна вещь, которую режимы маскировали: что делать с пакетом, не попавшим ни в deny, ни в allow.
| Было | Стало |
|---|---|
policy_mode: blacklist → только deny-set, default accept |
default_action: accept |
policy_mode: whitelist → только allow-set, default drop |
default_action: drop |
Набор со своим policy_mode + same-mode lock |
У набора нет mode; только правила |
| Две разные nft/MikroTik цепочки | Одна цепочка всегда |
1. established / lo → accept (Linux)
2. @deny → drop
3. @allow → accept
4. default_action → accept | drop
Миграция значений: blacklist → accept, whitelist → drop.
Вердикт SA3 для страницы агента
Да как layout DNA (Header + Trace 2/3 + Facts 1/3), нет как AI-run шаблон.
| Элемент SA3 | Решение |
|---|---|
| Header + actions | Approve / Revoke / Install / More |
| Trace Timeline | Policy chain (правила Блок/Accept) |
| Facts EditableDetailRow | default_action + identity/timestamps |
| Retry / Pause / Owners / tool calls | Не копировать |
| QuickActionGrid на detail | Убрать (действия в header) |
Preview: solution-agents-3 · Solutions/Agents
Страница: agents/$id.tsx
Исходное состояние (проблемы)
- Same-mode lock на assign sets (
setAgentPolicySets) - Evaluate берёт mode с первого set; whitelist игнорирует deny в nft; blacklist игнорирует allow
- MikroTik RSC переключает bl/wl, а не держит обе list-правила
- Preview UI нет; EvoBGP refresh path мёртвый
1. Backend
Модель
- Правило:
action: deny | allow+ источник (list / cidr / hostname) - Агент:
default_action: accept | drop(колонка: migrateagents.policy_mode→default_actionили переиспользовать колонку с новыми значениями + backfill) - Набор: без mode; убрать UI/валидацию
policy_mode; колонкаpolicy_sets.policy_mode— legacy ignore / drop в след. релизе - Убрать same-mode check; не писать default агента из sets
Evaluate
- Сбор bags по цепочке set.sort → rule.priority → overrides
allowCidrs = allow \ deny(exact) →conflicts_droppeddefaultActionс агента- Hash:
{ apply_version: 2, defaultAction, denyCidrs, allowCidrs, generation }
Agent protocol / apply
Единая цепочка (nft, ipset/iptables, MikroTik install + mikrotik-rsc.ts):
- established/lo accept
- deny → drop
- allow → accept
- default =
default_action
JSON агенту (apply_version ≥ 2):
{
"apply_version": 2,
"default_action": "accept",
"deny_cidrs": [],
"allow_cidrs": [],
"hash": "...",
"generation": 1
}
Compat на один релиз (опционально): зеркало policy_mode: accept→blacklist, drop→whitelist только для старых бинарников; новые скрипты читают default_action + всегда единую цепочку. После обновления one-liner — убрать зеркало.
API / contracts
packages/shared/src/contracts.ts:
defaultActionSchema = z.enum(['accept', 'drop'])- Agent PATCH/response:
default_action(accept legacypolicy_modeblacklist/whitelist → map) - Policy set create/patch: не требовать / не экспозить mode в UI; API может игнорировать поле
- Preview:
{
default_action, hash, generation, sync_interval_sec, apply_version: 2,
summary: { sets, rules_deny, rules_allow, cidrs_deny, cidrs_allow, overrides, conflicts_dropped },
chain: [{ set_id, set_name, rule_id, action, source_kind, source_label, cidr_count }],
deny_cidrs, allow_cidrs, deny_cidrs_total, allow_cidrs_total
}
Только snake_case. Удалить PolicyModeToggle / mode с set detail.
Тесты: mixed deny+allow; exact conflict; unified apply оба default; assign разных бывших «режимов» sets без 400; hash apply_version.
2. UI: агент (SA3 layout DNA)
cd apps/web && pnpm dlx shadcn@latest add @reui/solution-agents-3 --yes
PageShell
├── AgentHeader
├── KpiStatGrid ← summary [stats-12]
├── grid @4xl: 2/3 + 1/3
│ ├── AgentPolicyTrace ← chain Timeline + Collapsible + Alert
│ └── AgentFactsPanel ← default_action Select + identity/dates
├── AgentPolicySetsSortable ← без фильтра mode
└── Effective CIDR Tabs ← Блок / Accept
Facts editable: «Если не совпало» → Accept / Drop (default_action).
Не показывать слова blacklist/whitelist.
Preview-референсы
| Зона | Preview | Docs |
|---|---|---|
| Каркас | solution-agents-3 | agents blocks |
| Frame | frame | docs |
| Timeline | c-timeline-6 | timeline |
| Facts rows | SA3 RunFacts · settings-3 | settings |
| KPI | stats-12 | KpiStatGrid |
| Sortable | c-sortable-5 | sortable |
| CIDR tabs | data-grid-filtering-2 · c-tabs-2 | data-grid |
| Alert | c-alert-7 | alert |
| Empty | empty-state-12 | — |
| Sheets | c-sheet-1 · form-7 | sheet |
| Autocomplete | c-autocomplete-8 · c-autocomplete-9 | autocomplete |
| Badge | badge | docs |
Set detail: только правила deny/allow + sortable; без mode.
Lists: community Autocomplete.
3. EvoBGP
- Autocomplete: proxy →
GET /v1/communities - Refresh: новый
GET /v1/communities/{id}/prefixesв EvoBGP + fixrefresh.ts - Docs
integrate-evobgp.md
4. Docs
- architecture / agents: нет BL/WL;
default_action; единый apply - OpenAPI:
default_action, preview, communities proxy
Порядок работ
- Schema/contracts:
default_action; deprecate set/agentpolicy_modesemantics - Evaluate + unified apply (nft/ipset/MikroTik) + tests + apply_version
- Preview API
- SA3 agent page + Facts
default_action - Sets sortable / set detail cleanup
- EvoBGP prefixes + refresh
- Communities autocomplete
- Docs + build
Вне скоупа
- Full first-match без sets
- IPv6
- AI-run UX из SA3 (Retry/Pause/Owners)