v1.1.0: per-stand services list from Terraform — services_dev.txt + services_test.txt

This commit is contained in:
2026-07-28 11:15:19 +04:00
parent 5a20962015
commit 0b810fdee1
6 changed files with 149 additions and 2 deletions
+1 -1
View File
@@ -18,7 +18,7 @@ from routes.api import bp as api_bp
from routes.api_test import bp as api_test_bp from routes.api_test import bp as api_test_bp
# Версия — меняется при КАЖДОМ изменении кода. Показывается в топбаре UI. # Версия — меняется при КАЖДОМ изменении кода. Показывается в топбаре UI.
VERSION = "1.0.99" VERSION = "1.1.0"
app = Flask(__name__, template_folder="templates", static_folder="static") app = Flask(__name__, template_folder="templates", static_folder="static")
app.config["NUBES_API_ENDPOINT"] = os.getenv("NUBES_API_ENDPOINT", "https://lk-api-gateway-test.ngcloud.ru/api/v1/svc") app.config["NUBES_API_ENDPOINT"] = os.getenv("NUBES_API_ENDPOINT", "https://lk-api-gateway-test.ngcloud.ru/api/v1/svc")
+55
View File
@@ -0,0 +1,55 @@
# Общий список сервисов — объединение DEV/TEST/PROD
# service_id service_name # RU description
# do not delete lines; to exclude a service, comment it with #
1 dummy # Болванка
2 template # Темплейт k8s
12 s3 # S3 Object Storage
13 s3bucket # S3 бакет
19 vcOrg # Организация в Cloud Director
# 20 vcOrgSaas # Организация [DEPRECATED] — нет в UI
21 vc_vdc # Виртуальный датацентр (vDC)
22 vc_nsxt # Сетевой шлюз периметра (Edge)
# 23 vc_vm # VM в Cloud Director (старый формат) (vc_vm) — нет в UI
# 24 vcNat # DEPRECATED Правила маршрутизации для VM (vc_nat)
25 vcexternalip # Публичные IP адреса
26 vapp # Виртуальный каталог ВМ (vApp)
27 vc_vm_v2 # VM в Cloud Director (vc_vmV2)
28 vc_vm_v3 # Виртуальная машина
29 vcVdcGroup # Группа датацентров
# 32 vmpostgre # vc_vm_postgresql_std
50 nextcloud # Nextcloud
81 superset # Apache Superset
82 harbor # Container Registry
86 k8sVelero # Velero
# 87 k8svalkey # Valkey — нет в UI
# 88 k8sZitiController # k8sZitiController — нет в UI
89 flask # Web-сервер с фреймворком Flask
90 postgres # PostgreSQL
91 redis # Redis
92 mongodb # MongoDB
93 rabbitmq # RabbitMQ
94 lucee # Lucee
95 nodejs # NodeJS
96 pgadmin # pgAdmin
# 97 nodered # NodeRed
98 http # Простой HTTP контейнер
99 gitea # Gitea
# 100 openwhisk # Serverless Openwhisk — нет в UI
109 zonesV2 # Управление DNS
# 110 dnszone # DNS зона — нет в UI
111 dnsrecord # DNS запись
# 112 tenant # Тенант в Grafana — нет в UI
# 113 vcComplex # Быстрый старт — нет в UI
# 114 GiteaComplex # Комплексная услуга по созданию gitea — нет в UI
115 mariadb # Mariadb
116 kafka # ApacheKafka
# 117 nifi # Nifi
119 Akhq # Akhq
120 clickhouse # ClickHouse
148 vcMgmtSthutrvalCluster # Менеджмент Kubernetes кластер Штурвал
149 valoTenant # VALO Cloud
150 k8sSthutrvalCluster # Kubernetes кластер Штурвал
151 k8sOpenbao # Vault
# 153 nifi # Nifi (DEV)
163 llmAi # LLM
# 175 k8sGo # Go — нет в UI
+55
View File
@@ -0,0 +1,55 @@
# Общий список сервисов — объединение DEV/TEST/PROD
# service_id service_name # RU description
# do not delete lines; to exclude a service, comment it with #
1 dummy # Болванка
2 template # Темплейт k8s
12 s3 # S3 Object Storage
13 s3bucket # S3 бакет
19 vcOrg # Организация в Cloud Director
# 20 vcOrgSaas # Организация [DEPRECATED] — нет в UI
21 vc_vdc # Виртуальный датацентр (vDC)
22 vc_nsxt # Сетевой шлюз периметра (Edge)
# 23 vc_vm # VM в Cloud Director (старый формат) (vc_vm) — нет в UI
# 24 vcNat # DEPRECATED Правила маршрутизации для VM (vc_nat)
25 vcexternalip # Публичные IP адреса
26 vapp # Виртуальный каталог ВМ (vApp)
27 vc_vm_v2 # VM в Cloud Director (vc_vmV2)
28 vc_vm_v3 # Виртуальная машина
29 vcVdcGroup # Группа датацентров
# 32 vmpostgre # vc_vm_postgresql_std
50 nextcloud # Nextcloud
81 superset # Apache Superset
82 harbor # Container Registry
86 k8sVelero # Velero
# 87 k8svalkey # Valkey — нет в UI
# 88 k8sZitiController # k8sZitiController — нет в UI
89 flask # Web-сервер с фреймворком Flask
90 postgres # PostgreSQL
91 redis # Redis
92 mongodb # MongoDB
93 rabbitmq # RabbitMQ
94 lucee # Lucee
95 nodejs # NodeJS
96 pgadmin # pgAdmin
# 97 nodered # NodeRed
98 http # Простой HTTP контейнер
99 gitea # Gitea
# 100 openwhisk # Serverless Openwhisk — нет в UI
109 zonesV2 # Управление DNS
# 110 dnszone # DNS зона — нет в UI
111 dnsrecord # DNS запись
# 112 tenant # Тенант в Grafana — нет в UI
# 113 vcComplex # Быстрый старт — нет в UI
# 114 GiteaComplex # Комплексная услуга по созданию gitea — нет в UI
115 mariadb # Mariadb
116 kafka # ApacheKafka
# 117 nifi # Nifi
119 Akhq # Akhq
120 clickhouse # ClickHouse
148 vcMgmtSthutrvalCluster # Менеджмент Kubernetes кластер Штурвал
149 valoTenant # VALO Cloud
150 k8sSthutrvalCluster # Kubernetes кластер Штурвал
151 k8sOpenbao # Vault
# 153 nifi # Nifi (DEV)
163 llmAi # LLM
# 175 k8sGo # Go — нет в UI
+34
View File
@@ -0,0 +1,34 @@
"""
Чтение списка разрешённых сервисов из services_{stand}.txt.
Формат файла: service_id service_name # описание
Закомментированные (#) строки — исключены.
Пустые строки — игнорируются.
Файл лежит в site/config/, пушится с кодом, деплоится вместе с приложением.
При изменении списка: edit → commit → push → redeploy.
"""
import os
import re
_CONFIG_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "config")
def load_service_ids(stand="test"):
"""Вернуть set разрешённых service_id для указанного стенда."""
path = os.path.join(_CONFIG_DIR, f"services_{stand}.txt")
ids = set()
try:
with open(path) as f:
for line in f:
line = line.strip()
if not line or line.startswith("#"):
continue
# Формат: "1 dummy # Болванка"
parts = line.split()
if parts and parts[0].isdigit():
ids.add(int(parts[0]))
except FileNotFoundError:
pass # файла нет — показываем все сервисы
return ids
+3
View File
@@ -14,6 +14,7 @@ from api.http_client import HttpClient, detect_endpoint, create_client, stand_na
from api.auth import get_token, get_client_id, get_token_info, get_token_masked from api.auth import get_token, get_client_id, get_token_info, get_token_masked
from operations.get_instances import get_organization, get_instances from operations.get_instances import get_organization, get_instances
from operations.get_services import get_services, get_service_detail from operations.get_services import get_services, get_service_detail
from operations.service_list import load_service_ids
from operations.tracker import list_all as tracker_list from operations.tracker import list_all as tracker_list
from runner import load_config from runner import load_config
@@ -135,6 +136,8 @@ def index():
# Конфиг из config.yaml + версия приложения # Конфиг из config.yaml + версия приложения
config = dict(load_config() or {}) config = dict(load_config() or {})
config["VERSION"] = current_app.config["VERSION"] config["VERSION"] = current_app.config["VERSION"]
# Список разрешённых сервисов из services_{stand}.txt
config["service_ids"] = sorted(load_service_ids(stand))
except Exception as e: except Exception as e:
error = str(e) error = str(e)
else: else:
+1 -1
View File
@@ -98,7 +98,7 @@
<div class="card"> <div class="card">
<div class="card-header" style="font-size:12px;">Сервисы</div> <div class="card-header" style="font-size:12px;">Сервисы</div>
<div class="card-body" style="padding:4px;"> <div class="card-body" style="padding:4px;">
<div class="svc-item active" onclick="selectService(1)">1. Болванка</div> {% for svc in services %}{% if svc.svcId in config.service_ids %}<div class="svc-item {% if loop.first %}active{% endif %}" onclick="selectService({{ svc.svcId }})">{{ svc.svcId }}. {{ svc.svc }}</div>{% endif %}{% endfor %}
</div> </div>
</div> </div>
</div> </div>