Обновить dev-стек: frontend и observability

В dev-стек добавлены deal-frontend (:8080, SPA через Caddy) и storage-service; профиль observability расширен Loki/Promtail/Grafana. Статус Telegram: account из живого сервиса (KV — фолбэк), connected = phase ready.
Rustam Khalimov
2026-09-13 18:13:35 +03:00
parent 80272b0dc5
commit a7ed350734
+9 -3
@@ -286,7 +286,7 @@ settings(Key varchar(200) PK, ValueJson text, UpdatedAt timestamptz) --
compose.prod; конфиг `deploy/observability/prometheus.yml` — job `deal` с таргетами compose.prod; конфиг `deploy/observability/prometheus.yml` — job `deal` с таргетами
`core/telegram-service/ai-service/ml-service:9464` (target-метка `service`), retention 15 суток `core/telegram-service/ai-service/ml-service:9464` (target-метка `service`), retention 15 суток
(volume `deal_prometheus_data`). UI — `127.0.0.1:9090` (оператору по SSH-туннелю). В dev тот же сервис (volume `deal_prometheus_data`). UI — `127.0.0.1:9090` (оператору по SSH-туннелю). В dev тот же сервис
добавлен в `deploy/compose.dev.yml` (профиль `observability`, UI `localhost:9090`). добавлен в `deploy/compose.dev.yml` (профиль `observability`): в dev также `loki`/`promtail`/`grafana` (Grafana `localhost:3001`, admin/admin), `tempo`/`otel-collector` (трейсы, UI :3200) и `cadvisor`/`node-exporter` (ресурсы); Prometheus — `localhost:9090`.
- **Grafana-провижининг**: `datasources/datasources.yml` — датасорсы Loki (uid `loki`, default) и - **Grafana-провижининг**: `datasources/datasources.yml` — датасорсы Loki (uid `loki`, default) и
Prometheus (uid `prometheus`, `http://prometheus:9090`); дашборд `Deal-Metrics-Overview` (uid `deal-metrics`) Prometheus (uid `prometheus`, `http://prometheus:9090`); дашборд `Deal-Metrics-Overview` (uid `deal-metrics`)
в папке «Дейл»: RPS/p95/5xx по сервисам, токены и вызовы AI/ML, глубины очередей, активные сессии, в папке «Дейл»: RPS/p95/5xx по сервисам, токены и вызовы AI/ML, глубины очередей, активные сессии,
@@ -321,12 +321,16 @@ settings(Key varchar(200) PK, ValueJson text, UpdatedAt timestamptz) --
| `deal-minio` | 9000/9001 | MinIO (вложения; в Local-режиме необязателен) | | `deal-minio` | 9000/9001 | MinIO (вложения; в Local-режиме необязателен) |
| `deal-core` | 5080 / 5082 | Deal.Api: HTTP `/api` + gRPC-ингресс telegram | | `deal-core` | 5080 / 5082 | Deal.Api: HTTP `/api` + gRPC-ингресс telegram |
| `deal-telegram-service` / `deal-ai-service` / `deal-ml-service` | 5101/5102/5103 | автономные сервисы этапа 6 | | `deal-telegram-service` / `deal-ai-service` / `deal-ml-service` | 5101/5102/5103 | автономные сервисы этапа 6 |
| `deal-storage-service` | **5104** | хранилище вложений (storage-service) |
| `deal-frontend` | **8080** | SPA (Vite) через Caddy: статика + `/api → core:5080` |
`docker compose -f deploy/compose.dev.yml up -d --build` — весь стек в сквозном gRPC-режиме `docker compose -f deploy/compose.dev.yml up -d --build` — весь стек в сквозном gRPC-режиме
(`Services__*__UseLocal=false`); `sh scripts/dev-smoke.sh` — одна команда (подъём → health → login → (`Services__*__UseLocal=false`); `sh scripts/dev-smoke.sh` — одна команда (подъём → health → login →
`/api/tg/status` → `POST /api/cards` → trash → флашер MlOutbox → `/api/ml/status`; trap → down). Host-режим `/api/tg/status` → `POST /api/cards` → trash → флашер MlOutbox → `/api/ml/status`; trap → down). Host-режим
(core с хоста, Local-заглушки) — §13.113.6. (core с хоста, Local-заглушки) — §13.113.6.
Профиль `observability` (`--profile observability`) добавляет `prometheus`/`tempo`/`otel-collector`/`cadvisor`/`node-exporter` и `loki`/`promtail`/`grafana`: локально UI `http://localhost:8080`, Grafana `http://localhost:3001` (admin/admin), Prometheus `:9090`, Loki `:3100`, Tempo `:3200`.
### Prod-стек (`deploy/compose.prod.yml`) ### Prod-стек (`deploy/compose.prod.yml`)
- Одна внутренняя сеть; наружу — только **caddy** (80/443): TLS (шапка `deploy/caddy/Caddyfile` — - Одна внутренняя сеть; наружу — только **caddy** (80/443): TLS (шапка `deploy/caddy/Caddyfile` —
@@ -988,6 +992,8 @@ ml 36/36 PASS; build 0/0 всех четырёх sln; `docker compose -f deploy/
| `deal-telegram-service` | **5101** | Telegram: сессии/QR/диалоги/мониторинг/backfill/discovery-операции | | `deal-telegram-service` | **5101** | Telegram: сессии/QR/диалоги/мониторинг/backfill/discovery-операции |
| `deal-ai-service` | **5102** | LLM-фасад: Filter/Classify/GenerateKeywords/EvaluateFit | | `deal-ai-service` | **5102** | LLM-фасад: Filter/Classify/GenerateKeywords/EvaluateFit |
| `deal-ml-service` | **5103** | инкрементальная модель per-tenant: predict/train/status/reset | | `deal-ml-service` | **5103** | инкрементальная модель per-tenant: predict/train/status/reset |
| `deal-storage-service` | **5104** | хранилище вложений (storage-service) |
| `deal-frontend` | **8080** | SPA (Vite) через Caddy: статика + `/api → core:5080` |
Порт каждого сервиса — env `GRPC_PORT` (контейнерный 5101/5102/5103), порт ингресса core — env Порт каждого сервиса — env `GRPC_PORT` (контейнерный 5101/5102/5103), порт ингресса core — env
`GRPC_INGRESS_PORT` (5082). Health-проверки контейнеров — встроенный gRPC-health (`grpc_health_probe` `GRPC_INGRESS_PORT` (5082). Health-проверки контейнеров — встроенный gRPC-health (`grpc_health_probe`
@@ -1035,7 +1041,7 @@ ml 36/36 PASS; build 0/0 всех четырёх sln; `docker compose -f deploy/
```sh ```sh
cd /c/telbase cd /c/telbase
docker compose -f deploy/compose.dev.yml up -d --build # весь стек (первый прогон собирает 4 образа) docker compose -f deploy/compose.dev.yml --profile observability up -d --build # весь стек: 5 процессов + frontend + observability
sh scripts/dev-smoke.sh # сквозной smoke и авто-очистка (trap → down) sh scripts/dev-smoke.sh # сквозной smoke и авто-очистка (trap → down)
docker compose -f deploy/compose.dev.yml down # погасить стек вручную (volumes сохраняются) docker compose -f deploy/compose.dev.yml down # погасить стек вручную (volumes сохраняются)
``` ```
@@ -1062,7 +1068,7 @@ docker compose -f deploy/compose.dev.yml down # погасить ст
> `Deal.Api/Sources/SourceIngressGrpcService` (`sources.proto` → `PushSource`, proto → домен через > `Deal.Api/Sources/SourceIngressGrpcService` (`sources.proto` → `PushSource`, proto → домен через
> `SourceProtoMapper`, тенант — `IngressTenantResolver`, превью — `TelegramSourceIngestObserver`). > `SourceProtoMapper`, тенант — `IngressTenantResolver`, превью — `TelegramSourceIngestObserver`).
> `TelegramIngressService` обслуживает только `SyncDialogs`/`ReportStatus`. > `TelegramIngressService` обслуживает только `SyncDialogs`/`ReportStatus`.
- Эндпоинты 1:1 api-map §3.3 (14 шт.): статус (§4.9 — live-поля фазы, `account` из KV, `monitored` из - Эндпоинты 1:1 api-map §3.3 (14 шт.): статус (§4.9 — live-поля фазы, `account` — живое имя из telegram-service (KV `tgAccount` — фолбэк), `connected` = авторизация `phase=ready` (не транспортный флаг), `monitored` из
`count(Dialogs WHERE Monitor)`, `keysSet`), start-phone/start-qr/send-code/send-password/logout, `count(Dialogs WHERE Monitor)`, `keysSet`), start-phone/start-qr/send-code/send-password/logout,
QR-image (SVG, Net.Codecrete.QrCodeGenerator; 404 «QR не активен — начните вход по QR»), dialogs/refresh/ QR-image (SVG, Net.Codecrete.QrCodeGenerator; 404 «QR не активен — начните вход по QR»), dialogs/refresh/
monitor-all/backfill-all/{id}/monitor/{id}/backfill (сервер-only)/preview. Boot-заглушка `GET /api/tg/status` monitor-all/backfill-all/{id}/monitor/{id}/backfill (сервер-only)/preview. Boot-заглушка `GET /api/tg/status`