Архитектура ISP (OSS/BSS)
Полная карта системы Детализированная архитектурная карта ISP-платформы — все сервисы, взаимодействия, бизнес-процессы, события, use cases и domain entities.
Эта страница — единый источник правды обо всей системе. Здесь описаны все микросервисы, их взаимодействия, бизнес-процессы, доменные сущности и инфраструктура — вплоть до отдельных функций (use cases) и событий.
Общая схема: 9 микросервисов (6 NestJS + 3 Go), фронтенд, инфраструктура.
# Сервис Runtime Порт База данных Доп. инфра 1 customer-core NestJS v11 3010 customer_core_dbRedis, S3 (MinIO), RabbitMQ 2 product-catalog NestJS v11 3011 product_dbRedis, RabbitMQ 3 billing NestJS v11 3012 billing_dbRedis, BullMQ, RabbitMQ 4 notification NestJS v11 3013 notification_dbRedis, BullMQ, RabbitMQ, SMTP 5 oms NestJS v11 3014 oms_dbRedis, BullMQ, RabbitMQ 6 network-inventory NestJS v11 3015 inventory_dbRedis, BullMQ, RabbitMQ 7 provisioning Go 1.23 8080 customer_core_dbRabbitMQ 8 aaa Go 1.23 8081 PostgreSQL (RADIUS) FreeRADIUS 9 mediation Go 1.23 8082 TimescaleDB MinIO (S3), RabbitMQ 10 web Next.js 16 3000 — Keycloak (OIDC)
Каждый NestJS-сервис построен по единому шаблону:
Exchange Тип Описание isp.events.customertopic События Customer Core isp.events.producttopic События Product Catalog isp.events.billingtopic События Billing isp.events.omstopic События OMS isp.events.notificationtopic События Notification isp.events.provisioningtopic События Provisioning (Go) isp.events.inventorytopic События Network Inventory isp.events.mediationtopic События Mediation (Go) isp.commands.provisioningtopic Команды к Provisioning/Notification isp.commands.inventorytopic Команды к Network Inventory
Routing Key Exchange Publisher Consumers Описание customer.createdisp.events.customercustomer-core billing Авто-создание billing account customer.updatedisp.events.customercustomer-core — Обновление профиля contract.signedisp.events.customercustomer-core — Подписание договора contract.terminatedisp.events.customercustomer-core — Расторжение договора payment.receivedisp.events.billingbilling notification Уведомление о платеже balance.negativeisp.events.billingbilling notification Уведомление о минусовом балансе balance.updatedisp.events.billingbilling — Обновление баланса (charge) dunning.stage_changedisp.events.billingbilling product-catalog, notification Блокировка подписок / уведомление invoice.issuedisp.events.billingbilling notification Уведомление о счёте subscription.activatedisp.events.productproduct-catalog — Активация подписки subscription.suspendedisp.events.productproduct-catalog — Приостановка подписки subscription.terminatedisp.events.productproduct-catalog — Прекращение подписки subscription.tariff_changedisp.events.productproduct-catalog — Смена тарифа order.createdisp.events.omsoms — Создание заказа order.completedisp.events.omsoms — Завершение заказа order.failedisp.events.omsoms — Ошибка заказа order.cancelledisp.events.omsoms — Отмена заказа order.step_completedisp.events.omsoms — Шаг саги завершён provisioning.successisp.events.provisioningprovisioning (Go) oms Провижнинг успешен provisioning.failedisp.events.provisioningprovisioning (Go) oms Провижнинг ошибка port.reservedisp.events.inventorynetwork-inventory oms Порт зарезервирован port.releasedisp.events.inventorynetwork-inventory oms Порт освобождён resource.exhaustedisp.events.inventorynetwork-inventory — Ресурсы исчерпаны device.status_changedisp.events.inventorynetwork-inventory — Статус устройства изменён availability.checkedisp.events.inventorynetwork-inventory — Результат проверки ТВ
Routing Key Exchange Publisher(s) Consumer Описание access.suspendisp.commands.provisioningoms, billing provisioning (Go) Блокировка доступа access.resumeisp.commands.provisioningoms, billing provisioning (Go) Разблокировка доступа service.activateisp.commands.provisioningoms provisioning (Go) Активация услуги на OLT service.deactivateisp.commands.provisioningoms provisioning (Go) Деактивация услуги send_notificationisp.commands.provisioningoms notification Отправка уведомления terminate_subscriptionisp.commands.provisioningoms — Прекращение подписки generate_final_invoiceisp.commands.provisioningoms — Генерация финального счёта check_availabilityisp.commands.inventorycustomer-core network-inventory Проверка техвозможности
RPC Доступ Описание CreateCustomerCRM only Создание клиента (физ/юр лицо) GetCustomerCRM only Получение по ID ListCustomersCRM only Список с фильтрацией и пагинацией UpdateCustomerCRM only Обновление профиля ChangeCustomerStatusCRM only FSM-переход статуса SoftDeleteCustomerCRM only Мягкое удаление GetMyProfileAny auth Профиль из JWT email (портал) ListAuditLogsCRM only Аудит-лог SearchCustomersCRM only Полнотекстовый поиск CreateContractCRM only Создание договора GetContractOwner-or-CRM Получение договора ListContractsOwner-or-CRM Список договоров клиента SignContractCRM only Подписание (FSM: draft→active) TerminateContractCRM only Расторжение CreateContactCRM only Добавление контакта ListContactsCRM only Список контактов UpdateContactCRM only Обновление контакта DeleteContactCRM only Удаление контакта CreateAddressCRM only Добавление адреса ListAddressesCRM only Список адресов UpdateAddressCRM only Обновление адреса DeleteAddressCRM only Удаление адреса
RPC Доступ Описание GetAccountOwner-or-CRM Лицевой счёт по customerId ListAccountsCRM only Список всех ЛС провайдера ProcessPaymentCRM only Приём платежа ProcessRefundCRM only Возврат средств AdjustBalanceCRM only Ручная корректировка баланса GetInvoiceOwner-or-CRM Счёт по ID ListInvoicesOwner-or-CRM Список счетов ListTransactionsOwner-or-CRM Журнал транзакций GenerateInvoiceCRM only Генерация счёта за период ChangeAccountStatusCRM only FSM-переход статуса ЛС GetBillingStatsCRM only Агрегированная статистика
RPC Доступ Описание CreateProductOfferingCRM only Создание тарифного плана GetProductOfferingAny auth Получение по ID ListProductOfferingsAny auth Каталог тарифов UpdateProductOfferingCRM only Обновление тарифа ActivateSubscriptionCRM only Активация подписки GetSubscriptionOwner-or-CRM Подписка по ID ListSubscriptionsOwner-or-CRM Подписки клиента ChangeTariffCRM only Смена тарифа SuspendSubscriptionCRM only Приостановка подписки TerminateSubscriptionCRM only Прекращение подписки ReactivateSubscriptionCRM only Реактивация подписки
RPC Доступ Описание CreateOrderCRM only Создание заказа (запуск саги) GetOrderCRM only Получение по ID ListOrdersCRM only Список заказов CancelOrderCRM only Отмена (компенсирующие действия)
RPC Доступ Описание SendNotificationCRM only Отправка по шаблону GetDeliveryStatusCRM only Статус доставки ListNotificationsCRM only Уведомления клиента ListTemplatesCRM only Шаблоны CreateTemplateCRM only Создание шаблона UpdateTemplateCRM only Обновление шаблона DeleteTemplateCRM only Удаление шаблона ListAnnouncementsCRM only Объявления CreateAnnouncementCRM only Создание объявления DeleteAnnouncementCRM only Удаление объявления
RPC Доступ Описание RegisterDeviceCRM only Регистрация устройства GetDeviceCRM only Устройство по ID ListDevicesCRM only Список устройств UpdateDeviceCRM only Обновление устройства ChangeDeviceStatusCRM only FSM-переход статуса ReservePortCRM only Резервирование порта (TTL) ReleasePortCRM only Освобождение порта AllocateIPCRM only Выделение IP из пула ReleaseIPCRM only Освобождение IP CheckAvailabilityCRM only Проверка техвозможности ListIPPoolsCRM only Пулы IP-адресов ListIPAddressesCRM only IP-адреса в пуле SearchIPByAddressCRM only Поиск IP по адресу
RPC Описание ProvisionAccessНастройка порта OLT/BRAS, VLAN, QoS SuspendAccessБлокировка доступа (dunning) ResumeAccessРазблокировка доступа DeprovisionAccessПолное отключение ChangeQoSСмена скорости/VLAN GetProvisioningStateТекущее состояние
RPC Описание SendCoARADIUS Change of Authorization DisconnectSessionRADIUS Disconnect-Request GetActiveSessionsАктивные сессии абонента GetAccountingHistoryИстория RADIUS accounting
RPC Описание GetTrafficStatsСтатистика трафика абонента GetTopTalkersТоп потребителей полосы GetInterfaceUtilizationУтилизация интерфейса
Сервис Entity Тип Ключевые поля customer-core Customer AggregateRoot id, providerId, type, displayName, email, phone, status Contract Entity id, customerId, contractNumber, status (FSM) Contact Entity id, customerId, type, value Address Entity id, customerId, fiasId, building, apartment Document Entity id, customerId, type, s3Key AuditLog Entity (immutable) id, entityType, entityId, action, changes billing Account AggregateRoot id, customerId, balance (Money), status, dunningStage Transaction Entity id, accountId, type, amount (Money), balanceAfter Invoice Entity id, accountId, invoiceNumber, totalAmount, period Payment Entity id, accountId, gateway, externalId product-catalog ProductOffering AggregateRoot id, name, downloadSpeed, uploadSpeed, monthlyPrice Subscription AggregateRoot id, customerId, productOfferingId, status (FSM) PriceComponent Entity id, offeringId, type, period, amount PriceRule Entity id, discountType, conditions Bundle Entity id, name, offeringIds ServiceInstance Entity id, subscriptionId, type, params oms Order AggregateRoot id, customerId, type, status (FSM), priority, steps FieldService Entity id, orderId, technicianId, scheduledAt notification Notification AggregateRoot id, customerId, templateId, channel, status NotificationPreference Entity customerId, channel, enabled network-inventory Device AggregateRoot id, hostname, type, vendor, model, status, ports[]
# Use Case Triggers Side Effects 1 CreateCustomerRPC → customer.created event → billing auto-creates account 2 GetCustomerRPC — 3 ListCustomersRPC — 4 SearchCustomersRPC Full-text поиск 5 ChangeCustomerStatusRPC FSM validation → customer.updated event 6 GetMyProfileRPC (portal) Resolve from JWT email 7 CreateContractRPC — 8 GetContractRPC Ownership check 9 SignContractRPC FSM: draft→active → contract.signed event 10 TerminateContractRPC → contract.terminated event 11 CreateContactRPC — 12 ListContactsRPC — 13 DeleteContactRPC Soft delete 14 CreateAddressRPC — 15 ListAddressesRPC — 16 DeleteAddressRPC Soft delete 17 ListDocumentsRPC — 18 GetDocumentUrlRPC Presigned S3 URL 19 ListAuditLogsRPC — 20 CheckAvailabilityRPC → check_availability command → network-inventory
# Use Case Triggers Side Effects 1 GetOrCreateAccountEvent: customer.created Авто-создание ЛС 2 GetAccountRPC — 3 ListAccountsRPC — 4 ProcessPaymentRPC → payment.received event → notification 5 ProcessRefundRPC Возврат средств 6 AdjustmentRPC Ручная корректировка баланса 7 ChargeAccountInternal/BullMQ Списание → balance.updated event 8 GenerateInvoiceRPC/BullMQ → invoice.issued event → notification 9 ListInvoicesRPC — 10 ListTransactionsRPC — 11 ChangeDunningStageBullMQ → dunning.stage_changed event → product-catalog, notification 12 ChangeAccountStatusRPC FSM validation 13 GetBillingStatsRPC Aggregated stats 14 ProrateTariffChangeInternal Пропорциональный перерасчёт при смене тарифа
# Use Case Triggers Side Effects 1 CreateProductOfferingRPC — 2 GetProductOfferingRPC — 3 ListProductOfferingsRPC — 4 UpdateProductOfferingRPC — 5 ActivateSubscriptionRPC → subscription.activated event 6 SuspendSubscriptionRPC/Event → subscription.suspended event 7 TerminateSubscriptionRPC → subscription.terminated event 8 ReactivateSubscriptionRPC — 9 ChangeTariffRPC → subscription.tariff_changed event 10 CalculatePricingInternal Расчёт стоимости с учётом скидок 11 CreateBundleRPC Создание бандла из тарифов 12 CreatePriceComponentRPC Компонент цены
# Use Case Triggers Side Effects 1 CreateOrderRPC → order.created event, запуск SagaEngine 2 GetOrderRPC — 3 ListOrdersRPC — 4 CancelOrderRPC → order.cancelled event, компенсации
# Use Case Triggers Side Effects 1 SendNotificationRPC/Command Email (SMTP), SMS, Push 2 GetDeliveryStatusRPC — 3 ListNotificationsRPC — 4 CreateTemplateRPC — 5 UpdateTemplateRPC — 6 DeleteTemplateRPC Soft delete 7 ListTemplatesRPC — 8 CreateAnnouncementRPC — 9 DeleteAnnouncementRPC Hard delete 10 ListAnnouncementsRPC — 11 GetNotificationPreferencesRPC — 12 SetNotificationPreferenceRPC — 13 UpdateDeliveryStatusWebhook/Internal —
# Use Case Triggers Side Effects 1 RegisterDeviceRPC — 2 GetDeviceRPC — 3 ListDevicesRPC — 4 UpdateDeviceRPC — 5 ChangeDeviceStatusRPC FSM → device.status_changed event 6 ReservePortRPC TTL reservation → port.reserved event 7 ReleasePortRPC/BullMQ TTL → port.released event 8 AllocateIPRPC Выделение IP из пула 9 ReleaseIPRPC Возврат IP в пул 10 CheckAvailabilityCommand Поиск свободного порта → availability.checked event 11 BindServiceInstanceRPC Привязка к подписке
Use Case Triggers Side Effects ProvisionAccessRabbitMQ command Конфигурация OLT/BRAS → provisioning.success/failed event OutboxRelayPeriodic ticker Ретрансляция outbox → RabbitMQ ReconcileCommand/Cron Сверка состояний с оборудованием
Use Case Triggers Side Effects ProfileUseCaseConnectRPC CRUD radcheck/radreply (FreeRADIUS SQL) CoAUseCaseConnectRPC UDP RADIUS CoA/Disconnect к NAS SessionUseCaseConnectRPC Чтение radacct (accounting)
Use Case Triggers Side Effects AggregateUseCasePeriodic Агрегация Netflow/IPFIX → TimescaleDB FlushUseCasePeriodic Архивация CDR → MinIO (S3)
Сервис БД Описание customer-core customer_core_dbКлиенты, договора, контакты, адреса, документы product-catalog product_dbТарифы, подписки, цены, бандлы billing billing_dbЛС, транзакции, счета, платежи notification notification_dbУведомления, шаблоны, preferences oms oms_dbЗаказы, шаги саг, field service network-inventory inventory_dbУстройства, порты, IP-пулы aaa PostgreSQL (RADIUS) radcheck, radreply, radacct (FreeRADIUS SQL) mediation TimescaleDB Netflow/IPFIX hypertables, CDR keycloak keycloak_dbRealm, users, clients, roles
Домен Сервис TLS money-bill.ruWeb UI Let's Encrypt api.money-bill.ruAPI Gateway Let's Encrypt argocd.money-bill.ruArgoCD UI Let's Encrypt grafana.money-bill.ruGrafana Let's Encrypt
Helper Назначение pkId()UUID primary key, gen_random_uuid() providerIdCol()provider_id varchar(100) NOT NULLcreatedAtCol()created_at timestamptz DEFAULT now()updatedAtCol()updated_at timestamptz DEFAULT now()deletedAtCol()deleted_at timestamptz (soft delete)versionCol()version integer DEFAULT 1 (optimistic locking)currencyCodeCol()Currency enum column with proper typing standardColumns()id + providerId + timestamps + deletedAt + version timestampColumns()createdAt + updatedAt enumToPgEnum()Domain const enum → PostgreSQL enum type
import { useListCustomers, customerKeys } from '@/entities/customer'
import { usePortalCustomer } from '@/features/portal-session'
Каждый entity слайс содержит:
api/use-*.ts — React Query hooks
api/query-keys.ts — фабрика ключей
api/prefetch.ts — SSR prefetch
index.ts — barrel export