From 38bb4de76cde97f143c00d458769d8bab5d4f5a8 Mon Sep 17 00:00:00 2001 From: emelinda Date: Thu, 20 Aug 2026 13:50:11 +0300 Subject: [PATCH] Update architecture documentation: improve Camunda details and add node group definitions --- docs/architecture/build_archimate.py | 60 +- .../architecture/contour-profile.example.json | 29 +- .../architecture/example-technology.archimate | 1274 +++++++++++------ docs/architecture/example-technology.xml | 952 +++++++----- docs/architecture/matrix.example.json | 236 +-- docs/architecture/preview.html | 44 +- docs/architecture/render_preview.py | 2 +- docs/architecture/scan_contour.py | 38 +- 8 files changed, 1652 insertions(+), 983 deletions(-) diff --git a/docs/architecture/build_archimate.py b/docs/architecture/build_archimate.py index 3cf354c..bb3e30b 100644 --- a/docs/architecture/build_archimate.py +++ b/docs/architecture/build_archimate.py @@ -142,14 +142,70 @@ for x in PROFILE["external"]: elif x.get("serves"): conn("Serving", o_ext[x["id"]], o_ss[x["serves"]]) +# --- представление «Развёртывание по узлам» +GROUPS = PROFILE.get("node_groups", []) +if GROUPS: + claimed = {a for g in GROUPS if isinstance(g.get("runs_apps"), list) for a in g["runs_apps"]} + for g in GROUPS: + el(T, g["id"], "Node", g["name"], g.get("doc", "")) + g["_hosts"] = [] + for hn in g.get("hosts", []): + hid = "nd-host-" + hn + el(T, hid, "Node", hn); R("Composition", g["id"], hid); g["_hosts"].append(hid) + g["_apps"] = ([a for a in DATA["apps"] if a not in claimed] + if g.get("runs_apps") == "*" else list(g.get("runs_apps") or [])) + for a in g["_apps"]: + R("Assignment", g["id"], app_id[a]) + for s in g.get("runs_software", []): + R("Aggregation", g["id"], s) + + vd = view("T2. Развёртывание по узлам", + "Какие группы узлов какие компоненты несут. Вложенность заменяет стрелки: " + "хост внутри группы — composition, приложение — assignment, системное ПО — aggregation. " + "Имена хостов заданы в профиле контура.") + + def host_row(v, g, parent, y): + for i, hid in enumerate(g["_hosts"]): + obj(v, hid, 14 + i * 125, y, 115, 44, parent) + return y + (54 if g["_hosts"] else 0) + + # левая колонка — небольшие группы + left = [g for g in GROUPS if g.get("runs_apps") != "*"] + y = 20 + for g in left: + items = g["_apps"] + list(g.get("runs_software", [])) + rows = (len(items) + 1) // 2 + h = 40 + (54 if g["_hosts"] else 0) + rows * 62 + 10 + og = obj(vd, g["id"], 20, y, 400, h) + yy = host_row(vd, g, og, 34) + for i, it in enumerate(items): + eid = app_id.get(it, it) + obj(vd, eid, 14 + (i % 2) * 195, yy + (i // 2) * 62, 180, 50, og) + y += h + 20 + + # центр — группа прикладных серверов + big = next((g for g in GROUPS if g.get("runs_apps") == "*"), None) + if big: + per, bw = 6, 180 + rows = (len(big["_apps"]) + per - 1) // per + h = 40 + (54 if big["_hosts"] else 0) + rows * 62 + 10 + og = obj(vd, big["id"], 450, 20, per * bw + 28, max(h, y - 40)) + yy = host_row(vd, big, og, 34) + for i, a in enumerate(big["_apps"]): + obj(vd, app_id[a], 14 + (i % per) * bw, yy + (i // per) * 62, bw - 15, 50, og) + PER_ROW = 6 for ts in SERVICES: lst = consumers[ts["id"]] if not lst: continue + n_doc = sum(1 for a in lst if DATA["matrix"][a].get(ts.get("key")) == "doc") + src = ("Связи выведены из манифестов приложений." + if not n_doc else + f"Связи выведены из манифестов; {n_doc} из них подтверждаются только " + f"документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны.") v = view(f"T{len(views)+1}. Потребители: {ts['name']}", - f"{len(lst)} из {len(DATA['apps'])} приложений контура. " - f"Связи выведены из манифестов приложений.") + f"{len(lst)} из {len(DATA['apps'])} приложений контура. {src}") ots = obj(v, ts["id"], 20, 20, 260, 60) for i, r in enumerate(ts["realizers"]): conn("Realization", obj(v, r, 320 + i * 280, 20, 260, 60), ots) diff --git a/docs/architecture/contour-profile.example.json b/docs/architecture/contour-profile.example.json index e2e7086..eb6eaef 100644 --- a/docs/architecture/contour-profile.example.json +++ b/docs/architecture/contour-profile.example.json @@ -21,7 +21,7 @@ { "id": "ss-redis", "name": "Redis", "doc": "Разворачивается не во всех контурах и не для всех приложений." }, { "id": "ss-kafka", "name": "Kafka", "doc": "chart kafka-contour, ns kafka." }, { "id": "ss-rabbit", "name": "RabbitMQ", "doc": "chart rabbitmq-contour, ns rabbitmq." }, - { "id": "ss-camunda", "name": "Camunda Platform", "doc": "chart camunda-contour, ns camunda. В этом примере потребителей не показано." } + { "id": "ss-camunda", "name": "Camunda Platform", "doc": "chart camunda-contour, ns camunda. Воркеры прикладных сервисов подключаются к Zeebe-gateway как job-workers, HTTP-часть ходит в Operate. Переменные ZEEBE_*/CAMUNDA_* приходят из k8s-секрета, поэтому в манифестах не видны." } ], "camunda_sub": ["Zeebe", "Zeebe Gateway", "Operate", "Tasklist", "Optimize", "Identity", "Connectors"], @@ -44,6 +44,33 @@ "assigned_to": "ss-istio-gw" }, + "_узлы": "Группы узлов из инвентаря серверов. runs_software — id из software/external, runs_apps — имена приложений; группа с \"runs_apps\": \"*\" забирает все приложения, не заявленные другими группами. Необязательный hosts позволяет раскрыть группу до отдельных хостов, если такой список появится.", + + "node_groups": [ + { "id": "ng-processing", "name": "Группа узлов processing (Сервера приложений)", + "runs_apps": ["processing"] }, + + { "id": "ng-app", "name": "Группа узлов generic (Сервера приложений)", + "runs_apps": "*" }, + + { "id": "ng-storage", "name": "Объектное хранилище", + "runs_software": ["nd-s3"] }, + + { "id": "ng-db", "name": "Группа узлов DB (Базы данных)", + "runs_software": ["ss-postgres"] }, + + { "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"] }, + + { "id": "ng-repo", "name": "Репозиторий компонентов", + "doc": "Реестр Helm-чартов и образов + Git-сервер контура, из которого Flux читает манифесты. Состав требует подтверждения.", + "runs_software": ["nd-cr", "nd-gitea"] }, + + { "id": "ng-cad", "name": "CAD ферма", + "doc": "Состав не выведен из репозитория — заполнить вручную: какие сервисы и ПО работают на этой группе узлов." } + ], + "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" }, diff --git a/docs/architecture/example-technology.archimate b/docs/architecture/example-technology.archimate index 8bfef96..9d45e93 100644 --- a/docs/architecture/example-technology.archimate +++ b/docs/architecture/example-technology.archimate @@ -142,7 +142,7 @@ chart rabbitmq-contour, ns rabbitmq. - chart camunda-contour, ns camunda. В этом примере потребителей не показано. + chart camunda-contour, ns camunda. Воркеры прикладных сервисов подключаются к Zeebe-gateway как job-workers, HTTP-часть ходит в Operate. Переменные ZEEBE_*/CAMUNDA_* приходят из k8s-секрета, поэтому в манифестах не видны. @@ -178,6 +178,17 @@ + + + + + + + Реестр Helm-чартов и образов + Git-сервер контура, из которого Flux читает манифесты. Состав требует подтверждения. + + + Состав не выведен из репозитория — заполнить вручную: какие сервисы и ПО работают на этой группе узлов. + @@ -239,103 +250,172 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -462,561 +542,823 @@ - + + Какие группы узлов какие компоненты несут. Вложенность заменяет стрелки: хост внутри группы — composition, приложение — assignment, системное ПО — aggregation. Имена хостов заданы в профиле контура. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 21 из 35 приложений контура. Связи выведены из манифестов приложений. - + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - 10 из 35 приложений контура. Связи выведены из манифестов приложений. - + + 24 из 35 приложений контура. Связи выведены из манифестов; 14 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны. + - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - - - 25 из 35 приложений контура. Связи выведены из манифестов приложений. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + 25 из 35 приложений контура. Связи выведены из манифестов приложений. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + 23 из 35 приложений контура. Связи выведены из манифестов приложений. - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - 3 из 35 приложений контура. Связи выведены из манифестов приложений. - + + 5 из 35 приложений контура. Связи выведены из манифестов; 2 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны. + - - - + + + + + - + - + - + - + - + - - - 12 из 35 приложений контура. Связи выведены из манифестов приложений. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + + + 13 из 35 приложений контура. Связи выведены из манифестов; 1 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - - - 11 из 35 приложений контура. Связи выведены из манифестов приложений. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 13 из 35 приложений контура. Связи выведены из манифестов приложений. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + 12 из 35 приложений контура. Связи выведены из манифестов; 1 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 из 35 приложений контура. Связи выведены из манифестов; 1 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны. + + + + + + + + + + + + + + 15 из 35 приложений контура. Связи выведены из манифестов; 2 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/architecture/example-technology.xml b/docs/architecture/example-technology.xml index 7934469..f8adaa6 100644 --- a/docs/architecture/example-technology.xml +++ b/docs/architecture/example-technology.xml @@ -187,7 +187,7 @@ Camunda Platform - chart camunda-contour, ns camunda. В этом примере потребителей не показано. + chart camunda-contour, ns camunda. Воркеры прикладных сервисов подключаются к Zeebe-gateway как job-workers, HTTP-часть ходит в Operate. Переменные ZEEBE_*/CAMUNDA_* приходят из k8s-секрета, поэтому в манифестах не видны. Zeebe @@ -266,6 +266,29 @@ Объектное хранилище + + Группа узлов processing (Сервера приложений) + + + Группа узлов generic (Сервера приложений) + + + Объектное хранилище + + + Группа узлов DB (Базы данных) + + + Группа узлов K8s (Поддерживающая инфраструктура) + + + Репозиторий компонентов + Реестр Helm-чартов и образов + Git-сервер контура, из которого Flux читает манифесты. Состав требует подтверждения. + + + CAD ферма + Состав не выведен из репозитория — заполнить вручную: какие сервисы и ПО работают на этой группе узлов. + @@ -324,103 +347,172 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -480,298 +572,406 @@ - T2. Потребители: Маршрутизация HTTPS-трафика - 21 из 35 приложений контура. Связи выведены из манифестов приложений. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + T2. Развёртывание по узлам + Какие группы узлов какие компоненты несут. Вложенность заменяет стрелки: хост внутри группы — composition, приложение — assignment, системное ПО — aggregation. Имена хостов заданы в профиле контура. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - T3. Потребители: Аутентификация OIDC - 10 из 35 приложений контура. Связи выведены из манифестов приложений. - - - - - - - - - - - - - - - - - - - - - - - + T3. Потребители: Маршрутизация HTTPS-трафика + 21 из 35 приложений контура. Связи выведены из манифестов приложений. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - T4. Потребители: Управление секретами - 25 из 35 приложений контура. Связи выведены из манифестов приложений. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + T4. Потребители: Аутентификация OIDC + 24 из 35 приложений контура. Связи выведены из манифестов; 14 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - T5. Потребители: Реляционное хранилище - 23 из 35 приложений контура. Связи выведены из манифестов приложений. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + T5. Потребители: Управление секретами + 25 из 35 приложений контура. Связи выведены из манифестов приложений. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - T6. Потребители: Кэш - 3 из 35 приложений контура. Связи выведены из манифестов приложений. - - - - - - - - - + T6. Потребители: Реляционное хранилище + 23 из 35 приложений контура. Связи выведены из манифестов приложений. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - T7. Потребители: Событийная шина - 12 из 35 приложений контура. Связи выведены из манифестов приложений. - - - - - - - - - - - - - - - - - - - - - - - - - - - + T7. Потребители: Кэш + 5 из 35 приложений контура. Связи выведены из манифестов; 2 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны. + + + + + + + + + + + + + - T8. Потребители: Очередь сообщений AMQP - 11 из 35 приложений контура. Связи выведены из манифестов приложений. - - - - - - - - - - - - - - - - - - - - - - - - - + T8. Потребители: Событийная шина + 13 из 35 приложений контура. Связи выведены из манифестов; 1 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - T9. Потребители: Объектное хранилище - 13 из 35 приложений контура. Связи выведены из манифестов приложений. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + T9. Потребители: Очередь сообщений AMQP + 12 из 35 приложений контура. Связи выведены из манифестов; 1 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + T10. Потребители: Оркестрация процессов BPMN + 1 из 35 приложений контура. Связи выведены из манифестов; 1 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны. + + + + + + + + T11. Потребители: Объектное хранилище + 15 из 35 приложений контура. Связи выведены из манифестов; 2 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/architecture/matrix.example.json b/docs/architecture/matrix.example.json index eedf7aa..c5451f0 100644 --- a/docs/architecture/matrix.example.json +++ b/docs/architecture/matrix.example.json @@ -38,13 +38,13 @@ ], "matrix": { "attachments": { - "postgres": true, + "postgres": "manifest", "rabbitmq": false, "kafka": false, "camunda": false, - "s3": true, + "s3": "manifest", "redis": false, - "vault": true, + "vault": "manifest", "oidc": false }, "auth-flow": { @@ -55,57 +55,57 @@ "s3": false, "redis": false, "vault": false, - "oidc": false + "oidc": "doc" }, "bim": { - "postgres": true, + "postgres": "manifest", "rabbitmq": false, "kafka": false, "camunda": false, "s3": false, "redis": false, - "vault": true, + "vault": "manifest", "oidc": false }, "cde": { "postgres": false, - "rabbitmq": false, + "rabbitmq": "doc", "kafka": false, - "camunda": false, - "s3": false, + "camunda": "doc", + "s3": "doc", "redis": false, - "vault": true, + "vault": "manifest", "oidc": false }, "checklists": { - "postgres": true, + "postgres": "manifest", "rabbitmq": false, "kafka": false, "camunda": false, "s3": false, "redis": false, - "vault": true, - "oidc": true + "vault": "manifest", + "oidc": "manifest" }, "comparisons": { - "postgres": true, + "postgres": "manifest", "rabbitmq": false, "kafka": false, "camunda": false, "s3": false, "redis": false, - "vault": true, - "oidc": true + "vault": "manifest", + "oidc": "manifest" }, "contracts": { - "postgres": true, - "rabbitmq": true, - "kafka": true, + "postgres": "manifest", + "rabbitmq": "manifest", + "kafka": "manifest", "camunda": false, - "s3": true, + "s3": "manifest", "redis": false, - "vault": true, - "oidc": true + "vault": "manifest", + "oidc": "manifest" }, "control-interface": { "postgres": false, @@ -115,7 +115,7 @@ "s3": false, "redis": false, "vault": false, - "oidc": false + "oidc": "doc" }, "cross-section": { "postgres": false, @@ -125,17 +125,17 @@ "s3": false, "redis": false, "vault": false, - "oidc": false + "oidc": "doc" }, "django": { - "postgres": true, - "rabbitmq": true, - "kafka": true, + "postgres": "manifest", + "rabbitmq": "manifest", + "kafka": "manifest", "camunda": false, - "s3": true, - "redis": true, - "vault": true, - "oidc": true + "s3": "manifest", + "redis": "manifest", + "vault": "manifest", + "oidc": "manifest" }, "document-link": { "postgres": false, @@ -148,34 +148,34 @@ "oidc": false }, "documentations": { - "postgres": true, - "rabbitmq": true, - "kafka": false, + "postgres": "manifest", + "rabbitmq": "manifest", + "kafka": "doc", "camunda": false, - "s3": true, + "s3": "manifest", "redis": false, - "vault": true, - "oidc": true + "vault": "manifest", + "oidc": "manifest" }, "drawings": { - "postgres": true, + "postgres": "manifest", "rabbitmq": false, "kafka": false, "camunda": false, "s3": false, "redis": false, - "vault": true, + "vault": "manifest", "oidc": false }, "eav": { - "postgres": true, + "postgres": "manifest", "rabbitmq": false, - "kafka": true, + "kafka": "manifest", "camunda": false, - "s3": true, + "s3": "manifest", "redis": false, - "vault": true, - "oidc": true + "vault": "manifest", + "oidc": "manifest" }, "faas": { "postgres": false, @@ -188,94 +188,94 @@ "oidc": false }, "flows": { - "postgres": true, - "rabbitmq": true, - "kafka": true, + "postgres": "manifest", + "rabbitmq": "manifest", + "kafka": "manifest", "camunda": false, "s3": false, "redis": false, - "vault": true, - "oidc": true + "vault": "manifest", + "oidc": "manifest" }, "iam": { - "postgres": true, + "postgres": "manifest", "rabbitmq": false, - "kafka": true, + "kafka": "manifest", "camunda": false, - "s3": true, + "s3": "manifest", "redis": false, - "vault": true, - "oidc": true + "vault": "manifest", + "oidc": "manifest" }, "inspections": { - "postgres": true, + "postgres": "manifest", "rabbitmq": false, - "kafka": true, + "kafka": "manifest", "camunda": false, "s3": false, "redis": false, - "vault": true, - "oidc": false + "vault": "manifest", + "oidc": "doc" }, "issues": { - "postgres": true, - "rabbitmq": true, - "kafka": true, + "postgres": "manifest", + "rabbitmq": "manifest", + "kafka": "manifest", "camunda": false, - "s3": true, - "redis": false, - "vault": true, - "oidc": true + "s3": "manifest", + "redis": "doc", + "vault": "manifest", + "oidc": "manifest" }, "mapper": { - "postgres": true, - "rabbitmq": true, - "kafka": true, + "postgres": "manifest", + "rabbitmq": "manifest", + "kafka": "manifest", "camunda": false, - "s3": true, - "redis": false, - "vault": true, - "oidc": false + "s3": "manifest", + "redis": "doc", + "vault": "manifest", + "oidc": "doc" }, "measurements": { "postgres": false, "rabbitmq": false, "kafka": false, "camunda": false, - "s3": false, + "s3": "doc", "redis": false, - "vault": true, + "vault": "manifest", "oidc": false }, "message-hub": { - "postgres": true, + "postgres": "manifest", "rabbitmq": false, - "kafka": true, + "kafka": "manifest", "camunda": false, - "s3": true, - "redis": true, - "vault": true, + "s3": "manifest", + "redis": "manifest", + "vault": "manifest", "oidc": false }, "notes": { - "postgres": true, - "rabbitmq": true, - "kafka": true, + "postgres": "manifest", + "rabbitmq": "manifest", + "kafka": "manifest", "camunda": false, - "s3": true, + "s3": "manifest", "redis": false, - "vault": true, - "oidc": false + "vault": "manifest", + "oidc": "doc" }, "pm": { - "postgres": true, - "rabbitmq": true, - "kafka": true, + "postgres": "manifest", + "rabbitmq": "manifest", + "kafka": "manifest", "camunda": false, - "s3": true, - "redis": true, - "vault": true, - "oidc": false + "s3": "manifest", + "redis": "manifest", + "vault": "manifest", + "oidc": "doc" }, "prescriptions": { "postgres": false, @@ -285,17 +285,17 @@ "s3": false, "redis": false, "vault": false, - "oidc": false + "oidc": "doc" }, "processing": { - "postgres": true, - "rabbitmq": true, + "postgres": "manifest", + "rabbitmq": "manifest", "kafka": false, "camunda": false, "s3": false, "redis": false, - "vault": true, - "oidc": true + "vault": "manifest", + "oidc": "manifest" }, "projects": { "postgres": false, @@ -305,7 +305,7 @@ "s3": false, "redis": false, "vault": false, - "oidc": false + "oidc": "doc" }, "remarks": { "postgres": false, @@ -315,7 +315,7 @@ "s3": false, "redis": false, "vault": false, - "oidc": false + "oidc": "doc" }, "reviews": { "postgres": false, @@ -325,17 +325,17 @@ "s3": false, "redis": false, "vault": false, - "oidc": false + "oidc": "doc" }, "rfi": { - "postgres": true, - "rabbitmq": true, + "postgres": "manifest", + "rabbitmq": "manifest", "kafka": false, "camunda": false, - "s3": true, + "s3": "manifest", "redis": false, - "vault": true, - "oidc": false + "vault": "manifest", + "oidc": "doc" }, "stamp-verification": { "postgres": false, @@ -348,44 +348,44 @@ "oidc": false }, "subscriptions": { - "postgres": true, + "postgres": "manifest", "rabbitmq": false, "kafka": false, "camunda": false, - "s3": true, + "s3": "manifest", "redis": false, - "vault": true, + "vault": "manifest", "oidc": false }, "system-log": { - "postgres": true, + "postgres": "manifest", "rabbitmq": false, - "kafka": true, + "kafka": "manifest", "camunda": false, "s3": false, "redis": false, - "vault": true, + "vault": "manifest", "oidc": false }, "transmittal": { - "postgres": true, - "rabbitmq": true, + "postgres": "manifest", + "rabbitmq": "manifest", "kafka": false, "camunda": false, "s3": false, "redis": false, - "vault": true, - "oidc": false + "vault": "manifest", + "oidc": "doc" }, "workspaces": { - "postgres": true, + "postgres": "manifest", "rabbitmq": false, "kafka": false, "camunda": false, "s3": false, "redis": false, - "vault": true, - "oidc": false + "vault": "manifest", + "oidc": "doc" } }, "exposed": [ diff --git a/docs/architecture/preview.html b/docs/architecture/preview.html index 033f1b3..6cb74b0 100644 --- a/docs/architecture/preview.html +++ b/docs/architecture/preview.html @@ -13,7 +13,7 @@ .legend code { background:#eee; padding:1px 5px; border-radius:3px; }

