diff --git a/.env.example b/.env.example index 9e495b3..3ba9c4f 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,11 @@ -# Copier en .env et renseigner avant le premier demarrage : -# cp .env.example .env && sed -i "s/CHANGEME/$(openssl rand -hex 24)/" .env +# Generer le .env avant le premier demarrage : +# +# grep -v '^DB_PASSWORD=' .env.example > .env +# printf 'DB_PASSWORD=%s\n' "$(openssl rand -hex 24)" >> .env +# chmod 600 .env +# +# Ne pas faire un sed global sur CHANGEME : le motif apparait aussi dans ce +# commentaire, et le mot de passe genere s'y retrouverait en clair. # Mot de passe PostgreSQL. Obligatoire : le compose refuse de demarrer sans. DB_PASSWORD=CHANGEME diff --git a/README.md b/README.md index 7df7a13..53e48cd 100644 --- a/README.md +++ b/README.md @@ -219,8 +219,8 @@ marche sur la première requête. ### Tout en conteneurs ```bash -cp .env.example .env -sed -i '' "s/CHANGEME/$(openssl rand -hex 24)/" .env # macOS ; sinon sed -i +grep -v '^DB_PASSWORD=' .env.example > .env +printf 'DB_PASSWORD=%s\n' "$(openssl rand -hex 24)" >> .env && chmod 600 .env docker compose up -d --build docker compose logs -f app diff --git a/deploy/deploy.sh b/deploy/deploy.sh new file mode 100755 index 0000000..d01c58f --- /dev/null +++ b/deploy/deploy.sh @@ -0,0 +1,49 @@ +#!/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