This commit is contained in:
193
vps-monitor/start.sh
Executable file
193
vps-monitor/start.sh
Executable file
@@ -0,0 +1,193 @@
|
||||
#!/usr/bin/env bash
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
# VPS Monitor — script de démarrage rapide
|
||||
# Lance le backend Python et le frontend React en développement.
|
||||
# Usage : ./start.sh
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
set -euo pipefail
|
||||
|
||||
# ── Couleurs ─────────────────────────────────────────────────────────────────
|
||||
R="\033[0m"; BOLD="\033[1m"; GRN="\033[32m"; YEL="\033[33m"
|
||||
RED="\033[31m"; CYN="\033[36m"; DIM="\033[2m"
|
||||
|
||||
log() { echo -e "${CYN}[VPS Monitor]${R} $*"; }
|
||||
ok() { echo -e "${GRN}[✓]${R} $*"; }
|
||||
warn() { echo -e "${YEL}[!]${R} $*"; }
|
||||
die() { echo -e "${RED}[✗]${R} $*" >&2; exit 1; }
|
||||
|
||||
# ── Répertoires ───────────────────────────────────────────────────────────────
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
BACKEND_DIR="$SCRIPT_DIR/backend"
|
||||
FRONTEND_DIR="$SCRIPT_DIR/frontend"
|
||||
VENV_DIR="$BACKEND_DIR/.venv"
|
||||
PIDS_FILE="$SCRIPT_DIR/.pids"
|
||||
|
||||
BACKEND_PORT="${BACKEND_PORT:-8000}"
|
||||
FRONTEND_PORT="${FRONTEND_PORT:-5173}"
|
||||
|
||||
# ── Nettoyage à la sortie ─────────────────────────────────────────────────────
|
||||
cleanup() {
|
||||
echo ""
|
||||
log "Arrêt des services…"
|
||||
if [[ -f "$PIDS_FILE" ]]; then
|
||||
while IFS= read -r pid; do
|
||||
kill "$pid" 2>/dev/null && echo -e " ${DIM}PID $pid arrêté${R}" || true
|
||||
done < "$PIDS_FILE"
|
||||
rm -f "$PIDS_FILE"
|
||||
fi
|
||||
ok "Arrêt propre."
|
||||
}
|
||||
trap cleanup EXIT INT TERM
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
# 1. Vérification des prérequis
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
echo ""
|
||||
echo -e "${BOLD}${CYN}══════════════════════════════════════════${R}"
|
||||
echo -e "${BOLD}${CYN} VPS Monitor — Démarrage ${R}"
|
||||
echo -e "${BOLD}${CYN}══════════════════════════════════════════${R}"
|
||||
echo ""
|
||||
log "Vérification des prérequis…"
|
||||
|
||||
PYTHON_BIN=""
|
||||
for bin in python3 python; do
|
||||
if command -v "$bin" &>/dev/null && "$bin" -c "import sys; assert sys.version_info >= (3,10)" 2>/dev/null; then
|
||||
PYTHON_BIN="$bin"
|
||||
break
|
||||
fi
|
||||
done
|
||||
[[ -z "$PYTHON_BIN" ]] && die "Python 3.10+ requis (python3 ou python introuvable)."
|
||||
ok "Python : $($PYTHON_BIN --version)"
|
||||
|
||||
command -v node &>/dev/null || die "Node.js requis (https://nodejs.org)."
|
||||
ok "Node : $(node --version)"
|
||||
|
||||
command -v npm &>/dev/null || die "npm requis."
|
||||
ok "npm : $(npm --version)"
|
||||
echo ""
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
# 2. Configuration du backend
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
log "Préparation du backend…"
|
||||
|
||||
# Environnement virtuel
|
||||
if [[ ! -d "$VENV_DIR" ]]; then
|
||||
log "Création du virtualenv Python…"
|
||||
"$PYTHON_BIN" -m venv "$VENV_DIR"
|
||||
fi
|
||||
|
||||
VENV_PYTHON="$VENV_DIR/bin/python"
|
||||
VENV_PIP="$VENV_DIR/bin/pip"
|
||||
|
||||
# Dépendances backend
|
||||
INSTALLED_MARKER="$VENV_DIR/.installed"
|
||||
REQ_HASH=$(md5sum "$BACKEND_DIR/requirements.txt" 2>/dev/null | cut -d' ' -f1 || echo "none")
|
||||
|
||||
if [[ ! -f "$INSTALLED_MARKER" ]] || [[ "$(cat "$INSTALLED_MARKER" 2>/dev/null)" != "$REQ_HASH" ]]; then
|
||||
log "Installation des dépendances Python…"
|
||||
"$VENV_PIP" install --quiet --upgrade pip
|
||||
"$VENV_PIP" install --quiet -r "$BACKEND_DIR/requirements.txt"
|
||||
echo "$REQ_HASH" > "$INSTALLED_MARKER"
|
||||
ok "Dépendances Python installées."
|
||||
else
|
||||
ok "Dépendances Python déjà à jour."
|
||||
fi
|
||||
|
||||
# Fichier .env du backend
|
||||
if [[ ! -f "$BACKEND_DIR/.env" ]]; then
|
||||
if [[ -f "$BACKEND_DIR/.env.example" ]]; then
|
||||
cp "$BACKEND_DIR/.env.example" "$BACKEND_DIR/.env"
|
||||
warn "Fichier .env créé depuis .env.example → $BACKEND_DIR/.env"
|
||||
warn "Pensez à vérifier la config (CORS_ORIGINS, etc.)."
|
||||
fi
|
||||
fi
|
||||
|
||||
# Dossier data
|
||||
mkdir -p "$BACKEND_DIR/data"
|
||||
echo ""
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
# 3. Configuration du frontend
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
log "Préparation du frontend…"
|
||||
|
||||
if [[ ! -d "$FRONTEND_DIR/node_modules" ]]; then
|
||||
log "Installation des dépendances npm…"
|
||||
npm install --prefix "$FRONTEND_DIR" --silent
|
||||
ok "Dépendances npm installées."
|
||||
else
|
||||
ok "node_modules déjà présent."
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
# 4. Démarrage des services
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
rm -f "$PIDS_FILE"
|
||||
LOGS_DIR="$SCRIPT_DIR/.logs"
|
||||
mkdir -p "$LOGS_DIR"
|
||||
|
||||
log "Démarrage du backend (port $BACKEND_PORT)…"
|
||||
(
|
||||
cd "$BACKEND_DIR"
|
||||
# Charge .env si python-dotenv est dispo, sinon exporte manuellement
|
||||
if [[ -f ".env" ]]; then
|
||||
set -a; source .env; set +a
|
||||
fi
|
||||
"$VENV_DIR/bin/uvicorn" main:app \
|
||||
--host 0.0.0.0 \
|
||||
--port "$BACKEND_PORT" \
|
||||
--log-level warning \
|
||||
2>&1 | sed 's/^/ [backend] /'
|
||||
) &
|
||||
BACKEND_PID=$!
|
||||
echo "$BACKEND_PID" >> "$PIDS_FILE"
|
||||
|
||||
# Attend que le backend réponde
|
||||
log "Attente du backend…"
|
||||
for i in $(seq 1 20); do
|
||||
if curl -sf "http://localhost:$BACKEND_PORT/api/vps" >/dev/null 2>&1; then
|
||||
break
|
||||
fi
|
||||
sleep 0.5
|
||||
done
|
||||
ok "Backend prêt."
|
||||
|
||||
log "Démarrage du frontend (port $FRONTEND_PORT)…"
|
||||
(
|
||||
npm run dev --prefix "$FRONTEND_DIR" -- \
|
||||
--port "$FRONTEND_PORT" \
|
||||
--strictPort \
|
||||
2>&1 | sed 's/^/ [frontend] /'
|
||||
) &
|
||||
FRONTEND_PID=$!
|
||||
echo "$FRONTEND_PID" >> "$PIDS_FILE"
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
# 5. Résumé
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
sleep 1
|
||||
echo ""
|
||||
echo -e "${BOLD}${GRN}══════════════════════════════════════════${R}"
|
||||
echo -e "${BOLD}${GRN} Application démarrée ! ${R}"
|
||||
echo -e "${BOLD}${GRN}══════════════════════════════════════════${R}"
|
||||
echo ""
|
||||
echo -e " ${BOLD}Frontend${R} → ${CYN}http://localhost:$FRONTEND_PORT${R}"
|
||||
echo -e " ${BOLD}Backend${R} → ${CYN}http://localhost:$BACKEND_PORT${R}"
|
||||
echo -e " ${BOLD}API docs${R} → ${CYN}http://localhost:$BACKEND_PORT/docs${R}"
|
||||
echo ""
|
||||
echo -e " ${DIM}Ctrl+C pour arrêter${R}"
|
||||
echo ""
|
||||
|
||||
# Ouvre le navigateur automatiquement (si disponible)
|
||||
if command -v xdg-open &>/dev/null; then
|
||||
xdg-open "http://localhost:$FRONTEND_PORT" &>/dev/null &
|
||||
elif command -v open &>/dev/null; then
|
||||
open "http://localhost:$FRONTEND_PORT" &>/dev/null &
|
||||
fi
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
# 6. Attente — affiche les logs des deux services en temps réel
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
wait "$BACKEND_PID" "$FRONTEND_PID"
|
||||
Reference in New Issue
Block a user