From 39a9f435ac67efa6825bd6b8020c9c00ac8d6500 Mon Sep 17 00:00:00 2001 From: Zareian Date: Mon, 14 Sep 2026 00:53:43 +0330 Subject: [PATCH] make the deploy script survive an unfamiliar server MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit دو حالتی که فقط روی سرورِ واقعی پیش می‌آیند، نه اینجا. اسکریپت‌های قدیمیِ activate به PS1 بدونِ محافظ دست می‌زنند و زیرِ set -u با «unbound variable» کلِ دیپلوی را می‌خوابانند — venv اینجا سالم است ولی venv سرور لزوماً نه، پس set -u دورِ همان یک خط موقتاً خاموش می‌شود. بررسیِ سلامت فقط 127.0.0.1:8000 را می‌زد. اگر gunicorn روی سوکت یا پورتِ دیگری باشد، دیپلویِ کاملاً موفق هم با پیامِ خطا تمام می‌شد. حالا آدرسِ عمومی هم امتحان می‌شود و در پایان می‌گوید کدام آدرس‌ها را زده. Co-Authored-By: Claude Opus 5 --- deploy.sh | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/deploy.sh b/deploy.sh index 66b5ac1..d18714d 100755 --- a/deploy.sh +++ b/deploy.sh @@ -25,7 +25,17 @@ step() { printf '\n%s▸ %s%s\n' "$C_OK" "$1" "$C_OFF"; } warn() { printf '%s⚠ %s%s\n' "$C_WARN" "$1" "$C_OFF"; } fail() { printf '%s✖ %s%s\n' "$C_ERR" "$1" "$C_OFF" >&2; exit 1; } -HEALTH_URL="${TADRISINO_HEALTH_URL:-http://127.0.0.1:8000/api/health}" +# اگر TADRISINO_HEALTH_URL ست نباشد چند آدرس امتحان می‌شود: پورتِ محلی ممکن +# است فرق کند (سوکتِ یونیکس، پورتِ دیگر)، و در آن حالت دیپلویِ موفق هم پیامِ +# خطا می‌گرفت. آدرسِ عمومی نشان می‌دهد سرویس واقعاً از بیرون جواب می‌دهد. +if [ -n "${TADRISINO_HEALTH_URL:-}" ]; then + HEALTH_URLS=("$TADRISINO_HEALTH_URL") +else + HEALTH_URLS=( + "http://127.0.0.1:8000/api/health" + "https://api.math.tadrisino2.ir/api/health" + ) +fi # ─── ۱. کدِ تازه ──────────────────────────────────────────────────────────── if [ "${SKIP_PULL:-0}" != "1" ]; then @@ -39,8 +49,12 @@ printf ' کامیتِ فعلی: %s\n' "$(git rev-parse --short HEAD) $(git log # ─── ۲. محیطِ پایتون ──────────────────────────────────────────────────────── step "فعال‌سازیِ محیطِ مجازی" if [ -d venv ]; then + # set -u موقتاً خاموش: اسکریپت‌های activate قدیمی به PS1 بدونِ محافظ دست + # می‌زنند و زیرِ set -u با «unbound variable» کلِ دیپلوی را می‌خوابانند. + set +u # shellcheck disable=SC1091 source venv/bin/activate + set -u printf ' venv فعال شد\n' elif [ -n "${VIRTUAL_ENV:-}" ]; then printf ' از venv فعالِ فعلی استفاده می‌شود: %s\n' "$VIRTUAL_ENV" @@ -152,19 +166,22 @@ fi # ─── ۸. آیا واقعاً بالا آمد؟ ─────────────────────────────────────────────── step "بررسیِ سلامت" -printf ' %s\n' "$HEALTH_URL" +CODE=000; BODY="" for attempt in 1 2 3 4 5 6 7 8 9 10; do - # یک درخواست، نه دو تا: دو فراخوانیِ جدا می‌توانست دو وضعیتِ متفاوت ببیند. - RESPONSE="$(curl -s -m 10 -w '\n%{http_code}' "$HEALTH_URL" 2>/dev/null || printf '\n000')" - CODE="${RESPONSE##*$'\n'}" - BODY="${RESPONSE%$'\n'*}" - if [ "$CODE" = "200" ]; then - printf '%s✓ سرویس سالم بالا آمد.%s\n' "$C_OK" "$C_OFF" - printf '%s\n' "$BODY" | python -m json.tool 2>/dev/null | sed 's/^/ /' || printf ' %s\n' "$BODY" - exit 0 - fi + for url in "${HEALTH_URLS[@]}"; do + # یک درخواست، نه دو تا: دو فراخوانیِ جدا می‌توانست دو وضعیتِ متفاوت ببیند. + RESPONSE="$(curl -s -m 10 -w '\n%{http_code}' "$url" 2>/dev/null || printf '\n000')" + CODE="${RESPONSE##*$'\n'}" + BODY="${RESPONSE%$'\n'*}" + if [ "$CODE" = "200" ]; then + printf '%s✓ سرویس سالم بالا آمد%s (%s)\n' "$C_OK" "$C_OFF" "$url" + printf '%s\n' "$BODY" | python -m json.tool 2>/dev/null | sed 's/^/ /' || printf ' %s\n' "$BODY" + exit 0 + fi + done sleep 3 done +printf ' آدرس‌های امتحان‌شده: %s\n' "${HEALTH_URLS[*]}" >&2 printf '%s✖ سرویس بعد از ۳۰ ثانیه هنوز سالم نیست (آخرین کد: %s)%s\n' "$C_ERR" "$CODE" "$C_OFF" >&2 printf '%s\n' "$BODY" | head -c 600 >&2; echo >&2