From d5a747616a1058cb75655effed7db2562c574795 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20?= =?UTF-8?q?=D0=97=D0=B8=D0=BC=D0=B8=D0=BD?= Date: Mon, 4 May 2026 01:21:34 +0300 Subject: [PATCH] =?UTF-8?q?fix(admin-ui):=20envsubst=20FQDN=20=D1=81=20per?= =?UTF-8?q?-cluster=20DNS=20suffix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit nginx resolver не использует search list, поэтому в proxy_pass нужен FQDN. Cluster domain различается: - cluster.265 (staging): 265.local - srvaltum01 (prod): altum.local - default kubespray: cluster.local Решение: nginx.conf — template с ${ORDINIS_NAMESPACE} и ${CLUSTER_DOMAIN}, обрабатывается официальным nginx entrypoint (/docker-entrypoint.d/20-envsubst-on-templates.sh). Helm подставляет ENV из fieldRef + values per-env. --- ordinis-admin-ui/Dockerfile | 8 +++++++- ordinis-admin-ui/nginx.conf | 13 ++++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/ordinis-admin-ui/Dockerfile b/ordinis-admin-ui/Dockerfile index 31d1e96..a66b70c 100644 --- a/ordinis-admin-ui/Dockerfile +++ b/ordinis-admin-ui/Dockerfile @@ -8,5 +8,11 @@ RUN pnpm build FROM repo.nstart.cloud/library/nginx:1.27-alpine COPY --from=build /app/dist /usr/share/nginx/html -COPY nginx.conf /etc/nginx/conf.d/default.conf +# Шаблон обрабатывается официальным entrypoint nginx-image: +# /docker-entrypoint.d/20-envsubst-on-templates.sh пробегает по +# /etc/nginx/templates/*.template и envsubst'ит ENV vars в /etc/nginx/conf.d/. +COPY nginx.conf /etc/nginx/templates/default.conf.template +ENV NGINX_ENVSUBST_TEMPLATE_DIR=/etc/nginx/templates \ + NGINX_ENVSUBST_TEMPLATE_SUFFIX=.template \ + NGINX_ENVSUBST_OUTPUT_DIR=/etc/nginx/conf.d EXPOSE 80 diff --git a/ordinis-admin-ui/nginx.conf b/ordinis-admin-ui/nginx.conf index bab5399..5e277a1 100644 --- a/ordinis-admin-ui/nginx.conf +++ b/ordinis-admin-ui/nginx.conf @@ -2,9 +2,10 @@ server { listen 80; server_name _; - # Resolver для динамического k8s service DNS (proxy_pass с переменной). - # 169.254.25.10 — nodelocal-dns на kubespray-кластерах (cluster.265 и .264). - resolver 169.254.25.10 1.1.1.1 valid=30s ipv6=off; + # Resolver — coredns (10.233.0.3 на kubespray-кластерах). nodelocal-dns + # (169.254.25.10) при первом cold lookup отвечает SERVFAIL, поэтому + # обращаемся напрямую к ClusterDNS service. + resolver ${RESOLVER_IP} valid=30s ipv6=off; # Real client IP behind ingress-nginx. set_real_ip_from 0.0.0.0/0; @@ -15,10 +16,12 @@ server { index index.html; # GET → read-api, мутирующие → writer. + # FQDN в proxy_pass нужен потому что nginx resolver не использует search list. + # Namespace и cluster-domain инжектятся через ENV (см. admin-ui Deployment). location /api/v1/ { - set $backend "ordinis-read-api"; + set $backend "ordinis-read-api.${ORDINIS_NAMESPACE}.svc.${CLUSTER_DOMAIN}"; if ($request_method ~ ^(POST|PUT|PATCH|DELETE)$) { - set $backend "ordinis-app"; + set $backend "ordinis-app.${ORDINIS_NAMESPACE}.svc.${CLUSTER_DOMAIN}"; } proxy_pass http://$backend; proxy_http_version 1.1;