#!/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