Expand contour profile documentation: add detailed descriptions for core services, external components, and node groups.

This commit is contained in:
emelinda 2026-08-20 15:03:18 +03:00
parent 4baf5ae1b6
commit e7ce7d09a0
5 changed files with 1198 additions and 825 deletions

View File

@ -38,8 +38,10 @@ for s in PROFILE["software"]:
cam_ids = [] cam_ids = []
for n in PROFILE.get("camunda_sub", []): for n in PROFILE.get("camunda_sub", []):
cid = "ss-cam-" + n.lower().replace(" ", "-") if isinstance(n, str):
el(T, cid, "SystemSoftware", n) n = {"name": n}
cid = "ss-cam-" + n["name"].lower().replace(" ", "-")
el(T, cid, "SystemSoftware", n["name"], n.get("doc", ""))
R("Composition", "ss-camunda", cid); cam_ids.append(cid) R("Composition", "ss-camunda", cid); cam_ids.append(cid)
for x in PROFILE["external"]: for x in PROFILE["external"]:
@ -57,7 +59,7 @@ el(T, fn["id"], "Node", fn["name"], fn.get("doc", ""))
R("Assignment", fn["id"], fn["assigned_to"]) R("Assignment", fn["id"], fn["assigned_to"])
for ts in PROFILE["services"]: for ts in PROFILE["services"]:
el(T, ts["id"], "TechnologyService", ts["name"]) el(T, ts["id"], "TechnologyService", ts["name"], ts.get("doc", ""))
for r in ts["realizers"]: for r in ts["realizers"]:
R("Realization", r, ts["id"]) R("Realization", r, ts["id"])
if ts.get("serves_software"): if ts.get("serves_software"):
@ -143,7 +145,7 @@ for x in PROFILE["external"]:
conn("Serving", o_ext[x["id"]], o_ss[x["serves"]]) conn("Serving", o_ext[x["id"]], o_ss[x["serves"]])
# --- представление «Развёртывание по узлам» # --- представление «Развёртывание по узлам»
GROUPS = PROFILE.get("node_groups", []) GROUPS, EXTRA_USES = PROFILE.get("node_groups", []), {}
if GROUPS: if GROUPS:
claimed = {a for g in GROUPS if isinstance(g.get("runs_apps"), list) for a in g["runs_apps"]} claimed = {a for g in GROUPS if isinstance(g.get("runs_apps"), list) for a in g["runs_apps"]}
for g in GROUPS: for g in GROUPS:
@ -158,6 +160,14 @@ if GROUPS:
R("Assignment", g["id"], app_id[a]) R("Assignment", g["id"], app_id[a])
for s in g.get("runs_software", []): for s in g.get("runs_software", []):
R("Aggregation", g["id"], s) R("Aggregation", g["id"], s)
# компоненты, которых нет в манифестах кластера (заданы профилем вручную)
g["_extra"] = []
for c in g.get("components", []):
el("application", c["id"], "ApplicationComponent", c["name"], c.get("doc", ""))
R("Assignment", g["id"], c["id"]); g["_extra"].append(c["id"])
for ts_id in c.get("uses", []):
R("Serving", ts_id, c["id"])
EXTRA_USES.setdefault(ts_id, []).append(c["id"])
vd = view("T2. Развёртывание по узлам", vd = view("T2. Развёртывание по узлам",
"Какие группы узлов какие компоненты несут. Вложенность заменяет стрелки: " "Какие группы узлов какие компоненты несут. Вложенность заменяет стрелки: "
@ -173,7 +183,7 @@ if GROUPS:
left = [g for g in GROUPS if g.get("runs_apps") != "*"] left = [g for g in GROUPS if g.get("runs_apps") != "*"]
y = 20 y = 20
for g in left: for g in left:
items = g["_apps"] + list(g.get("runs_software", [])) items = g["_apps"] + list(g.get("runs_software", [])) + g["_extra"]
rows = (len(items) + 1) // 2 rows = (len(items) + 1) // 2
h = 40 + (54 if g["_hosts"] else 0) + rows * 62 + 10 h = 40 + (54 if g["_hosts"] else 0) + rows * 62 + 10
og = obj(vd, g["id"], 20, y, 400, h) og = obj(vd, g["id"], 20, y, 400, h)
@ -197,7 +207,8 @@ if GROUPS:
PER_ROW = 6 PER_ROW = 6
for ts in SERVICES: for ts in SERVICES:
lst = consumers[ts["id"]] lst = consumers[ts["id"]]
if not lst: extra = EXTRA_USES.get(ts["id"], [])
if not lst and not extra:
continue continue
n_doc = sum(1 for a in lst if DATA["matrix"][a].get(ts.get("key")) == "doc") n_doc = sum(1 for a in lst if DATA["matrix"][a].get(ts.get("key")) == "doc")
src = ("Связи выведены из манифестов приложений." src = ("Связи выведены из манифестов приложений."
@ -209,9 +220,9 @@ for ts in SERVICES:
ots = obj(v, ts["id"], 20, 20, 260, 60) ots = obj(v, ts["id"], 20, 20, 260, 60)
for i, r in enumerate(ts["realizers"]): for i, r in enumerate(ts["realizers"]):
conn("Realization", obj(v, r, 320 + i * 280, 20, 260, 60), ots) conn("Realization", obj(v, r, 320 + i * 280, 20, 260, 60), ots)
for i, a in enumerate(lst): for i, eid in enumerate([app_id[a] for a in lst] + extra):
conn("Serving", ots, conn("Serving", ots,
obj(v, app_id[a], 20 + (i % PER_ROW) * 190, 150 + (i // PER_ROW) * 80, 170, 55)) obj(v, eid, 20 + (i % PER_ROW) * 190, 150 + (i // PER_ROW) * 80, 170, 55))
# ---------------------------------------------------------------- сериализация # ---------------------------------------------------------------- сериализация
FOLDERS = [("Strategy", "strategy"), ("Business", "business"), ("Application", "application"), FOLDERS = [("Strategy", "strategy"), ("Business", "business"), ("Application", "application"),

View File

@ -1,86 +1,305 @@
{ {
"_комментарий": "Профиль контура: всё, что зависит от конкретной инсталляции. Значения здесь — ПРИМЕР. Для реального контура скопируйте файл, подставьте настоящие имена и держите копию вне репозитория.", "_комментарий": "Профиль контура: всё, что зависит от конкретной инсталляции. Значения здесь — ПРИМЕР. Для реального контура скопируйте файл, подставьте настоящие имена и держите копию вне репозитория. Поля doc попадают в Documentation элемента и видны в Archi.",
"model": { "model": {
"name": "СДЕ Sarex — типовой контур (пример)", "name": "СДЕ Sarex — типовой контур (пример)",
"purpose": "Технологический слой типового контура. Имена кластера, узлов, доменов и реестра заменены на примеры. Прикладной слой присутствует только как потребители технологических сервисов межсервисные связи приложений моделируются отдельно." "purpose": "Технологический слой типового контура. Имена кластера, узлов, доменов и реестра заменены на примеры. Прикладной слой присутствует как потребители технологических сервисов и как состав групп узлов; межсервисные связи приложений моделируются отдельно."
}, },
"cluster": { "cluster": {
"name": "Кластер k8s-prod", "name": "Кластер k8s-prod",
"doc": "clusters/<contour>/kustomization.yaml. Развёртывание через FluxCD v2 (GitOps)." "doc": "Flux CD — набор контроллеров Kubernetes, реализующий подход GitOps: вся система описана декларативно и находится под контролем версий, а автоматика непрерывно приводит развёрнутое окружение в соответствие состоянию, заданному в Git. Контроллеры с заданным интервалом сравнивают фактическое состояние ресурсов с желаемым и применяют расхождения. Основные ресурсы: GitRepository описывает источник, Kustomization — набор манифестов для согласования, HelmRelease — развёртывание Helm-чарта.\n\nКластер Kubernetes, в котором работает вся платформа. Состав задаётся одним файлом clusters/<контур>/kustomization.yaml — плоским списком инфраструктурных компонентов и приложений; он же является источником истины о том, что развёрнуто. Доставка изменений — GitOps через FluxCD v2: Flux читает манифесты из Git-сервера контура и приводит кластер к описанному состоянию, ручной kubectl apply в нормальном процессе не используется. Прикладные сервисы ставятся не собственными чартами, а одним общим universal-chart, что делает их конфигурацию единообразной."
}, },
"software": [ "software": [
{ "id": "ss-istio-gw", "name": "Istio Ingress Gateway", "doc": "Ingress-контроллер, публикует контур наружу через NodePort." }, {
{ "id": "ss-istio-mesh", "name": "Istio Service Mesh", "doc": "chart istio-config-contour. Gateway, VirtualService, RequestAuthentication." }, "id": "ss-istio-gw",
{ "id": "ss-certmanager", "name": "cert-manager", "doc": "Выпуск сертификатов. В примере — самоподписанный ClusterIssuer, wildcard на домен контура." }, "name": "Istio Ingress Gateway",
{ "id": "ss-zitadel", "name": "Zitadel", "doc": "chart idp-contour, ns zitadel. Основной поставщик идентичности." }, "doc": "Istio — открытый service mesh, который прозрачно накладывается на существующие распределённые приложения и централизованно управляет взаимодействием сервисов, не требуя изменений в коде. Ingress-шлюз — это компонент плоскости данных Istio на границе mesh: он принимает внешний трафик, терминирует TLS и передаёт запросы внутрь по правилам, заданным ресурсами Gateway и VirtualService.\n\nЕдинственная точка входа внешнего трафика в контур. Терминирует TLS и передаёт запросы дальше по правилам service mesh. Публикуется через NodePort и в типовой конфигурации привязан к выделенному узлу — это делает его единственной точкой отказа для всего внешнего доступа: при потере узла контур остаётся живым внутри, но недоступен снаружи. Резервирование ingress стоит рассматривать отдельно от резервирования приложений."
{ "id": "ss-vault", "name": "Vault + Agent Injector", "doc": "chart vault-contour, ns vault. Единственный механизм доставки секретов, путь secrets/data/apps/<app>/postgres." }, },
{ "id": "ss-postgres", "name": "PostgreSQL", "doc": "chart postgresql-contour, ns postgresql. PVC на сетевом хранилище." }, {
{ "id": "ss-redis", "name": "Redis", "doc": "Разворачивается не во всех контурах и не для всех приложений." }, "id": "ss-istio-mesh",
{ "id": "ss-kafka", "name": "Kafka", "doc": "chart kafka-contour, ns kafka." }, "name": "Istio Service Mesh",
{ "id": "ss-rabbit", "name": "RabbitMQ", "doc": "chart rabbitmq-contour, ns rabbitmq." }, "doc": "Istio разделён на плоскость управления, которая хранит конфигурацию и раздаёт её прокси, и плоскость данных из прокси Envoy рядом с каждым подом. Такая схема даёт три группы возможностей: управление трафиком (маршрутизация, балансировка HTTP/gRPC/TCP, повторы и переключение при отказах), безопасность (взаимный TLS между сервисами) и наблюдаемость — метрики, логи и трассировки для всего трафика кластера собираются автоматически. Конфигурация меняется на лету: Istio перепрограммирует прокси без пересборки и перезапуска приложений.\n\nУправляющая конфигурация сети: Gateway описывает внешние точки входа, VirtualService — маршрутизацию по путям на конкретные сервисы, RequestAuthentication — проверку JWT на входе. Поставляется чартом istio-config-contour и является тем местом, где видно, какие приложения вообще опубликованы наружу. В части контуров разводка по путям вынесена за пределы репозитория во внешний nginx — тогда в модели виден только факт публикации, но не таблица маршрутов. Sidecar-прокси рядом с каждым подом дают mTLS между сервисами и метрики трафика."
{ "id": "ss-camunda", "name": "Camunda Platform", "doc": "chart camunda-contour, ns camunda. Воркеры прикладных сервисов подключаются к Zeebe-gateway как job-workers, HTTP-часть ходит в Operate. Переменные ZEEBE_*/CAMUNDA_* приходят из k8s-секрета, поэтому в манифестах не видны." } },
{
"id": "ss-certmanager",
"name": "cert-manager",
"doc": "cert-manager — расширение Kubernetes, которое выпускает TLS-сертификаты для нагрузок в кластере и продлевает их до истечения срока. Ресурсы Issuer и ClusterIssuer описывают, у какого удостоверяющего центра и на каких условиях получать сертификат, а ресурс Certificate — сам запрошенный сертификат; результат складывается в секрет Kubernetes, откуда его читают поды и ingress-контроллеры. Поддерживаются разные источники: Let's Encrypt, HashiCorp Vault, внутренние PKI и самоподписанные издатели.\n\nВыпускает и автоматически продлевает TLS-сертификаты для внешних доменов контура. Работает через ClusterIssuer: в контурах с доступом в интернет это Let's Encrypt, в закрытых — самоподписанный издатель, как в этом примере. Выпущенный wildcard-сертификат складывается в секрет, который использует ingress-gateway. Практическое следствие самоподписанного варианта: клиентам нужно доверять корневому сертификату контура, иначе браузеры и интеграции будут ругаться."
},
{
"id": "ss-zitadel",
"name": "Zitadel",
"doc": "Zitadel — платформа управления идентификацией, реализующая отраслевые стандарты OIDC, OAuth 2.0 и SAML для входа и единой аутентификации. Отличительные черты — мультиарендность с настройкой оформления под каждого арендатора, полный журнал аудита на основе event sourcing и возможность развёртывания как в облаке, так и на своих мощностях. Закрывает задачи аутентификации, многофакторной проверки и управления пользователями без разработки собственной подсистемы входа.\n\nОсновной поставщик идентичности платформы, отвечает за аутентификацию пользователей по OIDC и выдачу токенов. Прикладные сервисы не проверяют пароли сами: они валидируют JWT по публичному ключу, а на границе контура это же делает Istio через RequestAuthentication. Самый широко используемый технологический сервис контура — с ним так или иначе работает подавляющее большинство приложений, включая фронтенды. Отдельный микрофронтенд auth-flow обслуживает сценарий логина и обработку OIDC-callback. Keycloak в платформе тоже встречается, но как вторичный вариант и внутри поставки Camunda."
},
{
"id": "ss-vault",
"name": "Vault + Agent Injector",
"doc": "HashiCorp Vault — централизованная система управления секретами: учётными данными, ключами шифрования и сертификатами, с аудитом всех обращений. Работает по схеме «клиент аутентифицируется — получает токен, связанный с набором политик — обращается к секретам по путям — Vault проверяет права и записывает обращение в журнал независимо от исхода». Модульная архитектура позволяет подключать разные способы аутентификации и разные хранилища секретов, включая выдачу временных учётных данных к базам данных.\n\nЕдинственный механизм доставки секретов приложениям. Секреты не лежат в манифестах и не хранятся в Git: под получает их через sidecar Agent Injector, который аутентифицируется в Vault по service account пода и монтирует значения из пути вида secrets/data/apps/<приложение>/postgres. Ролью и service account служит имя приложения — соглашение единообразно для всех сервисов. Практическое следствие для чтения архитектуры: связи приложения с БД, брокером или S3 часто не видны в YAML, потому что реквизиты приходят из Vault. Трафик к Vault выведен из-под sidecar-прокси Istio отдельной аннотацией, иначе инициализация пода не проходит."
},
{
"id": "ss-postgres",
"name": "PostgreSQL",
"doc": "PostgreSQL — объектно-реляционная СУБД с открытым исходным кодом и почти сорокалетней историей развития. Соответствует требованиям ACID, использует многоверсионное управление конкурентным доступом (MVCC) и покрывает не менее 170 из 177 обязательных возможностей ядра стандарта SQL:2023. Поддерживает широкий набор типов данных, включая JSON и JSONB, геометрические и пользовательские типы, а также расширения — хранимые процедуры на нескольких языках, обёртки сторонних источников данных и геопространственное расширение PostGIS.\n\nОсновное реляционное хранилище контура и самый востребованный технологический сервис после управления секретами. Разворачивается внутри кластера как StatefulSet на сетевом хранилище; в части контуров вместо него используется внешняя managed-СУБД, и тогда в кластере остаются только реквизиты подключения. Базы разделены по приложениям — общей схемы нет, каждый сервис владеет своими таблицами, что важно для независимости релизов. Реквизиты всегда приходят через Vault, поэтому в манифестах приложения видна лишь аннотация инжектора."
},
{
"id": "ss-redis",
"name": "Redis",
"doc": "Redis — сервер структур данных, хранящий данные в оперативной памяти. Помимо строк поддерживает хеши, списки, множества, упорядоченные множества и потоки — журнал с добавлением в конец. Такой набор примитивов закрывает разные задачи одним инструментом: кэширование, хранение сессий, очереди, счётчики и обработку событий. Предусмотрены механизмы сохранения данных на диск, что позволяет пережить перезапуск.\n\nКэш и брокер фоновых задач. В отличие от PostgreSQL, не является общей инфраструктурой контура: разворачивается точечно, в namespace тех приложений, которым он действительно нужен — как правило, там, где есть Celery-воркеры или требуется разделяемое состояние между репликами. Из-за этого экземпляров Redis в контуре несколько и они независимы; общего кэша, через который сервисы обмениваются данными, в платформе нет."
},
{
"id": "ss-kafka",
"name": "Kafka",
"doc": "Apache Kafka — платформа потоковой обработки событий: публикация, хранение и обработка непрерывных потоков данных в реальном времени. События пишутся в темы, темы делятся на разделы и распределяются по брокерам ради масштабирования; производители пишут, потребители читают. Ключевое отличие от обычной очереди в том, что событие не удаляется после прочтения, а хранится по настраиваемой политике — поэтому его можно перечитать заново и подключить новых потребителей к уже накопленной истории.\n\nШина событий для асинхронного обмена между сервисами. Используется там, где нужен журнал событий с возможностью повторного чтения и несколькими независимыми потребителями: аудит действий, уведомления, синхронизация состояний между доменами. Соседствует с RabbitMQ, и это осознанное разделение, а не дублирование: Kafka отвечает за поток событий, RabbitMQ — за адресную доставку задач. Часть приложений подключена к обеим шинам одновременно."
},
{
"id": "ss-rabbit",
"name": "RabbitMQ",
"doc": "RabbitMQ — брокер сообщений, реализующий протокол AMQP 0-9-1 для асинхронного обмена между приложениями. Опубликованное сообщение попадает в обменник, привязки маршрутизируют его в очереди по ключу маршрутизации, а из очередей его забирают потребители. Доставка подтверждается: при явном подтверждении потребитель сообщает об успешной обработке, и если он отвалился, не подтвердив сообщение, брокер передаст его другому потребителю или дождётся появления нового — сообщение не теряется.\n\nОчередь задач для фоновой обработки: выгрузки, конвертация документов, рассылки, длительные операции, которые нельзя выполнять в HTTP-запросе. В отличие от Kafka, ориентирован на адресную доставку конкретному обработчику с подтверждением и повторами. В ряде контуров панель управления публикуется наружу отдельным доменом, что удобно для эксплуатации, но требует внимания к доступу — это полноценный административный интерфейс."
},
{
"id": "ss-camunda",
"name": "Camunda Platform",
"doc": "Camunda 8 — платформа оркестрации и автоматизации бизнес-процессов с участием людей, систем и устройств. В её основе движок Zeebe, координирующий исполнение процессов в распределённой среде; Operate и Tasklist дают операционную видимость и работу с пользовательскими задачами, Optimize — аналитику по исполнению. Работу выполняют job-воркеры: внешние компоненты, которые опрашивают кластер на предмет заданий своего типа, обрабатывают их и возвращают результат.\n\nДвижок исполнения бизнес-процессов в нотации BPMN. Через него проходят маршруты согласования документов: процесс описывает шаги и условия, а конкретные действия выполняют воркеры прикладных сервисов, подключённые к Zeebe как job-workers по типу задачи. Это единственный компонент контура, где логика согласования выражена декларативно и её можно менять без пересборки сервисов. Важная особенность для чтения конфигурации: переменные ZEEBE_* и CAMUNDA_* приходят из k8s-секрета, поэтому в манифестах приложений связь с Camunda не видна — она подтверждается только документацией сервисов."
}
],
"camunda_sub": [
{
"name": "Zeebe",
"doc": "Ядро движка: хранит состояние запущенных процессов и раздаёт задачи воркерам. Работает как StatefulSet, состояние на диске."
},
{
"name": "Zeebe Gateway",
"doc": "Точка подключения клиентов и job-workers к ядру. Именно её адрес прикладные сервисы получают в переменной ZEEBE_GATEWAY."
},
{
"name": "Operate",
"doc": "Интерфейс и REST API для наблюдения за экземплярами процессов: где застрял маршрут, какие переменные, какие инциденты. Используется не только людьми — прикладные сервисы обращаются к его API программно."
},
{
"name": "Tasklist",
"doc": "Интерфейс пользовательских задач BPMN — шагов процесса, требующих действия человека."
},
{
"name": "Optimize",
"doc": "Аналитика по исполнению процессов: длительности, узкие места, статистика прохождения маршрутов."
},
{
"name": "Identity",
"doc": "Управление доступом к компонентам Camunda и выдача OAuth-токенов для машинного доступа. В поставке идёт вместе с собственным Keycloak, отдельным от основного поставщика идентичности контура."
},
{
"name": "Connectors",
"doc": "Готовые коннекторы к внешним системам, вызываемые из процесса без написания своего воркера."
}
], ],
"camunda_sub": ["Zeebe", "Zeebe Gateway", "Operate", "Tasklist", "Optimize", "Identity", "Connectors"],
"external": [ "external": [
{ "id": "nd-s3", "name": "s3.example.com — объектное хранилище", "doc": "Внешнее по отношению к кластеру.", "realizes": "ts-object" }, {
{ "id": "nd-nfs", "name": "Сетевое хранилище (StorageClass)", "doc": "Класс хранения для PVC.", "serves": "ss-postgres" }, "id": "nd-s3",
{ "id": "nd-gitea", "name": "Git-сервер контура", "doc": "Источник манифестов для Flux.", "serves": "cluster" }, "name": "s3.example.com — объектное хранилище",
{ "id": "nd-cr", "name": "registry.example.com", "doc": "Реестр Helm-чартов (OCI) и образов контейнеров.", "serves": "cluster", "realizes": "ts-object",
"doc": "Объектное хранилище — масштабируемый репозиторий для неструктурированных данных: файлов, медиа, журналов и резервных копий, без ограничений традиционной файловой системы. Отраслевым стандартом доступа стал API S3, поэтому такие хранилища взаимозаменяемы для приложения. В self-hosted варианте обычно применяется MinIO с S3-совместимым API и распределённым развёртыванием на основе избыточного кодирования (erasure coding): данные разрезаются на фрагменты с избыточностью и раскладываются по узлам, что позволяет пережить отказ части из них дешевле, чем при простом дублировании.\n\nХранилище файлов платформы: документы, чертежи, модели, вложения, результаты конвертации. Вынесено за пределы кластера — в одних контурах это MinIO на отдельных узлах, в других внешний S3-совместимый сервис заказчика. Именно здесь лежит основной объём данных: базы хранят метаданные и связи, а сами файлы всегда в объектном хранилище. Прямой доступ браузера к хранилищу не используется, отдача файлов идёт через прокси-сервис платформы."
},
{
"id": "nd-nfs",
"name": "Сетевое хранилище (StorageClass)",
"serves": "ss-postgres",
"doc": "Класс хранения, из которого выделяются тома для компонентов с состоянием — прежде всего для PostgreSQL, а также для брокеров и движка процессов. От его производительности напрямую зависит отзывчивость СУБД, поэтому это место стоит проверять первым при жалобах на медленную работу платформы."
},
{
"id": "nd-gitea",
"name": "Git-сервер контура",
"serves": "cluster",
"doc": "Хранит манифесты, из которых Flux собирает состояние кластера. В закрытых контурах наполняется зеркалированием из основного репозитория разработки, что даёт контуру автономность: даже при отсутствии связи с внешним миром развёртывание работает из локальной копии. Практически это означает, что изменение, попавшее в основной репозиторий, доедет до контура не мгновенно, а после синхронизации зеркала."
},
{
"id": "nd-cr",
"name": "registry.example.com",
"serves": "cluster",
"doc": "Реестр, из которого кластер получает и Helm-чарты (в формате OCI), и образы контейнеров. Единая точка поставки: версия чарта и тег образа, указанные в манифестах, разрешаются именно здесь. Доступность реестра — обязательное условие для развёртывания и перезапуска подов, поэтому в закрытых контурах он размещается внутри периметра.",
"artifacts": [ "artifacts": [
{ "id": "ar-charts", "name": "Helm-чарты (OCI)" }, {
{ "id": "ar-images", "name": "Образы контейнеров" } "id": "ar-charts",
] } "name": "Helm-чарты (OCI)",
"doc": "Пакеты развёртывания. Инфраструктурные компоненты имеют собственные чарты с суффиксом контура, а все прикладные сервисы ставятся одним общим чартом universal-chart — различаются только значения."
},
{
"id": "ar-images",
"name": "Образы контейнеров",
"doc": "Собранные образы сервисов. Тег образа в манифесте контура — это и есть версия сервиса, работающая в этом контуре; обновление сервиса сводится к смене тега и синхронизации Flux."
}
]
}
], ],
"frontend_node": { "frontend_node": {
"id": "nd-frontend", "id": "nd-frontend",
"name": "frontend-node-01", "name": "frontend-node-01",
"doc": "Выделенный узел, к которому ingress-gateway прибит через nodeSelector.", "assigned_to": "ss-istio-gw",
"assigned_to": "ss-istio-gw" "doc": "Узел, к которому привязан ingress-gateway через nodeSelector. Привязка сделана ради предсказуемого адреса для внешней балансировки и правил межсетевого экрана, но ценой того, что внешний доступ зависит от одного узла."
}, },
"_узлы": "Группы узлов из инвентаря серверов. runs_software — id из software/external, runs_apps — имена приложений; группа с \"runs_apps\": \"*\" забирает все приложения, не заявленные другими группами. Необязательный hosts позволяет раскрыть группу до отдельных хостов, если такой список появится.", "_узлы": "Группы узлов из инвентаря серверов. runs_software — id из software/external, runs_apps — имена приложений; группа с \"runs_apps\": \"*\" забирает все приложения, не заявленные другими группами. Необязательный hosts позволяет раскрыть группу до отдельных хостов, если такой список появится.",
"node_groups": [ "node_groups": [
{ "id": "ng-processing", "name": "Группа узлов processing (Сервера приложений)", {
"runs_apps": ["processing"] }, "id": "ng-processing",
"name": "Группа узлов processing (Сервера приложений)",
{ "id": "ng-app", "name": "Группа узлов generic (Сервера приложений)", "runs_apps": [
"runs_apps": "*" }, "processing"
],
{ "id": "ng-storage", "name": "Объектное хранилище", "doc": "Узлы под вычислительно тяжёлую обработку, вынесенную из общего пула приложений: конвертация и разбор файлов, построение производных представлений документов и моделей. Отделены от остальных прикладных серверов намеренно — такая нагрузка неравномерна и способна вытеснить интерактивные сервисы, если делить с ними ресурсы."
"runs_software": ["nd-s3"] }, },
{
{ "id": "ng-db", "name": "Группа узлов DB (Базы данных)", "id": "ng-app",
"runs_software": ["ss-postgres"] }, "name": "Группа узлов generic (Сервера приложений)",
"runs_apps": "*",
{ "id": "ng-k8s", "name": "Группа узлов K8s (Поддерживающая инфраструктура)", "doc": "Основной пул прикладных серверов: здесь работает подавляющее большинство сервисов платформы — и бэкенды доменных областей, и микрофронтенды. Нагрузка преимущественно интерактивная, запрос-ответ. Это самая массовая группа, и именно её объём определяет, сколько ресурсов требует контур."
"runs_software": ["ss-istio-gw", "ss-istio-mesh", "ss-certmanager", "ss-zitadel", },
"ss-vault", "ss-redis", "ss-kafka", "ss-rabbit", "ss-camunda"] }, {
"id": "ng-storage",
{ "id": "ng-repo", "name": "Репозиторий компонентов", "name": "Объектное хранилище",
"doc": "Реестр Helm-чартов и образов + Git-сервер контура, из которого Flux читает манифесты. Состав требует подтверждения.", "runs_software": [
"runs_software": ["nd-cr", "nd-gitea"] }, "nd-s3"
],
{ "id": "ng-cad", "name": "CAD ферма", "doc": "Узлы файлового хранилища. Отделены от вычислительных, потому что растут по другому закону: объём здесь определяется накопленными документами и моделями за всё время эксплуатации, а не числом одновременных пользователей. Это же делает группу главным кандидатом на резервное копирование."
"doc": "Состав не выведен из репозитория — заполнить вручную: какие сервисы и ПО работают на этой группе узлов." } },
{
"id": "ng-db",
"name": "Группа узлов DB (Базы данных)",
"runs_software": [
"ss-postgres"
],
"doc": "Узлы СУБД. Вынесены отдельно по двум причинам: предсказуемая производительность дисков и возможность обслуживать базы, не затрагивая прикладные сервисы. Хранят метаданные и связи всех доменных областей; при потере данных этой группы файлы в объектном хранилище останутся, но станут неадресуемыми."
},
{
"id": "ng-k8s",
"name": "Группа узлов K8s (Поддерживающая инфраструктура)",
"runs_software": [
"ss-istio-gw",
"ss-istio-mesh",
"ss-certmanager",
"ss-zitadel",
"ss-vault",
"ss-redis",
"ss-kafka",
"ss-rabbit",
"ss-camunda"
],
"doc": "Узлы платформенных сервисов, на которых не работает прикладная логика: сеть и вход в контур, идентификация, секреты, брокеры, движок процессов, кэш. Прикладные сервисы без этой группы нефункциональны — здесь сосредоточены зависимости, общие для всех доменных областей."
},
{
"id": "ng-repo",
"name": "Репозиторий компонентов",
"runs_software": [
"nd-cr",
"nd-gitea"
],
"doc": "Узлы поставки: реестр чартов и образов, а также Git-сервер, из которого Flux читает манифесты. Обеспечивают автономность контура — развёртывание и перезапуск не требуют выхода во внешнюю сеть. Состав группы требует подтверждения: не исключено, что под репозиторием компонентов понимается только реестр артефактов."
},
{
"id": "ng-cad",
"name": "CAD ферма",
"doc": "Узлы обработки исходных файлов BIM-моделей в проприетарных форматах NWD и RVT. Работают асинхронно: воркер разбирает очередь заданий, забирает исходный файл из объектного хранилища, конвертирует его в пригодный для просмотра и анализа вид и складывает результат обратно. Вынесены в отдельную группу, потому что требуют специфического окружения и дают тяжёлую неравномерную нагрузку — обработка одной модели занимает несоизмеримо больше времени, чем любой интерактивный запрос. В манифестах кластера этих компонентов нет: группа обслуживается вне GitOps-контура платформы.",
"components": [
{
"id": "ac-bim-converter",
"name": "Конвертер BIM-моделей",
"uses": [
"ts-amqp",
"ts-object"
],
"doc": "Воркер, слушающий очередь RabbitMQ. Обрабатывает файлы NWD (Navisworks) и RVT (Revit): получает задание из очереди, читает исходный файл из объектного хранилища и возвращает туда результат конвертации. Прямых HTTP-вызовов от прикладных сервисов не принимает — единственная точка входа это очередь, что позволяет накапливать задания и переживать недоступность фермы без потери запросов."
}
]
}
], ],
"services": [ "services": [
{ "id": "ts-ingress", "name": "Маршрутизация HTTPS-трафика", "realizers": ["ss-istio-gw", "ss-istio-mesh"], "key": "istio" }, {
{ "id": "ts-tls", "name": "Выпуск TLS-сертификатов", "realizers": ["ss-certmanager"], "key": null, "serves_software": "ss-istio-gw" }, "id": "ts-ingress",
{ "id": "ts-oidc", "name": "Аутентификация OIDC", "realizers": ["ss-zitadel"], "key": "oidc" }, "name": "Маршрутизация HTTPS-трафика",
{ "id": "ts-secrets", "name": "Управление секретами", "realizers": ["ss-vault"], "key": "vault" }, "realizers": [
{ "id": "ts-rdbms", "name": "Реляционное хранилище", "realizers": ["ss-postgres"], "key": "postgres" }, "ss-istio-gw",
{ "id": "ts-cache", "name": "Кэш", "realizers": ["ss-redis"], "key": "redis" }, "ss-istio-mesh"
{ "id": "ts-events", "name": "Событийная шина", "realizers": ["ss-kafka"], "key": "kafka" }, ],
{ "id": "ts-amqp", "name": "Очередь сообщений AMQP", "realizers": ["ss-rabbit"], "key": "rabbitmq" }, "key": "istio",
{ "id": "ts-bpmn", "name": "Оркестрация процессов BPMN", "realizers": ["ss-camunda"], "key": "camunda" }, "doc": "Публикация приложений наружу: терминация TLS, разбор внешнего домена и пути, направление запроса нужному сервису, проверка токена на границе. Сервисом пользуются только те приложения, у которых есть внешний интерфейс; остальные доступны исключительно внутри кластера."
{ "id": "ts-object", "name": "Объектное хранилище", "realizers": ["nd-s3"], "key": "s3" } },
{
"id": "ts-tls",
"name": "Выпуск TLS-сертификатов",
"realizers": [
"ss-certmanager"
],
"key": null,
"serves_software": "ss-istio-gw",
"doc": "Автоматическое получение и продление сертификатов для доменов контура. Потребитель у сервиса один — ingress-gateway; приложения с ним не взаимодействуют, поэтому отдельного представления с потребителями у него нет."
},
{
"id": "ts-oidc",
"name": "Аутентификация OIDC",
"realizers": [
"ss-zitadel"
],
"key": "oidc",
"doc": "Проверка личности пользователя и выдача токена, по которому сервисы принимают решение о доступе. Самый массово используемый сервис контура. Значительная часть связей подтверждается только документацией приложений: публичный ключ и параметры подключения приходят из секретов, а не из манифестов."
},
{
"id": "ts-secrets",
"name": "Управление секретами",
"realizers": [
"ss-vault"
],
"key": "vault",
"doc": "Выдача приложениям реквизитов доступа к базам, брокерам и хранилищам во время запуска пода. Практически универсальная зависимость: почти каждый сервис с состоянием стартует только после успешного получения секретов, поэтому недоступность этого сервиса останавливает не работу, а перезапуск и выкатку."
},
{
"id": "ts-rdbms",
"name": "Реляционное хранилище",
"realizers": [
"ss-postgres"
],
"key": "postgres",
"doc": "Хранение структурированных данных доменных областей: карточек, связей, статусов, журналов. У каждого сервиса своя база, общей схемы нет — обмен между сервисами идёт через API и шины, а не через общие таблицы."
},
{
"id": "ts-cache",
"name": "Кэш",
"realizers": [
"ss-redis"
],
"key": "redis",
"doc": "Разделяемое короткоживущее состояние и очередь фоновых задач для сервисов с Celery-воркерами. Востребован узким кругом приложений, поэтому разворачивается точечно, а не как общая инфраструктура контура."
},
{
"id": "ts-events",
"name": "Событийная шина",
"realizers": [
"ss-kafka"
],
"key": "kafka",
"doc": "Асинхронная публикация событий с сохранением журнала и несколькими независимыми потребителями. Используется там, где важен факт изменения и возможность его повторно прочитать: аудит, уведомления, синхронизация состояний между доменами."
},
{
"id": "ts-amqp",
"name": "Очередь сообщений AMQP",
"realizers": [
"ss-rabbit"
],
"key": "rabbitmq",
"doc": "Адресная доставка задач фоновым обработчикам с подтверждением и повторами. Обслуживает длительные операции — конвертацию, выгрузки, рассылки, — которые нельзя выполнять внутри HTTP-запроса."
},
{
"id": "ts-bpmn",
"name": "Оркестрация процессов BPMN",
"realizers": [
"ss-camunda"
],
"key": "camunda",
"doc": "Исполнение маршрутов согласования, описанных схемой BPMN: движок ведёт состояние процесса и раздаёт шаги воркерам прикладных сервисов. Позволяет менять логику согласования без пересборки сервисов. Связь с потребителем не видна в манифестах — параметры подключения приходят из секрета."
},
{
"id": "ts-object",
"name": "Объектное хранилище",
"realizers": [
"nd-s3"
],
"key": "s3",
"doc": "Хранение и выдача файлов: документов, чертежей, моделей, вложений и производных представлений. Базовый сервис для всех документоориентированных областей платформы — в реляционных базах лежат только метаданные, содержимое всегда здесь."
}
] ]
} }

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,7 @@
xsi:schemaLocation="http://www.opengroup.org/xsd/archimate/3.0/ https://www.opengroup.org/xsd/archimate/3.1/archimate3_Diagram.xsd" xsi:schemaLocation="http://www.opengroup.org/xsd/archimate/3.0/ https://www.opengroup.org/xsd/archimate/3.1/archimate3_Diagram.xsd"
identifier="model-contour"> identifier="model-contour">
<name xml:lang="ru">СДЕ Sarex — типовой контур (пример)</name> <name xml:lang="ru">СДЕ Sarex — типовой контур (пример)</name>
<documentation xml:lang="ru">Технологический слой типового контура. Имена кластера, узлов, доменов и реестра заменены на примеры. Прикладной слой присутствует только как потребители технологических сервисов межсервисные связи приложений моделируются отдельно.</documentation> <documentation xml:lang="ru">Технологический слой типового контура. Имена кластера, узлов, доменов и реестра заменены на примеры. Прикладной слой присутствует как потребители технологических сервисов и как состав групп узлов; межсервисные связи приложений моделируются отдельно.</documentation>
<elements> <elements>
<element identifier="ac-attachments" xsi:type="ApplicationComponent"> <element identifier="ac-attachments" xsi:type="ApplicationComponent">
<name xml:lang="ru">attachments</name> <name xml:lang="ru">attachments</name>
@ -145,86 +145,121 @@
<name xml:lang="ru">workspaces</name> <name xml:lang="ru">workspaces</name>
<documentation xml:lang="ru">apps/workspaces/&lt;contour&gt;/</documentation> <documentation xml:lang="ru">apps/workspaces/&lt;contour&gt;/</documentation>
</element> </element>
<element identifier="ac-bim-converter" xsi:type="ApplicationComponent">
<name xml:lang="ru">Конвертер BIM-моделей</name>
<documentation xml:lang="ru">Воркер, слушающий очередь RabbitMQ. Обрабатывает файлы NWD (Navisworks) и RVT (Revit): получает задание из очереди, читает исходный файл из объектного хранилища и возвращает туда результат конвертации. Прямых HTTP-вызовов от прикладных сервисов не принимает — единственная точка входа это очередь, что позволяет накапливать задания и переживать недоступность фермы без потери запросов.</documentation>
</element>
<element identifier="nd-cluster" xsi:type="Node"> <element identifier="nd-cluster" xsi:type="Node">
<name xml:lang="ru">Кластер k8s-prod</name> <name xml:lang="ru">Кластер k8s-prod</name>
<documentation xml:lang="ru">clusters/&lt;contour&gt;/kustomization.yaml. Развёртывание через FluxCD v2 (GitOps).</documentation> <documentation xml:lang="ru">Flux CD — набор контроллеров Kubernetes, реализующий подход GitOps: вся система описана декларативно и находится под контролем версий, а автоматика непрерывно приводит развёрнутое окружение в соответствие состоянию, заданному в Git. Контроллеры с заданным интервалом сравнивают фактическое состояние ресурсов с желаемым и применяют расхождения. Основные ресурсы: GitRepository описывает источник, Kustomization — набор манифестов для согласования, HelmRelease — развёртывание Helm-чарта.
Кластер Kubernetes, в котором работает вся платформа. Состав задаётся одним файлом clusters/&lt;контур&gt;/kustomization.yaml — плоским списком инфраструктурных компонентов и приложений; он же является источником истины о том, что развёрнуто. Доставка изменений — GitOps через FluxCD v2: Flux читает манифесты из Git-сервера контура и приводит кластер к описанному состоянию, ручной kubectl apply в нормальном процессе не используется. Прикладные сервисы ставятся не собственными чартами, а одним общим universal-chart, что делает их конфигурацию единообразной.</documentation>
</element> </element>
<element identifier="ss-istio-gw" xsi:type="SystemSoftware"> <element identifier="ss-istio-gw" xsi:type="SystemSoftware">
<name xml:lang="ru">Istio Ingress Gateway</name> <name xml:lang="ru">Istio Ingress Gateway</name>
<documentation xml:lang="ru">Ingress-контроллер, публикует контур наружу через NodePort.</documentation> <documentation xml:lang="ru">Istio — открытый service mesh, который прозрачно накладывается на существующие распределённые приложения и централизованно управляет взаимодействием сервисов, не требуя изменений в коде. Ingress-шлюз — это компонент плоскости данных Istio на границе mesh: он принимает внешний трафик, терминирует TLS и передаёт запросы внутрь по правилам, заданным ресурсами Gateway и VirtualService.
Единственная точка входа внешнего трафика в контур. Терминирует TLS и передаёт запросы дальше по правилам service mesh. Публикуется через NodePort и в типовой конфигурации привязан к выделенному узлу — это делает его единственной точкой отказа для всего внешнего доступа: при потере узла контур остаётся живым внутри, но недоступен снаружи. Резервирование ingress стоит рассматривать отдельно от резервирования приложений.</documentation>
</element> </element>
<element identifier="ss-istio-mesh" xsi:type="SystemSoftware"> <element identifier="ss-istio-mesh" xsi:type="SystemSoftware">
<name xml:lang="ru">Istio Service Mesh</name> <name xml:lang="ru">Istio Service Mesh</name>
<documentation xml:lang="ru">chart istio-config-contour. Gateway, VirtualService, RequestAuthentication.</documentation> <documentation xml:lang="ru">Istio разделён на плоскость управления, которая хранит конфигурацию и раздаёт её прокси, и плоскость данных из прокси Envoy рядом с каждым подом. Такая схема даёт три группы возможностей: управление трафиком (маршрутизация, балансировка HTTP/gRPC/TCP, повторы и переключение при отказах), безопасность (взаимный TLS между сервисами) и наблюдаемость — метрики, логи и трассировки для всего трафика кластера собираются автоматически. Конфигурация меняется на лету: Istio перепрограммирует прокси без пересборки и перезапуска приложений.
Управляющая конфигурация сети: Gateway описывает внешние точки входа, VirtualService — маршрутизацию по путям на конкретные сервисы, RequestAuthentication — проверку JWT на входе. Поставляется чартом istio-config-contour и является тем местом, где видно, какие приложения вообще опубликованы наружу. В части контуров разводка по путям вынесена за пределы репозитория во внешний nginx — тогда в модели виден только факт публикации, но не таблица маршрутов. Sidecar-прокси рядом с каждым подом дают mTLS между сервисами и метрики трафика.</documentation>
</element> </element>
<element identifier="ss-certmanager" xsi:type="SystemSoftware"> <element identifier="ss-certmanager" xsi:type="SystemSoftware">
<name xml:lang="ru">cert-manager</name> <name xml:lang="ru">cert-manager</name>
<documentation xml:lang="ru">Выпуск сертификатов. В примере — самоподписанный ClusterIssuer, wildcard на домен контура.</documentation> <documentation xml:lang="ru">cert-manager — расширение Kubernetes, которое выпускает TLS-сертификаты для нагрузок в кластере и продлевает их до истечения срока. Ресурсы Issuer и ClusterIssuer описывают, у какого удостоверяющего центра и на каких условиях получать сертификат, а ресурс Certificate — сам запрошенный сертификат; результат складывается в секрет Kubernetes, откуда его читают поды и ingress-контроллеры. Поддерживаются разные источники: Let's Encrypt, HashiCorp Vault, внутренние PKI и самоподписанные издатели.
Выпускает и автоматически продлевает TLS-сертификаты для внешних доменов контура. Работает через ClusterIssuer: в контурах с доступом в интернет это Let's Encrypt, в закрытых — самоподписанный издатель, как в этом примере. Выпущенный wildcard-сертификат складывается в секрет, который использует ingress-gateway. Практическое следствие самоподписанного варианта: клиентам нужно доверять корневому сертификату контура, иначе браузеры и интеграции будут ругаться.</documentation>
</element> </element>
<element identifier="ss-zitadel" xsi:type="SystemSoftware"> <element identifier="ss-zitadel" xsi:type="SystemSoftware">
<name xml:lang="ru">Zitadel</name> <name xml:lang="ru">Zitadel</name>
<documentation xml:lang="ru">chart idp-contour, ns zitadel. Основной поставщик идентичности.</documentation> <documentation xml:lang="ru">Zitadel — платформа управления идентификацией, реализующая отраслевые стандарты OIDC, OAuth 2.0 и SAML для входа и единой аутентификации. Отличительные черты — мультиарендность с настройкой оформления под каждого арендатора, полный журнал аудита на основе event sourcing и возможность развёртывания как в облаке, так и на своих мощностях. Закрывает задачи аутентификации, многофакторной проверки и управления пользователями без разработки собственной подсистемы входа.
Основной поставщик идентичности платформы, отвечает за аутентификацию пользователей по OIDC и выдачу токенов. Прикладные сервисы не проверяют пароли сами: они валидируют JWT по публичному ключу, а на границе контура это же делает Istio через RequestAuthentication. Самый широко используемый технологический сервис контура — с ним так или иначе работает подавляющее большинство приложений, включая фронтенды. Отдельный микрофронтенд auth-flow обслуживает сценарий логина и обработку OIDC-callback. Keycloak в платформе тоже встречается, но как вторичный вариант и внутри поставки Camunda.</documentation>
</element> </element>
<element identifier="ss-vault" xsi:type="SystemSoftware"> <element identifier="ss-vault" xsi:type="SystemSoftware">
<name xml:lang="ru">Vault + Agent Injector</name> <name xml:lang="ru">Vault + Agent Injector</name>
<documentation xml:lang="ru">chart vault-contour, ns vault. Единственный механизм доставки секретов, путь secrets/data/apps/&lt;app&gt;/postgres.</documentation> <documentation xml:lang="ru">HashiCorp Vault — централизованная система управления секретами: учётными данными, ключами шифрования и сертификатами, с аудитом всех обращений. Работает по схеме «клиент аутентифицируется — получает токен, связанный с набором политик — обращается к секретам по путям — Vault проверяет права и записывает обращение в журнал независимо от исхода». Модульная архитектура позволяет подключать разные способы аутентификации и разные хранилища секретов, включая выдачу временных учётных данных к базам данных.
Единственный механизм доставки секретов приложениям. Секреты не лежат в манифестах и не хранятся в Git: под получает их через sidecar Agent Injector, который аутентифицируется в Vault по service account пода и монтирует значения из пути вида secrets/data/apps/&lt;приложение&gt;/postgres. Ролью и service account служит имя приложения — соглашение единообразно для всех сервисов. Практическое следствие для чтения архитектуры: связи приложения с БД, брокером или S3 часто не видны в YAML, потому что реквизиты приходят из Vault. Трафик к Vault выведен из-под sidecar-прокси Istio отдельной аннотацией, иначе инициализация пода не проходит.</documentation>
</element> </element>
<element identifier="ss-postgres" xsi:type="SystemSoftware"> <element identifier="ss-postgres" xsi:type="SystemSoftware">
<name xml:lang="ru">PostgreSQL</name> <name xml:lang="ru">PostgreSQL</name>
<documentation xml:lang="ru">chart postgresql-contour, ns postgresql. PVC на сетевом хранилище.</documentation> <documentation xml:lang="ru">PostgreSQL — объектно-реляционная СУБД с открытым исходным кодом и почти сорокалетней историей развития. Соответствует требованиям ACID, использует многоверсионное управление конкурентным доступом (MVCC) и покрывает не менее 170 из 177 обязательных возможностей ядра стандарта SQL:2023. Поддерживает широкий набор типов данных, включая JSON и JSONB, геометрические и пользовательские типы, а также расширения — хранимые процедуры на нескольких языках, обёртки сторонних источников данных и геопространственное расширение PostGIS.
Основное реляционное хранилище контура и самый востребованный технологический сервис после управления секретами. Разворачивается внутри кластера как StatefulSet на сетевом хранилище; в части контуров вместо него используется внешняя managed-СУБД, и тогда в кластере остаются только реквизиты подключения. Базы разделены по приложениям — общей схемы нет, каждый сервис владеет своими таблицами, что важно для независимости релизов. Реквизиты всегда приходят через Vault, поэтому в манифестах приложения видна лишь аннотация инжектора.</documentation>
</element> </element>
<element identifier="ss-redis" xsi:type="SystemSoftware"> <element identifier="ss-redis" xsi:type="SystemSoftware">
<name xml:lang="ru">Redis</name> <name xml:lang="ru">Redis</name>
<documentation xml:lang="ru">Разворачивается не во всех контурах и не для всех приложений.</documentation> <documentation xml:lang="ru">Redis — сервер структур данных, хранящий данные в оперативной памяти. Помимо строк поддерживает хеши, списки, множества, упорядоченные множества и потоки — журнал с добавлением в конец. Такой набор примитивов закрывает разные задачи одним инструментом: кэширование, хранение сессий, очереди, счётчики и обработку событий. Предусмотрены механизмы сохранения данных на диск, что позволяет пережить перезапуск.
Кэш и брокер фоновых задач. В отличие от PostgreSQL, не является общей инфраструктурой контура: разворачивается точечно, в namespace тех приложений, которым он действительно нужен — как правило, там, где есть Celery-воркеры или требуется разделяемое состояние между репликами. Из-за этого экземпляров Redis в контуре несколько и они независимы; общего кэша, через который сервисы обмениваются данными, в платформе нет.</documentation>
</element> </element>
<element identifier="ss-kafka" xsi:type="SystemSoftware"> <element identifier="ss-kafka" xsi:type="SystemSoftware">
<name xml:lang="ru">Kafka</name> <name xml:lang="ru">Kafka</name>
<documentation xml:lang="ru">chart kafka-contour, ns kafka.</documentation> <documentation xml:lang="ru">Apache Kafka — платформа потоковой обработки событий: публикация, хранение и обработка непрерывных потоков данных в реальном времени. События пишутся в темы, темы делятся на разделы и распределяются по брокерам ради масштабирования; производители пишут, потребители читают. Ключевое отличие от обычной очереди в том, что событие не удаляется после прочтения, а хранится по настраиваемой политике — поэтому его можно перечитать заново и подключить новых потребителей к уже накопленной истории.
Шина событий для асинхронного обмена между сервисами. Используется там, где нужен журнал событий с возможностью повторного чтения и несколькими независимыми потребителями: аудит действий, уведомления, синхронизация состояний между доменами. Соседствует с RabbitMQ, и это осознанное разделение, а не дублирование: Kafka отвечает за поток событий, RabbitMQ — за адресную доставку задач. Часть приложений подключена к обеим шинам одновременно.</documentation>
</element> </element>
<element identifier="ss-rabbit" xsi:type="SystemSoftware"> <element identifier="ss-rabbit" xsi:type="SystemSoftware">
<name xml:lang="ru">RabbitMQ</name> <name xml:lang="ru">RabbitMQ</name>
<documentation xml:lang="ru">chart rabbitmq-contour, ns rabbitmq.</documentation> <documentation xml:lang="ru">RabbitMQ — брокер сообщений, реализующий протокол AMQP 0-9-1 для асинхронного обмена между приложениями. Опубликованное сообщение попадает в обменник, привязки маршрутизируют его в очереди по ключу маршрутизации, а из очередей его забирают потребители. Доставка подтверждается: при явном подтверждении потребитель сообщает об успешной обработке, и если он отвалился, не подтвердив сообщение, брокер передаст его другому потребителю или дождётся появления нового — сообщение не теряется.
Очередь задач для фоновой обработки: выгрузки, конвертация документов, рассылки, длительные операции, которые нельзя выполнять в HTTP-запросе. В отличие от Kafka, ориентирован на адресную доставку конкретному обработчику с подтверждением и повторами. В ряде контуров панель управления публикуется наружу отдельным доменом, что удобно для эксплуатации, но требует внимания к доступу — это полноценный административный интерфейс.</documentation>
</element> </element>
<element identifier="ss-camunda" xsi:type="SystemSoftware"> <element identifier="ss-camunda" xsi:type="SystemSoftware">
<name xml:lang="ru">Camunda Platform</name> <name xml:lang="ru">Camunda Platform</name>
<documentation xml:lang="ru">chart camunda-contour, ns camunda. Воркеры прикладных сервисов подключаются к Zeebe-gateway как job-workers, HTTP-часть ходит в Operate. Переменные ZEEBE_*/CAMUNDA_* приходят из k8s-секрета, поэтому в манифестах не видны.</documentation> <documentation xml:lang="ru">Camunda 8 — платформа оркестрации и автоматизации бизнес-процессов с участием людей, систем и устройств. В её основе движок Zeebe, координирующий исполнение процессов в распределённой среде; Operate и Tasklist дают операционную видимость и работу с пользовательскими задачами, Optimize — аналитику по исполнению. Работу выполняют job-воркеры: внешние компоненты, которые опрашивают кластер на предмет заданий своего типа, обрабатывают их и возвращают результат.
Движок исполнения бизнес-процессов в нотации BPMN. Через него проходят маршруты согласования документов: процесс описывает шаги и условия, а конкретные действия выполняют воркеры прикладных сервисов, подключённые к Zeebe как job-workers по типу задачи. Это единственный компонент контура, где логика согласования выражена декларативно и её можно менять без пересборки сервисов. Важная особенность для чтения конфигурации: переменные ZEEBE_* и CAMUNDA_* приходят из k8s-секрета, поэтому в манифестах приложений связь с Camunda не видна — она подтверждается только документацией сервисов.</documentation>
</element> </element>
<element identifier="ss-cam-zeebe" xsi:type="SystemSoftware"> <element identifier="ss-cam-zeebe" xsi:type="SystemSoftware">
<name xml:lang="ru">Zeebe</name> <name xml:lang="ru">Zeebe</name>
<documentation xml:lang="ru">Ядро движка: хранит состояние запущенных процессов и раздаёт задачи воркерам. Работает как StatefulSet, состояние на диске.</documentation>
</element> </element>
<element identifier="ss-cam-zeebe-gateway" xsi:type="SystemSoftware"> <element identifier="ss-cam-zeebe-gateway" xsi:type="SystemSoftware">
<name xml:lang="ru">Zeebe Gateway</name> <name xml:lang="ru">Zeebe Gateway</name>
<documentation xml:lang="ru">Точка подключения клиентов и job-workers к ядру. Именно её адрес прикладные сервисы получают в переменной ZEEBE_GATEWAY.</documentation>
</element> </element>
<element identifier="ss-cam-operate" xsi:type="SystemSoftware"> <element identifier="ss-cam-operate" xsi:type="SystemSoftware">
<name xml:lang="ru">Operate</name> <name xml:lang="ru">Operate</name>
<documentation xml:lang="ru">Интерфейс и REST API для наблюдения за экземплярами процессов: где застрял маршрут, какие переменные, какие инциденты. Используется не только людьми — прикладные сервисы обращаются к его API программно.</documentation>
</element> </element>
<element identifier="ss-cam-tasklist" xsi:type="SystemSoftware"> <element identifier="ss-cam-tasklist" xsi:type="SystemSoftware">
<name xml:lang="ru">Tasklist</name> <name xml:lang="ru">Tasklist</name>
<documentation xml:lang="ru">Интерфейс пользовательских задач BPMN — шагов процесса, требующих действия человека.</documentation>
</element> </element>
<element identifier="ss-cam-optimize" xsi:type="SystemSoftware"> <element identifier="ss-cam-optimize" xsi:type="SystemSoftware">
<name xml:lang="ru">Optimize</name> <name xml:lang="ru">Optimize</name>
<documentation xml:lang="ru">Аналитика по исполнению процессов: длительности, узкие места, статистика прохождения маршрутов.</documentation>
</element> </element>
<element identifier="ss-cam-identity" xsi:type="SystemSoftware"> <element identifier="ss-cam-identity" xsi:type="SystemSoftware">
<name xml:lang="ru">Identity</name> <name xml:lang="ru">Identity</name>
<documentation xml:lang="ru">Управление доступом к компонентам Camunda и выдача OAuth-токенов для машинного доступа. В поставке идёт вместе с собственным Keycloak, отдельным от основного поставщика идентичности контура.</documentation>
</element> </element>
<element identifier="ss-cam-connectors" xsi:type="SystemSoftware"> <element identifier="ss-cam-connectors" xsi:type="SystemSoftware">
<name xml:lang="ru">Connectors</name> <name xml:lang="ru">Connectors</name>
<documentation xml:lang="ru">Готовые коннекторы к внешним системам, вызываемые из процесса без написания своего воркера.</documentation>
</element> </element>
<element identifier="nd-s3" xsi:type="Node"> <element identifier="nd-s3" xsi:type="Node">
<name xml:lang="ru">s3.example.com — объектное хранилище</name> <name xml:lang="ru">s3.example.com — объектное хранилище</name>
<documentation xml:lang="ru">Внешнее по отношению к кластеру.</documentation> <documentation xml:lang="ru">Объектное хранилище — масштабируемый репозиторий для неструктурированных данных: файлов, медиа, журналов и резервных копий, без ограничений традиционной файловой системы. Отраслевым стандартом доступа стал API S3, поэтому такие хранилища взаимозаменяемы для приложения. В self-hosted варианте обычно применяется MinIO с S3-совместимым API и распределённым развёртыванием на основе избыточного кодирования (erasure coding): данные разрезаются на фрагменты с избыточностью и раскладываются по узлам, что позволяет пережить отказ части из них дешевле, чем при простом дублировании.
Хранилище файлов платформы: документы, чертежи, модели, вложения, результаты конвертации. Вынесено за пределы кластера — в одних контурах это MinIO на отдельных узлах, в других внешний S3-совместимый сервис заказчика. Именно здесь лежит основной объём данных: базы хранят метаданные и связи, а сами файлы всегда в объектном хранилище. Прямой доступ браузера к хранилищу не используется, отдача файлов идёт через прокси-сервис платформы.</documentation>
</element> </element>
<element identifier="nd-nfs" xsi:type="Node"> <element identifier="nd-nfs" xsi:type="Node">
<name xml:lang="ru">Сетевое хранилище (StorageClass)</name> <name xml:lang="ru">Сетевое хранилище (StorageClass)</name>
<documentation xml:lang="ru">Класс хранения для PVC.</documentation> <documentation xml:lang="ru">Класс хранения, из которого выделяются тома для компонентов с состоянием — прежде всего для PostgreSQL, а также для брокеров и движка процессов. От его производительности напрямую зависит отзывчивость СУБД, поэтому это место стоит проверять первым при жалобах на медленную работу платформы.</documentation>
</element> </element>
<element identifier="nd-gitea" xsi:type="Node"> <element identifier="nd-gitea" xsi:type="Node">
<name xml:lang="ru">Git-сервер контура</name> <name xml:lang="ru">Git-сервер контура</name>
<documentation xml:lang="ru">Источник манифестов для Flux.</documentation> <documentation xml:lang="ru">Хранит манифесты, из которых Flux собирает состояние кластера. В закрытых контурах наполняется зеркалированием из основного репозитория разработки, что даёт контуру автономность: даже при отсутствии связи с внешним миром развёртывание работает из локальной копии. Практически это означает, что изменение, попавшее в основной репозиторий, доедет до контура не мгновенно, а после синхронизации зеркала.</documentation>
</element> </element>
<element identifier="nd-cr" xsi:type="Node"> <element identifier="nd-cr" xsi:type="Node">
<name xml:lang="ru">registry.example.com</name> <name xml:lang="ru">registry.example.com</name>
<documentation xml:lang="ru">Реестр Helm-чартов (OCI) и образов контейнеров.</documentation> <documentation xml:lang="ru">Реестр, из которого кластер получает и Helm-чарты (в формате OCI), и образы контейнеров. Единая точка поставки: версия чарта и тег образа, указанные в манифестах, разрешаются именно здесь. Доступность реестра — обязательное условие для развёртывания и перезапуска подов, поэтому в закрытых контурах он размещается внутри периметра.</documentation>
</element> </element>
<element identifier="ar-charts" xsi:type="Artifact"> <element identifier="ar-charts" xsi:type="Artifact">
<name xml:lang="ru">Helm-чарты (OCI)</name> <name xml:lang="ru">Helm-чарты (OCI)</name>
@ -234,60 +269,75 @@
</element> </element>
<element identifier="nd-frontend" xsi:type="Node"> <element identifier="nd-frontend" xsi:type="Node">
<name xml:lang="ru">frontend-node-01</name> <name xml:lang="ru">frontend-node-01</name>
<documentation xml:lang="ru">Выделенный узел, к которому ingress-gateway прибит через nodeSelector.</documentation> <documentation xml:lang="ru">Узел, к которому привязан ingress-gateway через nodeSelector. Привязка сделана ради предсказуемого адреса для внешней балансировки и правил межсетевого экрана, но ценой того, что внешний доступ зависит от одного узла.</documentation>
</element> </element>
<element identifier="ts-ingress" xsi:type="TechnologyService"> <element identifier="ts-ingress" xsi:type="TechnologyService">
<name xml:lang="ru">Маршрутизация HTTPS-трафика</name> <name xml:lang="ru">Маршрутизация HTTPS-трафика</name>
<documentation xml:lang="ru">Публикация приложений наружу: терминация TLS, разбор внешнего домена и пути, направление запроса нужному сервису, проверка токена на границе. Сервисом пользуются только те приложения, у которых есть внешний интерфейс; остальные доступны исключительно внутри кластера.</documentation>
</element> </element>
<element identifier="ts-tls" xsi:type="TechnologyService"> <element identifier="ts-tls" xsi:type="TechnologyService">
<name xml:lang="ru">Выпуск TLS-сертификатов</name> <name xml:lang="ru">Выпуск TLS-сертификатов</name>
<documentation xml:lang="ru">Автоматическое получение и продление сертификатов для доменов контура. Потребитель у сервиса один — ingress-gateway; приложения с ним не взаимодействуют, поэтому отдельного представления с потребителями у него нет.</documentation>
</element> </element>
<element identifier="ts-oidc" xsi:type="TechnologyService"> <element identifier="ts-oidc" xsi:type="TechnologyService">
<name xml:lang="ru">Аутентификация OIDC</name> <name xml:lang="ru">Аутентификация OIDC</name>
<documentation xml:lang="ru">Проверка личности пользователя и выдача токена, по которому сервисы принимают решение о доступе. Самый массово используемый сервис контура. Значительная часть связей подтверждается только документацией приложений: публичный ключ и параметры подключения приходят из секретов, а не из манифестов.</documentation>
</element> </element>
<element identifier="ts-secrets" xsi:type="TechnologyService"> <element identifier="ts-secrets" xsi:type="TechnologyService">
<name xml:lang="ru">Управление секретами</name> <name xml:lang="ru">Управление секретами</name>
<documentation xml:lang="ru">Выдача приложениям реквизитов доступа к базам, брокерам и хранилищам во время запуска пода. Практически универсальная зависимость: почти каждый сервис с состоянием стартует только после успешного получения секретов, поэтому недоступность этого сервиса останавливает не работу, а перезапуск и выкатку.</documentation>
</element> </element>
<element identifier="ts-rdbms" xsi:type="TechnologyService"> <element identifier="ts-rdbms" xsi:type="TechnologyService">
<name xml:lang="ru">Реляционное хранилище</name> <name xml:lang="ru">Реляционное хранилище</name>
<documentation xml:lang="ru">Хранение структурированных данных доменных областей: карточек, связей, статусов, журналов. У каждого сервиса своя база, общей схемы нет — обмен между сервисами идёт через API и шины, а не через общие таблицы.</documentation>
</element> </element>
<element identifier="ts-cache" xsi:type="TechnologyService"> <element identifier="ts-cache" xsi:type="TechnologyService">
<name xml:lang="ru">Кэш</name> <name xml:lang="ru">Кэш</name>
<documentation xml:lang="ru">Разделяемое короткоживущее состояние и очередь фоновых задач для сервисов с Celery-воркерами. Востребован узким кругом приложений, поэтому разворачивается точечно, а не как общая инфраструктура контура.</documentation>
</element> </element>
<element identifier="ts-events" xsi:type="TechnologyService"> <element identifier="ts-events" xsi:type="TechnologyService">
<name xml:lang="ru">Событийная шина</name> <name xml:lang="ru">Событийная шина</name>
<documentation xml:lang="ru">Асинхронная публикация событий с сохранением журнала и несколькими независимыми потребителями. Используется там, где важен факт изменения и возможность его повторно прочитать: аудит, уведомления, синхронизация состояний между доменами.</documentation>
</element> </element>
<element identifier="ts-amqp" xsi:type="TechnologyService"> <element identifier="ts-amqp" xsi:type="TechnologyService">
<name xml:lang="ru">Очередь сообщений AMQP</name> <name xml:lang="ru">Очередь сообщений AMQP</name>
<documentation xml:lang="ru">Адресная доставка задач фоновым обработчикам с подтверждением и повторами. Обслуживает длительные операции — конвертацию, выгрузки, рассылки, — которые нельзя выполнять внутри HTTP-запроса.</documentation>
</element> </element>
<element identifier="ts-bpmn" xsi:type="TechnologyService"> <element identifier="ts-bpmn" xsi:type="TechnologyService">
<name xml:lang="ru">Оркестрация процессов BPMN</name> <name xml:lang="ru">Оркестрация процессов BPMN</name>
<documentation xml:lang="ru">Исполнение маршрутов согласования, описанных схемой BPMN: движок ведёт состояние процесса и раздаёт шаги воркерам прикладных сервисов. Позволяет менять логику согласования без пересборки сервисов. Связь с потребителем не видна в манифестах — параметры подключения приходят из секрета.</documentation>
</element> </element>
<element identifier="ts-object" xsi:type="TechnologyService"> <element identifier="ts-object" xsi:type="TechnologyService">
<name xml:lang="ru">Объектное хранилище</name> <name xml:lang="ru">Объектное хранилище</name>
<documentation xml:lang="ru">Хранение и выдача файлов: документов, чертежей, моделей, вложений и производных представлений. Базовый сервис для всех документоориентированных областей платформы — в реляционных базах лежат только метаданные, содержимое всегда здесь.</documentation>
</element> </element>
<element identifier="ng-processing" xsi:type="Node"> <element identifier="ng-processing" xsi:type="Node">
<name xml:lang="ru">Группа узлов processing (Сервера приложений)</name> <name xml:lang="ru">Группа узлов processing (Сервера приложений)</name>
<documentation xml:lang="ru">Узлы под вычислительно тяжёлую обработку, вынесенную из общего пула приложений: конвертация и разбор файлов, построение производных представлений документов и моделей. Отделены от остальных прикладных серверов намеренно — такая нагрузка неравномерна и способна вытеснить интерактивные сервисы, если делить с ними ресурсы.</documentation>
</element> </element>
<element identifier="ng-app" xsi:type="Node"> <element identifier="ng-app" xsi:type="Node">
<name xml:lang="ru">Группа узлов generic (Сервера приложений)</name> <name xml:lang="ru">Группа узлов generic (Сервера приложений)</name>
<documentation xml:lang="ru">Основной пул прикладных серверов: здесь работает подавляющее большинство сервисов платформы — и бэкенды доменных областей, и микрофронтенды. Нагрузка преимущественно интерактивная, запрос-ответ. Это самая массовая группа, и именно её объём определяет, сколько ресурсов требует контур.</documentation>
</element> </element>
<element identifier="ng-storage" xsi:type="Node"> <element identifier="ng-storage" xsi:type="Node">
<name xml:lang="ru">Объектное хранилище</name> <name xml:lang="ru">Объектное хранилище</name>
<documentation xml:lang="ru">Узлы файлового хранилища. Отделены от вычислительных, потому что растут по другому закону: объём здесь определяется накопленными документами и моделями за всё время эксплуатации, а не числом одновременных пользователей. Это же делает группу главным кандидатом на резервное копирование.</documentation>
</element> </element>
<element identifier="ng-db" xsi:type="Node"> <element identifier="ng-db" xsi:type="Node">
<name xml:lang="ru">Группа узлов DB (Базы данных)</name> <name xml:lang="ru">Группа узлов DB (Базы данных)</name>
<documentation xml:lang="ru">Узлы СУБД. Вынесены отдельно по двум причинам: предсказуемая производительность дисков и возможность обслуживать базы, не затрагивая прикладные сервисы. Хранят метаданные и связи всех доменных областей; при потере данных этой группы файлы в объектном хранилище останутся, но станут неадресуемыми.</documentation>
</element> </element>
<element identifier="ng-k8s" xsi:type="Node"> <element identifier="ng-k8s" xsi:type="Node">
<name xml:lang="ru">Группа узлов K8s (Поддерживающая инфраструктура)</name> <name xml:lang="ru">Группа узлов K8s (Поддерживающая инфраструктура)</name>
<documentation xml:lang="ru">Узлы платформенных сервисов, на которых не работает прикладная логика: сеть и вход в контур, идентификация, секреты, брокеры, движок процессов, кэш. Прикладные сервисы без этой группы нефункциональны — здесь сосредоточены зависимости, общие для всех доменных областей.</documentation>
</element> </element>
<element identifier="ng-repo" xsi:type="Node"> <element identifier="ng-repo" xsi:type="Node">
<name xml:lang="ru">Репозиторий компонентов</name> <name xml:lang="ru">Репозиторий компонентов</name>
<documentation xml:lang="ru">Реестр Helm-чартов и образов + Git-сервер контура, из которого Flux читает манифесты. Состав требует подтверждения.</documentation> <documentation xml:lang="ru">Узлы поставки: реестр чартов и образов, а также Git-сервер, из которого Flux читает манифесты. Обеспечивают автономность контура — развёртывание и перезапуск не требуют выхода во внешнюю сеть. Состав группы требует подтверждения: не исключено, что под репозиторием компонентов понимается только реестр артефактов.</documentation>
</element> </element>
<element identifier="ng-cad" xsi:type="Node"> <element identifier="ng-cad" xsi:type="Node">
<name xml:lang="ru">CAD ферма</name> <name xml:lang="ru">CAD ферма</name>
<documentation xml:lang="ru">Состав не выведен из репозитория — заполнить вручную: какие сервисы и ПО работают на этой группе узлов.</documentation> <documentation xml:lang="ru">Узлы обработки исходных файлов BIM-моделей в проприетарных форматах NWD и RVT. Работают асинхронно: воркер разбирает очередь заданий, забирает исходный файл из объектного хранилища, конвертирует его в пригодный для просмотра и анализа вид и складывает результат обратно. Вынесены в отдельную группу, потому что требуют специфического окружения и дают тяжёлую неравномерную нагрузку — обработка одной модели занимает несоизмеримо больше времени, чем любой интерактивный запрос. В манифестах кластера этих компонентов нет: группа обслуживается вне GitOps-контура платформы.</documentation>
</element> </element>
</elements> </elements>
<relationships> <relationships>
@ -513,6 +563,9 @@
<relationship identifier="rel-220" source="ng-k8s" target="ss-camunda" xsi:type="Aggregation"/> <relationship identifier="rel-220" source="ng-k8s" target="ss-camunda" xsi:type="Aggregation"/>
<relationship identifier="rel-221" source="ng-repo" target="nd-cr" xsi:type="Aggregation"/> <relationship identifier="rel-221" source="ng-repo" target="nd-cr" xsi:type="Aggregation"/>
<relationship identifier="rel-222" source="ng-repo" target="nd-gitea" xsi:type="Aggregation"/> <relationship identifier="rel-222" source="ng-repo" target="nd-gitea" xsi:type="Aggregation"/>
<relationship identifier="rel-223" source="ng-cad" target="ac-bim-converter" xsi:type="Assignment"/>
<relationship identifier="rel-224" source="ts-amqp" target="ac-bim-converter" xsi:type="Serving"/>
<relationship identifier="rel-225" source="ts-object" target="ac-bim-converter" xsi:type="Serving"/>
</relationships> </relationships>
<views> <views>
<diagrams> <diagrams>
@ -593,385 +646,390 @@
<node identifier="do-0068" elementRef="ng-repo" xsi:type="Element" x="20" y="796" w="400" h="112"/> <node identifier="do-0068" elementRef="ng-repo" xsi:type="Element" x="20" y="796" w="400" h="112"/>
<node identifier="do-0069" elementRef="nd-cr" xsi:type="Element" x="34" y="830" w="180" h="50"/> <node identifier="do-0069" elementRef="nd-cr" xsi:type="Element" x="34" y="830" w="180" h="50"/>
<node identifier="do-0070" elementRef="nd-gitea" xsi:type="Element" x="229" y="830" w="180" h="50"/> <node identifier="do-0070" elementRef="nd-gitea" xsi:type="Element" x="229" y="830" w="180" h="50"/>
<node identifier="do-0071" elementRef="ng-cad" xsi:type="Element" x="20" y="928" w="400" h="50"/> <node identifier="do-0071" elementRef="ng-cad" xsi:type="Element" x="20" y="928" w="400" h="112"/>
<node identifier="do-0072" elementRef="ng-app" xsi:type="Element" x="450" y="20" w="1108" h="958"/> <node identifier="do-0072" elementRef="ac-bim-converter" xsi:type="Element" x="34" y="962" w="180" h="50"/>
<node identifier="do-0073" elementRef="ac-attachments" xsi:type="Element" x="464" y="54" w="165" h="50"/> <node identifier="do-0073" elementRef="ng-app" xsi:type="Element" x="450" y="20" w="1108" h="1020"/>
<node identifier="do-0074" elementRef="ac-auth-flow" xsi:type="Element" x="644" y="54" w="165" h="50"/> <node identifier="do-0074" elementRef="ac-attachments" xsi:type="Element" x="464" y="54" w="165" h="50"/>
<node identifier="do-0075" elementRef="ac-bim" xsi:type="Element" x="824" y="54" w="165" h="50"/> <node identifier="do-0075" elementRef="ac-auth-flow" xsi:type="Element" x="644" y="54" w="165" h="50"/>
<node identifier="do-0076" elementRef="ac-cde" xsi:type="Element" x="1004" y="54" w="165" h="50"/> <node identifier="do-0076" elementRef="ac-bim" xsi:type="Element" x="824" y="54" w="165" h="50"/>
<node identifier="do-0077" elementRef="ac-checklists" xsi:type="Element" x="1184" y="54" w="165" h="50"/> <node identifier="do-0077" elementRef="ac-cde" xsi:type="Element" x="1004" y="54" w="165" h="50"/>
<node identifier="do-0078" elementRef="ac-comparisons" xsi:type="Element" x="1364" y="54" w="165" h="50"/> <node identifier="do-0078" elementRef="ac-checklists" xsi:type="Element" x="1184" y="54" w="165" h="50"/>
<node identifier="do-0079" elementRef="ac-contracts" xsi:type="Element" x="464" y="116" w="165" h="50"/> <node identifier="do-0079" elementRef="ac-comparisons" xsi:type="Element" x="1364" y="54" w="165" h="50"/>
<node identifier="do-0080" elementRef="ac-control-interface" xsi:type="Element" x="644" y="116" w="165" h="50"/> <node identifier="do-0080" elementRef="ac-contracts" xsi:type="Element" x="464" y="116" w="165" h="50"/>
<node identifier="do-0081" elementRef="ac-cross-section" xsi:type="Element" x="824" y="116" w="165" h="50"/> <node identifier="do-0081" elementRef="ac-control-interface" xsi:type="Element" x="644" y="116" w="165" h="50"/>
<node identifier="do-0082" elementRef="ac-django" xsi:type="Element" x="1004" y="116" w="165" h="50"/> <node identifier="do-0082" elementRef="ac-cross-section" xsi:type="Element" x="824" y="116" w="165" h="50"/>
<node identifier="do-0083" elementRef="ac-document-link" xsi:type="Element" x="1184" y="116" w="165" h="50"/> <node identifier="do-0083" elementRef="ac-django" xsi:type="Element" x="1004" y="116" w="165" h="50"/>
<node identifier="do-0084" elementRef="ac-documentations" xsi:type="Element" x="1364" y="116" w="165" h="50"/> <node identifier="do-0084" elementRef="ac-document-link" xsi:type="Element" x="1184" y="116" w="165" h="50"/>
<node identifier="do-0085" elementRef="ac-drawings" xsi:type="Element" x="464" y="178" w="165" h="50"/> <node identifier="do-0085" elementRef="ac-documentations" xsi:type="Element" x="1364" y="116" w="165" h="50"/>
<node identifier="do-0086" elementRef="ac-eav" xsi:type="Element" x="644" y="178" w="165" h="50"/> <node identifier="do-0086" elementRef="ac-drawings" xsi:type="Element" x="464" y="178" w="165" h="50"/>
<node identifier="do-0087" elementRef="ac-faas" xsi:type="Element" x="824" y="178" w="165" h="50"/> <node identifier="do-0087" elementRef="ac-eav" xsi:type="Element" x="644" y="178" w="165" h="50"/>
<node identifier="do-0088" elementRef="ac-flows" xsi:type="Element" x="1004" y="178" w="165" h="50"/> <node identifier="do-0088" elementRef="ac-faas" xsi:type="Element" x="824" y="178" w="165" h="50"/>
<node identifier="do-0089" elementRef="ac-iam" xsi:type="Element" x="1184" y="178" w="165" h="50"/> <node identifier="do-0089" elementRef="ac-flows" xsi:type="Element" x="1004" y="178" w="165" h="50"/>
<node identifier="do-0090" elementRef="ac-inspections" xsi:type="Element" x="1364" y="178" w="165" h="50"/> <node identifier="do-0090" elementRef="ac-iam" xsi:type="Element" x="1184" y="178" w="165" h="50"/>
<node identifier="do-0091" elementRef="ac-issues" xsi:type="Element" x="464" y="240" w="165" h="50"/> <node identifier="do-0091" elementRef="ac-inspections" xsi:type="Element" x="1364" y="178" w="165" h="50"/>
<node identifier="do-0092" elementRef="ac-mapper" xsi:type="Element" x="644" y="240" w="165" h="50"/> <node identifier="do-0092" elementRef="ac-issues" xsi:type="Element" x="464" y="240" w="165" h="50"/>
<node identifier="do-0093" elementRef="ac-measurements" xsi:type="Element" x="824" y="240" w="165" h="50"/> <node identifier="do-0093" elementRef="ac-mapper" xsi:type="Element" x="644" y="240" w="165" h="50"/>
<node identifier="do-0094" elementRef="ac-message-hub" xsi:type="Element" x="1004" y="240" w="165" h="50"/> <node identifier="do-0094" elementRef="ac-measurements" xsi:type="Element" x="824" y="240" w="165" h="50"/>
<node identifier="do-0095" elementRef="ac-notes" xsi:type="Element" x="1184" y="240" w="165" h="50"/> <node identifier="do-0095" elementRef="ac-message-hub" xsi:type="Element" x="1004" y="240" w="165" h="50"/>
<node identifier="do-0096" elementRef="ac-pm" xsi:type="Element" x="1364" y="240" w="165" h="50"/> <node identifier="do-0096" elementRef="ac-notes" xsi:type="Element" x="1184" y="240" w="165" h="50"/>
<node identifier="do-0097" elementRef="ac-prescriptions" xsi:type="Element" x="464" y="302" w="165" h="50"/> <node identifier="do-0097" elementRef="ac-pm" xsi:type="Element" x="1364" y="240" w="165" h="50"/>
<node identifier="do-0098" elementRef="ac-projects" xsi:type="Element" x="644" y="302" w="165" h="50"/> <node identifier="do-0098" elementRef="ac-prescriptions" xsi:type="Element" x="464" y="302" w="165" h="50"/>
<node identifier="do-0099" elementRef="ac-remarks" xsi:type="Element" x="824" y="302" w="165" h="50"/> <node identifier="do-0099" elementRef="ac-projects" xsi:type="Element" x="644" y="302" w="165" h="50"/>
<node identifier="do-0100" elementRef="ac-reviews" xsi:type="Element" x="1004" y="302" w="165" h="50"/> <node identifier="do-0100" elementRef="ac-remarks" xsi:type="Element" x="824" y="302" w="165" h="50"/>
<node identifier="do-0101" elementRef="ac-rfi" xsi:type="Element" x="1184" y="302" w="165" h="50"/> <node identifier="do-0101" elementRef="ac-reviews" xsi:type="Element" x="1004" y="302" w="165" h="50"/>
<node identifier="do-0102" elementRef="ac-stamp-verification" xsi:type="Element" x="1364" y="302" w="165" h="50"/> <node identifier="do-0102" elementRef="ac-rfi" xsi:type="Element" x="1184" y="302" w="165" h="50"/>
<node identifier="do-0103" elementRef="ac-subscriptions" xsi:type="Element" x="464" y="364" w="165" h="50"/> <node identifier="do-0103" elementRef="ac-stamp-verification" xsi:type="Element" x="1364" y="302" w="165" h="50"/>
<node identifier="do-0104" elementRef="ac-system-log" xsi:type="Element" x="644" y="364" w="165" h="50"/> <node identifier="do-0104" elementRef="ac-subscriptions" xsi:type="Element" x="464" y="364" w="165" h="50"/>
<node identifier="do-0105" elementRef="ac-transmittal" xsi:type="Element" x="824" y="364" w="165" h="50"/> <node identifier="do-0105" elementRef="ac-system-log" xsi:type="Element" x="644" y="364" w="165" h="50"/>
<node identifier="do-0106" elementRef="ac-workspaces" xsi:type="Element" x="1004" y="364" w="165" h="50"/> <node identifier="do-0106" elementRef="ac-transmittal" xsi:type="Element" x="824" y="364" w="165" h="50"/>
<node identifier="do-0107" elementRef="ac-workspaces" xsi:type="Element" x="1004" y="364" w="165" h="50"/>
</view> </view>
<view identifier="view-3" xsi:type="Diagram"> <view identifier="view-3" xsi:type="Diagram">
<name xml:lang="ru">T3. Потребители: Маршрутизация HTTPS-трафика</name> <name xml:lang="ru">T3. Потребители: Маршрутизация HTTPS-трафика</name>
<documentation xml:lang="ru">21 из 35 приложений контура. Связи выведены из манифестов приложений.</documentation> <documentation xml:lang="ru">21 из 35 приложений контура. Связи выведены из манифестов приложений.</documentation>
<node identifier="do-0107" elementRef="ts-ingress" xsi:type="Element" x="20" y="20" w="260" h="60"/> <node identifier="do-0108" elementRef="ts-ingress" xsi:type="Element" x="20" y="20" w="260" h="60"/>
<node identifier="do-0108" elementRef="ss-istio-gw" xsi:type="Element" x="320" y="20" w="260" h="60"/> <node identifier="do-0109" elementRef="ss-istio-gw" xsi:type="Element" x="320" y="20" w="260" h="60"/>
<node identifier="do-0110" elementRef="ss-istio-mesh" xsi:type="Element" x="600" y="20" w="260" h="60"/> <node identifier="do-0111" elementRef="ss-istio-mesh" xsi:type="Element" x="600" y="20" w="260" h="60"/>
<node identifier="do-0112" elementRef="ac-auth-flow" xsi:type="Element" x="20" y="150" w="170" h="55"/> <node identifier="do-0113" elementRef="ac-auth-flow" xsi:type="Element" x="20" y="150" w="170" h="55"/>
<node identifier="do-0114" elementRef="ac-bim" xsi:type="Element" x="210" y="150" w="170" h="55"/> <node identifier="do-0115" elementRef="ac-bim" xsi:type="Element" x="210" y="150" w="170" h="55"/>
<node identifier="do-0116" elementRef="ac-cde" xsi:type="Element" x="400" y="150" w="170" h="55"/> <node identifier="do-0117" elementRef="ac-cde" xsi:type="Element" x="400" y="150" w="170" h="55"/>
<node identifier="do-0118" elementRef="ac-checklists" xsi:type="Element" x="590" y="150" w="170" h="55"/> <node identifier="do-0119" elementRef="ac-checklists" xsi:type="Element" x="590" y="150" w="170" h="55"/>
<node identifier="do-0120" elementRef="ac-control-interface" xsi:type="Element" x="780" y="150" w="170" h="55"/> <node identifier="do-0121" elementRef="ac-control-interface" xsi:type="Element" x="780" y="150" w="170" h="55"/>
<node identifier="do-0122" elementRef="ac-django" xsi:type="Element" x="970" y="150" w="170" h="55"/> <node identifier="do-0123" elementRef="ac-django" xsi:type="Element" x="970" y="150" w="170" h="55"/>
<node identifier="do-0124" elementRef="ac-document-link" xsi:type="Element" x="20" y="230" w="170" h="55"/> <node identifier="do-0125" elementRef="ac-document-link" xsi:type="Element" x="20" y="230" w="170" h="55"/>
<node identifier="do-0126" elementRef="ac-documentations" xsi:type="Element" x="210" y="230" w="170" h="55"/> <node identifier="do-0127" elementRef="ac-documentations" xsi:type="Element" x="210" y="230" w="170" h="55"/>
<node identifier="do-0128" elementRef="ac-eav" xsi:type="Element" x="400" y="230" w="170" h="55"/> <node identifier="do-0129" elementRef="ac-eav" xsi:type="Element" x="400" y="230" w="170" h="55"/>
<node identifier="do-0130" elementRef="ac-flows" xsi:type="Element" x="590" y="230" w="170" h="55"/> <node identifier="do-0131" elementRef="ac-flows" xsi:type="Element" x="590" y="230" w="170" h="55"/>
<node identifier="do-0132" elementRef="ac-iam" xsi:type="Element" x="780" y="230" w="170" h="55"/> <node identifier="do-0133" elementRef="ac-iam" xsi:type="Element" x="780" y="230" w="170" h="55"/>
<node identifier="do-0134" elementRef="ac-inspections" xsi:type="Element" x="970" y="230" w="170" h="55"/> <node identifier="do-0135" elementRef="ac-inspections" xsi:type="Element" x="970" y="230" w="170" h="55"/>
<node identifier="do-0136" elementRef="ac-issues" xsi:type="Element" x="20" y="310" w="170" h="55"/> <node identifier="do-0137" elementRef="ac-issues" xsi:type="Element" x="20" y="310" w="170" h="55"/>
<node identifier="do-0138" elementRef="ac-pm" xsi:type="Element" x="210" y="310" w="170" h="55"/> <node identifier="do-0139" elementRef="ac-pm" xsi:type="Element" x="210" y="310" w="170" h="55"/>
<node identifier="do-0140" elementRef="ac-processing" xsi:type="Element" x="400" y="310" w="170" h="55"/> <node identifier="do-0141" elementRef="ac-processing" xsi:type="Element" x="400" y="310" w="170" h="55"/>
<node identifier="do-0142" elementRef="ac-remarks" xsi:type="Element" x="590" y="310" w="170" h="55"/> <node identifier="do-0143" elementRef="ac-remarks" xsi:type="Element" x="590" y="310" w="170" h="55"/>
<node identifier="do-0144" elementRef="ac-reviews" xsi:type="Element" x="780" y="310" w="170" h="55"/> <node identifier="do-0145" elementRef="ac-reviews" xsi:type="Element" x="780" y="310" w="170" h="55"/>
<node identifier="do-0146" elementRef="ac-rfi" xsi:type="Element" x="970" y="310" w="170" h="55"/> <node identifier="do-0147" elementRef="ac-rfi" xsi:type="Element" x="970" y="310" w="170" h="55"/>
<node identifier="do-0148" elementRef="ac-stamp-verification" xsi:type="Element" x="20" y="390" w="170" h="55"/> <node identifier="do-0149" elementRef="ac-stamp-verification" xsi:type="Element" x="20" y="390" w="170" h="55"/>
<node identifier="do-0150" elementRef="ac-transmittal" xsi:type="Element" x="210" y="390" w="170" h="55"/> <node identifier="do-0151" elementRef="ac-transmittal" xsi:type="Element" x="210" y="390" w="170" h="55"/>
<node identifier="do-0152" elementRef="ac-workspaces" xsi:type="Element" x="400" y="390" w="170" h="55"/> <node identifier="do-0153" elementRef="ac-workspaces" xsi:type="Element" x="400" y="390" w="170" h="55"/>
<connection identifier="cn-0113" relationshipRef="rel-036" xsi:type="Relationship" source="do-0107" target="do-0112"/> <connection identifier="cn-0114" relationshipRef="rel-036" xsi:type="Relationship" source="do-0108" target="do-0113"/>
<connection identifier="cn-0115" relationshipRef="rel-037" xsi:type="Relationship" source="do-0107" target="do-0114"/> <connection identifier="cn-0116" relationshipRef="rel-037" xsi:type="Relationship" source="do-0108" target="do-0115"/>
<connection identifier="cn-0117" relationshipRef="rel-038" xsi:type="Relationship" source="do-0107" target="do-0116"/> <connection identifier="cn-0118" relationshipRef="rel-038" xsi:type="Relationship" source="do-0108" target="do-0117"/>
<connection identifier="cn-0119" relationshipRef="rel-039" xsi:type="Relationship" source="do-0107" target="do-0118"/> <connection identifier="cn-0120" relationshipRef="rel-039" xsi:type="Relationship" source="do-0108" target="do-0119"/>
<connection identifier="cn-0121" relationshipRef="rel-040" xsi:type="Relationship" source="do-0107" target="do-0120"/> <connection identifier="cn-0122" relationshipRef="rel-040" xsi:type="Relationship" source="do-0108" target="do-0121"/>
<connection identifier="cn-0123" relationshipRef="rel-041" xsi:type="Relationship" source="do-0107" target="do-0122"/> <connection identifier="cn-0124" relationshipRef="rel-041" xsi:type="Relationship" source="do-0108" target="do-0123"/>
<connection identifier="cn-0125" relationshipRef="rel-042" xsi:type="Relationship" source="do-0107" target="do-0124"/> <connection identifier="cn-0126" relationshipRef="rel-042" xsi:type="Relationship" source="do-0108" target="do-0125"/>
<connection identifier="cn-0127" relationshipRef="rel-043" xsi:type="Relationship" source="do-0107" target="do-0126"/> <connection identifier="cn-0128" relationshipRef="rel-043" xsi:type="Relationship" source="do-0108" target="do-0127"/>
<connection identifier="cn-0129" relationshipRef="rel-044" xsi:type="Relationship" source="do-0107" target="do-0128"/> <connection identifier="cn-0130" relationshipRef="rel-044" xsi:type="Relationship" source="do-0108" target="do-0129"/>
<connection identifier="cn-0131" relationshipRef="rel-045" xsi:type="Relationship" source="do-0107" target="do-0130"/> <connection identifier="cn-0132" relationshipRef="rel-045" xsi:type="Relationship" source="do-0108" target="do-0131"/>
<connection identifier="cn-0133" relationshipRef="rel-046" xsi:type="Relationship" source="do-0107" target="do-0132"/> <connection identifier="cn-0134" relationshipRef="rel-046" xsi:type="Relationship" source="do-0108" target="do-0133"/>
<connection identifier="cn-0135" relationshipRef="rel-047" xsi:type="Relationship" source="do-0107" target="do-0134"/> <connection identifier="cn-0136" relationshipRef="rel-047" xsi:type="Relationship" source="do-0108" target="do-0135"/>
<connection identifier="cn-0137" relationshipRef="rel-048" xsi:type="Relationship" source="do-0107" target="do-0136"/> <connection identifier="cn-0138" relationshipRef="rel-048" xsi:type="Relationship" source="do-0108" target="do-0137"/>
<connection identifier="cn-0139" relationshipRef="rel-049" xsi:type="Relationship" source="do-0107" target="do-0138"/> <connection identifier="cn-0140" relationshipRef="rel-049" xsi:type="Relationship" source="do-0108" target="do-0139"/>
<connection identifier="cn-0141" relationshipRef="rel-050" xsi:type="Relationship" source="do-0107" target="do-0140"/> <connection identifier="cn-0142" relationshipRef="rel-050" xsi:type="Relationship" source="do-0108" target="do-0141"/>
<connection identifier="cn-0143" relationshipRef="rel-051" xsi:type="Relationship" source="do-0107" target="do-0142"/> <connection identifier="cn-0144" relationshipRef="rel-051" xsi:type="Relationship" source="do-0108" target="do-0143"/>
<connection identifier="cn-0145" relationshipRef="rel-052" xsi:type="Relationship" source="do-0107" target="do-0144"/> <connection identifier="cn-0146" relationshipRef="rel-052" xsi:type="Relationship" source="do-0108" target="do-0145"/>
<connection identifier="cn-0147" relationshipRef="rel-053" xsi:type="Relationship" source="do-0107" target="do-0146"/> <connection identifier="cn-0148" relationshipRef="rel-053" xsi:type="Relationship" source="do-0108" target="do-0147"/>
<connection identifier="cn-0149" relationshipRef="rel-054" xsi:type="Relationship" source="do-0107" target="do-0148"/> <connection identifier="cn-0150" relationshipRef="rel-054" xsi:type="Relationship" source="do-0108" target="do-0149"/>
<connection identifier="cn-0151" relationshipRef="rel-055" xsi:type="Relationship" source="do-0107" target="do-0150"/> <connection identifier="cn-0152" relationshipRef="rel-055" xsi:type="Relationship" source="do-0108" target="do-0151"/>
<connection identifier="cn-0153" relationshipRef="rel-056" xsi:type="Relationship" source="do-0107" target="do-0152"/> <connection identifier="cn-0154" relationshipRef="rel-056" xsi:type="Relationship" source="do-0108" target="do-0153"/>
<connection identifier="cn-0109" relationshipRef="rel-024" xsi:type="Relationship" source="do-0108" target="do-0107"/> <connection identifier="cn-0110" relationshipRef="rel-024" xsi:type="Relationship" source="do-0109" target="do-0108"/>
<connection identifier="cn-0111" relationshipRef="rel-025" xsi:type="Relationship" source="do-0110" target="do-0107"/> <connection identifier="cn-0112" relationshipRef="rel-025" xsi:type="Relationship" source="do-0111" target="do-0108"/>
</view> </view>
<view identifier="view-4" xsi:type="Diagram"> <view identifier="view-4" xsi:type="Diagram">
<name xml:lang="ru">T4. Потребители: Аутентификация OIDC</name> <name xml:lang="ru">T4. Потребители: Аутентификация OIDC</name>
<documentation xml:lang="ru">24 из 35 приложений контура. Связи выведены из манифестов; 14 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны.</documentation> <documentation xml:lang="ru">24 из 35 приложений контура. Связи выведены из манифестов; 14 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны.</documentation>
<node identifier="do-0154" elementRef="ts-oidc" xsi:type="Element" x="20" y="20" w="260" h="60"/> <node identifier="do-0155" elementRef="ts-oidc" xsi:type="Element" x="20" y="20" w="260" h="60"/>
<node identifier="do-0155" elementRef="ss-zitadel" xsi:type="Element" x="320" y="20" w="260" h="60"/> <node identifier="do-0156" elementRef="ss-zitadel" xsi:type="Element" x="320" y="20" w="260" h="60"/>
<node identifier="do-0157" elementRef="ac-auth-flow" xsi:type="Element" x="20" y="150" w="170" h="55"/> <node identifier="do-0158" elementRef="ac-auth-flow" xsi:type="Element" x="20" y="150" w="170" h="55"/>
<node identifier="do-0159" elementRef="ac-checklists" xsi:type="Element" x="210" y="150" w="170" h="55"/> <node identifier="do-0160" elementRef="ac-checklists" xsi:type="Element" x="210" y="150" w="170" h="55"/>
<node identifier="do-0161" elementRef="ac-comparisons" xsi:type="Element" x="400" y="150" w="170" h="55"/> <node identifier="do-0162" elementRef="ac-comparisons" xsi:type="Element" x="400" y="150" w="170" h="55"/>
<node identifier="do-0163" elementRef="ac-contracts" xsi:type="Element" x="590" y="150" w="170" h="55"/> <node identifier="do-0164" elementRef="ac-contracts" xsi:type="Element" x="590" y="150" w="170" h="55"/>
<node identifier="do-0165" elementRef="ac-control-interface" xsi:type="Element" x="780" y="150" w="170" h="55"/> <node identifier="do-0166" elementRef="ac-control-interface" xsi:type="Element" x="780" y="150" w="170" h="55"/>
<node identifier="do-0167" elementRef="ac-cross-section" xsi:type="Element" x="970" y="150" w="170" h="55"/> <node identifier="do-0168" elementRef="ac-cross-section" xsi:type="Element" x="970" y="150" w="170" h="55"/>
<node identifier="do-0169" elementRef="ac-django" xsi:type="Element" x="20" y="230" w="170" h="55"/> <node identifier="do-0170" elementRef="ac-django" xsi:type="Element" x="20" y="230" w="170" h="55"/>
<node identifier="do-0171" elementRef="ac-documentations" xsi:type="Element" x="210" y="230" w="170" h="55"/> <node identifier="do-0172" elementRef="ac-documentations" xsi:type="Element" x="210" y="230" w="170" h="55"/>
<node identifier="do-0173" elementRef="ac-eav" xsi:type="Element" x="400" y="230" w="170" h="55"/> <node identifier="do-0174" elementRef="ac-eav" xsi:type="Element" x="400" y="230" w="170" h="55"/>
<node identifier="do-0175" elementRef="ac-flows" xsi:type="Element" x="590" y="230" w="170" h="55"/> <node identifier="do-0176" elementRef="ac-flows" xsi:type="Element" x="590" y="230" w="170" h="55"/>
<node identifier="do-0177" elementRef="ac-iam" xsi:type="Element" x="780" y="230" w="170" h="55"/> <node identifier="do-0178" elementRef="ac-iam" xsi:type="Element" x="780" y="230" w="170" h="55"/>
<node identifier="do-0179" elementRef="ac-inspections" xsi:type="Element" x="970" y="230" w="170" h="55"/> <node identifier="do-0180" elementRef="ac-inspections" xsi:type="Element" x="970" y="230" w="170" h="55"/>
<node identifier="do-0181" elementRef="ac-issues" xsi:type="Element" x="20" y="310" w="170" h="55"/> <node identifier="do-0182" elementRef="ac-issues" xsi:type="Element" x="20" y="310" w="170" h="55"/>
<node identifier="do-0183" elementRef="ac-mapper" xsi:type="Element" x="210" y="310" w="170" h="55"/> <node identifier="do-0184" elementRef="ac-mapper" xsi:type="Element" x="210" y="310" w="170" h="55"/>
<node identifier="do-0185" elementRef="ac-notes" xsi:type="Element" x="400" y="310" w="170" h="55"/> <node identifier="do-0186" elementRef="ac-notes" xsi:type="Element" x="400" y="310" w="170" h="55"/>
<node identifier="do-0187" elementRef="ac-pm" xsi:type="Element" x="590" y="310" w="170" h="55"/> <node identifier="do-0188" elementRef="ac-pm" xsi:type="Element" x="590" y="310" w="170" h="55"/>
<node identifier="do-0189" elementRef="ac-prescriptions" xsi:type="Element" x="780" y="310" w="170" h="55"/> <node identifier="do-0190" elementRef="ac-prescriptions" xsi:type="Element" x="780" y="310" w="170" h="55"/>
<node identifier="do-0191" elementRef="ac-processing" xsi:type="Element" x="970" y="310" w="170" h="55"/> <node identifier="do-0192" elementRef="ac-processing" xsi:type="Element" x="970" y="310" w="170" h="55"/>
<node identifier="do-0193" elementRef="ac-projects" xsi:type="Element" x="20" y="390" w="170" h="55"/> <node identifier="do-0194" elementRef="ac-projects" xsi:type="Element" x="20" y="390" w="170" h="55"/>
<node identifier="do-0195" elementRef="ac-remarks" xsi:type="Element" x="210" y="390" w="170" h="55"/> <node identifier="do-0196" elementRef="ac-remarks" xsi:type="Element" x="210" y="390" w="170" h="55"/>
<node identifier="do-0197" elementRef="ac-reviews" xsi:type="Element" x="400" y="390" w="170" h="55"/> <node identifier="do-0198" elementRef="ac-reviews" xsi:type="Element" x="400" y="390" w="170" h="55"/>
<node identifier="do-0199" elementRef="ac-rfi" xsi:type="Element" x="590" y="390" w="170" h="55"/> <node identifier="do-0200" elementRef="ac-rfi" xsi:type="Element" x="590" y="390" w="170" h="55"/>
<node identifier="do-0201" elementRef="ac-transmittal" xsi:type="Element" x="780" y="390" w="170" h="55"/> <node identifier="do-0202" elementRef="ac-transmittal" xsi:type="Element" x="780" y="390" w="170" h="55"/>
<node identifier="do-0203" elementRef="ac-workspaces" xsi:type="Element" x="970" y="390" w="170" h="55"/> <node identifier="do-0204" elementRef="ac-workspaces" xsi:type="Element" x="970" y="390" w="170" h="55"/>
<connection identifier="cn-0158" relationshipRef="rel-057" xsi:type="Relationship" source="do-0154" target="do-0157"/> <connection identifier="cn-0159" relationshipRef="rel-057" xsi:type="Relationship" source="do-0155" target="do-0158"/>
<connection identifier="cn-0160" relationshipRef="rel-058" xsi:type="Relationship" source="do-0154" target="do-0159"/> <connection identifier="cn-0161" relationshipRef="rel-058" xsi:type="Relationship" source="do-0155" target="do-0160"/>
<connection identifier="cn-0162" relationshipRef="rel-059" xsi:type="Relationship" source="do-0154" target="do-0161"/> <connection identifier="cn-0163" relationshipRef="rel-059" xsi:type="Relationship" source="do-0155" target="do-0162"/>
<connection identifier="cn-0164" relationshipRef="rel-060" xsi:type="Relationship" source="do-0154" target="do-0163"/> <connection identifier="cn-0165" relationshipRef="rel-060" xsi:type="Relationship" source="do-0155" target="do-0164"/>
<connection identifier="cn-0166" relationshipRef="rel-061" xsi:type="Relationship" source="do-0154" target="do-0165"/> <connection identifier="cn-0167" relationshipRef="rel-061" xsi:type="Relationship" source="do-0155" target="do-0166"/>
<connection identifier="cn-0168" relationshipRef="rel-062" xsi:type="Relationship" source="do-0154" target="do-0167"/> <connection identifier="cn-0169" relationshipRef="rel-062" xsi:type="Relationship" source="do-0155" target="do-0168"/>
<connection identifier="cn-0170" relationshipRef="rel-063" xsi:type="Relationship" source="do-0154" target="do-0169"/> <connection identifier="cn-0171" relationshipRef="rel-063" xsi:type="Relationship" source="do-0155" target="do-0170"/>
<connection identifier="cn-0172" relationshipRef="rel-064" xsi:type="Relationship" source="do-0154" target="do-0171"/> <connection identifier="cn-0173" relationshipRef="rel-064" xsi:type="Relationship" source="do-0155" target="do-0172"/>
<connection identifier="cn-0174" relationshipRef="rel-065" xsi:type="Relationship" source="do-0154" target="do-0173"/> <connection identifier="cn-0175" relationshipRef="rel-065" xsi:type="Relationship" source="do-0155" target="do-0174"/>
<connection identifier="cn-0176" relationshipRef="rel-066" xsi:type="Relationship" source="do-0154" target="do-0175"/> <connection identifier="cn-0177" relationshipRef="rel-066" xsi:type="Relationship" source="do-0155" target="do-0176"/>
<connection identifier="cn-0178" relationshipRef="rel-067" xsi:type="Relationship" source="do-0154" target="do-0177"/> <connection identifier="cn-0179" relationshipRef="rel-067" xsi:type="Relationship" source="do-0155" target="do-0178"/>
<connection identifier="cn-0180" relationshipRef="rel-068" xsi:type="Relationship" source="do-0154" target="do-0179"/> <connection identifier="cn-0181" relationshipRef="rel-068" xsi:type="Relationship" source="do-0155" target="do-0180"/>
<connection identifier="cn-0182" relationshipRef="rel-069" xsi:type="Relationship" source="do-0154" target="do-0181"/> <connection identifier="cn-0183" relationshipRef="rel-069" xsi:type="Relationship" source="do-0155" target="do-0182"/>
<connection identifier="cn-0184" relationshipRef="rel-070" xsi:type="Relationship" source="do-0154" target="do-0183"/> <connection identifier="cn-0185" relationshipRef="rel-070" xsi:type="Relationship" source="do-0155" target="do-0184"/>
<connection identifier="cn-0186" relationshipRef="rel-071" xsi:type="Relationship" source="do-0154" target="do-0185"/> <connection identifier="cn-0187" relationshipRef="rel-071" xsi:type="Relationship" source="do-0155" target="do-0186"/>
<connection identifier="cn-0188" relationshipRef="rel-072" xsi:type="Relationship" source="do-0154" target="do-0187"/> <connection identifier="cn-0189" relationshipRef="rel-072" xsi:type="Relationship" source="do-0155" target="do-0188"/>
<connection identifier="cn-0190" relationshipRef="rel-073" xsi:type="Relationship" source="do-0154" target="do-0189"/> <connection identifier="cn-0191" relationshipRef="rel-073" xsi:type="Relationship" source="do-0155" target="do-0190"/>
<connection identifier="cn-0192" relationshipRef="rel-074" xsi:type="Relationship" source="do-0154" target="do-0191"/> <connection identifier="cn-0193" relationshipRef="rel-074" xsi:type="Relationship" source="do-0155" target="do-0192"/>
<connection identifier="cn-0194" relationshipRef="rel-075" xsi:type="Relationship" source="do-0154" target="do-0193"/> <connection identifier="cn-0195" relationshipRef="rel-075" xsi:type="Relationship" source="do-0155" target="do-0194"/>
<connection identifier="cn-0196" relationshipRef="rel-076" xsi:type="Relationship" source="do-0154" target="do-0195"/> <connection identifier="cn-0197" relationshipRef="rel-076" xsi:type="Relationship" source="do-0155" target="do-0196"/>
<connection identifier="cn-0198" relationshipRef="rel-077" xsi:type="Relationship" source="do-0154" target="do-0197"/> <connection identifier="cn-0199" relationshipRef="rel-077" xsi:type="Relationship" source="do-0155" target="do-0198"/>
<connection identifier="cn-0200" relationshipRef="rel-078" xsi:type="Relationship" source="do-0154" target="do-0199"/> <connection identifier="cn-0201" relationshipRef="rel-078" xsi:type="Relationship" source="do-0155" target="do-0200"/>
<connection identifier="cn-0202" relationshipRef="rel-079" xsi:type="Relationship" source="do-0154" target="do-0201"/> <connection identifier="cn-0203" relationshipRef="rel-079" xsi:type="Relationship" source="do-0155" target="do-0202"/>
<connection identifier="cn-0204" relationshipRef="rel-080" xsi:type="Relationship" source="do-0154" target="do-0203"/> <connection identifier="cn-0205" relationshipRef="rel-080" xsi:type="Relationship" source="do-0155" target="do-0204"/>
<connection identifier="cn-0156" relationshipRef="rel-028" xsi:type="Relationship" source="do-0155" target="do-0154"/> <connection identifier="cn-0157" relationshipRef="rel-028" xsi:type="Relationship" source="do-0156" target="do-0155"/>
</view> </view>
<view identifier="view-5" xsi:type="Diagram"> <view identifier="view-5" xsi:type="Diagram">
<name xml:lang="ru">T5. Потребители: Управление секретами</name> <name xml:lang="ru">T5. Потребители: Управление секретами</name>
<documentation xml:lang="ru">25 из 35 приложений контура. Связи выведены из манифестов приложений.</documentation> <documentation xml:lang="ru">25 из 35 приложений контура. Связи выведены из манифестов приложений.</documentation>
<node identifier="do-0205" elementRef="ts-secrets" xsi:type="Element" x="20" y="20" w="260" h="60"/> <node identifier="do-0206" elementRef="ts-secrets" xsi:type="Element" x="20" y="20" w="260" h="60"/>
<node identifier="do-0206" elementRef="ss-vault" xsi:type="Element" x="320" y="20" w="260" h="60"/> <node identifier="do-0207" elementRef="ss-vault" xsi:type="Element" x="320" y="20" w="260" h="60"/>
<node identifier="do-0208" elementRef="ac-attachments" xsi:type="Element" x="20" y="150" w="170" h="55"/> <node identifier="do-0209" elementRef="ac-attachments" xsi:type="Element" x="20" y="150" w="170" h="55"/>
<node identifier="do-0210" elementRef="ac-bim" xsi:type="Element" x="210" y="150" w="170" h="55"/> <node identifier="do-0211" elementRef="ac-bim" xsi:type="Element" x="210" y="150" w="170" h="55"/>
<node identifier="do-0212" elementRef="ac-cde" xsi:type="Element" x="400" y="150" w="170" h="55"/> <node identifier="do-0213" elementRef="ac-cde" xsi:type="Element" x="400" y="150" w="170" h="55"/>
<node identifier="do-0214" elementRef="ac-checklists" xsi:type="Element" x="590" y="150" w="170" h="55"/> <node identifier="do-0215" elementRef="ac-checklists" xsi:type="Element" x="590" y="150" w="170" h="55"/>
<node identifier="do-0216" elementRef="ac-comparisons" xsi:type="Element" x="780" y="150" w="170" h="55"/> <node identifier="do-0217" elementRef="ac-comparisons" xsi:type="Element" x="780" y="150" w="170" h="55"/>
<node identifier="do-0218" elementRef="ac-contracts" xsi:type="Element" x="970" y="150" w="170" h="55"/> <node identifier="do-0219" elementRef="ac-contracts" xsi:type="Element" x="970" y="150" w="170" h="55"/>
<node identifier="do-0220" elementRef="ac-django" xsi:type="Element" x="20" y="230" w="170" h="55"/> <node identifier="do-0221" elementRef="ac-django" xsi:type="Element" x="20" y="230" w="170" h="55"/>
<node identifier="do-0222" elementRef="ac-documentations" xsi:type="Element" x="210" y="230" w="170" h="55"/> <node identifier="do-0223" elementRef="ac-documentations" xsi:type="Element" x="210" y="230" w="170" h="55"/>
<node identifier="do-0224" elementRef="ac-drawings" xsi:type="Element" x="400" y="230" w="170" h="55"/> <node identifier="do-0225" elementRef="ac-drawings" xsi:type="Element" x="400" y="230" w="170" h="55"/>
<node identifier="do-0226" elementRef="ac-eav" xsi:type="Element" x="590" y="230" w="170" h="55"/> <node identifier="do-0227" elementRef="ac-eav" xsi:type="Element" x="590" y="230" w="170" h="55"/>
<node identifier="do-0228" elementRef="ac-flows" xsi:type="Element" x="780" y="230" w="170" h="55"/> <node identifier="do-0229" elementRef="ac-flows" xsi:type="Element" x="780" y="230" w="170" h="55"/>
<node identifier="do-0230" elementRef="ac-iam" xsi:type="Element" x="970" y="230" w="170" h="55"/> <node identifier="do-0231" elementRef="ac-iam" xsi:type="Element" x="970" y="230" w="170" h="55"/>
<node identifier="do-0232" elementRef="ac-inspections" xsi:type="Element" x="20" y="310" w="170" h="55"/> <node identifier="do-0233" elementRef="ac-inspections" xsi:type="Element" x="20" y="310" w="170" h="55"/>
<node identifier="do-0234" elementRef="ac-issues" xsi:type="Element" x="210" y="310" w="170" h="55"/> <node identifier="do-0235" elementRef="ac-issues" xsi:type="Element" x="210" y="310" w="170" h="55"/>
<node identifier="do-0236" elementRef="ac-mapper" xsi:type="Element" x="400" y="310" w="170" h="55"/> <node identifier="do-0237" elementRef="ac-mapper" xsi:type="Element" x="400" y="310" w="170" h="55"/>
<node identifier="do-0238" elementRef="ac-measurements" xsi:type="Element" x="590" y="310" w="170" h="55"/> <node identifier="do-0239" elementRef="ac-measurements" xsi:type="Element" x="590" y="310" w="170" h="55"/>
<node identifier="do-0240" elementRef="ac-message-hub" xsi:type="Element" x="780" y="310" w="170" h="55"/> <node identifier="do-0241" elementRef="ac-message-hub" xsi:type="Element" x="780" y="310" w="170" h="55"/>
<node identifier="do-0242" elementRef="ac-notes" xsi:type="Element" x="970" y="310" w="170" h="55"/> <node identifier="do-0243" elementRef="ac-notes" xsi:type="Element" x="970" y="310" w="170" h="55"/>
<node identifier="do-0244" elementRef="ac-pm" xsi:type="Element" x="20" y="390" w="170" h="55"/> <node identifier="do-0245" elementRef="ac-pm" xsi:type="Element" x="20" y="390" w="170" h="55"/>
<node identifier="do-0246" elementRef="ac-processing" xsi:type="Element" x="210" y="390" w="170" h="55"/> <node identifier="do-0247" elementRef="ac-processing" xsi:type="Element" x="210" y="390" w="170" h="55"/>
<node identifier="do-0248" elementRef="ac-rfi" xsi:type="Element" x="400" y="390" w="170" h="55"/> <node identifier="do-0249" elementRef="ac-rfi" xsi:type="Element" x="400" y="390" w="170" h="55"/>
<node identifier="do-0250" elementRef="ac-subscriptions" xsi:type="Element" x="590" y="390" w="170" h="55"/> <node identifier="do-0251" elementRef="ac-subscriptions" xsi:type="Element" x="590" y="390" w="170" h="55"/>
<node identifier="do-0252" elementRef="ac-system-log" xsi:type="Element" x="780" y="390" w="170" h="55"/> <node identifier="do-0253" elementRef="ac-system-log" xsi:type="Element" x="780" y="390" w="170" h="55"/>
<node identifier="do-0254" elementRef="ac-transmittal" xsi:type="Element" x="970" y="390" w="170" h="55"/> <node identifier="do-0255" elementRef="ac-transmittal" xsi:type="Element" x="970" y="390" w="170" h="55"/>
<node identifier="do-0256" elementRef="ac-workspaces" xsi:type="Element" x="20" y="470" w="170" h="55"/> <node identifier="do-0257" elementRef="ac-workspaces" xsi:type="Element" x="20" y="470" w="170" h="55"/>
<connection identifier="cn-0209" relationshipRef="rel-081" xsi:type="Relationship" source="do-0205" target="do-0208"/> <connection identifier="cn-0210" relationshipRef="rel-081" xsi:type="Relationship" source="do-0206" target="do-0209"/>
<connection identifier="cn-0211" relationshipRef="rel-082" xsi:type="Relationship" source="do-0205" target="do-0210"/> <connection identifier="cn-0212" relationshipRef="rel-082" xsi:type="Relationship" source="do-0206" target="do-0211"/>
<connection identifier="cn-0213" relationshipRef="rel-083" xsi:type="Relationship" source="do-0205" target="do-0212"/> <connection identifier="cn-0214" relationshipRef="rel-083" xsi:type="Relationship" source="do-0206" target="do-0213"/>
<connection identifier="cn-0215" relationshipRef="rel-084" xsi:type="Relationship" source="do-0205" target="do-0214"/> <connection identifier="cn-0216" relationshipRef="rel-084" xsi:type="Relationship" source="do-0206" target="do-0215"/>
<connection identifier="cn-0217" relationshipRef="rel-085" xsi:type="Relationship" source="do-0205" target="do-0216"/> <connection identifier="cn-0218" relationshipRef="rel-085" xsi:type="Relationship" source="do-0206" target="do-0217"/>
<connection identifier="cn-0219" relationshipRef="rel-086" xsi:type="Relationship" source="do-0205" target="do-0218"/> <connection identifier="cn-0220" relationshipRef="rel-086" xsi:type="Relationship" source="do-0206" target="do-0219"/>
<connection identifier="cn-0221" relationshipRef="rel-087" xsi:type="Relationship" source="do-0205" target="do-0220"/> <connection identifier="cn-0222" relationshipRef="rel-087" xsi:type="Relationship" source="do-0206" target="do-0221"/>
<connection identifier="cn-0223" relationshipRef="rel-088" xsi:type="Relationship" source="do-0205" target="do-0222"/> <connection identifier="cn-0224" relationshipRef="rel-088" xsi:type="Relationship" source="do-0206" target="do-0223"/>
<connection identifier="cn-0225" relationshipRef="rel-089" xsi:type="Relationship" source="do-0205" target="do-0224"/> <connection identifier="cn-0226" relationshipRef="rel-089" xsi:type="Relationship" source="do-0206" target="do-0225"/>
<connection identifier="cn-0227" relationshipRef="rel-090" xsi:type="Relationship" source="do-0205" target="do-0226"/> <connection identifier="cn-0228" relationshipRef="rel-090" xsi:type="Relationship" source="do-0206" target="do-0227"/>
<connection identifier="cn-0229" relationshipRef="rel-091" xsi:type="Relationship" source="do-0205" target="do-0228"/> <connection identifier="cn-0230" relationshipRef="rel-091" xsi:type="Relationship" source="do-0206" target="do-0229"/>
<connection identifier="cn-0231" relationshipRef="rel-092" xsi:type="Relationship" source="do-0205" target="do-0230"/> <connection identifier="cn-0232" relationshipRef="rel-092" xsi:type="Relationship" source="do-0206" target="do-0231"/>
<connection identifier="cn-0233" relationshipRef="rel-093" xsi:type="Relationship" source="do-0205" target="do-0232"/> <connection identifier="cn-0234" relationshipRef="rel-093" xsi:type="Relationship" source="do-0206" target="do-0233"/>
<connection identifier="cn-0235" relationshipRef="rel-094" xsi:type="Relationship" source="do-0205" target="do-0234"/> <connection identifier="cn-0236" relationshipRef="rel-094" xsi:type="Relationship" source="do-0206" target="do-0235"/>
<connection identifier="cn-0237" relationshipRef="rel-095" xsi:type="Relationship" source="do-0205" target="do-0236"/> <connection identifier="cn-0238" relationshipRef="rel-095" xsi:type="Relationship" source="do-0206" target="do-0237"/>
<connection identifier="cn-0239" relationshipRef="rel-096" xsi:type="Relationship" source="do-0205" target="do-0238"/> <connection identifier="cn-0240" relationshipRef="rel-096" xsi:type="Relationship" source="do-0206" target="do-0239"/>
<connection identifier="cn-0241" relationshipRef="rel-097" xsi:type="Relationship" source="do-0205" target="do-0240"/> <connection identifier="cn-0242" relationshipRef="rel-097" xsi:type="Relationship" source="do-0206" target="do-0241"/>
<connection identifier="cn-0243" relationshipRef="rel-098" xsi:type="Relationship" source="do-0205" target="do-0242"/> <connection identifier="cn-0244" relationshipRef="rel-098" xsi:type="Relationship" source="do-0206" target="do-0243"/>
<connection identifier="cn-0245" relationshipRef="rel-099" xsi:type="Relationship" source="do-0205" target="do-0244"/> <connection identifier="cn-0246" relationshipRef="rel-099" xsi:type="Relationship" source="do-0206" target="do-0245"/>
<connection identifier="cn-0247" relationshipRef="rel-100" xsi:type="Relationship" source="do-0205" target="do-0246"/> <connection identifier="cn-0248" relationshipRef="rel-100" xsi:type="Relationship" source="do-0206" target="do-0247"/>
<connection identifier="cn-0249" relationshipRef="rel-101" xsi:type="Relationship" source="do-0205" target="do-0248"/> <connection identifier="cn-0250" relationshipRef="rel-101" xsi:type="Relationship" source="do-0206" target="do-0249"/>
<connection identifier="cn-0251" relationshipRef="rel-102" xsi:type="Relationship" source="do-0205" target="do-0250"/> <connection identifier="cn-0252" relationshipRef="rel-102" xsi:type="Relationship" source="do-0206" target="do-0251"/>
<connection identifier="cn-0253" relationshipRef="rel-103" xsi:type="Relationship" source="do-0205" target="do-0252"/> <connection identifier="cn-0254" relationshipRef="rel-103" xsi:type="Relationship" source="do-0206" target="do-0253"/>
<connection identifier="cn-0255" relationshipRef="rel-104" xsi:type="Relationship" source="do-0205" target="do-0254"/> <connection identifier="cn-0256" relationshipRef="rel-104" xsi:type="Relationship" source="do-0206" target="do-0255"/>
<connection identifier="cn-0257" relationshipRef="rel-105" xsi:type="Relationship" source="do-0205" target="do-0256"/> <connection identifier="cn-0258" relationshipRef="rel-105" xsi:type="Relationship" source="do-0206" target="do-0257"/>
<connection identifier="cn-0207" relationshipRef="rel-029" xsi:type="Relationship" source="do-0206" target="do-0205"/> <connection identifier="cn-0208" relationshipRef="rel-029" xsi:type="Relationship" source="do-0207" target="do-0206"/>
</view> </view>
<view identifier="view-6" xsi:type="Diagram"> <view identifier="view-6" xsi:type="Diagram">
<name xml:lang="ru">T6. Потребители: Реляционное хранилище</name> <name xml:lang="ru">T6. Потребители: Реляционное хранилище</name>
<documentation xml:lang="ru">23 из 35 приложений контура. Связи выведены из манифестов приложений.</documentation> <documentation xml:lang="ru">23 из 35 приложений контура. Связи выведены из манифестов приложений.</documentation>
<node identifier="do-0258" elementRef="ts-rdbms" xsi:type="Element" x="20" y="20" w="260" h="60"/> <node identifier="do-0259" elementRef="ts-rdbms" xsi:type="Element" x="20" y="20" w="260" h="60"/>
<node identifier="do-0259" elementRef="ss-postgres" xsi:type="Element" x="320" y="20" w="260" h="60"/> <node identifier="do-0260" elementRef="ss-postgres" xsi:type="Element" x="320" y="20" w="260" h="60"/>
<node identifier="do-0261" elementRef="ac-attachments" xsi:type="Element" x="20" y="150" w="170" h="55"/> <node identifier="do-0262" elementRef="ac-attachments" xsi:type="Element" x="20" y="150" w="170" h="55"/>
<node identifier="do-0263" elementRef="ac-bim" xsi:type="Element" x="210" y="150" w="170" h="55"/> <node identifier="do-0264" elementRef="ac-bim" xsi:type="Element" x="210" y="150" w="170" h="55"/>
<node identifier="do-0265" elementRef="ac-checklists" xsi:type="Element" x="400" y="150" w="170" h="55"/> <node identifier="do-0266" elementRef="ac-checklists" xsi:type="Element" x="400" y="150" w="170" h="55"/>
<node identifier="do-0267" elementRef="ac-comparisons" xsi:type="Element" x="590" y="150" w="170" h="55"/> <node identifier="do-0268" elementRef="ac-comparisons" xsi:type="Element" x="590" y="150" w="170" h="55"/>
<node identifier="do-0269" elementRef="ac-contracts" xsi:type="Element" x="780" y="150" w="170" h="55"/> <node identifier="do-0270" elementRef="ac-contracts" xsi:type="Element" x="780" y="150" w="170" h="55"/>
<node identifier="do-0271" elementRef="ac-django" xsi:type="Element" x="970" y="150" w="170" h="55"/> <node identifier="do-0272" elementRef="ac-django" xsi:type="Element" x="970" y="150" w="170" h="55"/>
<node identifier="do-0273" elementRef="ac-documentations" xsi:type="Element" x="20" y="230" w="170" h="55"/> <node identifier="do-0274" elementRef="ac-documentations" xsi:type="Element" x="20" y="230" w="170" h="55"/>
<node identifier="do-0275" elementRef="ac-drawings" xsi:type="Element" x="210" y="230" w="170" h="55"/> <node identifier="do-0276" elementRef="ac-drawings" xsi:type="Element" x="210" y="230" w="170" h="55"/>
<node identifier="do-0277" elementRef="ac-eav" xsi:type="Element" x="400" y="230" w="170" h="55"/> <node identifier="do-0278" elementRef="ac-eav" xsi:type="Element" x="400" y="230" w="170" h="55"/>
<node identifier="do-0279" elementRef="ac-flows" xsi:type="Element" x="590" y="230" w="170" h="55"/> <node identifier="do-0280" elementRef="ac-flows" xsi:type="Element" x="590" y="230" w="170" h="55"/>
<node identifier="do-0281" elementRef="ac-iam" xsi:type="Element" x="780" y="230" w="170" h="55"/> <node identifier="do-0282" elementRef="ac-iam" xsi:type="Element" x="780" y="230" w="170" h="55"/>
<node identifier="do-0283" elementRef="ac-inspections" xsi:type="Element" x="970" y="230" w="170" h="55"/> <node identifier="do-0284" elementRef="ac-inspections" xsi:type="Element" x="970" y="230" w="170" h="55"/>
<node identifier="do-0285" elementRef="ac-issues" xsi:type="Element" x="20" y="310" w="170" h="55"/> <node identifier="do-0286" elementRef="ac-issues" xsi:type="Element" x="20" y="310" w="170" h="55"/>
<node identifier="do-0287" elementRef="ac-mapper" xsi:type="Element" x="210" y="310" w="170" h="55"/> <node identifier="do-0288" elementRef="ac-mapper" xsi:type="Element" x="210" y="310" w="170" h="55"/>
<node identifier="do-0289" elementRef="ac-message-hub" xsi:type="Element" x="400" y="310" w="170" h="55"/> <node identifier="do-0290" elementRef="ac-message-hub" xsi:type="Element" x="400" y="310" w="170" h="55"/>
<node identifier="do-0291" elementRef="ac-notes" xsi:type="Element" x="590" y="310" w="170" h="55"/> <node identifier="do-0292" elementRef="ac-notes" xsi:type="Element" x="590" y="310" w="170" h="55"/>
<node identifier="do-0293" elementRef="ac-pm" xsi:type="Element" x="780" y="310" w="170" h="55"/> <node identifier="do-0294" elementRef="ac-pm" xsi:type="Element" x="780" y="310" w="170" h="55"/>
<node identifier="do-0295" elementRef="ac-processing" xsi:type="Element" x="970" y="310" w="170" h="55"/> <node identifier="do-0296" elementRef="ac-processing" xsi:type="Element" x="970" y="310" w="170" h="55"/>
<node identifier="do-0297" elementRef="ac-rfi" xsi:type="Element" x="20" y="390" w="170" h="55"/> <node identifier="do-0298" elementRef="ac-rfi" xsi:type="Element" x="20" y="390" w="170" h="55"/>
<node identifier="do-0299" elementRef="ac-subscriptions" xsi:type="Element" x="210" y="390" w="170" h="55"/> <node identifier="do-0300" elementRef="ac-subscriptions" xsi:type="Element" x="210" y="390" w="170" h="55"/>
<node identifier="do-0301" elementRef="ac-system-log" xsi:type="Element" x="400" y="390" w="170" h="55"/> <node identifier="do-0302" elementRef="ac-system-log" xsi:type="Element" x="400" y="390" w="170" h="55"/>
<node identifier="do-0303" elementRef="ac-transmittal" xsi:type="Element" x="590" y="390" w="170" h="55"/> <node identifier="do-0304" elementRef="ac-transmittal" xsi:type="Element" x="590" y="390" w="170" h="55"/>
<node identifier="do-0305" elementRef="ac-workspaces" xsi:type="Element" x="780" y="390" w="170" h="55"/> <node identifier="do-0306" elementRef="ac-workspaces" xsi:type="Element" x="780" y="390" w="170" h="55"/>
<connection identifier="cn-0262" relationshipRef="rel-106" xsi:type="Relationship" source="do-0258" target="do-0261"/> <connection identifier="cn-0263" relationshipRef="rel-106" xsi:type="Relationship" source="do-0259" target="do-0262"/>
<connection identifier="cn-0264" relationshipRef="rel-107" xsi:type="Relationship" source="do-0258" target="do-0263"/> <connection identifier="cn-0265" relationshipRef="rel-107" xsi:type="Relationship" source="do-0259" target="do-0264"/>
<connection identifier="cn-0266" relationshipRef="rel-108" xsi:type="Relationship" source="do-0258" target="do-0265"/> <connection identifier="cn-0267" relationshipRef="rel-108" xsi:type="Relationship" source="do-0259" target="do-0266"/>
<connection identifier="cn-0268" relationshipRef="rel-109" xsi:type="Relationship" source="do-0258" target="do-0267"/> <connection identifier="cn-0269" relationshipRef="rel-109" xsi:type="Relationship" source="do-0259" target="do-0268"/>
<connection identifier="cn-0270" relationshipRef="rel-110" xsi:type="Relationship" source="do-0258" target="do-0269"/> <connection identifier="cn-0271" relationshipRef="rel-110" xsi:type="Relationship" source="do-0259" target="do-0270"/>
<connection identifier="cn-0272" relationshipRef="rel-111" xsi:type="Relationship" source="do-0258" target="do-0271"/> <connection identifier="cn-0273" relationshipRef="rel-111" xsi:type="Relationship" source="do-0259" target="do-0272"/>
<connection identifier="cn-0274" relationshipRef="rel-112" xsi:type="Relationship" source="do-0258" target="do-0273"/> <connection identifier="cn-0275" relationshipRef="rel-112" xsi:type="Relationship" source="do-0259" target="do-0274"/>
<connection identifier="cn-0276" relationshipRef="rel-113" xsi:type="Relationship" source="do-0258" target="do-0275"/> <connection identifier="cn-0277" relationshipRef="rel-113" xsi:type="Relationship" source="do-0259" target="do-0276"/>
<connection identifier="cn-0278" relationshipRef="rel-114" xsi:type="Relationship" source="do-0258" target="do-0277"/> <connection identifier="cn-0279" relationshipRef="rel-114" xsi:type="Relationship" source="do-0259" target="do-0278"/>
<connection identifier="cn-0280" relationshipRef="rel-115" xsi:type="Relationship" source="do-0258" target="do-0279"/> <connection identifier="cn-0281" relationshipRef="rel-115" xsi:type="Relationship" source="do-0259" target="do-0280"/>
<connection identifier="cn-0282" relationshipRef="rel-116" xsi:type="Relationship" source="do-0258" target="do-0281"/> <connection identifier="cn-0283" relationshipRef="rel-116" xsi:type="Relationship" source="do-0259" target="do-0282"/>
<connection identifier="cn-0284" relationshipRef="rel-117" xsi:type="Relationship" source="do-0258" target="do-0283"/> <connection identifier="cn-0285" relationshipRef="rel-117" xsi:type="Relationship" source="do-0259" target="do-0284"/>
<connection identifier="cn-0286" relationshipRef="rel-118" xsi:type="Relationship" source="do-0258" target="do-0285"/> <connection identifier="cn-0287" relationshipRef="rel-118" xsi:type="Relationship" source="do-0259" target="do-0286"/>
<connection identifier="cn-0288" relationshipRef="rel-119" xsi:type="Relationship" source="do-0258" target="do-0287"/> <connection identifier="cn-0289" relationshipRef="rel-119" xsi:type="Relationship" source="do-0259" target="do-0288"/>
<connection identifier="cn-0290" relationshipRef="rel-120" xsi:type="Relationship" source="do-0258" target="do-0289"/> <connection identifier="cn-0291" relationshipRef="rel-120" xsi:type="Relationship" source="do-0259" target="do-0290"/>
<connection identifier="cn-0292" relationshipRef="rel-121" xsi:type="Relationship" source="do-0258" target="do-0291"/> <connection identifier="cn-0293" relationshipRef="rel-121" xsi:type="Relationship" source="do-0259" target="do-0292"/>
<connection identifier="cn-0294" relationshipRef="rel-122" xsi:type="Relationship" source="do-0258" target="do-0293"/> <connection identifier="cn-0295" relationshipRef="rel-122" xsi:type="Relationship" source="do-0259" target="do-0294"/>
<connection identifier="cn-0296" relationshipRef="rel-123" xsi:type="Relationship" source="do-0258" target="do-0295"/> <connection identifier="cn-0297" relationshipRef="rel-123" xsi:type="Relationship" source="do-0259" target="do-0296"/>
<connection identifier="cn-0298" relationshipRef="rel-124" xsi:type="Relationship" source="do-0258" target="do-0297"/> <connection identifier="cn-0299" relationshipRef="rel-124" xsi:type="Relationship" source="do-0259" target="do-0298"/>
<connection identifier="cn-0300" relationshipRef="rel-125" xsi:type="Relationship" source="do-0258" target="do-0299"/> <connection identifier="cn-0301" relationshipRef="rel-125" xsi:type="Relationship" source="do-0259" target="do-0300"/>
<connection identifier="cn-0302" relationshipRef="rel-126" xsi:type="Relationship" source="do-0258" target="do-0301"/> <connection identifier="cn-0303" relationshipRef="rel-126" xsi:type="Relationship" source="do-0259" target="do-0302"/>
<connection identifier="cn-0304" relationshipRef="rel-127" xsi:type="Relationship" source="do-0258" target="do-0303"/> <connection identifier="cn-0305" relationshipRef="rel-127" xsi:type="Relationship" source="do-0259" target="do-0304"/>
<connection identifier="cn-0306" relationshipRef="rel-128" xsi:type="Relationship" source="do-0258" target="do-0305"/> <connection identifier="cn-0307" relationshipRef="rel-128" xsi:type="Relationship" source="do-0259" target="do-0306"/>
<connection identifier="cn-0260" relationshipRef="rel-030" xsi:type="Relationship" source="do-0259" target="do-0258"/> <connection identifier="cn-0261" relationshipRef="rel-030" xsi:type="Relationship" source="do-0260" target="do-0259"/>
</view> </view>
<view identifier="view-7" xsi:type="Diagram"> <view identifier="view-7" xsi:type="Diagram">
<name xml:lang="ru">T7. Потребители: Кэш</name> <name xml:lang="ru">T7. Потребители: Кэш</name>
<documentation xml:lang="ru">5 из 35 приложений контура. Связи выведены из манифестов; 2 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны.</documentation> <documentation xml:lang="ru">5 из 35 приложений контура. Связи выведены из манифестов; 2 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны.</documentation>
<node identifier="do-0307" elementRef="ts-cache" xsi:type="Element" x="20" y="20" w="260" h="60"/> <node identifier="do-0308" elementRef="ts-cache" xsi:type="Element" x="20" y="20" w="260" h="60"/>
<node identifier="do-0308" elementRef="ss-redis" xsi:type="Element" x="320" y="20" w="260" h="60"/> <node identifier="do-0309" elementRef="ss-redis" xsi:type="Element" x="320" y="20" w="260" h="60"/>
<node identifier="do-0310" elementRef="ac-django" xsi:type="Element" x="20" y="150" w="170" h="55"/> <node identifier="do-0311" elementRef="ac-django" xsi:type="Element" x="20" y="150" w="170" h="55"/>
<node identifier="do-0312" elementRef="ac-issues" xsi:type="Element" x="210" y="150" w="170" h="55"/> <node identifier="do-0313" elementRef="ac-issues" xsi:type="Element" x="210" y="150" w="170" h="55"/>
<node identifier="do-0314" elementRef="ac-mapper" xsi:type="Element" x="400" y="150" w="170" h="55"/> <node identifier="do-0315" elementRef="ac-mapper" xsi:type="Element" x="400" y="150" w="170" h="55"/>
<node identifier="do-0316" elementRef="ac-message-hub" xsi:type="Element" x="590" y="150" w="170" h="55"/> <node identifier="do-0317" elementRef="ac-message-hub" xsi:type="Element" x="590" y="150" w="170" h="55"/>
<node identifier="do-0318" elementRef="ac-pm" xsi:type="Element" x="780" y="150" w="170" h="55"/> <node identifier="do-0319" elementRef="ac-pm" xsi:type="Element" x="780" y="150" w="170" h="55"/>
<connection identifier="cn-0311" relationshipRef="rel-129" xsi:type="Relationship" source="do-0307" target="do-0310"/> <connection identifier="cn-0312" relationshipRef="rel-129" xsi:type="Relationship" source="do-0308" target="do-0311"/>
<connection identifier="cn-0313" relationshipRef="rel-130" xsi:type="Relationship" source="do-0307" target="do-0312"/> <connection identifier="cn-0314" relationshipRef="rel-130" xsi:type="Relationship" source="do-0308" target="do-0313"/>
<connection identifier="cn-0315" relationshipRef="rel-131" xsi:type="Relationship" source="do-0307" target="do-0314"/> <connection identifier="cn-0316" relationshipRef="rel-131" xsi:type="Relationship" source="do-0308" target="do-0315"/>
<connection identifier="cn-0317" relationshipRef="rel-132" xsi:type="Relationship" source="do-0307" target="do-0316"/> <connection identifier="cn-0318" relationshipRef="rel-132" xsi:type="Relationship" source="do-0308" target="do-0317"/>
<connection identifier="cn-0319" relationshipRef="rel-133" xsi:type="Relationship" source="do-0307" target="do-0318"/> <connection identifier="cn-0320" relationshipRef="rel-133" xsi:type="Relationship" source="do-0308" target="do-0319"/>
<connection identifier="cn-0309" relationshipRef="rel-031" xsi:type="Relationship" source="do-0308" target="do-0307"/> <connection identifier="cn-0310" relationshipRef="rel-031" xsi:type="Relationship" source="do-0309" target="do-0308"/>
</view> </view>
<view identifier="view-8" xsi:type="Diagram"> <view identifier="view-8" xsi:type="Diagram">
<name xml:lang="ru">T8. Потребители: Событийная шина</name> <name xml:lang="ru">T8. Потребители: Событийная шина</name>
<documentation xml:lang="ru">13 из 35 приложений контура. Связи выведены из манифестов; 1 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны.</documentation> <documentation xml:lang="ru">13 из 35 приложений контура. Связи выведены из манифестов; 1 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны.</documentation>
<node identifier="do-0320" elementRef="ts-events" xsi:type="Element" x="20" y="20" w="260" h="60"/> <node identifier="do-0321" elementRef="ts-events" xsi:type="Element" x="20" y="20" w="260" h="60"/>
<node identifier="do-0321" elementRef="ss-kafka" xsi:type="Element" x="320" y="20" w="260" h="60"/> <node identifier="do-0322" elementRef="ss-kafka" xsi:type="Element" x="320" y="20" w="260" h="60"/>
<node identifier="do-0323" elementRef="ac-contracts" xsi:type="Element" x="20" y="150" w="170" h="55"/> <node identifier="do-0324" elementRef="ac-contracts" xsi:type="Element" x="20" y="150" w="170" h="55"/>
<node identifier="do-0325" elementRef="ac-django" xsi:type="Element" x="210" y="150" w="170" h="55"/> <node identifier="do-0326" elementRef="ac-django" xsi:type="Element" x="210" y="150" w="170" h="55"/>
<node identifier="do-0327" elementRef="ac-documentations" xsi:type="Element" x="400" y="150" w="170" h="55"/> <node identifier="do-0328" elementRef="ac-documentations" xsi:type="Element" x="400" y="150" w="170" h="55"/>
<node identifier="do-0329" elementRef="ac-eav" xsi:type="Element" x="590" y="150" w="170" h="55"/> <node identifier="do-0330" elementRef="ac-eav" xsi:type="Element" x="590" y="150" w="170" h="55"/>
<node identifier="do-0331" elementRef="ac-flows" xsi:type="Element" x="780" y="150" w="170" h="55"/> <node identifier="do-0332" elementRef="ac-flows" xsi:type="Element" x="780" y="150" w="170" h="55"/>
<node identifier="do-0333" elementRef="ac-iam" xsi:type="Element" x="970" y="150" w="170" h="55"/> <node identifier="do-0334" elementRef="ac-iam" xsi:type="Element" x="970" y="150" w="170" h="55"/>
<node identifier="do-0335" elementRef="ac-inspections" xsi:type="Element" x="20" y="230" w="170" h="55"/> <node identifier="do-0336" elementRef="ac-inspections" xsi:type="Element" x="20" y="230" w="170" h="55"/>
<node identifier="do-0337" elementRef="ac-issues" xsi:type="Element" x="210" y="230" w="170" h="55"/> <node identifier="do-0338" elementRef="ac-issues" xsi:type="Element" x="210" y="230" w="170" h="55"/>
<node identifier="do-0339" elementRef="ac-mapper" xsi:type="Element" x="400" y="230" w="170" h="55"/> <node identifier="do-0340" elementRef="ac-mapper" xsi:type="Element" x="400" y="230" w="170" h="55"/>
<node identifier="do-0341" elementRef="ac-message-hub" xsi:type="Element" x="590" y="230" w="170" h="55"/> <node identifier="do-0342" elementRef="ac-message-hub" xsi:type="Element" x="590" y="230" w="170" h="55"/>
<node identifier="do-0343" elementRef="ac-notes" xsi:type="Element" x="780" y="230" w="170" h="55"/> <node identifier="do-0344" elementRef="ac-notes" xsi:type="Element" x="780" y="230" w="170" h="55"/>
<node identifier="do-0345" elementRef="ac-pm" xsi:type="Element" x="970" y="230" w="170" h="55"/> <node identifier="do-0346" elementRef="ac-pm" xsi:type="Element" x="970" y="230" w="170" h="55"/>
<node identifier="do-0347" elementRef="ac-system-log" xsi:type="Element" x="20" y="310" w="170" h="55"/> <node identifier="do-0348" elementRef="ac-system-log" xsi:type="Element" x="20" y="310" w="170" h="55"/>
<connection identifier="cn-0324" relationshipRef="rel-134" xsi:type="Relationship" source="do-0320" target="do-0323"/> <connection identifier="cn-0325" relationshipRef="rel-134" xsi:type="Relationship" source="do-0321" target="do-0324"/>
<connection identifier="cn-0326" relationshipRef="rel-135" xsi:type="Relationship" source="do-0320" target="do-0325"/> <connection identifier="cn-0327" relationshipRef="rel-135" xsi:type="Relationship" source="do-0321" target="do-0326"/>
<connection identifier="cn-0328" relationshipRef="rel-136" xsi:type="Relationship" source="do-0320" target="do-0327"/> <connection identifier="cn-0329" relationshipRef="rel-136" xsi:type="Relationship" source="do-0321" target="do-0328"/>
<connection identifier="cn-0330" relationshipRef="rel-137" xsi:type="Relationship" source="do-0320" target="do-0329"/> <connection identifier="cn-0331" relationshipRef="rel-137" xsi:type="Relationship" source="do-0321" target="do-0330"/>
<connection identifier="cn-0332" relationshipRef="rel-138" xsi:type="Relationship" source="do-0320" target="do-0331"/> <connection identifier="cn-0333" relationshipRef="rel-138" xsi:type="Relationship" source="do-0321" target="do-0332"/>
<connection identifier="cn-0334" relationshipRef="rel-139" xsi:type="Relationship" source="do-0320" target="do-0333"/> <connection identifier="cn-0335" relationshipRef="rel-139" xsi:type="Relationship" source="do-0321" target="do-0334"/>
<connection identifier="cn-0336" relationshipRef="rel-140" xsi:type="Relationship" source="do-0320" target="do-0335"/> <connection identifier="cn-0337" relationshipRef="rel-140" xsi:type="Relationship" source="do-0321" target="do-0336"/>
<connection identifier="cn-0338" relationshipRef="rel-141" xsi:type="Relationship" source="do-0320" target="do-0337"/> <connection identifier="cn-0339" relationshipRef="rel-141" xsi:type="Relationship" source="do-0321" target="do-0338"/>
<connection identifier="cn-0340" relationshipRef="rel-142" xsi:type="Relationship" source="do-0320" target="do-0339"/> <connection identifier="cn-0341" relationshipRef="rel-142" xsi:type="Relationship" source="do-0321" target="do-0340"/>
<connection identifier="cn-0342" relationshipRef="rel-143" xsi:type="Relationship" source="do-0320" target="do-0341"/> <connection identifier="cn-0343" relationshipRef="rel-143" xsi:type="Relationship" source="do-0321" target="do-0342"/>
<connection identifier="cn-0344" relationshipRef="rel-144" xsi:type="Relationship" source="do-0320" target="do-0343"/> <connection identifier="cn-0345" relationshipRef="rel-144" xsi:type="Relationship" source="do-0321" target="do-0344"/>
<connection identifier="cn-0346" relationshipRef="rel-145" xsi:type="Relationship" source="do-0320" target="do-0345"/> <connection identifier="cn-0347" relationshipRef="rel-145" xsi:type="Relationship" source="do-0321" target="do-0346"/>
<connection identifier="cn-0348" relationshipRef="rel-146" xsi:type="Relationship" source="do-0320" target="do-0347"/> <connection identifier="cn-0349" relationshipRef="rel-146" xsi:type="Relationship" source="do-0321" target="do-0348"/>
<connection identifier="cn-0322" relationshipRef="rel-032" xsi:type="Relationship" source="do-0321" target="do-0320"/> <connection identifier="cn-0323" relationshipRef="rel-032" xsi:type="Relationship" source="do-0322" target="do-0321"/>
</view> </view>
<view identifier="view-9" xsi:type="Diagram"> <view identifier="view-9" xsi:type="Diagram">
<name xml:lang="ru">T9. Потребители: Очередь сообщений AMQP</name> <name xml:lang="ru">T9. Потребители: Очередь сообщений AMQP</name>
<documentation xml:lang="ru">12 из 35 приложений контура. Связи выведены из манифестов; 1 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны.</documentation> <documentation xml:lang="ru">12 из 35 приложений контура. Связи выведены из манифестов; 1 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны.</documentation>
<node identifier="do-0349" elementRef="ts-amqp" xsi:type="Element" x="20" y="20" w="260" h="60"/> <node identifier="do-0350" elementRef="ts-amqp" xsi:type="Element" x="20" y="20" w="260" h="60"/>
<node identifier="do-0350" elementRef="ss-rabbit" xsi:type="Element" x="320" y="20" w="260" h="60"/> <node identifier="do-0351" elementRef="ss-rabbit" xsi:type="Element" x="320" y="20" w="260" h="60"/>
<node identifier="do-0352" elementRef="ac-cde" xsi:type="Element" x="20" y="150" w="170" h="55"/> <node identifier="do-0353" elementRef="ac-cde" xsi:type="Element" x="20" y="150" w="170" h="55"/>
<node identifier="do-0354" elementRef="ac-contracts" xsi:type="Element" x="210" y="150" w="170" h="55"/> <node identifier="do-0355" elementRef="ac-contracts" xsi:type="Element" x="210" y="150" w="170" h="55"/>
<node identifier="do-0356" elementRef="ac-django" xsi:type="Element" x="400" y="150" w="170" h="55"/> <node identifier="do-0357" elementRef="ac-django" xsi:type="Element" x="400" y="150" w="170" h="55"/>
<node identifier="do-0358" elementRef="ac-documentations" xsi:type="Element" x="590" y="150" w="170" h="55"/> <node identifier="do-0359" elementRef="ac-documentations" xsi:type="Element" x="590" y="150" w="170" h="55"/>
<node identifier="do-0360" elementRef="ac-flows" xsi:type="Element" x="780" y="150" w="170" h="55"/> <node identifier="do-0361" elementRef="ac-flows" xsi:type="Element" x="780" y="150" w="170" h="55"/>
<node identifier="do-0362" elementRef="ac-issues" xsi:type="Element" x="970" y="150" w="170" h="55"/> <node identifier="do-0363" elementRef="ac-issues" xsi:type="Element" x="970" y="150" w="170" h="55"/>
<node identifier="do-0364" elementRef="ac-mapper" xsi:type="Element" x="20" y="230" w="170" h="55"/> <node identifier="do-0365" elementRef="ac-mapper" xsi:type="Element" x="20" y="230" w="170" h="55"/>
<node identifier="do-0366" elementRef="ac-notes" xsi:type="Element" x="210" y="230" w="170" h="55"/> <node identifier="do-0367" elementRef="ac-notes" xsi:type="Element" x="210" y="230" w="170" h="55"/>
<node identifier="do-0368" elementRef="ac-pm" xsi:type="Element" x="400" y="230" w="170" h="55"/> <node identifier="do-0369" elementRef="ac-pm" xsi:type="Element" x="400" y="230" w="170" h="55"/>
<node identifier="do-0370" elementRef="ac-processing" xsi:type="Element" x="590" y="230" w="170" h="55"/> <node identifier="do-0371" elementRef="ac-processing" xsi:type="Element" x="590" y="230" w="170" h="55"/>
<node identifier="do-0372" elementRef="ac-rfi" xsi:type="Element" x="780" y="230" w="170" h="55"/> <node identifier="do-0373" elementRef="ac-rfi" xsi:type="Element" x="780" y="230" w="170" h="55"/>
<node identifier="do-0374" elementRef="ac-transmittal" xsi:type="Element" x="970" y="230" w="170" h="55"/> <node identifier="do-0375" elementRef="ac-transmittal" xsi:type="Element" x="970" y="230" w="170" h="55"/>
<connection identifier="cn-0353" relationshipRef="rel-147" xsi:type="Relationship" source="do-0349" target="do-0352"/> <node identifier="do-0377" elementRef="ac-bim-converter" xsi:type="Element" x="20" y="310" w="170" h="55"/>
<connection identifier="cn-0355" relationshipRef="rel-148" xsi:type="Relationship" source="do-0349" target="do-0354"/> <connection identifier="cn-0354" relationshipRef="rel-147" xsi:type="Relationship" source="do-0350" target="do-0353"/>
<connection identifier="cn-0357" relationshipRef="rel-149" xsi:type="Relationship" source="do-0349" target="do-0356"/> <connection identifier="cn-0356" relationshipRef="rel-148" xsi:type="Relationship" source="do-0350" target="do-0355"/>
<connection identifier="cn-0359" relationshipRef="rel-150" xsi:type="Relationship" source="do-0349" target="do-0358"/> <connection identifier="cn-0358" relationshipRef="rel-149" xsi:type="Relationship" source="do-0350" target="do-0357"/>
<connection identifier="cn-0361" relationshipRef="rel-151" xsi:type="Relationship" source="do-0349" target="do-0360"/> <connection identifier="cn-0360" relationshipRef="rel-150" xsi:type="Relationship" source="do-0350" target="do-0359"/>
<connection identifier="cn-0363" relationshipRef="rel-152" xsi:type="Relationship" source="do-0349" target="do-0362"/> <connection identifier="cn-0362" relationshipRef="rel-151" xsi:type="Relationship" source="do-0350" target="do-0361"/>
<connection identifier="cn-0365" relationshipRef="rel-153" xsi:type="Relationship" source="do-0349" target="do-0364"/> <connection identifier="cn-0364" relationshipRef="rel-152" xsi:type="Relationship" source="do-0350" target="do-0363"/>
<connection identifier="cn-0367" relationshipRef="rel-154" xsi:type="Relationship" source="do-0349" target="do-0366"/> <connection identifier="cn-0366" relationshipRef="rel-153" xsi:type="Relationship" source="do-0350" target="do-0365"/>
<connection identifier="cn-0369" relationshipRef="rel-155" xsi:type="Relationship" source="do-0349" target="do-0368"/> <connection identifier="cn-0368" relationshipRef="rel-154" xsi:type="Relationship" source="do-0350" target="do-0367"/>
<connection identifier="cn-0371" relationshipRef="rel-156" xsi:type="Relationship" source="do-0349" target="do-0370"/> <connection identifier="cn-0370" relationshipRef="rel-155" xsi:type="Relationship" source="do-0350" target="do-0369"/>
<connection identifier="cn-0373" relationshipRef="rel-157" xsi:type="Relationship" source="do-0349" target="do-0372"/> <connection identifier="cn-0372" relationshipRef="rel-156" xsi:type="Relationship" source="do-0350" target="do-0371"/>
<connection identifier="cn-0375" relationshipRef="rel-158" xsi:type="Relationship" source="do-0349" target="do-0374"/> <connection identifier="cn-0374" relationshipRef="rel-157" xsi:type="Relationship" source="do-0350" target="do-0373"/>
<connection identifier="cn-0351" relationshipRef="rel-033" xsi:type="Relationship" source="do-0350" target="do-0349"/> <connection identifier="cn-0376" relationshipRef="rel-158" xsi:type="Relationship" source="do-0350" target="do-0375"/>
<connection identifier="cn-0378" relationshipRef="rel-224" xsi:type="Relationship" source="do-0350" target="do-0377"/>
<connection identifier="cn-0352" relationshipRef="rel-033" xsi:type="Relationship" source="do-0351" target="do-0350"/>
</view> </view>
<view identifier="view-10" xsi:type="Diagram"> <view identifier="view-10" xsi:type="Diagram">
<name xml:lang="ru">T10. Потребители: Оркестрация процессов BPMN</name> <name xml:lang="ru">T10. Потребители: Оркестрация процессов BPMN</name>
<documentation xml:lang="ru">1 из 35 приложений контура. Связи выведены из манифестов; 1 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны.</documentation> <documentation xml:lang="ru">1 из 35 приложений контура. Связи выведены из манифестов; 1 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны.</documentation>
<node identifier="do-0376" elementRef="ts-bpmn" xsi:type="Element" x="20" y="20" w="260" h="60"/> <node identifier="do-0379" elementRef="ts-bpmn" xsi:type="Element" x="20" y="20" w="260" h="60"/>
<node identifier="do-0377" elementRef="ss-camunda" xsi:type="Element" x="320" y="20" w="260" h="60"/> <node identifier="do-0380" elementRef="ss-camunda" xsi:type="Element" x="320" y="20" w="260" h="60"/>
<node identifier="do-0379" elementRef="ac-cde" xsi:type="Element" x="20" y="150" w="170" h="55"/> <node identifier="do-0382" elementRef="ac-cde" xsi:type="Element" x="20" y="150" w="170" h="55"/>
<connection identifier="cn-0380" relationshipRef="rel-159" xsi:type="Relationship" source="do-0376" target="do-0379"/> <connection identifier="cn-0383" relationshipRef="rel-159" xsi:type="Relationship" source="do-0379" target="do-0382"/>
<connection identifier="cn-0378" relationshipRef="rel-034" xsi:type="Relationship" source="do-0377" target="do-0376"/> <connection identifier="cn-0381" relationshipRef="rel-034" xsi:type="Relationship" source="do-0380" target="do-0379"/>
</view> </view>
<view identifier="view-11" xsi:type="Diagram"> <view identifier="view-11" xsi:type="Diagram">
<name xml:lang="ru">T11. Потребители: Объектное хранилище</name> <name xml:lang="ru">T11. Потребители: Объектное хранилище</name>
<documentation xml:lang="ru">15 из 35 приложений контура. Связи выведены из манифестов; 2 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны.</documentation> <documentation xml:lang="ru">15 из 35 приложений контура. Связи выведены из манифестов; 2 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны.</documentation>
<node identifier="do-0381" elementRef="ts-object" xsi:type="Element" x="20" y="20" w="260" h="60"/> <node identifier="do-0384" elementRef="ts-object" xsi:type="Element" x="20" y="20" w="260" h="60"/>
<node identifier="do-0382" elementRef="nd-s3" xsi:type="Element" x="320" y="20" w="260" h="60"/> <node identifier="do-0385" elementRef="nd-s3" xsi:type="Element" x="320" y="20" w="260" h="60"/>
<node identifier="do-0384" elementRef="ac-attachments" xsi:type="Element" x="20" y="150" w="170" h="55"/> <node identifier="do-0387" elementRef="ac-attachments" xsi:type="Element" x="20" y="150" w="170" h="55"/>
<node identifier="do-0386" elementRef="ac-cde" xsi:type="Element" x="210" y="150" w="170" h="55"/> <node identifier="do-0389" elementRef="ac-cde" xsi:type="Element" x="210" y="150" w="170" h="55"/>
<node identifier="do-0388" elementRef="ac-contracts" xsi:type="Element" x="400" y="150" w="170" h="55"/> <node identifier="do-0391" elementRef="ac-contracts" xsi:type="Element" x="400" y="150" w="170" h="55"/>
<node identifier="do-0390" elementRef="ac-django" xsi:type="Element" x="590" y="150" w="170" h="55"/> <node identifier="do-0393" elementRef="ac-django" xsi:type="Element" x="590" y="150" w="170" h="55"/>
<node identifier="do-0392" elementRef="ac-documentations" xsi:type="Element" x="780" y="150" w="170" h="55"/> <node identifier="do-0395" elementRef="ac-documentations" xsi:type="Element" x="780" y="150" w="170" h="55"/>
<node identifier="do-0394" elementRef="ac-eav" xsi:type="Element" x="970" y="150" w="170" h="55"/> <node identifier="do-0397" elementRef="ac-eav" xsi:type="Element" x="970" y="150" w="170" h="55"/>
<node identifier="do-0396" elementRef="ac-iam" xsi:type="Element" x="20" y="230" w="170" h="55"/> <node identifier="do-0399" elementRef="ac-iam" xsi:type="Element" x="20" y="230" w="170" h="55"/>
<node identifier="do-0398" elementRef="ac-issues" xsi:type="Element" x="210" y="230" w="170" h="55"/> <node identifier="do-0401" elementRef="ac-issues" xsi:type="Element" x="210" y="230" w="170" h="55"/>
<node identifier="do-0400" elementRef="ac-mapper" xsi:type="Element" x="400" y="230" w="170" h="55"/> <node identifier="do-0403" elementRef="ac-mapper" xsi:type="Element" x="400" y="230" w="170" h="55"/>
<node identifier="do-0402" elementRef="ac-measurements" xsi:type="Element" x="590" y="230" w="170" h="55"/> <node identifier="do-0405" elementRef="ac-measurements" xsi:type="Element" x="590" y="230" w="170" h="55"/>
<node identifier="do-0404" elementRef="ac-message-hub" xsi:type="Element" x="780" y="230" w="170" h="55"/> <node identifier="do-0407" elementRef="ac-message-hub" xsi:type="Element" x="780" y="230" w="170" h="55"/>
<node identifier="do-0406" elementRef="ac-notes" xsi:type="Element" x="970" y="230" w="170" h="55"/> <node identifier="do-0409" elementRef="ac-notes" xsi:type="Element" x="970" y="230" w="170" h="55"/>
<node identifier="do-0408" elementRef="ac-pm" xsi:type="Element" x="20" y="310" w="170" h="55"/> <node identifier="do-0411" elementRef="ac-pm" xsi:type="Element" x="20" y="310" w="170" h="55"/>
<node identifier="do-0410" elementRef="ac-rfi" xsi:type="Element" x="210" y="310" w="170" h="55"/> <node identifier="do-0413" elementRef="ac-rfi" xsi:type="Element" x="210" y="310" w="170" h="55"/>
<node identifier="do-0412" elementRef="ac-subscriptions" xsi:type="Element" x="400" y="310" w="170" h="55"/> <node identifier="do-0415" elementRef="ac-subscriptions" xsi:type="Element" x="400" y="310" w="170" h="55"/>
<connection identifier="cn-0385" relationshipRef="rel-160" xsi:type="Relationship" source="do-0381" target="do-0384"/> <node identifier="do-0417" elementRef="ac-bim-converter" xsi:type="Element" x="590" y="310" w="170" h="55"/>
<connection identifier="cn-0387" relationshipRef="rel-161" xsi:type="Relationship" source="do-0381" target="do-0386"/> <connection identifier="cn-0388" relationshipRef="rel-160" xsi:type="Relationship" source="do-0384" target="do-0387"/>
<connection identifier="cn-0389" relationshipRef="rel-162" xsi:type="Relationship" source="do-0381" target="do-0388"/> <connection identifier="cn-0390" relationshipRef="rel-161" xsi:type="Relationship" source="do-0384" target="do-0389"/>
<connection identifier="cn-0391" relationshipRef="rel-163" xsi:type="Relationship" source="do-0381" target="do-0390"/> <connection identifier="cn-0392" relationshipRef="rel-162" xsi:type="Relationship" source="do-0384" target="do-0391"/>
<connection identifier="cn-0393" relationshipRef="rel-164" xsi:type="Relationship" source="do-0381" target="do-0392"/> <connection identifier="cn-0394" relationshipRef="rel-163" xsi:type="Relationship" source="do-0384" target="do-0393"/>
<connection identifier="cn-0395" relationshipRef="rel-165" xsi:type="Relationship" source="do-0381" target="do-0394"/> <connection identifier="cn-0396" relationshipRef="rel-164" xsi:type="Relationship" source="do-0384" target="do-0395"/>
<connection identifier="cn-0397" relationshipRef="rel-166" xsi:type="Relationship" source="do-0381" target="do-0396"/> <connection identifier="cn-0398" relationshipRef="rel-165" xsi:type="Relationship" source="do-0384" target="do-0397"/>
<connection identifier="cn-0399" relationshipRef="rel-167" xsi:type="Relationship" source="do-0381" target="do-0398"/> <connection identifier="cn-0400" relationshipRef="rel-166" xsi:type="Relationship" source="do-0384" target="do-0399"/>
<connection identifier="cn-0401" relationshipRef="rel-168" xsi:type="Relationship" source="do-0381" target="do-0400"/> <connection identifier="cn-0402" relationshipRef="rel-167" xsi:type="Relationship" source="do-0384" target="do-0401"/>
<connection identifier="cn-0403" relationshipRef="rel-169" xsi:type="Relationship" source="do-0381" target="do-0402"/> <connection identifier="cn-0404" relationshipRef="rel-168" xsi:type="Relationship" source="do-0384" target="do-0403"/>
<connection identifier="cn-0405" relationshipRef="rel-170" xsi:type="Relationship" source="do-0381" target="do-0404"/> <connection identifier="cn-0406" relationshipRef="rel-169" xsi:type="Relationship" source="do-0384" target="do-0405"/>
<connection identifier="cn-0407" relationshipRef="rel-171" xsi:type="Relationship" source="do-0381" target="do-0406"/> <connection identifier="cn-0408" relationshipRef="rel-170" xsi:type="Relationship" source="do-0384" target="do-0407"/>
<connection identifier="cn-0409" relationshipRef="rel-172" xsi:type="Relationship" source="do-0381" target="do-0408"/> <connection identifier="cn-0410" relationshipRef="rel-171" xsi:type="Relationship" source="do-0384" target="do-0409"/>
<connection identifier="cn-0411" relationshipRef="rel-173" xsi:type="Relationship" source="do-0381" target="do-0410"/> <connection identifier="cn-0412" relationshipRef="rel-172" xsi:type="Relationship" source="do-0384" target="do-0411"/>
<connection identifier="cn-0413" relationshipRef="rel-174" xsi:type="Relationship" source="do-0381" target="do-0412"/> <connection identifier="cn-0414" relationshipRef="rel-173" xsi:type="Relationship" source="do-0384" target="do-0413"/>
<connection identifier="cn-0383" relationshipRef="rel-035" xsi:type="Relationship" source="do-0382" target="do-0381"/> <connection identifier="cn-0416" relationshipRef="rel-174" xsi:type="Relationship" source="do-0384" target="do-0415"/>
<connection identifier="cn-0418" relationshipRef="rel-225" xsi:type="Relationship" source="do-0384" target="do-0417"/>
<connection identifier="cn-0386" relationshipRef="rel-035" xsi:type="Relationship" source="do-0385" target="do-0384"/>
</view> </view>
</diagrams> </diagrams>
</views> </views>

File diff suppressed because one or more lines are too long