From 8f531d2e0e37630ebd89d3b7bc6f131b21128e9d Mon Sep 17 00:00:00 2001 From: billisdead Date: Sun, 24 May 2026 13:17:06 +0200 Subject: [PATCH] =?UTF-8?q?Proc=C3=A9dure=20de=20d=C3=A9veloppement=20loca?= =?UTF-8?q?l=20+=20tunnel=20SSH?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Nouveau script scripts/dev-local.sh : lance Flask (port 8080) et le serveur Vite dev (port 5173) en parallèle avec nettoyage propre (trap EXIT/INT/TERM). VITE_API_URL est injecté pour pointer vers Flask local, accessible depuis le client via tunnel SSH. - docs/INSTALL_ROCKY.md : nouvelle section 16 avec schéma ASCII, procédure pas-à-pas et commande tunnel SSH exacte. - docs/INSTALL_ROCKY.md : corrige les deux références cassées à vite.config.selfhost.ts (sections 9 et 15.1) supprimé lors de la dé-Replit-isation. Co-Authored-By: Claude Sonnet 4.6 --- docs/INSTALL_ROCKY.md | 66 ++++++++++++++++++++++- scripts/dev-local.sh | 120 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 184 insertions(+), 2 deletions(-) create mode 100755 scripts/dev-local.sh diff --git a/docs/INSTALL_ROCKY.md b/docs/INSTALL_ROCKY.md index d174a9c..5ba0ee1 100644 --- a/docs/INSTALL_ROCKY.md +++ b/docs/INSTALL_ROCKY.md @@ -25,6 +25,7 @@ 13. [Vérification finale](#13-vérification-finale) 14. [Disaster Recovery](#14-disaster-recovery) 15. [Maintenance et mises à jour](#15-maintenance-et-mises-à-jour) +16. [Développement local avec tunnel SSH](#16-développement-local-avec-tunnel-ssh) --- @@ -233,7 +234,7 @@ pnpm install # Construire le frontend (lit VITE_APP_URL depuis .env) source .env export VITE_APP_URL -pnpm --filter @workspace/voix-du-peuple run build --config vite.config.selfhost.ts +pnpm --filter @workspace/voix-du-peuple run build # Vérifier que le build est présent ls artifacts/voix-du-peuple/dist/public/ @@ -439,7 +440,7 @@ pnpm install # Reconstruire le frontend (toujours faire après un pull) source .env && export VITE_APP_URL -pnpm --filter @workspace/voix-du-peuple run build --config vite.config.selfhost.ts +pnpm --filter @workspace/voix-du-peuple run build # Appliquer systemctl restart voix-du-peuple-api @@ -540,3 +541,64 @@ crontab -e | Backup BDD | `pg_dump -U voix_user -h 127.0.0.1 voix_du_peuple > backup.sql` | | Purger les données | `psql -U voix_user -h 127.0.0.1 voix_du_peuple -c "TRUNCATE ideas; TRUNCATE synthesis;"` | | Health check | `curl http://127.0.0.1:8080/health` | + +--- + +## 16. Développement local avec tunnel SSH + +Cette procédure permet de prévisualiser l'application directement depuis votre +machine sans avoir à configurer Nginx ni reconstruire le frontend à chaque +modification. + +### 16.1 Principe + +``` +Votre machine locale Serveur distant +┌─────────────────┐ ┌──────────────────────────┐ +│ navigateur │ tunnel │ Vite dev server :5173 │ +│ localhost:5173 │◄─────────►│ │ +│ localhost:8080 │ │ Flask API :8080 │ +└─────────────────┘ └──────────────────────────┘ +``` + +Le tunnel SSH redirige les deux ports localement — aucun port n'est ouvert sur +Internet. + +### 16.2 Démarrer les serveurs + +```bash +cd /opt/voix-du-peuple +bash scripts/dev-local.sh +``` + +Le script : +1. Charge `.env` +2. Démarre l'API Flask sur le port `PORT` (défaut : 8080) +3. Démarre le serveur Vite sur le port 5173 +4. Affiche la commande tunnel SSH à exécuter depuis votre machine +5. S'arrête proprement (Ctrl+C) en tuant les deux processus + +> **Note** : PostgreSQL doit être en cours d'exécution et `DATABASE_URL` +> correctement renseignée dans `.env`. + +### 16.3 Ouvrir le tunnel SSH + +Depuis **votre machine locale** (pas le serveur) : + +```bash +ssh -L 5173:localhost:5173 -L 8080:localhost:8080 utilisateur@votre-serveur +``` + +Maintenez cette connexion SSH ouverte pendant toute la session de travail. + +### 16.4 Accéder à l'interface + +Ouvrez `http://localhost:5173` dans votre navigateur local. + +Le rechargement à chaud (HMR) fonctionne : toute modification dans +`artifacts/voix-du-peuple/src/` est reflétée instantanément sans rebuild. + +### 16.5 Arrêter + +- Ctrl+C dans le terminal où tourne `dev-local.sh` (arrête Flask et Vite) +- Fermer la connexion SSH (ou Ctrl+C dans le terminal du tunnel) diff --git a/scripts/dev-local.sh b/scripts/dev-local.sh new file mode 100755 index 0000000..ad85ac5 --- /dev/null +++ b/scripts/dev-local.sh @@ -0,0 +1,120 @@ +#!/usr/bin/env bash +# dev-local.sh — Lance l'API Flask + le serveur Vite en mode développement +# +# Usage : bash scripts/dev-local.sh +# +# 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. +# +# Prérequis : +# - PostgreSQL en cours d'exécution et DATABASE_URL configurée dans .env +# - Virtualenv Python présent (.venv/) — voir section 7 de docs/INSTALL_ROCKY.md +# - pnpm installé (npm install -g pnpm) + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +ENV_FILE="$ROOT/.env" + +# ─── Vérifications préalables ──────────────────────────────────────────────── + +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 + +if [ ! -f "$ROOT/.venv/bin/python" ]; then + echo "Erreur : virtualenv Python introuvable (.venv/bin/python)." + echo "Consultez la section 7 de docs/INSTALL_ROCKY.md pour le créer." + exit 1 +fi + +if ! command -v pnpm &>/dev/null; then + echo "Erreur : pnpm introuvable." + echo "Installez-le avec : npm install -g pnpm" + exit 1 +fi + +# ─── Chargement de l'environnement ─────────────────────────────────────────── + +set -a +# shellcheck disable=SC1090 +source "$ENV_FILE" +set +a + +FLASK_PORT="${PORT:-8080}" +VITE_PORT=5173 + +# ─── Dépendances Node ───────────────────────────────────────────────────────── + +if [ ! -d "$ROOT/node_modules" ]; then + echo "Installation des dépendances Node (première exécution)…" + (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"