Files
2026FIFAWorldCup/ops/healthcheck-production.sh

63 lines
1.9 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
HOST="${1:-192.168.0.188}"
PORT="${2:-3108}"
PUBLIC_HOST="${3:-2026fifa.wooo.work}"
normalize_host() {
local host="$1"
if [[ "$host" == http://* ]] || [[ "$host" == https://* ]]; then
printf '%s' "$host"
return
fi
printf 'https://%s' "$host"
}
PUBLIC_URL="$(normalize_host "$PUBLIC_HOST")"
[[ "$PUBLIC_URL" == */ ]] && PUBLIC_URL="${PUBLIC_URL%/}"
PUBLIC_URL="${PUBLIC_URL}/api/health"
INTERNAL_URL="http://${HOST}:${PORT}/api/health"
echo "[health] check public=${PUBLIC_URL}"
echo "[health] check internal=${INTERNAL_URL} (fallback)"
for i in {1..30}; do
if command -v jq >/dev/null 2>&1; then
data=""
if resp="$(curl -sS --max-time 6 "${PUBLIC_URL}")" && echo "${resp}" | jq -e '.status' >/dev/null 2>&1; then
data="${resp}"
elif resp="$(curl -sS --max-time 6 "${INTERNAL_URL}")" && echo "${resp}" | jq -e '.status' >/dev/null 2>&1; then
data="${resp}"
fi
if [[ -z "${data}" ]]; then
sleep 4
continue
fi
status="$(echo "${data}" | jq -r '.status')"
count="$(echo "${data}" | jq -r '.matchCount')"
publicOrigin="$(echo "${data}" | jq -r '.publicOrigin // "-"')"
tz="$(echo "${data}" | jq -r '.timeZone // "unknown"')"
updated="$(echo "${data}" | jq -r '.lastUpdatedTaipei // "-"')"
echo "[health] #${i} status=${status} matches=${count} public=${publicOrigin} timezone=${tz} updated=${updated}"
if [[ "${status}" == "ready" && "${count}" != "0" ]]; then
echo "[health] production api ready"
exit 0
fi
else
code="$(curl -o /dev/null -sS --max-time 6 -w '%{http_code}' "${PUBLIC_URL}")"
if [[ "${code}" != "200" ]]; then
code="$(curl -o /dev/null -sS --max-time 6 -w '%{http_code}' "${INTERNAL_URL}")"
fi
echo "[health] #${i} http=${code}"
if [[ "${code}" == "200" ]]; then
echo "[health] production endpoint returns ok"
exit 0
fi
fi
sleep 4
done
echo "[health] ERROR: not healthy"
exit 1