СДЕ Sarex — типовой контур (пример)

-

Автогенерация из ugmk-technology.archimate. Зелёный — технологический слой, +

Автогенерация из example-technology.archimate. Зелёный — технологический слой, голубой — прикладной. Пунктир с полым треугольником — realization, стрелка — serving, ромб — composition, линия с шариком — assignment.

T1. Технологический слой

Что развёрнуто в кластере и какие технологические сервисы это даёт. Приложения-потребители вынесены в отдельные представления T2 и далее.

@@ -28,7 +28,7 @@ -Кластер k8s-prodCamunda Platformregistry.example.coms3.example.com — объектное хранилищеСетевое хранилище (StorageClass)Git-сервер контураfrontend-node-01Istio Ingress GatewayIstio Service Meshcert-managerZitadelVault + Agent InjectorPostgreSQLRedisKafkaRabbitMQZeebeZeebe GatewayOperateTasklistOptimizeIdentityConnectorsМаршрутизацияHTTPS-трафикаВыпускTLS-сертификатовАутентификация OIDCУправление секретамиРеляционное хранилищеКэшСобытийная шинаОчередь сообщенийAMQPОркестрация процессовBPMNОбъектное хранилищеHelm-чарты (OCI)Образы контейнеров

T2. Потребители: Маршрутизация HTTPS-трафика

21 из 35 приложений контура. Связи выведены из манифестов приложений.

+Кластер k8s-prodCamunda Platformregistry.example.coms3.example.com — объектное хранилищеСетевое хранилище (StorageClass)Git-сервер контураfrontend-node-01Istio Ingress GatewayIstio Service Meshcert-managerZitadelVault + Agent InjectorPostgreSQLRedisKafkaRabbitMQZeebeZeebe GatewayOperateTasklistOptimizeIdentityConnectorsМаршрутизацияHTTPS-трафикаВыпускTLS-сертификатовАутентификация OIDCУправление секретамиРеляционное хранилищеКэшСобытийная шинаОчередь сообщенийAMQPОркестрация процессовBPMNОбъектное хранилищеHelm-чарты (OCI)Образы контейнеров

T2. Развёртывание по узлам

Какие группы узлов какие компоненты несут. Вложенность заменяет стрелки: хост внутри группы — composition, приложение — assignment, системное ПО — aggregation. Имена хостов заданы в профиле контура.

@@ -40,7 +40,7 @@ -Маршрутизация HTTPS-трафикаIstio Ingress GatewayIstio Service Meshauth-flowbimcdechecklistscontrol-interfacedjangodocument-linkdocumentationseavflowsiaminspectionsissuespmprocessingremarksreviewsrfistamp-verificationtransmittalworkspaces

