chore(architecture): remove dpd portal legacy

This commit is contained in:
igor04091968
2026-06-05 08:55:13 +03:00
parent bc2f56ef8f
commit 2ec1836e8c
14 changed files with 112 additions and 915 deletions
+58
View File
@@ -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.
-127
View File
@@ -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-логики.
+2 -9
View File
@@ -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-парсинга.
+5 -11
View File
@@ -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`.