feat: scripts de déploiement et release multi-arch
- deploy/install.sh : installeur curl-able (détecte l'arch, télécharge depuis la dernière release Gitea, configure le service systemd) - deploy/release.sh : build musl statique x86_64 + aarch64, crée la release Gitea et uploade les binaires en asset - deploy/install-agent.sh : installeur local depuis le binaire compilé - server/Dockerfile.dev + docker-compose.dev.yml : stack dev Docker Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -10,3 +10,4 @@ server/*.test
|
|||||||
# OS
|
# OS
|
||||||
.DS_Store
|
.DS_Store
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
|
config.toml
|
||||||
|
|||||||
@@ -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
|
||||||
Executable
+187
@@ -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"
|
||||||
Executable
+101
@@ -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 <tag> [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"
|
||||||
@@ -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"]
|
||||||
@@ -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:
|
||||||
Reference in New Issue
Block a user