T3. Потребители: Аутентификация OIDC

10 из 35 приложений контура. Связи выведены из манифестов приложений.

+Группа узлов generic (Сервера приложений)Группа узлов K8s (Поддерживающая инфраструктура)Группа узлов processing (Сервера приложений)Объектное хранилищеГруппа узлов DB (Базы данных)Репозиторий компонентовCAD фермаprocessings3.example.com —объектное хранилищеPostgreSQLIstio Ingress GatewayIstio Service Meshcert-managerZitadelVault + Agent InjectorRedisKafkaRabbitMQCamunda Platformregistry.example.comGit-сервер контураattachmentsauth-flowbimcdechecklistscomparisonscontractscontrol-interfacecross-sectiondjangodocument-linkdocumentationsdrawingseavfaasflowsiaminspectionsissuesmappermeasurementsmessage-hubnotespmprescriptionsprojectsremarksreviewsrfistamp-verificationsubscriptionssystem-logtransmittalworkspaces

T3. Потребители: Маршрутизация HTTPS-трафика

21 из 35 приложений контура. Связи выведены из манифестов приложений.

@@ -52,7 +52,7 @@ -Аутентификация OIDCZitadelchecklistscomparisonscontractsdjangodocumentationseavflowsiamissuesprocessing

T4. Потребители: Управление секретами

25 из 35 приложений контура. Связи выведены из манифестов приложений.

+Маршрутизация HTTPS-трафикаIstio Ingress GatewayIstio Service Meshauth-flowbimcdechecklistscontrol-interfacedjangodocument-linkdocumentationseavflowsiaminspectionsissuespmprocessingremarksreviewsrfistamp-verificationtransmittalworkspaces

T4. Потребители: Аутентификация OIDC

24 из 35 приложений контура. Связи выведены из манифестов; 14 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны.

@@ -64,7 +64,7 @@ -Управление секретамиVault + Agent Injectorattachmentsbimcdechecklistscomparisonscontractsdjangodocumentationsdrawingseavflowsiaminspectionsissuesmappermeasurementsmessage-hubnotespmprocessingrfisubscriptionssystem-logtransmittalworkspaces

T5. Потребители: Реляционное хранилище

23 из 35 приложений контура. Связи выведены из манифестов приложений.

+Аутентификация OIDCZitadelauth-flowchecklistscomparisonscontractscontrol-interfacecross-sectiondjangodocumentationseavflowsiaminspectionsissuesmappernotespmprescriptionsprocessingprojectsremarksreviewsrfitransmittalworkspaces

T5. Потребители: Управление секретами

25 из 35 приложений контура. Связи выведены из манифестов приложений.

@@ -76,7 +76,7 @@ -Реляционное хранилищеPostgreSQLattachmentsbimchecklistscomparisonscontractsdjangodocumentationsdrawingseavflowsiaminspectionsissuesmappermessage-hubnotespmprocessingrfisubscriptionssystem-logtransmittalworkspaces

T6. Потребители: Кэш

3 из 35 приложений контура. Связи выведены из манифестов приложений.

+Управление секретамиVault + Agent Injectorattachmentsbimcdechecklistscomparisonscontractsdjangodocumentationsdrawingseavflowsiaminspectionsissuesmappermeasurementsmessage-hubnotespmprocessingrfisubscriptionssystem-logtransmittalworkspaces

T6. Потребители: Реляционное хранилище

23 из 35 приложений контура. Связи выведены из манифестов приложений.

@@ -88,7 +88,7 @@ -КэшRedisdjangomessage-hubpm

T7. Потребители: Событийная шина

12 из 35 приложений контура. Связи выведены из манифестов приложений.

+Реляционное хранилищеPostgreSQLattachmentsbimchecklistscomparisonscontractsdjangodocumentationsdrawingseavflowsiaminspectionsissuesmappermessage-hubnotespmprocessingrfisubscriptionssystem-logtransmittalworkspaces

T7. Потребители: Кэш

