diff --git a/.gitignore b/.gitignore index ed6a276..cef0768 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ server/*.test # OS .DS_Store Thumbs.db +config.toml diff --git a/deploy/install-agent.sh b/deploy/install-agent.sh new file mode 100644 index 0000000..b501dd9 --- /dev/null +++ b/deploy/install-agent.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +set -e + +BINARY="$(dirname "$0")/../agent/target/release/nanometrics-agent" +SERVICE="$(dirname "$0")/nanometrics-agent.service" +CONFIG="$(dirname "$0")/../agent/config.toml" + +# Vérifications +if [ ! -f "$BINARY" ]; then + echo "ERREUR : binaire introuvable : $BINARY" + echo "Compilez d'abord : cargo build --release --manifest-path agent/Cargo.toml" + exit 1 +fi +if [ ! -f "$CONFIG" ]; then + echo "ERREUR : config.toml introuvable : $CONFIG" + echo "Copiez agent/config.toml.example vers agent/config.toml et ajustez l'IP du serveur." + exit 1 +fi + +echo "[1/5] Copie du binaire vers /usr/local/bin/" +cp "$BINARY" /usr/local/bin/nanometrics-agent +chmod 755 /usr/local/bin/nanometrics-agent + +echo "[2/5] Création du répertoire de configuration /etc/nanometrics/" +mkdir -p /etc/nanometrics +chmod 755 /etc/nanometrics + +echo "[3/5] Copie de config.toml vers /etc/nanometrics/" +cp "$CONFIG" /etc/nanometrics/config.toml +chmod 644 /etc/nanometrics/config.toml + +echo "[4/5] Installation du service systemd" +cp "$SERVICE" /etc/systemd/system/nanometrics-agent.service +systemctl daemon-reload +systemctl enable nanometrics-agent + +echo "[5/5] Démarrage du service" +systemctl restart nanometrics-agent + +sleep 2 +echo "" +echo "=== Statut ===" +systemctl status nanometrics-agent --no-pager diff --git a/deploy/install.sh b/deploy/install.sh new file mode 100755 index 0000000..cc2f62e --- /dev/null +++ b/deploy/install.sh @@ -0,0 +1,187 @@ +#!/usr/bin/env bash +# Installe l'agent Nanometrics depuis la dernière release Gitea. +# Usage : +# curl -fsSL https://git.maison43gil.com/gilles/nano_metrics/raw/branch/main/deploy/install.sh | bash +# SERVER_IP=10.0.0.50 SERVER_PORT=9999 curl -fsSL ... | bash +set -euo pipefail + +REPO_API="https://git.maison43gil.com/api/v1/repos/gilles/nano_metrics" +SERVICE_URL="https://git.maison43gil.com/gilles/nano_metrics/raw/branch/main/deploy/nanometrics-agent.service" +INSTALL_BIN="/usr/local/bin/nanometrics-agent" +CONFIG_DIR="/etc/nanometrics" +CONFIG_FILE="$CONFIG_DIR/config.toml" +SERVICE_FILE="/etc/systemd/system/nanometrics-agent.service" + +# ── Couleurs ─────────────────────────────────────────────────────────────────── +RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m' +ok() { echo -e "${GREEN}✓${NC} $*"; } +warn() { echo -e "${YELLOW}!${NC} $*"; } +err() { echo -e "${RED}✗${NC} $*" >&2; } + +# ── Root check ───────────────────────────────────────────────────────────────── +if [ "$(id -u)" -ne 0 ]; then + err "Ce script doit être lancé en root (sudo bash ou sudo curl | bash)" + exit 1 +fi + +echo "======================================" +echo " Nanometrics Agent — Installation" +echo "======================================" +echo "" + +# ── 1. Détection de l'architecture ──────────────────────────────────────────── +ARCH="$(uname -m)" +case "$ARCH" in + x86_64) LABEL="linux-amd64" ;; + aarch64) LABEL="linux-arm64" ;; + *) + err "Architecture non supportée : $ARCH" + err "Seules x86_64 et aarch64 sont supportées." + exit 1 + ;; +esac +ok "Architecture détectée : $ARCH → $LABEL" + +# ── 2. Récupérer l'URL du binaire depuis la dernière release ────────────────── +echo "→ Récupération de la dernière release..." + +ASSETS_JSON=$(curl -sf "$REPO_API/releases?limit=1&page=1") +ASSET_URL=$(echo "$ASSETS_JSON" | python3 -c " +import sys, json +releases = json.load(sys.stdin) +if not releases: + raise SystemExit('Aucune release trouvée sur le dépôt.') +assets = releases[0].get('assets', []) +name = 'nanometrics-agent-$LABEL' +for a in assets: + if a['name'] == name: + print(a['browser_download_url']) + break +else: + raise SystemExit(f'Asset {name!r} introuvable dans la release.') +") + +TAG=$(echo "$ASSETS_JSON" | python3 -c " +import sys, json +releases = json.load(sys.stdin) +print(releases[0]['tag_name']) +") + +ok "Release : $TAG — URL : $ASSET_URL" + +# ── 3. Télécharger le binaire ───────────────────────────────────────────────── +TMP_BIN="$(mktemp)" +trap 'rm -f "$TMP_BIN"' EXIT + +echo "→ Téléchargement du binaire..." +curl -fsSL -o "$TMP_BIN" "$ASSET_URL" +chmod 755 "$TMP_BIN" +ok "Binaire téléchargé ($(du -sh "$TMP_BIN" | cut -f1))" + +# ── 4. Paramètres de configuration ──────────────────────────────────────────── +echo "" +echo "--- Configuration du serveur ---" + +if [ -z "${SERVER_IP:-}" ]; then + read -rp "Adresse IP du serveur Nanometrics : " SERVER_IP +fi +if [ -z "${SERVER_IP:-}" ]; then + err "SERVER_IP est requis." + exit 1 +fi + +SERVER_PORT="${SERVER_PORT:-9999}" +MQTT_ENABLED="${MQTT_ENABLED:-false}" + +ok "Serveur : $SERVER_IP:$SERVER_PORT" + +# ── 5. Installer le binaire ──────────────────────────────────────────────────── +echo "" +echo "[1/5] Installation du binaire dans /usr/local/bin/" +cp "$TMP_BIN" "$INSTALL_BIN" +chmod 755 "$INSTALL_BIN" +ok "Binaire installé" + +# ── 6. Créer le répertoire de configuration ─────────────────────────────────── +echo "[2/5] Création de $CONFIG_DIR" +mkdir -p "$CONFIG_DIR" +chmod 755 "$CONFIG_DIR" +ok "Répertoire créé" + +# ── 7. Écrire config.toml ───────────────────────────────────────────────────── +echo "[3/5] Écriture de $CONFIG_FILE" + +# Ne pas écraser une config existante (upgrade) +if [ -f "$CONFIG_FILE" ]; then + warn "config.toml déjà présent — conservé tel quel" +else +cat > "$CONFIG_FILE" << TOML +[server] +ip = "$SERVER_IP" +port = $SERVER_PORT + +[protocols.udp] +enabled = true + +[protocols.mqtt] +enabled = $MQTT_ENABLED +host = "10.0.0.3" +port = 1883 +topic_base = "nanometrics/agents" +auto_discovery = true +birth_message = true +last_will = true + +[metrics.cpu] +udp = true +mqtt = false + +[metrics.memory] +udp = true +mqtt = false + +[metrics.disk] +udp = true +mqtt = false + +[metrics.network] +udp = false +mqtt = false + +[metrics.uptime] +udp = true +mqtt = false + +[metrics.temperature] +udp = true +mqtt = false + +[metrics.smart] +udp = true +mqtt = false +TOML + chmod 640 "$CONFIG_FILE" + ok "config.toml créé" +fi + +# ── 8. Installer le fichier service ────────────────────────────────────────── +echo "[4/5] Installation du service systemd" +curl -fsSL -o "$SERVICE_FILE" "$SERVICE_URL" +chmod 644 "$SERVICE_FILE" +systemctl daemon-reload +systemctl enable nanometrics-agent +ok "Service installé et activé" + +# ── 9. Démarrer le service ──────────────────────────────────────────────────── +echo "[5/5] Démarrage du service" +systemctl restart nanometrics-agent +sleep 2 + +echo "" +echo "=== Statut ===" +systemctl status nanometrics-agent --no-pager || true + +echo "" +ok "Installation terminée — agent $TAG opérationnel" +echo " Config : $CONFIG_FILE" +echo " Logs : journalctl -u nanometrics-agent -f" diff --git a/deploy/release.sh b/deploy/release.sh new file mode 100755 index 0000000..eeac4b8 --- /dev/null +++ b/deploy/release.sh @@ -0,0 +1,101 @@ +#!/usr/bin/env bash +# Compile le binaire release et publie une release Gitea avec le binaire en asset. +# Usage : ./deploy/release.sh v0.1.0 +# ./deploy/release.sh v0.1.1 "Description du changement" +set -euo pipefail + +REPO_API="https://git.maison43gil.com/api/v1/repos/gilles/nano_metrics" +TOKEN_FILE="$(dirname "$0")/../repo.md" + +# Lire le token depuis repo.md +TOKEN=$(grep -oP '(?<=\*\*Token\*\* : ).*' "$TOKEN_FILE" | tr -d '[:space:]') +if [ -z "$TOKEN" ]; then + echo "ERREUR : token Gitea introuvable dans repo.md" + exit 1 +fi + +TAG="${1:-}" +if [ -z "$TAG" ]; then + echo "Usage : $0 [description]" + echo "Exemple : $0 v0.1.0" + exit 1 +fi +DESCRIPTION="${2:-Release $TAG}" + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +CARGO_TOML="$ROOT/agent/Cargo.toml" + +# ── 1. Compiler pour toutes les cibles supportées ────────────────────────── +echo "=== Compilation de l'agent ===" +TARGETS=("x86_64-unknown-linux-musl" "aarch64-unknown-linux-musl") +LABELS=("linux-amd64" "linux-arm64") + +mkdir -p "$ROOT/dist" + +for i in "${!TARGETS[@]}"; do + TARGET="${TARGETS[$i]}" + LABEL="${LABELS[$i]}" + echo "→ $TARGET ($LABEL)..." + + # Installer la cible si absente + rustup target add "$TARGET" 2>/dev/null || true + + # Compiler + cargo build --release \ + --manifest-path "$CARGO_TOML" \ + --target "$TARGET" \ + 2>&1 | tail -3 + + SRC="$ROOT/agent/target/$TARGET/release/nanometrics-agent" + if [ ! -f "$SRC" ]; then + echo " AVERTISSEMENT : binaire introuvable pour $TARGET, ignoré" + continue + fi + + DEST="$ROOT/dist/nanometrics-agent-$LABEL" + cp "$SRC" "$DEST" + strip "$DEST" 2>/dev/null || true + echo " OK : $(du -sh "$DEST" | cut -f1)" +done + +# ── 2. Créer la release Gitea ────────────────────────────────────────────── +echo "" +echo "=== Création de la release Gitea $TAG ===" + +RELEASE_JSON=$(curl -sf \ + -H "Authorization: token $TOKEN" \ + -H "Content-Type: application/json" \ + -X POST "$REPO_API/releases" \ + -d "{ + \"tag_name\": \"$TAG\", + \"name\": \"$TAG\", + \"body\": \"$DESCRIPTION\", + \"draft\": false, + \"prerelease\": false + }") + +RELEASE_ID=$(echo "$RELEASE_JSON" | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])") +echo "Release ID : $RELEASE_ID" + +# ── 3. Uploader les binaires comme assets ───────────────────────────────── +echo "" +echo "=== Upload des binaires ===" + +for LABEL in "${LABELS[@]}"; do + ASSET="$ROOT/dist/nanometrics-agent-$LABEL" + [ -f "$ASSET" ] || continue + + ASSET_NAME="nanometrics-agent-$LABEL" + echo "→ Upload $ASSET_NAME..." + + curl -sf \ + -H "Authorization: token $TOKEN" \ + -F "attachment=@$ASSET;filename=$ASSET_NAME" \ + "$REPO_API/releases/$RELEASE_ID/assets" \ + > /dev/null + + echo " OK" +done + +echo "" +echo "✓ Release $TAG publiée : https://git.maison43gil.com/gilles/nano_metrics/releases/tag/$TAG" diff --git a/server/Dockerfile.dev b/server/Dockerfile.dev new file mode 100644 index 0000000..f49c35a --- /dev/null +++ b/server/Dockerfile.dev @@ -0,0 +1,7 @@ +# Dockerfile de dev : utilise le binaire pré-compilé localement (pas de pull Docker Hub) +FROM nginx:alpine +COPY nanometrics-server /app/nanometrics-server +WORKDIR /app +VOLUME /data +EXPOSE 8080 9999/udp +CMD ["./nanometrics-server"] diff --git a/server/docker-compose.dev.yml b/server/docker-compose.dev.yml new file mode 100644 index 0000000..bcaceb5 --- /dev/null +++ b/server/docker-compose.dev.yml @@ -0,0 +1,29 @@ +version: '3.8' +services: + server: + image: nanometrics-server:dev + restart: unless-stopped + environment: + UDP_ADDR: "0.0.0.0:9999" + DB_PATH: "/data/nanometrics.db" + HTTP_ADDR: "0.0.0.0:8080" + MQTT_BROKER: "tcp://10.0.0.3:1883" + MQTT_TOPIC_BASE: "nanometrics/agents" + volumes: + - nanometrics_data:/data + ports: + - "9999:9999/udp" + + dashboard: + image: nginx:alpine + restart: unless-stopped + volumes: + - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro + - ../dashboard:/usr/share/nginx/html:ro + ports: + - "8888:80" + depends_on: + - server + +volumes: + nanometrics_data: