feat: add installation and update script for VPS Monitor Agent
Some checks failed
Build and Push Docker Images / docker (push) Failing after 11s
Some checks failed
Build and Push Docker Images / docker (push) Failing after 11s
This commit is contained in:
155
vps-monitor/agent/INSTALL.md
Normal file
155
vps-monitor/agent/INSTALL.md
Normal file
@@ -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é> Clé API à utiliser (générée aléatoirement si omise)
|
||||
--port <port> Port d'écoute de l'agent (défaut : 8001)
|
||||
--branch <nom> 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)
|
||||
220
vps-monitor/agent/install.sh
Executable file
220
vps-monitor/agent/install.sh
Executable file
@@ -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" <<EOF
|
||||
AGENT_API_KEY=${AGENT_API_KEY}
|
||||
AGENT_PORT=${AGENT_PORT}
|
||||
EOF
|
||||
chmod 600 "$INSTALL_DIR/.env"
|
||||
success ".env configuré (chmod 600)."
|
||||
|
||||
# ─── Service systemd ──────────────────────────────────────────────────────────
|
||||
info "Configuration du service systemd..."
|
||||
cat > "$SERVICE_FILE" <<EOF
|
||||
[Unit]
|
||||
Description=VPS Monitor Agent
|
||||
After=docker.service network-online.target
|
||||
Requires=docker.service
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
WorkingDirectory=${INSTALL_DIR}
|
||||
EnvironmentFile=${INSTALL_DIR}/.env
|
||||
ExecStart=${INSTALL_DIR}/venv/bin/uvicorn agent:app --host 0.0.0.0 --port \${AGENT_PORT}
|
||||
Restart=always
|
||||
RestartSec=5
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
systemctl daemon-reload
|
||||
systemctl enable "$SERVICE_NAME"
|
||||
systemctl restart "$SERVICE_NAME"
|
||||
|
||||
# ─── Vérification ─────────────────────────────────────────────────────────────
|
||||
sleep 2
|
||||
if systemctl is-active --quiet "$SERVICE_NAME"; then
|
||||
success "Service démarré et actif."
|
||||
else
|
||||
warn "Le service ne semble pas avoir démarré. Consultez les logs :"
|
||||
echo " journalctl -u ${SERVICE_NAME} -n 30 --no-pager"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ─── Résumé ───────────────────────────────────────────────────────────────────
|
||||
PUBLIC_IP=$(curl -sf --max-time 3 https://api.ipify.org 2>/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."
|
||||
Reference in New Issue
Block a user