Files
billisdead be507cb229 dev-local.sh : installation automatique des prérequis
- Venv Python : création automatique si absent (détecte python3.11,
  python3, python >= 3.9 ; erreur guidée si introuvable)
- Dépendances pip : pip install -r requirements.txt à chaque lancement
  (no-op si rien n'a changé, garantit la cohérence après un pull)
- pnpm : installation automatique via corepack (si dispo) ou npm
- Node.js : non installable sans root — message d'erreur avec commandes
  exactes pour Rocky/RHEL, Debian/Ubuntu et nvm

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 15:33:40 +02:00

167 lines
7.3 KiB
Bash
Executable File

#!/usr/bin/env bash
# dev-local.sh — Lance l'API Flask + le serveur Vite en mode développement
#
# Usage : bash scripts/dev-local.sh
#
# Le script installe automatiquement les prérequis manquants (venv Python,
# dépendances pip, pnpm, node_modules). Node.js et PostgreSQL doivent être
# présents au préalable (installation système, voir docs/INSTALL_ROCKY.md).
#
# Pour accéder à l'interface depuis votre machine locale, ouvrez un tunnel SSH :
# ssh -L 5173:localhost:5173 -L 8080:localhost:8080 utilisateur@votre-serveur
# Puis ouvrez http://localhost:5173 dans votre navigateur.
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
ENV_FILE="$ROOT/.env"
# ─── Fichier .env ─────────────────────────────────────────────────────────────
if [ ! -f "$ENV_FILE" ]; then
echo "Erreur : fichier .env introuvable."
echo "Copiez .env.example et remplissez les valeurs :"
echo " cp \"$ROOT/.env.example\" \"$ENV_FILE\" && \${EDITOR:-vim} \"$ENV_FILE\""
exit 1
fi
set -a
# shellcheck disable=SC1090
source "$ENV_FILE"
set +a
FLASK_PORT="${PORT:-8080}"
VITE_PORT=5173
# ─── Python : venv + dépendances pip ─────────────────────────────────────────
if [ ! -f "$ROOT/.venv/bin/python" ]; then
echo "→ Création du virtualenv Python…"
# Cherche python3.11, puis python3, puis python (>= 3.9)
PYTHON_BIN=""
for bin in python3.11 python3 python; do
if command -v "$bin" &>/dev/null \
&& "$bin" -c "import sys; sys.exit(0 if sys.version_info >= (3, 9) else 1)" 2>/dev/null; then
PYTHON_BIN="$bin"
break
fi
done
if [ -z "$PYTHON_BIN" ]; then
echo "Erreur : Python 3.9+ introuvable."
echo "Installez Python 3.11 :"
echo " Rocky/RHEL → dnf install -y python3.11"
echo " Debian/Ubuntu → apt install -y python3.11"
exit 1
fi
"$PYTHON_BIN" -m venv "$ROOT/.venv"
echo " Virtualenv créé avec $("$ROOT/.venv/bin/python" --version)."
fi
echo "→ Vérification des dépendances Python…"
"$ROOT/.venv/bin/pip" install --upgrade pip --quiet
"$ROOT/.venv/bin/pip" install -r "$ROOT/artifacts/flask-api/requirements.txt" --quiet
echo " OK."
# ─── Node.js ──────────────────────────────────────────────────────────────────
if ! command -v node &>/dev/null; then
echo "Erreur : Node.js introuvable (installation système requise)."
echo "Installez Node.js 20 :"
echo " Rocky/RHEL → curl -fsSL https://rpm.nodesource.com/setup_20.x | bash -"
echo " dnf install -y nodejs"
echo " Debian/Ubuntu → curl -fsSL https://deb.nodesource.com/setup_20.x | bash -"
echo " apt install -y nodejs"
echo " nvm (universel) → https://github.com/nvm-sh/nvm"
exit 1
fi
# ─── pnpm ─────────────────────────────────────────────────────────────────────
if ! command -v pnpm &>/dev/null; then
echo "→ Installation de pnpm…"
if command -v corepack &>/dev/null; then
corepack enable
corepack prepare pnpm@latest --activate
elif command -v npm &>/dev/null; then
npm install -g pnpm --quiet
else
echo "Erreur : ni corepack ni npm disponibles pour installer pnpm."
exit 1
fi
echo " pnpm $(pnpm --version) installé."
fi
# ─── Dépendances Node ─────────────────────────────────────────────────────────
if [ ! -d "$ROOT/node_modules" ]; then
echo "→ Installation des dépendances Node…"
(cd "$ROOT" && pnpm install --frozen-lockfile)
fi
# ─── Bannière ─────────────────────────────────────────────────────────────────
echo ""
echo "┌──────────────────────────────────────────────────────────────┐"
echo "│ La Voix du Peuple — développement local │"
echo "├──────────────────────────────────────────────────────────────┤"
printf "│ API Flask → http://localhost:%-5s │\n" "${FLASK_PORT}"
printf "│ Interface → http://localhost:%-5s │\n" "${VITE_PORT}"
echo "├──────────────────────────────────────────────────────────────┤"
echo "│ Tunnel SSH depuis votre machine locale : │"
printf "│ ssh -L %s:localhost:%s \\\\\n│ -L %s:localhost:%s utilisateur@serveur │\n" \
"${VITE_PORT}" "${VITE_PORT}" "${FLASK_PORT}" "${FLASK_PORT}"
printf "│ Puis ouvrez : http://localhost:%-5s │\n" "${VITE_PORT}"
echo "└──────────────────────────────────────────────────────────────┘"
echo ""
# ─── Nettoyage à la sortie ────────────────────────────────────────────────────
cleanup() {
echo ""
echo "Arrêt des serveurs…"
kill "$FLASK_PID" "$VITE_PID" 2>/dev/null || true
wait "$FLASK_PID" "$VITE_PID" 2>/dev/null || true
echo "Arrêté."
}
trap cleanup EXIT INT TERM
# ─── Démarrage de Flask ───────────────────────────────────────────────────────
echo "→ Démarrage de Flask (port ${FLASK_PORT})…"
(
cd "$ROOT/artifacts/flask-api"
PORT="${FLASK_PORT}" "$ROOT/.venv/bin/python" app.py
) &
FLASK_PID=$!
# Laisser Flask s'initialiser (init_db inclus)
sleep 2
if ! kill -0 "$FLASK_PID" 2>/dev/null; then
echo ""
echo "Erreur : Flask ne démarre pas."
echo "Vérifiez DATABASE_URL et les autres variables dans .env."
echo "Logs disponibles dans le terminal ci-dessus."
exit 1
fi
# ─── Démarrage du serveur Vite ────────────────────────────────────────────────
echo "→ Démarrage du serveur Vite (port ${VITE_PORT})…"
(
cd "$ROOT/artifacts/voix-du-peuple"
# PORT non défini → Vite retombe sur 5173 (voir vite.config.ts)
# VITE_API_URL pointe vers Flask local, accessible via le tunnel SSH
unset PORT
VITE_API_URL="http://localhost:${FLASK_PORT}" pnpm dev
) &
VITE_PID=$!
echo ""
echo "Les deux serveurs sont démarrés. Appuyez sur Ctrl+C pour arrêter."
echo ""
# Attendre la fin de l'un ou l'autre des processus
wait -n "$FLASK_PID" "$VITE_PID" 2>/dev/null || wait "$FLASK_PID" "$VITE_PID"