diff --git a/apps/issues/d8-ugmk-prod/backend-s3.yaml b/apps/issues/d8-ugmk-prod/backend-s3.yaml index dd37264..192c19e 100644 --- a/apps/issues/d8-ugmk-prod/backend-s3.yaml +++ b/apps/issues/d8-ugmk-prod/backend-s3.yaml @@ -64,15 +64,19 @@ 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: @@ -94,9 +98,12 @@ 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" - name: DOCUMENTATIONS_URL value: diff --git a/apps/issues/d8-ugmk-prod/celery-s3.yaml b/apps/issues/d8-ugmk-prod/celery-s3.yaml index 7c02f31..c795536 100644 --- a/apps/issues/d8-ugmk-prod/celery-s3.yaml +++ b/apps/issues/d8-ugmk-prod/celery-s3.yaml @@ -62,17 +62,21 @@ 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: @@ -94,9 +98,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: diff --git a/apps/issues/d8-ugmk-prod/kafka-app.yaml b/apps/issues/d8-ugmk-prod/kafka-app.yaml index 67f9ba7..7884c3b 100644 --- a/apps/issues/d8-ugmk-prod/kafka-app.yaml +++ b/apps/issues/d8-ugmk-prod/kafka-app.yaml @@ -138,15 +138,16 @@ 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: @@ -168,9 +169,10 @@ 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" - name: DOCUMENTATIONS_URL value: diff --git a/apps/issues/d8-ugmk-prod/kustomization.yaml b/apps/issues/d8-ugmk-prod/kustomization.yaml index 549a8b2..4cbb228 100644 --- a/apps/issues/d8-ugmk-prod/kustomization.yaml +++ b/apps/issues/d8-ugmk-prod/kustomization.yaml @@ -18,3 +18,7 @@ patches: target: kind: HelmRelease name: celery + - path: production-configmap.yaml + target: + kind: ConfigMap + name: production-configmap diff --git a/apps/issues/d8-ugmk-prod/production-configmap.yaml b/apps/issues/d8-ugmk-prod/production-configmap.yaml new file mode 100644 index 0000000..b2a73fa --- /dev/null +++ b/apps/issues/d8-ugmk-prod/production-configmap.yaml @@ -0,0 +1,171 @@ +--- +# ВНИМАНИЕ: data["production.py"] — одна строка, kustomize заменяет её ЦЕЛИКОМ, +# поэтому здесь продублировано всё содержимое из +# apps/issues/base/production-configmap.yaml (та же ловушка, что с envs). +# +# Зачем нужен этот патч (INFRA-3005): +# в base зашит хардкодом SAREX_API = "https://srx.wb.ru". production.py делает +# `from .base import *`, а затем переприсваивает значения — поэтому ConfigMap +# ПОБЕЖДАЕТ env-переменные из HelmRelease, и правка SAREX_API в оверлее +# backend-s3.yaml/celery-s3.yaml сама по себе ни на что не влияет. +# +# В issues-backend settings.SAREX_API используется в блокирующих вызовах: +# - src/issues/models.py:270 Issue.get_user_data() — requests.get БЕЗ timeout +# - src/api/services.py:149 get_session() — httpx.Client(timeout=600) +# → get_fresh_token() → синхронный экспорт в Excel +# (src/api/export/data_collector.py:285) +# Из закрытого контура УГМК srx.wb.ru недоступен, поэтому синхронный экспорт +# замечаний в Excel (≤800 замечаний без вложений, см. export.py:47) висел +# до таймаута 600 с. +# +# Отличия от base: +# - SAREX_API → https://sarex.uralmine.com +# - 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 + + WORKFLOWS_HOST = "http://workflows-api-service.workflow.svc.cluster.local:8000" + WORKFLOWS_URL = "http://workflows-api-service.workflow.svc.cluster.local:8000" + 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 = "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", + } + }