5 из 35 приложений контура. Связи выведены из манифестов; 2 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны.

@@ -100,7 +100,7 @@ -Событийная шинаKafkacontractsdjangoeavflowsiaminspectionsissuesmappermessage-hubnotespmsystem-log

T8. Потребители: Очередь сообщений AMQP

11 из 35 приложений контура. Связи выведены из манифестов приложений.

+КэшRedisdjangoissuesmappermessage-hubpm

T8. Потребители: Событийная шина

13 из 35 приложений контура. Связи выведены из манифестов; 1 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны.

@@ -112,7 +112,7 @@ -Очередь сообщений AMQPRabbitMQcontractsdjangodocumentationsflowsissuesmappernotespmprocessingrfitransmittal

T9. Потребители: Объектное хранилище

13 из 35 приложений контура. Связи выведены из манифестов приложений.

+Событийная шинаKafkacontractsdjangodocumentationseavflowsiaminspectionsissuesmappermessage-hubnotespmsystem-log

T9. Потребители: Очередь сообщений AMQP

12 из 35 приложений контура. Связи выведены из манифестов; 1 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны.

@@ -124,5 +124,29 @@ -Объектное хранилищеs3.example.com — объектное хранилищеattachmentscontractsdjangodocumentationseaviamissuesmappermessage-hubnotespmrfisubscriptions
+Очередь сообщений AMQPRabbitMQcdecontractsdjangodocumentationsflowsissuesmappernotespmprocessingrfitransmittal

T10. Потребители: Оркестрация процессов BPMN

