From c082b087c57a1e145249997fa3e4dbfbcfb9d680 Mon Sep 17 00:00:00 2001 From: lendry Date: Tue, 30 Jun 2026 11:00:43 +0300 Subject: [PATCH] fix and update --- docker-compose.yml | 15 ++++++++++++ infra/nginx-gateway-sync/entrypoint.sh | 33 ++++++++++++++++++++++++++ install.sh | 11 ++++----- 3 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 infra/nginx-gateway-sync/entrypoint.sh diff --git a/docker-compose.yml b/docker-compose.yml index 8d37f89..08c6969 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -303,6 +303,21 @@ services: timeout: 5s retries: 3 + # После recreate api-gateway nginx держит старый IP upstream → 502. Этот watcher + # делает nginx -s reload когда gateway снова поднялся (~55 с на Nest bootstrap). + nginx-gateway-sync: + profiles: ["proxy"] + image: docker:27-cli + container_name: lendry-id-nginx-gateway-sync + restart: unless-stopped + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./infra/nginx-gateway-sync/entrypoint.sh:/entrypoint.sh:ro + depends_on: + nginx: + condition: service_started + entrypoint: ["/bin/sh", "/entrypoint.sh"] + volumes: postgres_data: redis_data: diff --git a/infra/nginx-gateway-sync/entrypoint.sh b/infra/nginx-gateway-sync/entrypoint.sh new file mode 100644 index 0000000..88ce300 --- /dev/null +++ b/infra/nginx-gateway-sync/entrypoint.sh @@ -0,0 +1,33 @@ +#!/bin/sh +set -eu + +NGINX_CONTAINER="${NGINX_CONTAINER:-lendry-id-nginx}" +GATEWAY_CONTAINER="${GATEWAY_CONTAINER:-lendry-id-api-gateway}" +BOOT_WAIT_SEC="${BOOT_WAIT_SEC:-55}" + +reload_nginx() { + if docker exec "$NGINX_CONTAINER" nginx -s reload 2>/dev/null; then + echo "[nginx-gateway-sync] nginx reload OK" + else + echo "[nginx-gateway-sync] nginx reload failed — пробуем restart" + docker restart "$NGINX_CONTAINER" >/dev/null 2>&1 || true + fi +} + +verify_gateway() { + docker exec "$NGINX_CONTAINER" wget -qO- --timeout=5 "http://${GATEWAY_CONTAINER}:3000/health" 2>/dev/null \ + || echo "[nginx-gateway-sync] предупреждение: nginx пока не достучался до ${GATEWAY_CONTAINER}:3000/health" +} + +echo "[nginx-gateway-sync] слежение за ${GATEWAY_CONTAINER} (boot wait ${BOOT_WAIT_SEC}s)..." + +docker events \ + --filter "container=${GATEWAY_CONTAINER}" \ + --filter event=start \ + --format '{{.Time}}' | while read -r _; do + echo "[nginx-gateway-sync] ${GATEWAY_CONTAINER} перезапущен, ждём Nest..." + sleep "$BOOT_WAIT_SEC" + reload_nginx + sleep 2 + verify_gateway +done diff --git a/install.sh b/install.sh index 0f9e24d..a80df6b 100644 --- a/install.sh +++ b/install.sh @@ -1980,12 +1980,11 @@ nginx_proxy_headers=" proxy_set_header Host \$host; proxy_read_timeout 300s; proxy_connect_timeout 75s;" -# Встроенный DNS Docker. valid=5s + resolver_timeout — баланс между свежим IP и -# «Server failure» при кратковременном дауне контейнера во время recreate. -NGINX_DOCKER_RESOLVER=" resolver 127.0.0.11 ipv6=off valid=5s; - resolver_timeout 5s;" -NGINX_DOCKER_SERVER_DNS=" resolver 127.0.0.11 ipv6=off valid=5s; - resolver_timeout 5s;" +# Встроенный DNS Docker. valid=2s — быстрее подхватывает новый IP после recreate api-gateway. +NGINX_DOCKER_RESOLVER=" resolver 127.0.0.11 ipv6=off valid=2s; + resolver_timeout 3s;" +NGINX_DOCKER_SERVER_DNS=" resolver 127.0.0.11 ipv6=off valid=2s; + resolver_timeout 3s;" # Имя nginx-переменной из ключа апстрима (только [A-Za-z0-9_]). nginx_upstream_var() {