Files
ScriptVPS/vps-monitor/start.sh
jeanotx32 c7cc18101a
Some checks failed
Build and Push Docker Images / docker (push) Failing after 9s
Feat : Various features
2026-05-18 23:48:50 -04:00

195 lines
9.2 KiB
Bash
Executable File

#!/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" \
--reload \
--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"