fix(ops): проверка готовности учитывает адрес привязки приложения
`glchat update` на стенде с внешним прокси всегда сообщал «приложение не поднялось»: readyz проверялся на 127.0.0.1, а приложение слушает адрес в WireGuard (GLCHAT_APP_BIND). Тот же дефект был в restore.sh и в `glchat status` (health показывался как unreachable). Добавлен общий помощник app_check_url.
This commit is contained in:
+14
-2
@@ -9,6 +9,16 @@ ENV_FILE="${GLCHAT_ETC_DIR}/.env"
|
|||||||
|
|
||||||
COMPOSE="docker compose -f ${COMPOSE_FILE}"
|
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 читает значение из .env инстанса (пусто, если ключа нет).
|
||||||
env_get() {
|
env_get() {
|
||||||
[ -f "$ENV_FILE" ] || return 0
|
[ -f "$ENV_FILE" ] || return 0
|
||||||
@@ -56,9 +66,11 @@ cmd_status() {
|
|||||||
echo "== compose =="
|
echo "== compose =="
|
||||||
$COMPOSE ps
|
$COMPOSE ps
|
||||||
echo
|
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')"
|
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 "== app =="
|
||||||
echo "version: ${version:-unknown}"
|
echo "version: ${version:-unknown}"
|
||||||
echo "readyz: ${health}"
|
echo "readyz: ${health}"
|
||||||
|
|||||||
+18
-1
@@ -8,6 +8,23 @@ ENV_FILE="${GLCHAT_ETC_DIR}/.env"
|
|||||||
COMPOSE_FILE="${GLCHAT_ETC_DIR}/compose.yaml"
|
COMPOSE_FILE="${GLCHAT_ETC_DIR}/compose.yaml"
|
||||||
|
|
||||||
log() { printf '[restore] %s\n' "$*"; }
|
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() {
|
die() {
|
||||||
printf '[restore] ошибка: %s\n' "$*" >&2
|
printf '[restore] ошибка: %s\n' "$*" >&2
|
||||||
exit 1
|
exit 1
|
||||||
@@ -79,7 +96,7 @@ log "запускаем приложение"
|
|||||||
(cd "$GLCHAT_ETC_DIR" && docker compose start app) || (cd "$GLCHAT_ETC_DIR" && docker compose up -d app)
|
(cd "$GLCHAT_ETC_DIR" && docker compose start app) || (cd "$GLCHAT_ETC_DIR" && docker compose up -d app)
|
||||||
|
|
||||||
for _ in $(seq 1 30); do
|
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 "приложение готово"
|
log "приложение готово"
|
||||||
GLCHAT_ETC_DIR="$GLCHAT_ETC_DIR" bash "${GLCHAT_ETC_DIR}/smoke.sh" || true
|
GLCHAT_ETC_DIR="$GLCHAT_ETC_DIR" bash "${GLCHAT_ETC_DIR}/smoke.sh" || true
|
||||||
log "восстановление завершено"
|
log "восстановление завершено"
|
||||||
|
|||||||
+15
-3
@@ -7,6 +7,16 @@ ENV_FILE="${GLCHAT_ETC_DIR}/.env"
|
|||||||
COMPOSE_FILE="${GLCHAT_ETC_DIR}/compose.yaml"
|
COMPOSE_FILE="${GLCHAT_ETC_DIR}/compose.yaml"
|
||||||
REPO_DIR_DEFAULT="${GLCHAT_REPO_DIR:-/opt/glchat-src}"
|
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' "$*"; }
|
log() { printf '[update] %s\n' "$*"; }
|
||||||
die() {
|
die() {
|
||||||
printf '[update] ошибка: %s\n' "$*" >&2
|
printf '[update] ошибка: %s\n' "$*" >&2
|
||||||
@@ -72,16 +82,18 @@ fi
|
|||||||
log "применяем новую версию"
|
log "применяем новую версию"
|
||||||
(cd "$GLCHAT_ETC_DIR" && docker compose "${compose_args[@]}" up -d --remove-orphans) || die "не удалось поднять стек"
|
(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
|
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 "приложение готово"
|
log "приложение готово"
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
sleep 2
|
sleep 2
|
||||||
done
|
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"
|
die "приложение не поднялось; откат: glchat restore <бэкап>, затем docker compose up -d"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user