1 из 35 приложений контура. Связи выведены из манифестов; 1 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны.

+ + + + + + + + + + + +Оркестрация процессов BPMNCamunda Platformcde

T11. Потребители: Объектное хранилище

15 из 35 приложений контура. Связи выведены из манифестов; 2 из них подтверждаются только документацией сервиса — значения приходят из k8s-секретов и в конфигах не видны.

+ + + + + + + + + + + +Объектное хранилищеs3.example.com — объектное хранилищеattachmentscdecontractsdjangodocumentationseaviamissuesmappermeasurementsmessage-hubnotespmrfisubscriptions
\ No newline at end of file diff --git a/docs/architecture/render_preview.py b/docs/architecture/render_preview.py index 364f528..3808afb 100644 --- a/docs/architecture/render_preview.py +++ b/docs/architecture/render_preview.py @@ -147,7 +147,7 @@ page = f""" .legend code {{ background:#eee; padding:1px 5px; border-radius:3px; }}

{html.escape(root.get('name') or '')}

-

Автогенерация из ugmk-technology.archimate. Зелёный — технологический слой, +

Автогенерация из {html.escape(src.name)}. Зелёный — технологический слой, голубой — прикладной. Пунктир с полым треугольником — realization, стрелка — serving, ромб — composition, линия с шариком — assignment.

{''.join(parts)} diff --git a/docs/architecture/scan_contour.py b/docs/architecture/scan_contour.py index 4227e43..0f5ada4 100644 --- a/docs/architecture/scan_contour.py +++ b/docs/architecture/scan_contour.py @@ -32,14 +32,30 @@ MARKERS = { "oidc": [r"ZITADEL", r"JWKS", r"OIDC", r"jwt-public"], } +def read(paths): + return "\n".join(p.read_text(encoding="utf-8", errors="replace") for p in paths) + def scan(app): - blob = [] - for sub in ("base", CLUSTER): - d = ROOT / "apps" / app / sub - if d.is_dir(): - blob += [f.read_text(encoding="utf-8", errors="replace") for f in d.rglob("*.yaml")] - blob = "\n".join(blob) - return {svc: any(re.search(p, blob) for p in pats) for svc, pats in MARKERS.items()} + """Возвращает по сервису источник связи: manifest, doc или False. + + Манифесты — основной источник, но часть переменных приходит из k8s-секретов + (блоки secretEnvs) и в YAML не видна. Поэтому CONFIGURATION.md / ENDPOINTS.md + рядом с манифестами используются как второй источник: связь реальна, просто + не выражена в конфиге. + """ + yaml_blob = read([f for sub in ("base", CLUSTER) + if (ROOT / "apps" / app / sub).is_dir() + for f in (ROOT / "apps" / app / sub).rglob("*.yaml")]) + doc_blob = read(sorted((ROOT / "apps" / app).glob("*.md"))) + out = {} + for svc, pats in MARKERS.items(): + if any(re.search(p, yaml_blob) for p in pats): + out[svc] = "manifest" + elif any(re.search(p, doc_blob, re.I) for p in pats): + out[svc] = "doc" + else: + out[svc] = False + return out matrix = {a: scan(a) for a in apps} @@ -54,14 +70,18 @@ hdr = ["app"] + list(MARKERS) + ["istio"] print(f"приложений: {len(apps)}\n") print(" | ".join(h.ljust(9) for h in hdr)) print("-" * 112) +MARK = {"manifest": "+", "doc": "d", False: ""} for app, row in matrix.items(): - cells = [app.ljust(17)] + ["+".ljust(9) if row[s] else "".ljust(9) for s in MARKERS] + cells = [app.ljust(17)] + [MARK[row[s]].ljust(9) for s in MARKERS] cells.append("+".ljust(9) if app in exposed_ns else "".ljust(9)) print(" | ".join(cells)) +print("\n + связь видна в манифестах, d — только в документации (значение из секрета)") print("\nпотребителей на сервис:") for s in MARKERS: - print(f" {s:10s} {sum(1 for r in matrix.values() if r[s]):2d}") + m = sum(1 for r in matrix.values() if r[s] == "manifest") + d = sum(1 for r in matrix.values() if r[s] == "doc") + print(f" {s:10s} {m + d:2d}" + (f" (из них {d} только по документации)" if d else "")) print(f" {'istio':10s} {len([a for a in apps if a in exposed_ns]):2d}") OUT.write_text(json.dumps({"apps": apps, "matrix": matrix, "exposed": exposed_ns},