Compare commits

...

2 Commits

Author SHA1 Message Date
emelinda
f22d5cc773 **Update d8-ugmk-prod configurations to fix service references and ensure proper workflow and API integration**
- Replace incorrect `WORKFLOWS_HOST` and `WORKFLOWS_URL` references across multiple YAML files to point to `backend-svc.processing.svc.cluster.local`.
- Update `DOCUMENTATIONS_URL` to use the accurate service name `backend-api-svc.documentations.svc.cluster.local`.
- Adjust `SAREX_API` and related settings for consistency using `https://sarex.uralmine.com`.
- Refactor `production-configmap.yaml` to align environment variable overrides and remove obsolete hardcoded values.
- Resolve key INFRA-3005 issues to prevent Excel export and notification failures caused by invalid DNS and configuration.
2026-10-20 18:01:28 +03:00
emelinda
709985b4a6 **Update d8-ugmk-prod configuration: replace SAREX_API and related endpoints with sarex.uralmine.com and adjust production ConfigMap.** 2026-10-20 17:42:13 +03:00
5 changed files with 232 additions and 20 deletions

View File

@ -64,27 +64,37 @@ spec:
- name: AERO_PUBLIC_HOST
value:
_default: "https://sarex.contour.infra.sarex.tech"
_default: "https://sarex.uralmine.com"
- name: AERO_HOST
value:
_default: "https://sarex.contour.infra.sarex.tech"
_default: "https://sarex.uralmine.com"
# server-to-server, не публичный хост: по коду issues-backend это
# базовый URL django (src/api/services.py, src/issues/notifications.py).
# Фактически значение всё равно берётся из production-configmap,
# где BASE_AERO_URL зашит на этот же адрес.
- name: BASE_AERO_URL
value:
_default: "https://sarex.contour.infra.sarex.tech"
_default: "http://backend-svc.django.svc.cluster.local:80"
- name: BASE_AUTH_URL
value:
_default: "http://backend-svc.django.svc.cluster.local:80"
# INFRA-3005: namespace workflow в УГМК не существует, processing
# поставляется как backend-svc в namespace processing
# (apps/processing/base/api.yaml:74 + d8-ugmk-prod/namespace.yaml).
# Формат — базовый URL без пути и без слэша на конце: код сам
# добавляет /internal/v1/... (src/issues/mailing.py:122,
# src/api/services.py:616).
- name: WORKFLOWS_HOST
value:
_default: "http://backend-svc.workflow.svc.cluster.local:80"
_default: "http://backend-svc.processing.svc.cluster.local:80"
- name: WORKFLOWS_URL
value:
_default: "http://backend-svc.workflow.svc.cluster.local:80"
_default: "http://backend-svc.processing.svc.cluster.local:80"
- name: RESOURCES_API_HOST
value:
@ -94,13 +104,19 @@ spec:
value:
_default: "http://backend-svc.eav.svc.cluster.local:80"
# Внимание: реально действует значение из production-configmap —
# там SAREX_API переприсваивается после `from .base import *`.
# См. apps/issues/d8-ugmk-prod/production-configmap.yaml (INFRA-3005).
- name: SAREX_API
value:
_default: "https://sarex.contour.infra.sarex.tech"
_default: "https://sarex.uralmine.com"
# Реальное имя сервиса — backend-api-svc (apps/documentations/base/api.yaml:74).
# Было documentations-api-svc — такого сервиса нет; не стреляло только
# потому, что production-configmap перетирает эту переменную хардкодом.
- name: DOCUMENTATIONS_URL
value:
_default: "http://documentations-api-svc.documentations.svc.cluster.local:80"
_default: "http://backend-api-svc.documentations.svc.cluster.local:80"
- name: DJANGO_SETTINGS_MODULE
value:

View File

