Технологический стек
NestJS на Bun 1.3+, Drizzle ORM, zod v4, BullMQ, ConnectRPC, RabbitMQ, PostgreSQL, Kubernetes + Kustomize, ArgoCD. Go — только для high-load.
Технологический стек и Инфраструктура
Этот раздел описывает конкретные технологии, используемые в платформе, их роли и причины выбора.
Ключевой принцип: Основной бэкенд — NestJS (TypeScript). Go используется только для сверхнагруженных компонентов: Mediation (Netflow/IPFIX), Provisioning (Netconf/SNMP), AAA (FreeRADIUS CoA).
Почему двуязычная архитектура? В отличие от монолитных ISP-систем на одном стеке (Hydra Billing — Ruby, Splynx — PHP, WHMCS — PHP), мы используем NestJS для бизнес-логики (BSS: типобезопасность, DI, декораторы, экосистема npm) и Go для сетевого взаимодействия (OSS: zero-alloc parsing Netflow, concurrent SNMP polling, нативные RADIUS-библиотеки). Это позволяет каждой команде использовать оптимальный инструмент, сохраняя единый контракт через Protobuf.
Обзор стека
Языки и фреймворки
Основной стек: NestJS (TypeScript)
Ядро:
| Компонент | Библиотека | Обоснование |
|---|---|---|
| Framework | NestJS 11+ | DI, модульность, enterprise-готовность, огромная экосистема @nestjs/* |
| Runtime | Bun 1.3+ | Всё-в-одном: runtime + package manager + test runner + bundler. Быстрее Node.js, встроенный S3/PostgreSQL/Redis клиент, ESM + CJS без конфликтов |
| Language | TypeScript 5.7+ (strict) | satisfies, const type params, decorators stage 3, Bun нативно компилирует TS |
| Package Manager | Bun (встроенный) | Workspaces, isolated installs, security scanner, ~25× быстрее npm, не нужен отдельный pnpm/yarn |
| Monorepo | Turborepo + Bun workspaces | Remote caching, task pipelines. Bun workspaces для резолва зависимостей |
Данные и валидация:
| Компонент | Библиотека | Обоснование |
|---|---|---|
| ORM | Drizzle ORM (drizzle-orm + drizzle-kit) | SQL-like API, zero overhead, type-safe joins/subqueries, ближе всего к SQL — нет magic, полный контроль |
| DB Driver | drizzle-orm/bun-sql (Bun.sql) | Встроенный PostgreSQL-клиент Bun, prepared statements, zero dependencies |
| Migrations | drizzle-kit | drizzle-kit generate + drizzle-kit migrate, declarative schema-first |
| Validation | zod 4 (zod@^4.0) | 14× быстрее парсинг, 2× меньше bundle, JSON Schema из коробки, recursive objects, i18n, .meta() |
| NestJS + Zod | nestjs-zod | Pipes, DTOs, OpenAPI schema generation из zod |
| Error Handling | neverthrow | Result<T, E> тип (Rust-style), нет throw — явный error path |
API и интеграции:
| Компонент | Библиотека | Обоснование |
|---|---|---|
| RPC | ConnectRPC (@connectrpc/connect + @connectrpc/connect-node) | Protobuf-first, HTTP/1.1+2, JSON fallback, браузеры без прокси |
| Contracts | Protobuf + buf.build | Schema-first, codegen (TS + Go), breaking change detection, BSR |
| Messaging | @golevelup/nestjs-rabbitmq | Decorator-based pub/sub, auto-reconnect, exchanges, DLX |
| Background Jobs | BullMQ 5 (@nestjs/bullmq) | Redis-backed, priorities, cron, retry, rate limit, concurrency control |
| Job Dashboard | Bull Board (@bull-board/nestjs) | Web UI для мониторинга и ретрая джоб |
Observability и надёжность:
| Компонент | Библиотека | Обоснование |
|---|---|---|
| Logging | nestjs-pino (pino) | Самый быстрый JSON logger, structured, async, request context |
| Tracing | @opentelemetry/sdk-node + auto-instrumentation | OTel traces + metrics, pg/redis/amqp auto-instrumented |
| Health | @nestjs/terminus | Readiness/liveness probes, DB/Redis/RabbitMQ health indicators |
| Circuit Breaker | opossum | Closed→Open→Half-Open, проверен в production (Red Hat) |
| Retry | p-retry | Exponential backoff, jitter, abort signal |
| Rate Limiting | @nestjs/throttler | Decorator-based, Redis-backed, per-route/per-user |
| Graceful Shutdown | @nestjs/common (built-in) | enableShutdownHooks(), drain connections |
Auth и безопасность:
| Компонент | Библиотека | Обоснование |
|---|---|---|
| Auth | @nestjs/passport + passport-jwt | Keycloak JWT, RBAC guards, @Roles() декораторы |
| RBAC | Custom guards + Keycloak | Per-RPC/per-route права, realm roles |
| Config | @nestjs/config + zod schema | Env-based (12-factor), type-safe валидация при bootstrap |
| Caching | @nestjs/cache-manager + cache-manager-ioredis-yet | Redis-backed, TTL, @CacheKey() декораторы |
| Helmet | helmet | Security headers (CSP, HSTS, X-Frame), Express-compatible |
| CORS | @nestjs/common (built-in CORS) | Fine-grained CORS политики, настройка в main.ts |
Тестирование:
| Компонент | Библиотека | Обоснование |
|---|---|---|
| Unit / E2E | bun:test (встроенный) | Встроенный test runner Bun, concurrent tests, snapshots, mocks, VS Code integration |
| HTTP testing | supertest | HTTP assertions для NestJS e2e |
| Integration | testcontainers (@testcontainers/postgresql, redis, rabbitmq) | Docker-based PostgreSQL/Redis/RabbitMQ для интеграционных тестов |
| Type testing | bun:test expectTypeOf() | Compile-time type assertions в тестах |
| Mocking | bun:test mocks + @golevelup/ts-jest | Auto-mock NestJS providers, mock.module() |
| API Contract | buf breaking | Проверка обратной совместимости Protobuf в CI |
High-Load компоненты: Go
Go используется только там, где нужна максимальная производительность или работа с низкоуровневыми сетевыми протоколами:
| Компонент | Язык | Обоснование |
|---|---|---|
| Mediation (Netflow/IPFIX) | Go 1.23+ | Обработка миллионов flow-записей/сек, UDP listener, zero-alloc parsing |
| Provisioning (Vendor Adapter) | Go 1.23+ | Netconf/SNMP/SSH к оборудованию, вендорные Go-библиотеки (gosnmp, junos-ez, netconf) |
| AAA (RADIUS CoA) | Go 1.23+ | Низкоуровневый RADIUS-протокол, CoA UDP, минимальная latency |
Frontend
| Компонент | Язык / Фреймворк | Обоснование |
|---|---|---|
| Customer Portal | Next.js 16 (React 19.2) | Turbopack (stable), Cache Components + PPR, proxy.ts, React Compiler, View Transitions |
| CRM / Operator UI | React 19.2 + Vite 6 | SPA, TanStack Query, ConnectRPC-ES, shadcn/ui |
| Mobile Apps | React Native + Expo | Единая кодовая база iOS/Android, OTA updates |
Базы данных и хранилища
PostgreSQL (основная СУБД)
- Версия: 16+
- Использование: Каждый сервис имеет свою БД (database-per-service). Общая БД запрещена.
- Расширения:
uuid-ossp— генерация UUIDpg_trgm— полнотекстовый поиск (клиенты, адреса)pgcrypto— шифрование чувствительных данныхtimescaledb— для метрик и time-series данных (Mediation)
- HA: Patroni + etcd для автоматического failover.
- Бэкапы: WAL-G → S3, point-in-time recovery.
- Миграции: drizzle-kit для NestJS-сервисов (schema-first,
generate+migrate), goose для Go-сервисов.
Redis
- Версия: 7+
- Использование:
- BullMQ: Фоновые задачи, cron-джобы, retry, приоритеты, rate limiting
- Кэширование (@nestjs/cache-manager — каталог продуктов, профили)
- Распределённые блокировки (Redlock)
- Rate limiting (sliding window)
- Session store для Customer Portal
- Idempotency keys (TTL 24h)
- HA: Redis Sentinel или Redis Cluster.
RabbitMQ
- Версия: 4.x (с поддержкой Quorum Queues и Streams)
- Использование:
- Асинхронный обмен событиями и командами между сервисами
- Dead Letter Queues (DLX/DLQ) для обработки ошибок
- Transactional Outbox relay
- Конфигурация:
- Кластер из 3 нод (Quorum Queues = Raft-репликация)
- Publisher Confirms для гарантии записи
- Manual Ack на стороне консьюмеров
x-delivery-limit: 5перед перемещением в DLQ
- Мониторинг:
rabbitmq_prometheusплагин → Prometheus → Grafana. - Подробнее: Топология exchanges/queues — в API-контрактах.
S3 / MinIO
- Использование:
- Архив CDR/UDR (долгосрочное хранение, СОРМ)
- Бэкапы баз данных (WAL-G)
- Статические файлы (инвойсы PDF, шаблоны)
Kubernetes + Kustomize
Почему Kustomize, а не Helm
| Критерий | Kustomize | Helm |
|---|---|---|
| Подход | Декларативный overlay (patching) | Шаблонизация (Go templates) |
| Сложность | Простые YAML-файлы, нативный kubectl | Шаблоны, values, hooks, charts |
| Дебаг | kubectl diff — видно что применится | helm template + ручная проверка |
| GitOps | Нативная поддержка ArgoCD | Поддержка ArgoCD |
| Кастомизация | Strategic merge patches, overlays | Values файлы |
| Зависимости | Нет (всё in-tree) | Chart dependencies, repositories |
Структура Kustomize-манифестов
k8s/
├── base/ # Базовые манифесты (общие для всех env)
│ ├── kustomization.yaml
│ ├── namespace.yaml
│ ├── customer-core/
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ ├── hpa.yaml
│ │ └── pdb.yaml
│ ├── billing/
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ ├── hpa.yaml
│ │ └── pdb.yaml
│ ├── provisioning/
│ │ └── ...
│ ├── rabbitmq/
│ │ ├── statefulset.yaml
│ │ ├── service.yaml
│ │ └── configmap.yaml
│ └── common/
│ ├── network-policies.yaml
│ ├── resource-quotas.yaml
│ └── limit-ranges.yaml
├── components/ # Переиспользуемые компоненты
│ ├── monitoring/
│ │ ├── kustomization.yaml
│ │ ├── service-monitor.yaml
│ │ └── prometheus-rules.yaml
│ ├── tracing/
│ │ ├── kustomization.yaml
│ │ └── otel-collector.yaml
│ └── security/
│ ├── kustomization.yaml
│ ├── network-policy-strict.yaml
│ └── pod-security-standards.yaml
└── overlays/ # Окружения (патчи поверх base)
├── dev/
│ ├── kustomization.yaml
│ ├── patches/
│ │ ├── replicas.yaml # replicas: 1
│ │ └── resources.yaml # cpu: 100m, memory: 128Mi
│ └── configmap-env.yaml
├── staging/
│ ├── kustomization.yaml
│ ├── patches/
│ │ ├── replicas.yaml # replicas: 2
│ │ └── resources.yaml # cpu: 250m, memory: 256Mi
│ └── configmap-env.yaml
└── production/
├── kustomization.yaml
├── patches/
│ ├── replicas.yaml # replicas: 3
│ ├── resources.yaml # cpu: 500m, memory: 512Mi
│ └── tolerations.yaml
├── configmap-env.yaml
└── sealed-secrets/Пример: base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: isp-platform
commonLabels:
app.kubernetes.io/part-of: isp-platform
app.kubernetes.io/managed-by: kustomize
resources:
- namespace.yaml
- customer-core/
- billing/
- provisioning/
- rabbitmq/
- common/Пример: overlays/production/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
components:
- ../../components/monitoring
- ../../components/tracing
- ../../components/security
patches:
- path: patches/replicas.yaml
- path: patches/resources.yaml
- path: patches/tolerations.yaml
configMapGenerator:
- name: app-config
behavior: merge
literals:
- LOG_LEVEL=info
- ENVIRONMENT=production
images:
- name: customer-core
newName: registry.example.com/isp/customer-core
newTag: v1.2.3
- name: billing
newName: registry.example.com/isp/billing
newTag: v1.1.0Пример: base/customer-core/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: customer-core
labels:
app.kubernetes.io/name: customer-core
app.kubernetes.io/component: bss
spec:
replicas: 2
selector:
matchLabels:
app.kubernetes.io/name: customer-core
template:
metadata:
labels:
app.kubernetes.io/name: customer-core
spec:
serviceAccountName: customer-core
securityContext:
runAsNonRoot: true
runAsUser: 1000
fsGroup: 1000
seccompProfile:
type: RuntimeDefault
containers:
- name: customer-core
image: customer-core:latest # Overridden by Kustomize images
ports:
- name: grpc
containerPort: 8080
protocol: TCP
- name: metrics
containerPort: 9090
protocol: TCP
envFrom:
- configMapRef:
name: app-config
- secretRef:
name: customer-core-secrets
resources:
requests:
cpu: 250m
memory: 256Mi
limits:
memory: 512Mi # Без CPU limit (best practice)
livenessProbe:
grpc:
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
readinessProbe:
grpc:
port: 8080
initialDelaySeconds: 3
periodSeconds: 5
startupProbe:
grpc:
port: 8080
failureThreshold: 30
periodSeconds: 2
topologySpreadConstraints:
- maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app.kubernetes.io/name: customer-coreKubernetes Best Practices
Pod Security:
runAsNonRoot: true— контейнеры не запускаются от root.seccompProfile: RuntimeDefault— ограничение syscalls.readOnlyRootFilesystem: true— где возможно.- Pod Security Standards:
restrictednamespace label.
Resource Management:
- Requests установлены для всех контейнеров (CPU + Memory).
- Limits только для Memory (без CPU limit — избегаем throttling).
LimitRangeиResourceQuotaна уровне namespace.
High Availability:
PodDisruptionBudget(PDB):minAvailable: 1для каждого сервиса.topologySpreadConstraints: Распределение pod'ов по нодам/зонам.HorizontalPodAutoscaler(HPA): По CPU utilization (target 70%).- KEDA: Autoscaling RabbitMQ consumers по длине очереди.
Probes:
startupProbe— для медленного старта (миграции БД, прогрев кэша).livenessProbe— gRPC health check (ConnectRPC поддерживает из коробки).readinessProbe— gRPC health check (не принимаем трафик пока не готовы).
Network Policies:
# Пример: Billing может подключаться только к своей PostgreSQL и RabbitMQ
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: billing-egress
spec:
podSelector:
matchLabels:
app.kubernetes.io/name: billing
policyTypes:
- Egress
egress:
- to:
- podSelector:
matchLabels:
app.kubernetes.io/name: postgresql-billing
ports:
- port: 5432
- to:
- podSelector:
matchLabels:
app.kubernetes.io/name: rabbitmq
ports:
- port: 5672
- to: # DNS
- namespaceSelector: {}
ports:
- port: 53
protocol: UDPCI/CD Pipeline
Обзор
| Этап | Инструмент | Описание |
|---|---|---|
| Код | Git (GitLab) | Monorepo (Turborepo), trunk-based development |
| Lint | ESLint + Prettier, buf lint | TS + Protobuf стиль, golangci-lint для Go-сервисов |
| Test | bun:test, supertest, testcontainers | Unit + e2e + integration с PostgreSQL/RabbitMQ/Redis |
| Scan | trivy, bun audit | Уязвимости в образах и зависимостях |
| Build | Docker (multi-stage) | NestJS: oven/bun:1.3-alpine, Go: distroless |
| Images | k3s containerd | docker save | k3s ctr import, без registry |
| Proto | buf build, buf push | Lint + breaking check + публикация в BSR |
| CD | ArgoCD + Helm + K3s | GitOps, rollout restart + refresh-argo |
| IaC | Terraform | Инфраструктура (PostgreSQL, RabbitMQ, Redis) |
| Secrets | HashiCorp Vault + ESO | External Secrets Operator для K8s |
ArgoCD + Helm
# ArgoCD Application (deploy/applications/isp-platform.yaml)
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: isp-platform
namespace: argocd
spec:
project: default
source:
repoURL: https://gitlab.local/isp-platform/g-service-monorepo.git
targetRevision: HEAD
path: infra/chart
helm:
valueFiles:
- values.yaml
- values.production.yaml
destination:
server: https://kubernetes.default.svc
namespace: isp-platform
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=trueСреды (Environments)
| Среда | Назначение | ArgoCD Sync | Данные |
|---|---|---|---|
dev | Разработка, эксперименты | Auto (на каждый push) | Synthetic/seed data |
staging | Pre-production тестирование | Auto (на merge в main) | Анонимизированная копия prod |
production | Боевая среда | Manual (approval) | Реальные данные абонентов |
dr | Disaster Recovery | Sync с prod | Реплика prod (другой ДЦ) |
Docker: Multi-stage Build
NestJS-сервисы (Customer Core, Billing, OMS, ...)
# --- Build stage ---
FROM oven/bun:1.3-alpine AS builder
WORKDIR /app
COPY bun.lock package.json ./
RUN bun install --frozen-lockfile
COPY . .
RUN bun run build
# --- Runtime stage ---
FROM oven/bun:1.3-alpine
RUN addgroup -g 1001 -S bunjs && adduser -S nestjs -u 1001
WORKDIR /app
COPY --from=builder --chown=nestjs:bunjs /app/dist ./dist
COPY --from=builder --chown=nestjs:bunjs /app/node_modules ./node_modules
COPY --from=builder --chown=nestjs:bunjs /app/package.json ./
USER nestjs
EXPOSE 8080
CMD ["bun", "run", "dist/main.js"]Go-сервисы (Mediation, Provisioning, AAA)
FROM golang:1.23-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /app/server ./cmd/mediation/
FROM gcr.io/distroless/static-debian12:nonroot
COPY --from=builder /app/server /server
USER nonroot:nonroot
EXPOSE 8080 9090
ENTRYPOINT ["/server"]Best practices:
- Multi-stage build: Build-зависимости не попадают в финальный образ.
- NestJS:
oven/bun:1.3-alpine— минимальный образ (~120MB), Bun runtime быстрее Node.js. - Go:
distroless/static— минимальная поверхность атаки (~20MB). - nonroot: Запуск от непривилегированного пользователя.
Сетевая инфраструктура (ISP-специфика)
BRAS / BNG
- Модели: Mikrotik CCR, Juniper MX, Huawei ME60, Eltex.
- Протоколы: PPPoE, IPoE (DHCP + Option 82).
- Интеграция: RADIUS (auth/acct), CoA, SNMP, Netconf.
OLT (GPON/xPON)
- Модели: Huawei MA56xx, ZTE C3xx, Eltex LTP.
- Управление: SNMP, Netconf, CLI (через Provisioning).
- Данные: В Network Inventory (порты, ONT, привязки).
FreeRADIUS
- Версия: 3.2+ (или 4.x при доступности)
- Backend: SQL (PostgreSQL) для radcheck/radreply/radacct.
- HA: Два инстанса (primary/secondary), NAS настроен на оба.
- Мониторинг:
freeradius-exporterдля Prometheus. - Подробнее: Интеграция с RADIUS.
Дополнительное оборудование
- DPI (Deep Packet Inspection): Для СОРМ-1, QoS, фильтрации РКН.
- DHCP Relay: Для IPoE-абонентов (Option 82 → RADIUS).
- DNS: Рекурсивные серверы для абонентов + авторитативные для ISP.
- ACS (TR-069): Удалённое управление CPE. Подробнее — OSS Layer.
Go-библиотеки (Mediation / Provisioning / AAA)
Эти библиотеки используются только в Go-сервисах (high-load компоненты).
| Категория | Библиотека | Назначение |
|---|---|---|
| RPC | connectrpc.com/connect | ConnectRPC сервер/клиент |
| Protobuf | google.golang.org/protobuf | Protobuf runtime |
| AMQP | github.com/rabbitmq/amqp091-go | RabbitMQ клиент (без абстракций, максимальный контроль) |
| Database | github.com/jackc/pgx/v5 | PostgreSQL driver (pool, batch, COPY, LISTEN/NOTIFY) |
| Migrations | github.com/pressly/goose/v3 | SQL-миграции |
| Logging | log/slog (stdlib) | Structured JSON logging |
| Tracing | go.opentelemetry.io/otel | OTel SDK (traces + metrics) |
| Circuit Breaker | github.com/sony/gobreaker/v2 | Circuit breaker (generics v2) |
| Config | github.com/caarlos0/env/v11 | Env-based config (12-factor) |
| Network | github.com/gosnmp/gosnmp | SNMP v2c/v3 для OLT/BRAS |
| Network | github.com/Juniper/go-netconf | Netconf к оборудованию |
| RADIUS | layeh.com/radius | RADIUS CoA/Disconnect packets |
| Testing | github.com/stretchr/testify | Assertions + mocks |
Подробнее об API-контрактах и примерах кода — в API-контракты.
Выбор технологий: Decision Log
| Решение | Альтернативы | Причина выбора |
|---|---|---|
| Bun 1.3+ runtime | Node.js 22, Deno | Всё-в-одном: runtime + pkg manager + test runner + bundler. Встроенный S3/PG/Redis клиент, ~25× быстрее npm install, native TS-компиляция |
| NestJS для backend | Hono, Elysia, Express | Enterprise DI, модульность, огромная экосистема @nestjs/*, battle-tested. Работает на Bun runtime |
| Drizzle ORM | Prisma, TypeORM, MikroORM | SQL-like API, zero overhead, type-safe joins, полный контроль над SQL. Bun.sql как driver |
| zod 4 | class-validator, io-ts, joi | 14× быстрее v3, 2× меньше bundle, JSON Schema из коробки, i18n, .meta(), recursive objects |
| BullMQ | Agenda, Bee-Queue, Temporal | Redis-native, приоритеты, rate limit, cron, NestJS-модуль, Bull Board UI |
| Go для high-load | Bun для всего | Go только для Netflow/SNMP/RADIUS — миллионы pps, UDP, zero-alloc. Остальное — NestJS |
| neverthrow | throw/catch, Effect-TS | Rust-style Result<T,E>, лёгкий, явные error paths, нет hidden control flow |
| bun:test | Jest, Vitest | Встроенный в Bun, concurrent tests, snapshots, VS Code, expectTypeOf(), не нужен отдельный runner |
| Turborepo | Nx, Lerna | Remote caching, task pipelines + Bun workspaces для решения |
| Next.js 16 | Remix, Astro | Turbopack (stable), Cache Components + PPR, React Compiler, View Transitions, proxy.ts |
| Protobuf + buf | OpenAPI, JSON Schema | Schema-first, codegen TS+Go, breaking detection, BSR |
| ConnectRPC | gRPC, tRPC, REST | gRPC-compatible + HTTP/1.1 + JSON fallback, единый протокол TS↔Go |
| RabbitMQ | Kafka, NATS | Flexible routing (exchanges), DLX/DLQ, Quorum Queues, проще для масштаба ISP |
| PostgreSQL | MySQL, CockroachDB | Зрелость, TimescaleDB, pg_trgm, advisory locks, LISTEN/NOTIFY |
| Kustomize | Helm, plain YAML | Декларативный, нативный kubectl, проще дебаг |
| ArgoCD | Flux, Jenkins | GitOps, UI, нативная поддержка Kustomize |
| FreeRADIUS | Собственное решение | Стандарт ISP, поддержка всех NAS-вендоров |
Ссылки по теме
- API-контракты: Protobuf, ConnectRPC, RabbitMQ топология, BullMQ, DDD — API-контракты.
- Микросервисы: Каждый сервис подробно — Каталог сервисов.
- BSS: Customer Core, Product, Billing, Notification — BSS Layer.
- OSS: Provisioning, Inventory, AAA, Vendor Adapter — OSS Layer.
- Архитектурные принципы: SOLID, DDD, UoW, Clean Architecture — Принципы архитектуры.
- Мониторинг: Метрики, алерты, дашборды, runbooks — Observability.
- Безопасность: mTLS, Vault, Network Policies, Pod Security — Безопасность.
- Миграция: План перехода с Legacy, маппинг — Стратегия миграции.
- Legacy маппинг: Поле-за-полем из book_orders — Маппинг Legacy CRM.
- RADIUS: FreeRADIUS, CoA, HA — Интеграция с RADIUS.