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