@ -62,29 +62,35 @@ spec:
value:
_default: "production"
# AERO_PUBLIC_HOST участвует в сборке ссылок в уведомлениях
# (src/issues/notifications.py:324) — с чужим хостом в письмах УГМК
# уходили ссылки на srx.wb.ru.
- name: AERO_PUBLIC_HOST
value:
_default: "https://srx.wb.ru"
_default: "https://sarex.uralmine.com"
- name: AERO_HOST
value:
_default: "https://srx.wb.ru"
_default: "https://sarex.uralmine.com"
# server-to-server — внутренний django, см. backend-s3.yaml.
- name: BASE_AERO_URL
value:
_default: "https://srx.wb.ru"
_default: "http://backend-svc.django.svc.cluster.local:80"
- name: BASE_AUTH_URL
value:
_default: "http://backend-svc.django.svc.cluster.local:80"
# INFRA-3005: именно этот хост ронял celery-задачу экспорта в Excel
# и все уведомления. См. backend-s3.yaml и production-configmap.yaml.
- name: WORKFLOWS_HOST
value:
_default: "http://workflows-api-service.workflow.svc.cluster.local:8000"
_default: "http://backend-svc.processing.svc.cluster.local:80"
- name: WORKFLOWS_URL
value:
_default: "http://workflows-api-service.workflow.svc.cluster.local:8000"
_default: "http://backend-svc.processing.svc.cluster.local:80"
- name: RESOURCES_API_HOST
value:
@ -94,9 +100,10 @@ spec:
value:
_default: "http://backend-svc.eav.svc.cluster.local:80"
# Реально действует значение из production-configmap, см. там.
- name: SAREX_API
value:
_default: "https://srx.wb.ru"
_default: "https://sarex.uralmine.com"
- name: DOCUMENTATIONS_URL
value:

View File

@ -138,27 +138,29 @@ spec:
- name: AERO_PUBLIC_HOST
value:
_default: "https://sarex.contour.infra.sarex.tech"
_default: "https://sarex.uralmine.com"
- name: AERO_HOST
value:
_default: "https://sarex.contour.infra.sarex.tech"
_default: "https://sarex.uralmine.com"
# server-to-server — внутренний django, см. backend-s3.yaml.
- name: BASE_AERO_URL
value:
_default: "https://sarex.contour.infra.sarex.tech"
_default: "http://backend-svc.django.svc.cluster.local:80"
- name: BASE_AUTH_URL
value:
_default: "http://backend-svc.django.svc.cluster.local:80"
# INFRA-3005: см. backend-s3.yaml и production-configmap.yaml.
- name: WORKFLOWS_HOST
value:
_default: "http://backend-svc.workflow.svc.cluster.local:80"
_default: "http://backend-svc.processing.svc.cluster.local:80"
- name: WORKFLOWS_URL
value:
_default: "http://backend-svc.workflow.svc.cluster.local:80"
_default: "http://backend-svc.processing.svc.cluster.local:80"
- name: RESOURCES_API_HOST
value:
@ -168,13 +170,15 @@ spec:
value:
_default: "http://backend-svc.eav.svc.cluster.local:80"
# Реально действует значение из production-configmap, см. там.
- name: SAREX_API
value:
_default: "https://sarex.contour.infra.sarex.tech"
_default: "https://sarex.uralmine.com"
# Реальное имя сервиса — backend-api-svc, см. backend-s3.yaml.
- name: DOCUMENTATIONS_URL
value:
_default: "http://documentations-api-svc.documentations.svc.cluster.local:80"
_default: "http://backend-api-svc.documentations.svc.cluster.local:80"
- name: DJANGO_SETTINGS_MODULE
value:

View File

@ -18,3 +18,7 @@ patches:
target:
kind: HelmRelease
name: celery
- path: production-configmap.yaml
target:
kind: ConfigMap
name: production-configmap

View File

