#!/usr/bin/env bash # Se ejecuta en el destino. Conserva releases anteriores y revierte código si falla. set -euo pipefail RUTA="${1:?}"; VERSION="${2:?}" [[ "$RUTA" =~ ^/[A-Za-z0-9_/-]+$ && "$RUTA" != / && "$RUTA" != *..* ]] [[ "$VERSION" =~ ^[A-Za-z0-9_-]+$ ]] exec 9>"$RUTA/.despliegue.lock" flock -n 9 || { echo 'Ya hay un despliegue en curso' >&2; exit 1; } NUEVA="$RUTA/releases/$VERSION" [[ -f "$NUEVA/build/index.js" && -f "$NUEVA/build-panel/index.js" && -f "$RUTA/.env" && -f "$RUTA/.env.panel" ]] command -v ffmpeg >/dev/null command -v ffprobe >/dev/null ANTERIOR="$(readlink "$RUTA/current" || true)" cd "$NUEVA" node despliegue/comprobar-entornos.mjs "$RUTA" node --env-file="$RUTA/.env" scripts/db/migrar.mjs if [[ ! -e "$RUTA/current" ]]; then ln -s "$NUEVA" "$RUTA/current" echo 'Primera versión preparada. Instala las unidades con sudo bash current/despliegue/instalar.sh.' exit 0 fi [[ -L "$RUTA/current" ]] || { echo 'current debe ser un enlace simbólico' >&2; exit 1; } SERVICIOS=(senzapaura senzapaura-panel) if systemctl is-enabled --quiet senzapaura-estudio 2>/dev/null; then SERVICIOS+=(senzapaura-estudio); fi ACTIVADA=0 revertir() { if [[ "$ACTIVADA" == 1 && -n "$ANTERIOR" ]]; then ln -s "$ANTERIOR" "$RUTA/.rollback-$VERSION" mv -Tf "$RUTA/.rollback-$VERSION" "$RUTA/current" sudo systemctl restart "${SERVICIOS[@]}" echo 'Se ha restaurado el código anterior. Las migraciones no se deshacen automáticamente.' >&2 fi } trap revertir ERR ln -s "$NUEVA" "$RUTA/.current-$VERSION" mv -Tf "$RUTA/.current-$VERSION" "$RUTA/current" ACTIVADA=1 sudo systemctl restart "${SERVICIOS[@]}" COMPROBADO=0 for INTENTO in {1..15}; do if curl -fsS -o /dev/null http://127.0.0.1:3000/ && curl -fsS -o /dev/null http://127.0.0.1:3001/entrar; then COMPROBADO=1; break; fi sleep 1 done [[ "$COMPROBADO" == 1 ]] systemctl is-active --quiet "${SERVICIOS[@]}" if [[ ${#SERVICIOS[@]} == 3 ]]; then curl -fsS -o /dev/null http://127.0.0.1:3002/entrar; fi ACTIVADA=0 trap - ERR echo "Publicadas web y administración: $VERSION"