From e97f2601130a4f33c5d7f8e5393c4278d74826d2 Mon Sep 17 00:00:00 2001 From: grendervill Date: Tue, 22 Sep 2026 20:49:13 +0300 Subject: [PATCH] =?UTF-8?q?fix(ops):=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=BA=D0=B0=20=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=B8=20=D1=83=D1=87=D0=B8=D1=82=D1=8B=D0=B2=D0=B0?= =?UTF-8?q?=D0=B5=D1=82=20=D0=B0=D0=B4=D1=80=D0=B5=D1=81=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=D0=B2=D1=8F=D0=B7=D0=BA=D0=B8=20=D0=BF=D1=80=D0=B8=D0=BB?= =?UTF-8?q?=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `glchat update` на стенде с внешним прокси всегда сообщал «приложение не поднялось»: readyz проверялся на 127.0.0.1, а приложение слушает адрес в WireGuard (GLCHAT_APP_BIND). Тот же дефект был в restore.sh и в `glchat status` (health показывался как unreachable). Добавлен общий помощник app_check_url. --- deploy/glchat-cli.sh | 16 ++++++++++++++-- deploy/restore.sh | 19 ++++++++++++++++++- deploy/update.sh | 18 +++++++++++++++--- 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/deploy/glchat-cli.sh b/deploy/glchat-cli.sh index fbc7e09..4d6aa07 100755 --- a/deploy/glchat-cli.sh +++ b/deploy/glchat-cli.sh @@ -9,6 +9,16 @@ ENV_FILE="${GLCHAT_ETC_DIR}/.env" COMPOSE="docker compose -f ${COMPOSE_FILE}" +# app_check_url печатает адрес /readyz с учётом привязки приложения: во внешнем +# режиме оно слушает WireGuard-адрес, и проверка localhost всегда падала бы. +app_check_url() { + local port="$1" host="${2:-}" + case "$host" in + 0.0.0.0 | "" | "::") host="127.0.0.1" ;; + esac + printf 'http://%s:%s/readyz' "$host" "$port" +} + # env_get читает значение из .env инстанса (пусто, если ключа нет). env_get() { [ -f "$ENV_FILE" ] || return 0 @@ -56,9 +66,11 @@ cmd_status() { echo "== compose ==" $COMPOSE ps echo - meta="$(curl -fsS "http://127.0.0.1:8080/api/v1/meta" 2>/dev/null || true)" + local check_url + check_url="$(app_check_url "${APP_PORT:-8080}" "$(env_get GLCHAT_APP_BIND)")" + meta="$(curl -fsS "${check_url%/readyz}/api/v1/meta" 2>/dev/null || true)" version="$(printf '%s' "$meta" | sed -n 's/.*"version":"\([^"]*\)".*/\1/p')" - health="$(curl -fsS "http://127.0.0.1:8080/readyz" 2>/dev/null || echo '{"status":"unreachable"}')" + health="$(curl -fsS "${check_url}" 2>/dev/null || echo '{"status":"unreachable"}')" echo "== app ==" echo "version: ${version:-unknown}" echo "readyz: ${health}" diff --git a/deploy/restore.sh b/deploy/restore.sh index 29be87e..bae4e19 100755 --- a/deploy/restore.sh +++ b/deploy/restore.sh @@ -8,6 +8,23 @@ ENV_FILE="${GLCHAT_ETC_DIR}/.env" COMPOSE_FILE="${GLCHAT_ETC_DIR}/compose.yaml" log() { printf '[restore] %s\n' "$*"; } + +# env_get читает значение из .env инстанса (пусто, если ключа нет). +env_get() { + [ -f "$ENV_FILE" ] || return 0 + sed -n "s/^$1=//p" "$ENV_FILE" | tail -1 +} + +# app_check_url печатает адрес /readyz с учётом привязки приложения: во внешнем +# режиме приложение слушает WireGuard-адрес, и проверка localhost не работает. +app_check_url() { + local port="$1" host="${2:-}" + case "$host" in + 0.0.0.0 | "" | "::") host="127.0.0.1" ;; + esac + printf 'http://%s:%s/readyz' "$host" "$port" +} + die() { printf '[restore] ошибка: %s\n' "$*" >&2 exit 1 @@ -79,7 +96,7 @@ log "запускаем приложение" (cd "$GLCHAT_ETC_DIR" && docker compose start app) || (cd "$GLCHAT_ETC_DIR" && docker compose up -d app) for _ in $(seq 1 30); do - if curl -fsS "http://127.0.0.1:${APP_PORT:-8080}/readyz" >/dev/null 2>&1; then + if curl -fsS "$(app_check_url "${APP_PORT:-8080}" "$(env_get GLCHAT_APP_BIND)")" >/dev/null 2>&1; then log "приложение готово" GLCHAT_ETC_DIR="$GLCHAT_ETC_DIR" bash "${GLCHAT_ETC_DIR}/smoke.sh" || true log "восстановление завершено" diff --git a/deploy/update.sh b/deploy/update.sh index 1c0da0c..12e4382 100755 --- a/deploy/update.sh +++ b/deploy/update.sh @@ -7,6 +7,16 @@ ENV_FILE="${GLCHAT_ETC_DIR}/.env" COMPOSE_FILE="${GLCHAT_ETC_DIR}/compose.yaml" REPO_DIR_DEFAULT="${GLCHAT_REPO_DIR:-/opt/glchat-src}" +# app_check_url печатает адрес /readyz с учётом привязки приложения: во внешнем +# режиме оно слушает WireGuard-адрес, и проверка localhost всегда падала бы. +app_check_url() { + local port="$1" host="${2:-}" + case "$host" in + 0.0.0.0 | "" | "::") host="127.0.0.1" ;; + esac + printf 'http://%s:%s/readyz' "$host" "$port" +} + log() { printf '[update] %s\n' "$*"; } die() { printf '[update] ошибка: %s\n' "$*" >&2 @@ -72,16 +82,18 @@ fi log "применяем новую версию" (cd "$GLCHAT_ETC_DIR" && docker compose "${compose_args[@]}" up -d --remove-orphans) || die "не удалось поднять стек" -log "ожидаем готовности (миграции выполняются на старте приложения)" +READY_URL="$(app_check_url "${APP_PORT:-8080}" "${GLCHAT_APP_BIND:-}")" + +log "ожидаем готовности ${READY_URL} (миграции выполняются на старте приложения)" for _ in $(seq 1 45); do - if curl -fsS "http://127.0.0.1:${APP_PORT:-8080}/readyz" >/dev/null 2>&1; then + if curl -fsS "$READY_URL" >/dev/null 2>&1; then log "приложение готово" break fi sleep 2 done -if ! curl -fsS "http://127.0.0.1:${APP_PORT:-8080}/readyz" >/dev/null 2>&1; then +if ! curl -fsS "$READY_URL" >/dev/null 2>&1; then die "приложение не поднялось; откат: glchat restore <бэкап>, затем docker compose up -d" fi