@ -0,0 +1,181 @@
---
# ВНИМАНИЕ: data["production.py"] — одна строка, kustomize заменяет её ЦЕЛИКОМ,
# поэтому здесь продублировано всё содержимое из
# apps/issues/base/production-configmap.yaml (та же ловушка, что с envs).
#
# Зачем нужен этот патч:
# production.py делает `from .base import *` (там всё через os.getenv), а затем
# переприсваивает часть значений ХАРДКОДОМ — поэтому для этих переменных
# ConfigMap ПОБЕЖДАЕТ env из HelmRelease, и правка env в оверлее
# backend-s3.yaml/celery-s3.yaml сама по себе ни на что не влияет.
#
# INFRA-3005 (основная причина зависания экспорта в Excel):
# в base хардкодом WORKFLOWS_HOST/WORKFLOWS_URL = workflows-api-service.workflow
# — такого сервиса в УГМК нет. celery собирает xlsx, затем
# ExportFinishedNotification → issues/mailing.py:122 делает POST на
# {WORKFLOWS_HOST}/internal/v1/companies/{id}/workflows и падает с
# ConnectionError (Name or service not known) — задача фейлится, фронт не
# получает завершения и крутит загрузку бесконечно. Тем же путём с 26.08
# падали ВСЕ уведомления (send_notification_on_create/on_update/
# to_new_responsible/on_bulk_update, ~1770 ошибок).
#
# Отличия от base:
# - WORKFLOWS_HOST / WORKFLOWS_URL → backend-svc.processing (через os.getenv,
# чтобы env из оверлея снова начал работать)
# - SAREX_API → https://sarex.uralmine.com (в base зашит https://srx.wb.ru)
# - CORS/CSRF origins → https://sarex.uralmine.com (в base только lk.srx.wb.ru)
# - убраны хардкоды KAFKA_USERNAME/KAFKA_PASSWORD/DJANGO_TOKEN и чужой
# дефолт KAFKA_HOST: в УГМК всё это приходит из Vault
# (см. podAnnotations в backend-s3.yaml / celery-s3.yaml / kafka-app.yaml)
# - BASE_AERO_URL оставлен внутренним — он server-to-server
apiVersion: v1
kind: ConfigMap
metadata:
name: production-configmap
namespace: issues
data:
production.py: |
from datetime import timedelta
import os
from .base import *
# DEBUG SETTINGS START
# -----------------------------------------------------------------------------
DEBUG = True
# -----------------------------------------------------------------------------
TEST_MODE = False
# SECRETS SETTINGS START
# -----------------------------------------------------------------------------
SECRET_KEY = "FromToMuchLoveOfLiving" # Delete after Test
# -----------------------------------------------------------------------------
DJANGO_TOKEN = os.getenv("DJANGO_TOKEN")
# ALLOWED HOSTS START
# -----------------------------------------------------------------------------
ALLOWED_HOSTS = ["*"]
# -----------------------------------------------------------------------------
# APPS SETTINGS START
# -----------------------------------------------------------------------------
# INSTALLED_APPS += [
# "django_extensions",
# ]
# -----------------------------------------------------------------------------
# DEBUG SETTINGS START
# -----------------------------------------------------------------------------
DEBUG = False
# -----------------------------------------------------------------------------
REVIEW_HOST='http://backend-svc.flows.svc.cluster.local:80'
# -----------------------------------------------------------------------------
# EXTERNAL SERVICES END
# INFRA-3005: в base здесь хардкод workflows-api-service.workflow — такого
# сервиса в УГМК нет (DNS: "Name or service not known"), из-за чего падал
# POST {WORKFLOWS_HOST}/internal/v1/companies/{id}/workflows в
# issues/mailing.py:122 (WorkflowsMailer) — а это и рассылка уведомлений,
# и финальный шаг celery-задачи экспорта в Excel.
# В УГМК workflows (processing) живёт как backend-svc в namespace processing.
WORKFLOWS_HOST = os.getenv("WORKFLOWS_HOST", "http://backend-svc.processing.svc.cluster.local:80")
WORKFLOWS_URL = os.getenv("WORKFLOWS_URL", "http://backend-svc.processing.svc.cluster.local:80")
# backend-api-svc — реальное имя сервиса documentations (base/api.yaml:74).
DOCUMENTATIONS_URL = "http://backend-api-svc.documentations.svc.cluster.local:80"
RESOURCES_API_HOST = os.getenv("RESOURCES_API_HOST", default="http://resources-service.resources.svc.cluster:8000")
KAFKA_HOST = os.getenv("KAFKA_HOST")
KAFKA_USERNAME = os.getenv("KAFKA_USERNAME")
KAFKA_PASSWORD = os.getenv("KAFKA_PASSWORD")
KAFKA_SSL_CAFILE = os.getenv("KAFKA_SSL_CAFILE", "/usr/local/share/ca-certificates/kafka.crt")
KAFKA_EAV_ASSETS_TOPIC = os.getenv("KAFKA_EAV_ASSETS_TOPIC", "sarex")
KAFKA_ISSUES_TOPIC = os.getenv("KAFKA_ISSUES_TOPIC", "sarex-issues")
USE_ASYNC_FUNCTIONS = True
USE_NOTIFICATIONS = True
# JWT SETTINGS START
if not os.environ.get("JWT_PRIVATE_KEY"):
os.environ["JWT_PRIVATE_KEY"] = _read_secret_file("/vault/secrets/django-jwt-private")
if not os.environ.get("JWT_PUBLIC_KEY"):
os.environ["JWT_PUBLIC_KEY"] = _read_secret_file("/vault/secrets/django-jwt-public")
# ---------------------------------------------------------------------------------------------------------------------
SIMPLE_JWT_ISSUER = os.getenv("SIMPLE_JWT_ISSUER", default="default_issuer")
SIMPLE_JWT = {
"ACCESS_TOKEN_LIFETIME": timedelta(minutes=5),
"REFRESH_TOKEN_LIFETIME": timedelta(days=1),
"ROTATE_REFRESH_TOKENS": False,
"UPDATE_LAST_LOGIN": False,
"ALGORITHM": "RS512",
"SIGNING_KEY": os.getenv("JWT_PRIVATE_KEY", default="").replace("\\n", "\n"),
"VERIFYING_KEY": os.getenv("JWT_PUBLIC_KEY").replace("\\n", "\n"),
"AUDIENCE": None,
"ISSUER": SIMPLE_JWT_ISSUER,
"AUTH_HEADER_TYPES": ("Bearer",),
"AUTH_HEADER_NAME": "HTTP_AUTHORIZATION",
"USER_ID_FIELD": "id",
"USER_ID_CLAIM": "user_id",
"AUTH_TOKEN_CLASSES": ("rest_framework_simplejwt.tokens.AccessToken",),
"TOKEN_TYPE_CLAIM": "token_type",
"JTI_CLAIM": "jti",
"SLIDING_TOKEN_REFRESH_EXP_CLAIM": "refresh_exp",
"SLIDING_TOKEN_LIFETIME": timedelta(minutes=5),
"SLIDING_TOKEN_REFRESH_LIFETIME": timedelta(days=1),
}
# ---------------------------------------------------------------------------------------------------------------------
CORS_ALLOWED_ORIGINS = [
"https://sarex.uralmine.com",
]
CORS_TRUSTED_ORIGINS = [
"https://sarex.uralmine.com",
]
CSRF_TRUSTED_ORIGINS = [
"https://sarex.uralmine.com",
]
CORS_ALLOW_ALL_ORIGINS = True
ENABLE_MAILGUN=False
SMTP_PORT=465
SMTP_HOST="mail.rwb.ru"
EMAIL_FROM="sarex@rwb.ru"
CORS_ALLOW_METHODS = [
"DELETE",
"GET",
"OPTIONS",
"PATCH",
"POST",
"PUT",
]
SAREX_API = os.getenv("SAREX_API", "https://sarex.uralmine.com")
AERO_PUBLIC_HOST = os.getenv("AERO_PUBLIC_HOST", default=SAREX_API)
BASE_AERO_URL = "http://backend-svc.django.svc.cluster.local:80"
ENVIRONMENT = "production"
SESSION_COOKIE_NAME = "issues-sessionid"
CSRF_COOKIE_NAME = "issues-csrftoken"
STATIC_URL = "/static/"
STORAGES = {
'default': {
'BACKEND': "storages.backends.s3boto3.S3Boto3Storage",
},
'staticfiles': {
# Leave whatever setting you already have here, e.g.:
'BACKEND': "storages.backends.s3boto3.S3Boto3Storage",
}
}