Procédure de développement local + tunnel SSH
- 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 <noreply@anthropic.com>
This commit is contained in:
+64
-2
@@ -25,6 +25,7 @@
|
|||||||
13. [Vérification finale](#13-vérification-finale)
|
13. [Vérification finale](#13-vérification-finale)
|
||||||
14. [Disaster Recovery](#14-disaster-recovery)
|
14. [Disaster Recovery](#14-disaster-recovery)
|
||||||
15. [Maintenance et mises à jour](#15-maintenance-et-mises-à-jour)
|
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)
|
# Construire le frontend (lit VITE_APP_URL depuis .env)
|
||||||
source .env
|
source .env
|
||||||
export VITE_APP_URL
|
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
|
# Vérifier que le build est présent
|
||||||
ls artifacts/voix-du-peuple/dist/public/
|
ls artifacts/voix-du-peuple/dist/public/
|
||||||
@@ -439,7 +440,7 @@ pnpm install
|
|||||||
|
|
||||||
# Reconstruire le frontend (toujours faire après un pull)
|
# Reconstruire le frontend (toujours faire après un pull)
|
||||||
source .env && export VITE_APP_URL
|
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
|
# Appliquer
|
||||||
systemctl restart voix-du-peuple-api
|
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` |
|
| 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;"` |
|
| 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` |
|
| 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)
|
||||||
|
|||||||
Executable
+120
@@ -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"
|
||||||
Reference in New Issue
Block a user