chore(architecture): remove dpd portal legacy
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
# Архитектурный baseline AWatch-rus
|
||||
|
||||
Дата фиксации: 2026-06-05
|
||||
|
||||
## Целевая архитектура
|
||||
|
||||
```text
|
||||
Backend/API: Rust
|
||||
Agent: Rust
|
||||
Portal: Rust SSR + HTML + HTMX
|
||||
Future Enterprise UI: React + TypeScript
|
||||
Future Desktop Forensics: Tauri + React + Rust core
|
||||
```
|
||||
|
||||
## Поддерживаемый контур
|
||||
|
||||
- Текущий production/pilot портал: Rust server-rendered HTML с HTMX-ready
|
||||
поведением и обычным JavaScript без отдельного frontend framework.
|
||||
- Контрактный слой для будущих интерфейсов: JSON API, OpenAPI 3.1 и
|
||||
TypeScript declarations.
|
||||
- Бизнес-логика, расчёты, workflow и работа с JSON-хранилищами остаются на
|
||||
стороне Rust backend/API.
|
||||
- Future Enterprise UI может быть реализован на React + TypeScript только
|
||||
поверх опубликованных JSON API.
|
||||
- Future Desktop Forensics может быть реализован как Tauri + React + Rust core,
|
||||
не ломая текущий портал.
|
||||
|
||||
## Исключено из roadmap
|
||||
|
||||
Dioxus и DPD Portal исключены из архитектурного roadmap проекта.
|
||||
|
||||
Это означает:
|
||||
|
||||
- новые Dioxus/DPD crate не добавляются;
|
||||
- `/dpd/` и `/dpd/api/*` не являются частью публичного API-контракта;
|
||||
- будущий UI не должен парсить HTML текущего портала;
|
||||
- новые UI-фреймворки требуют отдельного architecture decision;
|
||||
- breaking changes API требуют version bump контракта и migration window.
|
||||
|
||||
## Compatibility baseline
|
||||
|
||||
Обязательные production endpoints:
|
||||
|
||||
- `/portal`;
|
||||
- `/reports`;
|
||||
- `/portal/reports`;
|
||||
- `/api/reports`;
|
||||
- `/api/contracts`;
|
||||
- `/api/contracts/openapi.json`;
|
||||
- `/api/contracts/typescript.d.ts`.
|
||||
|
||||
Правила совместимости:
|
||||
|
||||
- изменения API должны быть additive;
|
||||
- клиенты игнорируют неизвестные поля;
|
||||
- optional-поля могут отсутствовать;
|
||||
- `null` не должен ломать UI;
|
||||
- публичные JSON-поля не переименовываются без новой версии контракта.
|
||||
@@ -0,0 +1,46 @@
|
||||
# Аудит очистки архитектуры от DPD/Dioxus
|
||||
|
||||
Дата: 2026-06-05
|
||||
|
||||
## Цель
|
||||
|
||||
Зафиксировать результат проверки наследия DPD/Dioxus после усиления API
|
||||
контрактов в коммите `bc2f56e`.
|
||||
|
||||
## Найденные DPD-артефакты до очистки
|
||||
|
||||
- workspace crate `adk-rust/crates/detmir-dpd-portal`;
|
||||
- запись workspace member `crates/detmir-dpd-portal` в `adk-rust/Cargo.toml`;
|
||||
- package entry `detmir-dpd-portal` в `adk-rust/Cargo.lock`;
|
||||
- документ `docs/DPD_PORTAL_RU.md`;
|
||||
- OpenAPI server base `/dpd/api`;
|
||||
- упоминания DPD mirror в `docs/PORTAL_API_CONTRACTS_RU.md`;
|
||||
- упоминания DPD mirror в `docs/UI_ARCHITECTURE_BASELINE_RU.md`.
|
||||
|
||||
## Найденные Dioxus-артефакты до очистки
|
||||
|
||||
Production-код, workspace crates, scripts, examples и OpenAPI/TypeScript
|
||||
контракты не содержали Dioxus-зависимостей или `rsx!`-кода.
|
||||
|
||||
Оставались только запретительные упоминания в архитектурном baseline:
|
||||
|
||||
- Dioxus не является частью roadmap;
|
||||
- Dioxus не добавлять без отдельного architecture decision.
|
||||
|
||||
## Выполненное решение
|
||||
|
||||
- DPD Portal исключён из workspace и публичного contract layer.
|
||||
- Документ `docs/DPD_PORTAL_RU.md` удалён как описание экспериментальной ветки.
|
||||
- OpenAPI больше не публикует `/dpd/api`.
|
||||
- Runtime-слой DPD Portal выведен из эксплуатации: app-service остановлен и
|
||||
выключен, gateway route удалён, перед удалением создан локальный backup.
|
||||
- `docs/ARCHITECTURE_BASELINE_RU.md`,
|
||||
`docs/UI_ARCHITECTURE_BASELINE_RU.md` и
|
||||
`docs/PORTAL_API_CONTRACTS_RU.md` фиксируют единственную целевую архитектуру:
|
||||
Rust backend/API, Rust agent, Rust SSR + HTML + HTMX portal, будущий
|
||||
React/TypeScript UI и будущий Tauri + React + Rust core desktop forensics.
|
||||
|
||||
## Статус
|
||||
|
||||
DPD/Dioxus остаются только как исторически упомянутые исключённые направления.
|
||||
Они не являются production runtime, публичным API или частью roadmap.
|
||||
@@ -1,127 +0,0 @@
|
||||
# DPD Parallel Portal
|
||||
|
||||
`detmir-dpd-portal` - параллельный gateway-портал DetMir. Он не заменяет
|
||||
текущий `detmir-portal`, а повторяет его функциональность через отдельный
|
||||
маршрут `/dpd/`.
|
||||
|
||||
## Назначение
|
||||
|
||||
DPD нужен для безопасной эволюции интерфейса:
|
||||
|
||||
- основной HTML-портал `/portal/` остаётся стабильным;
|
||||
- `/dpd/` работает как полный mirror текущего портала;
|
||||
- будущий React/Tauri UI сможет использовать те же API-контракты;
|
||||
- новые UI-решения проверяются без cutover и без дублирования бизнес-логики.
|
||||
- будущий UI не парсит HTML текущего портала как источник данных.
|
||||
|
||||
DPD проксирует:
|
||||
|
||||
- вкладки;
|
||||
- API;
|
||||
- действия проверки;
|
||||
- дела;
|
||||
- расследования;
|
||||
- markdown/download endpoints;
|
||||
- материалы проверки.
|
||||
|
||||
DPD gateway сохраняет операторский контекст для симметрии с основным порталом:
|
||||
`X-Remote-User`, `X-Gateway-User`, `X-Forwarded-*`, `User-Agent`, `Referer`,
|
||||
`Origin`, `Cookie` и `Authorization` передаются в upstream, hop-by-hop
|
||||
заголовки не передаются. Это нужно, чтобы audit/review/case-действия через
|
||||
`/dpd/` фиксировались так же, как через `/portal/`.
|
||||
|
||||
## Архитектурное решение
|
||||
|
||||
Выбран зрелый путь:
|
||||
|
||||
```text
|
||||
detmir-portal Rust backend
|
||||
|
|
||||
| stable /api/contracts
|
||||
v
|
||||
current HTML UI + DPD mirror + future React/Tauri UI
|
||||
```
|
||||
|
||||
Не используется отдельный экспериментальный UI-фреймворк в production path.
|
||||
Сначала фиксируются API-контракты, тестируется совместимость и только затем
|
||||
добавляется новый frontend.
|
||||
|
||||
## Запуск
|
||||
|
||||
```bash
|
||||
detmir-dpd-portal \
|
||||
--bind 127.0.0.1:8722 \
|
||||
--upstream-base http://127.0.0.1:8720
|
||||
```
|
||||
|
||||
Переменные окружения:
|
||||
|
||||
- `DETMIR_DPD_BIND`;
|
||||
- `DETMIR_DPD_UPSTREAM_BASE`;
|
||||
- `DETMIR_DPD_TIMEOUT_SECONDS` - по умолчанию 60 секунд, чтобы первый
|
||||
холодный `/api/reports` после рестарта не выглядел как отказ DPD-портала.
|
||||
|
||||
## Маршруты
|
||||
|
||||
- `/dpd/` - полный параллельный mirror текущего портала.
|
||||
- `/dpd/_dpd/health` - health самого DPD gateway.
|
||||
- `/dpd/preview/` - компактный read-only preview-экран.
|
||||
|
||||
## API-контракты
|
||||
|
||||
Контракты публикует основной `detmir-portal`, а DPD зеркалирует их:
|
||||
|
||||
- `/api/contracts`;
|
||||
- `/api/contracts/openapi.json`;
|
||||
- `/api/contracts/typescript.d.ts`;
|
||||
- `/dpd/api/contracts`;
|
||||
- `/dpd/api/contracts/openapi.json`;
|
||||
- `/dpd/api/contracts/typescript.d.ts`.
|
||||
|
||||
Правила совместимости:
|
||||
|
||||
- изменения API должны быть additive;
|
||||
- клиенты React/Tauri обязаны игнорировать неизвестные поля;
|
||||
- optional-поля могут отсутствовать;
|
||||
- `null` не должен ломать UI;
|
||||
- breaking changes требуют version bump контракта и отдельного architecture
|
||||
decision;
|
||||
- будущий React/Tauri UI не должен парсить HTML текущего портала.
|
||||
|
||||
## Проверка симметрии
|
||||
|
||||
Минимальная проверка на сервере:
|
||||
|
||||
```bash
|
||||
systemctl is-active detmir-dpd-portal detmir-portal nginx --no-pager
|
||||
curl -sS http://127.0.0.1:8722/_dpd/health
|
||||
curl -sS -o /dev/null -w 'dpd_index=%{http_code}\n' http://127.0.0.1:8722/
|
||||
curl -sS -o /dev/null -w 'dpd_reports=%{http_code}\n' http://127.0.0.1:8722/api/reports
|
||||
curl -sS -o /dev/null -w 'dpd_contracts=%{http_code}\n' http://127.0.0.1:8722/api/contracts
|
||||
```
|
||||
|
||||
Браузерная проверка с ноутбука:
|
||||
|
||||
```bash
|
||||
ssh -o ExitOnForwardFailure=yes -o ServerAliveInterval=15 -o ServerAliveCountMax=3 \
|
||||
-N -L 18720:127.0.0.1:8720 <GATEWAY_HOST>
|
||||
|
||||
detmir-dpd-portal \
|
||||
--bind 127.0.0.1:18722 \
|
||||
--upstream-base http://127.0.0.1:18720
|
||||
|
||||
DETMIR_PORTAL_SMOKE_URL=http://127.0.0.1:18722/ \
|
||||
DETMIR_PORTAL_SMOKE_TIMEOUT_MS=70000 \
|
||||
node scripts/detmir-portal-tabs-smoke.mjs
|
||||
```
|
||||
|
||||
Ожидаемый результат: `ok=true`, все вкладки работают, нет JS/API ошибок,
|
||||
абсолютные `/portal/...` ссылки в HTML/JS переписаны в `/dpd/...`.
|
||||
|
||||
## Ограничения
|
||||
|
||||
- DPD gateway не добавляет новые бизнес-сущности.
|
||||
- DPD gateway не заменяет текущий портал.
|
||||
- Данные берутся из существующего портала/API.
|
||||
- Новый React/Tauri UI должен появляться поверх контрактов, а не через
|
||||
копирование backend-логики.
|
||||
@@ -16,12 +16,6 @@ React/Tauri-интерфейса без переписывания backend-ло
|
||||
- `GET /api/contracts/openapi.json`
|
||||
- `GET /api/contracts/typescript.d.ts`
|
||||
|
||||
DPD mirror:
|
||||
|
||||
- `GET /dpd/api/contracts`
|
||||
- `GET /dpd/api/contracts/openapi.json`
|
||||
- `GET /dpd/api/contracts/typescript.d.ts`
|
||||
|
||||
## Правила совместимости
|
||||
|
||||
- Изменения API должны быть additive.
|
||||
@@ -56,9 +50,9 @@ DPD mirror:
|
||||
|
||||
- HTML-портал не удаляется.
|
||||
- Маршрут `/portal/` остаётся стабильным.
|
||||
- DPD `/dpd/` остаётся параллельным mirror.
|
||||
- Backend-расчёты, JSON-хранилища и workflow не дублируются во frontend.
|
||||
- Публичные JSON-поля не переименовываются без новой версии контракта.
|
||||
- Dioxus и DPD Portal исключены из архитектурного roadmap проекта.
|
||||
|
||||
## Проверка
|
||||
|
||||
@@ -66,7 +60,6 @@ DPD mirror:
|
||||
curl -sS http://127.0.0.1:8720/api/contracts | jq .
|
||||
curl -sS http://127.0.0.1:8720/api/contracts/openapi.json | jq .openapi
|
||||
curl -sS http://127.0.0.1:8720/api/contracts/typescript.d.ts | head
|
||||
curl -sS http://127.0.0.1:8722/api/contracts | jq .
|
||||
```
|
||||
|
||||
Ожидаемый результат:
|
||||
@@ -75,4 +68,4 @@ curl -sS http://127.0.0.1:8722/api/contracts | jq .
|
||||
- `contract_version` заполнен;
|
||||
- OpenAPI JSON валиден;
|
||||
- TypeScript declarations доступны;
|
||||
- DPD отдаёт те же контрактные endpoints через mirror.
|
||||
- будущий React/Tauri UI может использовать JSON API без HTML-парсинга.
|
||||
|
||||
@@ -10,7 +10,8 @@ Agent: Rust
|
||||
Current Portal: Rust server-rendered HTML + HTMX
|
||||
Future Enterprise UI: React + TypeScript
|
||||
Future Desktop Forensics: Tauri + React + Rust core
|
||||
Dioxus: out of scope / не рассматривается
|
||||
Dioxus: excluded from roadmap
|
||||
DPD Portal: excluded from roadmap
|
||||
```
|
||||
|
||||
## Правила
|
||||
@@ -21,7 +22,7 @@ Dioxus: out of scope / не рассматривается
|
||||
- Будущий React/Tauri UI не должен ломать текущий портал.
|
||||
- Agent и backend остаются Rust-first.
|
||||
- Новые UI-фреймворки не добавлять без отдельного architecture decision.
|
||||
- Dioxus не добавлять и не рассматривать.
|
||||
- Dioxus и DPD Portal исключены из архитектурного roadmap проекта.
|
||||
- Будущий React/Tauri UI не должен парсить HTML текущего портала как источник
|
||||
данных.
|
||||
|
||||
@@ -31,9 +32,8 @@ Dioxus: out of scope / не рассматривается
|
||||
|
||||
1. Укрепить текущий Rust web portal.
|
||||
2. Зафиксировать стабильные JSON API-контракты.
|
||||
3. Поддерживать DPD `/dpd/` как параллельный mirror для проверки совместимости.
|
||||
4. Готовить будущий React/Tauri UI только поверх опубликованных контрактов.
|
||||
5. Любые breaking changes проводить только через version bump контракта и
|
||||
3. Готовить будущий React/Tauri UI только поверх опубликованных контрактов.
|
||||
4. Любые breaking changes проводить только через version bump контракта и
|
||||
отдельное architecture decision.
|
||||
|
||||
## Контрактный слой
|
||||
@@ -44,12 +44,6 @@ Dioxus: out of scope / не рассматривается
|
||||
- `/api/contracts/openapi.json`;
|
||||
- `/api/contracts/typescript.d.ts`.
|
||||
|
||||
DPD mirror endpoints:
|
||||
|
||||
- `/dpd/api/contracts`;
|
||||
- `/dpd/api/contracts/openapi.json`;
|
||||
- `/dpd/api/contracts/typescript.d.ts`.
|
||||
|
||||
Правило совместимости: изменения API должны быть additive. Клиенты обязаны
|
||||
игнорировать неизвестные поля, корректно обрабатывать отсутствующие optional
|
||||
поля и не падать на `null`.
|
||||
|
||||
Reference in New Issue
Block a user