video-surveillance-app/deploy/deploy.sh

66 lines
2.4 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
#
# Redeploiement sur le serveur Hetzner.
#
# ./deploy/deploy.sh
#
# Le build tourne sur le serveur, dans le conteneur Maven : la machine de dev
# n'a pas besoin d'un JDK 21, et l'architecture (arm64 ici, x86_64 la-bas) ne
# pose pas de probleme.
set -euo pipefail
HOST="${DEPLOY_HOST:-hetzner}"
REMOTE_DIR="${DEPLOY_DIR:-/opt/iot-alarm-system}"
LOCAL_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
echo "==> Synchronisation vers ${HOST}:${REMOTE_DIR}"
# --delete sans toucher au .env : il contient le mot de passe de la base et
# n'existe que sur le serveur.
rsync -az --delete \
--exclude 'target/' \
--exclude '.git/' \
--exclude '.env' \
--exclude '.DS_Store' \
"${LOCAL_DIR}/" "${HOST}:${REMOTE_DIR}/"
echo "==> Rendu de la configuration MediaMTX"
# Le mot de passe de publication vit dans le .env du serveur et n'existe nulle
# part dans le depot. Le fichier rendu est gitignore.
ssh "${HOST}" "cd ${REMOTE_DIR} && \
PASS=\$(grep '^STREAM_PUBLISH_PASSWORD=' .env | cut -d= -f2-) && \
APIPASS=\$(grep '^MEDIA_API_PASSWORD=' .env | cut -d= -f2-) && \
PUBLIC_IP=\$(curl -s --max-time 10 https://api.ipify.org) && \
sed -e \"s|__PUBLISH_PASSWORD__|\${PASS}|\" \
-e \"s|__API_PASSWORD__|\${APIPASS}|\" \
-e \"s|__PUBLIC_IP__|\${PUBLIC_IP}|\" \
deploy/mediamtx/mediamtx.yml.template > deploy/mediamtx/mediamtx.yml && \
chmod 600 deploy/mediamtx/mediamtx.yml"
echo "==> Build de l'image (tests unitaires + ArchUnit inclus)"
ssh "${HOST}" "cd ${REMOTE_DIR} && docker compose build app"
echo "==> Redemarrage"
ssh "${HOST}" "cd ${REMOTE_DIR} && docker compose up -d"
# `up -d` ne recree pas un conteneur dont seule la configuration montee a
# change : MediaMTX garderait l'ancienne en memoire.
ssh "${HOST}" "cd ${REMOTE_DIR} && docker compose restart mediamtx"
echo "==> Attente du healthcheck"
for i in $(seq 1 30); do
status=$(ssh "${HOST}" "docker inspect -f '{{.State.Health.Status}}' iot-alarm-app 2>/dev/null || echo absent")
if [ "${status}" = "healthy" ]; then
echo "==> Application saine"
ssh "${HOST}" "docker exec iot-alarm-app wget -qO- http://localhost:8080/api/v1/alarm/status"
echo
exit 0
fi
printf '.'
sleep 5
done
echo
echo "!! L'application n'est pas devenue saine. Logs :" >&2
ssh "${HOST}" "cd ${REMOTE_DIR} && docker compose logs --tail 60 app" >&2
exit 1