diff --git a/.kiro/specs/schotziad-km-tracker/design.md b/.kiro/specs/schotziad-km-tracker/design.md index 2581208..b475da2 100644 --- a/.kiro/specs/schotziad-km-tracker/design.md +++ b/.kiro/specs/schotziad-km-tracker/design.md @@ -1674,6 +1674,8 @@ La génération PDF est enveloppée dans un `CancellationToken` avec délai de 1 ## Déploiement (Docker Compose) +> **Procédure de déploiement (Git + Docker)** : le serveur récupère les sources depuis le dépôt Gitea (`http://192.168.1.55:3000/MadJax/SchotzIAD`, branche `master`) et reconstruit les conteneurs — l'ancienne méthode par copie d'archive est abandonnée. Le script `deploy.sh` (à la racine du dépôt) vérifie les prérequis (git, Docker, Docker Compose, présence du `.env`), détecte via `git fetch` si une nouvelle version de `master` est disponible et ne reconstruit (`docker compose up -d --build`) **que** dans ce cas (option `--force` pour forcer un rebuild sans nouveau commit). Le guide complet — installation des prérequis, premier `git clone`, création du `.env` à partir de `.env.example`, mises à jour et dépannage — figure dans **`DEPLOY.md`** à la racine du dépôt. + ### Architecture des conteneurs La solution est hébergée via **Docker Compose** avec deux services : diff --git a/DEPLOY.md b/DEPLOY.md new file mode 100644 index 0000000..dec3268 --- /dev/null +++ b/DEPLOY.md @@ -0,0 +1,133 @@ +# Déploiement de SchotzIAD KM Tracker + +Déploiement via **Git (Gitea) + Docker Compose**. Le serveur récupère les +sources depuis Gitea et reconstruit les conteneurs — plus besoin de copier une +archive. + +- Dépôt Gitea : `http://192.168.1.55:3000/MadJax/SchotzIAD` +- Branche déployée : `master` +- Frontend exposé sur le port hôte **2202** (derrière le reverse-proxy Caddy externe). + +--- + +## 1. Premier déploiement (une seule fois sur le serveur) + +### 1.1 Installer les prérequis + +Le serveur a besoin de **git** et de **Docker** (avec le plugin Compose v2). + +Sur Debian/Ubuntu : + +```bash +sudo apt update +sudo apt install -y git +# Docker + plugin compose : voir https://docs.docker.com/engine/install/ +# (paquets docker-ce, docker-ce-cli, containerd.io, docker-compose-plugin) +``` + +Vérification : + +```bash +git --version +docker --version +docker compose version +``` + +### 1.2 Cloner le dépôt + +```bash +git clone http://192.168.1.55:3000/MadJax/SchotzIAD SchotzIAD +cd SchotzIAD +``` + +Au premier `git clone`/`push`, Gitea demande identifiant + token. Avec le +credential helper `store` déjà en place, ils ne sont demandés qu'une fois. + +### 1.3 Créer le fichier `.env` + +Le `.env` n'est **jamais** versionné (il contient les secrets). On le crée à +partir du modèle fourni : + +```bash +cp .env.example .env +``` + +Puis éditer `.env` et renseigner au minimum : + +- `JWT_SECRET_KEY` : **obligatoire**. Générer une valeur aléatoire longue, ex. : + ```bash + openssl rand -base64 48 + ``` + (sans cette clé, le backend refuse de démarrer.) +- `AUTH_FRONTEND_BASE_URL` : l'URL publique du site (ex. `https://schotz.exemple.fr`), + utilisée dans les liens de réinitialisation de mot de passe. +- `ORS_API_KEY` : clé OpenRouteService (sinon distances à vol d'oiseau). +- `SMTP_*` : facultatif. Si `SMTP_HOST` est vide, le lien de réinitialisation + est seulement journalisé côté serveur. + +### 1.4 Premier démarrage + +```bash +./deploy.sh --force +``` + +(`--force` car il n'y a pas de « version précédente » à comparer la première fois.) + +--- + +## 2. Mettre à jour le site (à chaque nouvelle version) + +Depuis le dossier du dépôt sur le serveur : + +```bash +./deploy.sh +``` + +Le script : + +1. vérifie les prérequis (git, docker, docker compose, présence du `.env`) ; +2. récupère les références distantes (`git fetch`) ; +3. **ne reconstruit que si une nouvelle version existe** sur `master` : + - si le serveur est déjà à jour, il s'arrête sans rien reconstruire ; + - sinon il fait `git pull --ff-only` puis `docker compose up -d --build` ; +4. affiche l'état des conteneurs. + +Pour forcer une reconstruction sans nouveau commit (par exemple après avoir +modifié `.env`) : + +```bash +./deploy.sh --force +``` + +--- + +## 3. Données et persistance + +- La base SQLite est persistée via un bind mount dans `./data/trajets.db` + (créé au premier démarrage). Elle **survit** aux redéploiements et n'est pas + versionnée. +- Sauvegarde : il suffit de copier `./data/trajets.db` (idéalement conteneurs + arrêtés, ou via une copie à chaud suivie d'un `VACUUM INTO`). + +--- + +## 4. Dépannage + +- **`.env absent`** : copier `.env.example` vers `.env` et le renseigner (étape 1.3). +- **`git pull --ff-only a échoué`** : l'historique local du serveur a divergé + (commits locaux non souhaités). Revenir à l'état distant : + ```bash + git fetch origin + git reset --hard origin/master # ⚠ écrase les modifs locales non commitées + ``` +- **`JWT_SECRET_KEY requis`** au démarrage du backend : la clé est absente du + `.env` (voir étape 1.3). +- **Voir les logs** : + ```bash + docker compose logs -f backend + docker compose logs -f frontend + ``` +- **Redémarrer sans rebuild** : + ```bash + docker compose restart + ``` diff --git a/deploy.sh b/deploy.sh new file mode 100755 index 0000000..62e0f3d --- /dev/null +++ b/deploy.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +# Déploiement / mise à jour de SchotzIAD KM Tracker via Git + Docker Compose. +# +# Récupère la dernière version depuis Gitea (branche master) et ne reconstruit +# les conteneurs QUE si une nouvelle version est disponible. À exécuter sur le +# serveur, dans le dépôt cloné (voir DEPLOY.md pour le premier déploiement). +# +# Usage : +# ./deploy.sh Met à jour puis rebuild uniquement si nouveau commit. +# ./deploy.sh --force Rebuild même sans nouveau commit (ex. après édition du .env). +# +# Codes de sortie : 0 = succès (ou déjà à jour), 1 = erreur de prérequis/déploiement. + +set -uo pipefail + +RACINE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$RACINE" + +BRANCHE="master" +FORCER=0 +[[ "${1:-}" == "--force" ]] && FORCER=1 + +echo "→ Déploiement SchotzIAD (dépôt : $RACINE, branche : $BRANCHE)" + +# --- 1. Prérequis ----------------------------------------------------------- +erreur() { echo "✗ $1" >&2; exit 1; } + +command -v git >/dev/null 2>&1 || erreur "git n'est pas installé (voir DEPLOY.md)." +command -v docker >/dev/null 2>&1 || erreur "docker n'est pas installé (voir DEPLOY.md)." + +# Docker Compose v2 (plugin « docker compose ») ou v1 (« docker-compose »). +if docker compose version >/dev/null 2>&1; then + COMPOSE="docker compose" +elif command -v docker-compose >/dev/null 2>&1; then + COMPOSE="docker-compose" +else + erreur "docker compose introuvable (ni le plugin v2, ni docker-compose v1)." +fi + +[[ -f "$RACINE/.env" ]] || erreur "Fichier .env absent. Copiez .env.example vers .env et renseignez-le (voir DEPLOY.md)." + +# --- 2. Détection d'une nouvelle version ------------------------------------ +echo "→ Récupération des références distantes (git fetch)…" +git fetch --quiet origin "$BRANCHE" || erreur "git fetch a échoué (accès à Gitea ?)." + +LOCAL="$(git rev-parse "$BRANCHE")" +DISTANT="$(git rev-parse "origin/$BRANCHE")" + +if [[ "$LOCAL" == "$DISTANT" && "$FORCER" -eq 0 ]]; then + echo "✓ Déjà à jour (commit ${LOCAL:0:8}). Aucun rebuild." + echo " (Utilisez ./deploy.sh --force pour reconstruire malgré tout.)" + exit 0 +fi + +# --- 3. Mise à jour du code ------------------------------------------------- +if [[ "$LOCAL" != "$DISTANT" ]]; then + echo "→ Nouvelle version détectée : ${LOCAL:0:8} → ${DISTANT:0:8}. Mise à jour…" + git pull --ff-only origin "$BRANCHE" || erreur "git pull --ff-only a échoué (historique divergent ? voir DEPLOY.md)." +else + echo "→ Pas de nouveau commit, mais --force demandé : reconstruction." +fi + +# --- 4. (Re)construction et démarrage --------------------------------------- +echo "→ Construction et démarrage des conteneurs ($COMPOSE up -d --build)…" +$COMPOSE up -d --build || erreur "Le déploiement Docker a échoué." + +echo "→ État des conteneurs :" +$COMPOSE ps + +echo "✓ Déploiement terminé (version ${DISTANT:0:8})."