You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
senzapaura_es/despliegue/desplegar.sh

43 lines
2.3 KiB

#!/usr/bin/env bash
# Construye y prepara ambas aplicaciones en una versión inmutable.
# Uso: bash despliegue/desplegar.sh usuario@host [/var/www/senzapaura]
set -euo pipefail
DESTINO="${1:-}"
RUTA="${2:-/var/www/senzapaura}"
CLAVE="${SSH_CLAVE:-$HOME/.ssh/senzapaura_deploy}"
[[ "$DESTINO" =~ ^[A-Za-z0-9_.-]+@[A-Za-z0-9_.-]+$ ]] || { echo 'Indica usuario@servidor' >&2; exit 1; }
[[ "$RUTA" =~ ^/[A-Za-z0-9_/-]+$ && "$RUTA" != / && "$RUTA" != *..* ]] || { echo 'Ruta de despliegue no válida' >&2; exit 1; }
SSH=(ssh -i "$CLAVE" -o BatchMode=yes)
VERSION="$(date -u +%Y%m%dT%H%M%SZ)-$(git rev-parse --short HEAD)"
TEMPORAL="$(mktemp -d)"
trap 'rm -rf -- "$TEMPORAL"' EXIT
npm run check
npm run lint
npm run test:unit -- --run
# En producción no se acepta un empaquetador que termine con error.
npm run build
npm run build:panel
npm run build:estudio
[[ -f build/index.js && -f build-panel/index.js && -f build-estudio/index.js ]]
cp package.json package-lock.json "$TEMPORAL/"
(cd "$TEMPORAL" && npm ci --omit=dev --silent)
if find "$TEMPORAL/node_modules" -name '*.node' | grep -q .; then
echo 'Hay dependencias nativas: requieren una construcción Linux.' >&2; exit 1
fi
"${SSH[@]}" "$DESTINO" "mkdir -p '$RUTA/releases' '$RUTA/media/audio' '$RUTA/media/escucha' '$RUTA/media/ondas' '$RUTA/media/imagenes'; mkdir '$RUTA/releases/$VERSION'"
tar -czf - build build-panel build-estudio package.json package-lock.json drizzle scripts/db/migrar.mjs scripts/estudio despliegue |
"${SSH[@]}" "$DESTINO" "tar -xzf - -C '$RUTA/releases/$VERSION'"
tar -czf - -C "$TEMPORAL" node_modules | "${SSH[@]}" "$DESTINO" "tar -xzf - -C '$RUTA/releases/$VERSION'"
# Los medios se comparten y nunca se sobrescriben al publicar código.
# Una sustitución editorial se carga desde el panel con una clave nueva.
for CARPETA in audio escucha imagenes; do
if [[ -d "media/$CARPETA" ]]; then
tar -czf - -C "media/$CARPETA" . | "${SSH[@]}" "$DESTINO" "tar --skip-old-files -xzf - -C '$RUTA/media/$CARPETA'"
fi
done
if [[ -d static/ondas ]]; then
tar -czf - -C static/ondas . | "${SSH[@]}" "$DESTINO" "tar --skip-old-files -xzf - -C '$RUTA/media/ondas'"
fi
# La base objetivo se toma exclusivamente del entorno del servidor.
"${SSH[@]}" "$DESTINO" "bash '$RUTA/releases/$VERSION/despliegue/activar.sh' '$RUTA' '$VERSION'"

Powered by TurnKey Linux.