diff --git a/vps-monitor/agent/INSTALL.md b/vps-monitor/agent/INSTALL.md new file mode 100644 index 0000000..420a569 --- /dev/null +++ b/vps-monitor/agent/INSTALL.md @@ -0,0 +1,155 @@ +# VPS Monitor Agent — Guide d'installation + +L'agent est un service léger à déployer sur chaque VPS à superviser. +Il expose une API REST locale que le backend central interroge pour lire l'état des conteneurs Docker et exécuter des actions. + +--- + +## Prérequis + +| Dépendance | Version minimale | Installation | +|------------|-----------------|--------------| +| Python 3 | 3.10+ | `apt install python3 python3-venv` | +| Docker | 24+ | [docs.docker.com](https://docs.docker.com/engine/install/) | +| curl | — | `apt install curl` | +| systemd | — | Inclus sur Debian/Ubuntu/Rocky | + +--- + +## Installation rapide (one-liner) + +```bash +curl -fsSL https://git.jeanbonapp.com/jeanbon/ScriptVPS/raw/branch/main/vps-monitor/agent/install.sh \ + | sudo bash +``` + +La clé API et le port sont générés/affichés automatiquement à la fin. + +--- + +## Options disponibles + +``` +sudo bash install.sh [OPTIONS] + +Options : + --key Clé API à utiliser (générée aléatoirement si omise) + --port Port d'écoute de l'agent (défaut : 8001) + --branch Branche du dépôt à utiliser (défaut : main) + --update Met à jour l'agent sans changer la configuration + --uninstall Supprime complètement l'agent et le service +``` + +### Exemples + +```bash +# Installation avec une clé et un port personnalisés +sudo bash install.sh --key "ma-super-cle-secrete" --port 8002 + +# Installer depuis une branche de développement +sudo bash install.sh --branch develop + +# Mettre à jour vers la dernière version +sudo bash install.sh --update + +# Désinstaller +sudo bash install.sh --uninstall +``` + +--- + +## Ce que fait le script + +1. **Télécharge** `agent.py` et `requirements.txt` depuis le dépôt Gitea (branche configurable). +2. **Crée** `/opt/vps-monitor-agent/` avec un environnement virtuel Python isolé. +3. **Installe** les dépendances Python (`fastapi`, `uvicorn`, `docker`). +4. **Génère** `/opt/vps-monitor-agent/.env` avec la clé API et le port (permissions `600`). +5. **Configure** et **démarre** le service systemd `vps-monitor-agent`. +6. **Affiche** l'adresse IP publique et la clé API à copier dans le backend. + +--- + +## Arborescence installée + +``` +/opt/vps-monitor-agent/ +├── agent.py # Code de l'agent +├── requirements.txt # Dépendances Python +├── .env # Clé API et port (chmod 600) +└── venv/ # Environnement virtuel Python +``` + +--- + +## Gestion du service + +```bash +# État +systemctl status vps-monitor-agent + +# Logs en direct +journalctl -u vps-monitor-agent -f + +# Redémarrer +systemctl restart vps-monitor-agent + +# Arrêter +systemctl stop vps-monitor-agent +``` + +--- + +## Mise à jour + +```bash +sudo bash install.sh --update +``` + +Le script `--update` : +- Retélécharge `agent.py` et `requirements.txt` depuis le dépôt. +- Met à jour les dépendances Python si besoin. +- Redémarre le service. +- **Conserve** la clé API et le port existants. + +Pour mettre à jour le script lui-même avant de lancer `--update` : + +```bash +curl -fsSL https://git.jeanbonapp.com/jeanbon/ScriptVPS/raw/branch/main/vps-monitor/agent/install.sh \ + -o install.sh && sudo bash install.sh --update +``` + +--- + +## Configuration du backend central + +Après l'installation, renseignez les informations de l'agent dans l'interface web : + +| Champ | Valeur | +|-------|--------| +| Hôte | IP publique du VPS | +| Port | Port choisi (défaut `8001`) | +| Clé API | Affichée à la fin de l'installation | + +--- + +## Variables d'environnement + +Le fichier `.env` supporte les variables suivantes : + +| Variable | Défaut | Description | +|----------|--------|-------------| +| `AGENT_API_KEY` | *(généré)* | Clé secrète partagée avec le backend | +| `AGENT_PORT` | `8001` | Port TCP d'écoute | + +Pour modifier la configuration sans réinstaller : + +```bash +sudo nano /opt/vps-monitor-agent/.env +sudo systemctl restart vps-monitor-agent +``` + +--- + +## Dépôt source + +[https://git.jeanbonapp.com/jeanbon/ScriptVPS](https://git.jeanbonapp.com/jeanbon/ScriptVPS) diff --git a/vps-monitor/agent/install.sh b/vps-monitor/agent/install.sh new file mode 100755 index 0000000..408c5cd --- /dev/null +++ b/vps-monitor/agent/install.sh @@ -0,0 +1,220 @@ +#!/usr/bin/env bash +# ============================================================================= +# VPS Monitor Agent — script d'installation / mise à jour +# Télécharge les fichiers depuis le dépôt Gitea et configure un service systemd. +# +# Usage : +# sudo bash install.sh [--port PORT] [--key API_KEY] [--branch BRANCH] +# sudo bash install.sh --update [--branch BRANCH] +# sudo bash install.sh --uninstall +# ============================================================================= +set -euo pipefail + +# ─── Constantes ─────────────────────────────────────────────────────────────── +REPO_BASE="https://git.jeanbonapp.com/jeanbon/ScriptVPS/raw/branch" +REPO_FILES=( + "vps-monitor/agent/agent.py" + "vps-monitor/agent/requirements.txt" +) + +INSTALL_DIR="/opt/vps-monitor-agent" +SERVICE_NAME="vps-monitor-agent" +SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service" +DEFAULT_PORT=8001 +DEFAULT_BRANCH="main" + +# ─── Couleurs ───────────────────────────────────────────────────────────────── +RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'; NC='\033[0m' +info() { echo -e "${CYAN}[INFO]${NC} $*"; } +success() { echo -e "${GREEN}[OK]${NC} $*"; } +warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } +error() { echo -e "${RED}[ERROR]${NC} $*" >&2; exit 1; } + +# ─── Arguments ──────────────────────────────────────────────────────────────── +AGENT_PORT=$DEFAULT_PORT +AGENT_API_KEY="" +REPO_BRANCH=$DEFAULT_BRANCH +MODE="install" # install | update | uninstall + +while [[ $# -gt 0 ]]; do + case $1 in + --port) AGENT_PORT="$2"; shift 2 ;; + --key) AGENT_API_KEY="$2"; shift 2 ;; + --branch) REPO_BRANCH="$2"; shift 2 ;; + --update) MODE="update"; shift ;; + --uninstall) MODE="uninstall"; shift ;; + *) error "Argument inconnu : $1. Voir INSTALL.md pour l'aide." ;; + esac +done + +# ─── Vérifications communes ─────────────────────────────────────────────────── +check_root() { [[ $EUID -ne 0 ]] && error "Ce script doit être exécuté en root (sudo)."; } +check_deps() { + command -v python3 &>/dev/null || error "Python 3 est requis : apt install python3 python3-venv" + command -v docker &>/dev/null || error "Docker est requis. Consultez https://docs.docker.com/engine/install/" + command -v curl &>/dev/null || error "curl est requis : apt install curl" +} + +# ─── Téléchargement des fichiers depuis le dépôt ───────────────────────────── +download_files() { + info "Téléchargement des fichiers (branche : ${REPO_BRANCH})..." + mkdir -p "$INSTALL_DIR" + for file in "${REPO_FILES[@]}"; do + filename=$(basename "$file") + url="${REPO_BASE}/${REPO_BRANCH}/${file}" + info " ↓ $filename" + curl -fsSL "$url" -o "$INSTALL_DIR/$filename" \ + || error "Impossible de télécharger : $url" + done + success "Fichiers téléchargés." +} + +# ─── Désinstallation ────────────────────────────────────────────────────────── +if [[ "$MODE" == "uninstall" ]]; then + check_root + info "Désinstallation de l'agent..." + systemctl stop "$SERVICE_NAME" 2>/dev/null || true + systemctl disable "$SERVICE_NAME" 2>/dev/null || true + rm -f "$SERVICE_FILE" + systemctl daemon-reload + rm -rf "$INSTALL_DIR" + success "Agent désinstallé." + exit 0 +fi + +# ─── Mise à jour ────────────────────────────────────────────────────────────── +if [[ "$MODE" == "update" ]]; then + check_root + [[ ! -d "$INSTALL_DIR" ]] && error "L'agent n'est pas installé. Lancez d'abord l'installation." + + info "Mise à jour de l'agent VPS Monitor..." + + # Conserver la clé API et le port existants + if [[ -f "$INSTALL_DIR/.env" ]]; then + AGENT_API_KEY=$(grep -E '^AGENT_API_KEY=' "$INSTALL_DIR/.env" | cut -d= -f2- || true) + SAVED_PORT=$(grep -E '^AGENT_PORT=' "$INSTALL_DIR/.env" | cut -d= -f2- || true) + [[ -n "$SAVED_PORT" ]] && AGENT_PORT="$SAVED_PORT" + fi + + download_files + + info "Mise à jour des dépendances Python..." + "$INSTALL_DIR/venv/bin/pip" install --quiet --upgrade pip + "$INSTALL_DIR/venv/bin/pip" install --quiet -r "$INSTALL_DIR/requirements.txt" + success "Dépendances à jour." + + info "Redémarrage du service..." + systemctl restart "$SERVICE_NAME" + sleep 2 + + if systemctl is-active --quiet "$SERVICE_NAME"; then + success "Service redémarré avec succès." + CURRENT_VERSION=$(curl -sf --max-time 3 \ + "http://localhost:${AGENT_PORT}/health" 2>/dev/null | python3 -c \ + "import sys,json; d=json.load(sys.stdin); print(d.get('version','?'))" 2>/dev/null || echo "?") + echo -e "\n${GREEN}Mise à jour terminée.${NC} Version active : ${CYAN}${CURRENT_VERSION}${NC}\n" + else + warn "Le service ne semble pas actif après la mise à jour." + echo " journalctl -u ${SERVICE_NAME} -n 30 --no-pager" + exit 1 + fi + exit 0 +fi + +# ─── Installation ───────────────────────────────────────────────────────────── +check_root +check_deps + +info "Python : $(python3 --version)" +info "Docker : $(docker --version)" + +# Clé API : fournie > existante > générée +if [[ -z "$AGENT_API_KEY" ]]; then + if [[ -f "$INSTALL_DIR/.env" ]]; then + AGENT_API_KEY=$(grep -E '^AGENT_API_KEY=' "$INSTALL_DIR/.env" | cut -d= -f2- || true) + [[ -n "$AGENT_API_KEY" ]] && info "Clé API existante conservée." + fi + if [[ -z "$AGENT_API_KEY" ]]; then + AGENT_API_KEY=$(python3 -c "import secrets; print(secrets.token_hex(32))") + warn "Aucune clé fournie — clé aléatoire générée." + fi +fi + +download_files + +# ─── Environnement virtuel ──────────────────────────────────────────────────── +if [[ ! -d "$INSTALL_DIR/venv" ]]; then + info "Création de l'environnement virtuel Python..." + python3 -m venv "$INSTALL_DIR/venv" +fi + +info "Installation des dépendances Python..." +"$INSTALL_DIR/venv/bin/pip" install --quiet --upgrade pip +"$INSTALL_DIR/venv/bin/pip" install --quiet -r "$INSTALL_DIR/requirements.txt" +success "Dépendances installées." + +# ─── Fichier .env ───────────────────────────────────────────────────────────── +cat > "$INSTALL_DIR/.env" < "$SERVICE_FILE" </dev/null \ + || hostname -I | awk '{print $1}') + +echo "" +echo -e "${GREEN}══════════════════════════════════════════════════${NC}" +echo -e "${GREEN} Agent VPS Monitor installé avec succès !${NC}" +echo -e "${GREEN}══════════════════════════════════════════════════${NC}" +echo -e " Adresse : ${CYAN}http://${PUBLIC_IP}:${AGENT_PORT}${NC}" +echo -e " Clé API : ${YELLOW}${AGENT_API_KEY}${NC}" +echo -e " Branche : ${CYAN}${REPO_BRANCH}${NC}" +echo "" +echo -e " Commandes utiles :" +echo -e " journalctl -u ${SERVICE_NAME} -f # logs en direct" +echo -e " systemctl status ${SERVICE_NAME} # état du service" +echo -e " sudo bash install.sh --update # mise à jour" +echo -e " sudo bash install.sh --uninstall # désinstallation" +echo -e "${GREEN}══════════════════════════════════════════════════${NC}" +echo "" +warn "Notez la clé API — elle est nécessaire pour configurer le backend central."