Files
MatchLiveTv/scripts/deploy/release_production.sh
Emiliano Frascaro 949a0a01fb Aggiunge proxy edge con pagina di cortesia e rilascio a downtime minimo.
NPM punta a nginx locale su :3000 che resta attivo durante il restart Rails; nuovo script release_production.sh esegue migrate, build e deploy in ordine.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-13 09:31:36 +02:00

94 lines
2.3 KiB
Bash
Executable File

#!/usr/bin/env bash
# Rilascio produzione con downtime minimo e pagina di cortesia durante il restart Rails.
#
# Uso dalla macchina di sviluppo (sync + deploy remoto):
# bash scripts/deploy/release_production.sh
#
# Solo sul server (dopo sync manuale):
# bash scripts/deploy/release_production.sh --local
#
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
SERVER="${DEPLOY_SERVER:-eminux@192.168.1.146}"
REMOTE_INFRA="${DEPLOY_PATH:-/opt/matchlivetv}/infra"
LOCAL_INFRA="${ROOT}/infra"
COMPOSE_FILE="${COMPOSE_FILE:-docker-compose.prod.yml}"
WAIT_SECS="${RELEASE_WAIT_SECS:-180}"
LOCAL_ONLY=false
for arg in "$@"; do
case "$arg" in
--local) LOCAL_ONLY=true ;;
esac
done
if [ "$LOCAL_ONLY" = false ]; then
bash "${ROOT}/scripts/deploy/sync_to_server.sh"
ssh "$SERVER" "bash ${REMOTE_INFRA%/infra}/scripts/deploy/release_production.sh --local"
exit 0
fi
INFRA="${MATCHLIVETV_INFRA:-$LOCAL_INFRA}"
if [ -d "/opt/matchlivetv/infra" ]; then
INFRA="/opt/matchlivetv/infra"
fi
ENV_FILE="${ENV_FILE:-${INFRA}/.env}"
compose() {
docker compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" "$@"
}
wait_for_rails() {
local i=0
local max=$((WAIT_SECS / 2))
echo "Attendo Rails (max ${WAIT_SECS}s)..."
while [ "$i" -lt "$max" ]; do
if compose exec -T rails curl -sf http://127.0.0.1:3000/up >/dev/null 2>&1; then
echo "Rails pronto."
return 0
fi
sleep 2
i=$((i + 1))
done
echo "ERRORE: Rails non healthy entro ${WAIT_SECS}s"
compose ps
return 1
}
cd "$INFRA"
echo "==> Build immagini (senza fermare i servizi)"
compose build rails sidekiq
echo "==> Migrazioni DB"
if compose ps --status running rails 2>/dev/null | grep -q rails; then
compose exec -T rails bundle exec rails db:migrate
else
compose run --rm --no-deps rails bundle exec rails db:prepare
fi
echo "==> Proxy edge (pagina di cortesia su :3000)"
compose up -d edge
echo "==> Deploy Rails"
compose up -d --no-deps --build rails
wait_for_rails
echo "==> Deploy Sidekiq"
compose up -d --no-deps --build sidekiq
echo "==> Cron"
bash scripts/install_production_cron.sh
if command -v curl >/dev/null 2>&1; then
if curl -sf http://127.0.0.1:3000/up >/dev/null 2>&1; then
echo "Smoke test /up via edge: OK"
else
echo "ATTENZIONE: /up non risponde via edge"
fi
fi
echo "Rilascio completato."