fix(deploy): restore router config to current slot before health check
nginx -t resolves upstream hostnames — if the config points to a stopped slot from a previous failed deploy, the health check fails and the router stays unhealthy indefinitely, blocking all future deploys. Before up -d --wait, write the router config to point to the CURRENT live slot (which is still running) and restart the router. This clears the stale unhealthy state. After the new slot passes health checks, switch the router config to the new slot and reload. Also extracted _write_router_conf() to avoid duplicating the nginx config template. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
58
deploy.sh
58
deploy.sh
@@ -35,9 +35,40 @@ echo "==> Running migrations..."
|
|||||||
$COMPOSE --profile "$TARGET" run --rm "${TARGET}-app" \
|
$COMPOSE --profile "$TARGET" run --rm "${TARGET}-app" \
|
||||||
python -m padelnomics.migrations.migrate
|
python -m padelnomics.migrations.migrate
|
||||||
|
|
||||||
|
# ── Ensure router is healthy before waiting ──────────────────
|
||||||
|
# nginx -t resolves upstream hostnames — if the config points to a stopped
|
||||||
|
# slot, the health check fails. Write config for the CURRENT live slot
|
||||||
|
# (which is still running) so the router stays healthy during --wait.
|
||||||
|
|
||||||
|
_write_router_conf() {
|
||||||
|
local SLOT="$1"
|
||||||
|
mkdir -p "$(dirname "$ROUTER_CONF")"
|
||||||
|
cat > "$ROUTER_CONF" <<NGINX
|
||||||
|
upstream app {
|
||||||
|
server ${SLOT}-app:5000;
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://app;
|
||||||
|
proxy_set_header Host \$host;
|
||||||
|
proxy_set_header X-Real-IP \$remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto \$scheme;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NGINX
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "$CURRENT" != "none" ]; then
|
||||||
|
echo "==> Resetting router to current slot ($CURRENT)..."
|
||||||
|
_write_router_conf "$CURRENT"
|
||||||
|
$COMPOSE restart router
|
||||||
|
fi
|
||||||
|
|
||||||
# ── Start & health check ───────────────────────────────────
|
# ── Start & health check ───────────────────────────────────
|
||||||
# Router config is NOT written yet — router keeps old config so it stays
|
|
||||||
# healthy while we wait for the new slot to pass its own health check.
|
|
||||||
|
|
||||||
echo "==> Starting $TARGET (waiting for health check)..."
|
echo "==> Starting $TARGET (waiting for health check)..."
|
||||||
if ! $COMPOSE --profile "$TARGET" up -d --wait; then
|
if ! $COMPOSE --profile "$TARGET" up -d --wait; then
|
||||||
@@ -62,27 +93,8 @@ fi
|
|||||||
|
|
||||||
# ── Write router config and reload (new slot is healthy) ────
|
# ── Write router config and reload (new slot is healthy) ────
|
||||||
|
|
||||||
echo "==> Writing router config for $TARGET..."
|
echo "==> Switching router to $TARGET..."
|
||||||
mkdir -p "$(dirname "$ROUTER_CONF")"
|
_write_router_conf "$TARGET"
|
||||||
cat > "$ROUTER_CONF" <<NGINX
|
|
||||||
upstream app {
|
|
||||||
server ${TARGET}-app:5000;
|
|
||||||
}
|
|
||||||
|
|
||||||
server {
|
|
||||||
listen 80;
|
|
||||||
|
|
||||||
location / {
|
|
||||||
proxy_pass http://app;
|
|
||||||
proxy_set_header Host \$host;
|
|
||||||
proxy_set_header X-Real-IP \$remote_addr;
|
|
||||||
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
|
||||||
proxy_set_header X-Forwarded-Proto \$scheme;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
NGINX
|
|
||||||
|
|
||||||
echo "==> Reloading router..."
|
|
||||||
$COMPOSE exec router nginx -s reload
|
$COMPOSE exec router nginx -s reload
|
||||||
|
|
||||||
# ── Cleanup old pre-deploy backups (keep last 3) ─────────────
|
# ── Cleanup old pre-deploy backups (keep last 3) ─────────────
|
||||||
|
|||||||
Reference in New Issue
Block a user