#!/usr/bin/env bash # ============================================ # Projet : API-KA # Fichier : scripts/deploy_m3u96b.sh # Node : m3u96b # Author : Simon-Pierre Boucher # Contact : contact@spboucher.ai # Date : 2026-08-16 # ============================================ # Déploiement complet d'API-KA sur le node m3u96b (/opt/api-ka). # À exécuter depuis le laptop, à la racine du projet. set -euo pipefail NODE="m3u96b" REMOTE_DIR="/opt/api-ka" PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)" echo "==> [1/6] Déploiement API-KA vers ${NODE}:${REMOTE_DIR}" ssh "$NODE" "sudo mkdir -p '$REMOTE_DIR' && sudo chown \"\$(whoami)\" '$REMOTE_DIR'" echo "==> [2/6] Synchronisation des fichiers (rsync)" rsync -az --delete \ --exclude '.env' \ --exclude 'venv/' \ --exclude '__pycache__/' \ --exclude '.pytest_cache/' \ --exclude '.ruff_cache/' \ --exclude '.git/' \ --exclude 'logs/' \ --exclude 'data/' \ "$PROJECT_DIR/" "$NODE:$REMOTE_DIR/" echo "==> [3/6] Environnement virtuel + dépendances" ssh "$NODE" "cd '$REMOTE_DIR' \ && mkdir -p logs data/backups \ && (python3.11 -m venv venv 2>/dev/null || python3 -m venv venv) \ && ./venv/bin/pip install --quiet --upgrade pip \ && ./venv/bin/pip install --quiet -r requirements.txt" echo "==> [4/6] Vérification du .env" if ! ssh "$NODE" "test -f '$REMOTE_DIR/.env'"; then echo "⚠️ $REMOTE_DIR/.env manquant sur $NODE — copier .env.example et le remplir avant de démarrer les services." fi echo "==> [5/6] Installation des services (systemd si disponible)" ssh "$NODE" "if command -v systemctl >/dev/null 2>&1; then \ sudo cp '$REMOTE_DIR'/systemd/apika-*.service /etc/systemd/system/ \ && sudo systemctl daemon-reload \ && sudo systemctl enable --now apika-api apika-scheduler apika-ngrok \ && sudo systemctl restart apika-api apika-scheduler apika-ngrok; \ else \ echo '⚠️ systemd indisponible sur ce node (macOS) — démarrer les services manuellement :'; \ echo ' cd $REMOTE_DIR && ./venv/bin/uvicorn src.api.main:app --host 127.0.0.1 --port 8000 &'; \ echo ' cd $REMOTE_DIR && ./venv/bin/python -m src.scheduler.daily_job &'; \ echo ' bash $REMOTE_DIR/scripts/start_ngrok.sh &'; \ fi" echo "==> [6/6] Healthcheck" sleep 3 if ssh "$NODE" "curl -fsS --max-time 10 http://127.0.0.1:8000/health" >/dev/null 2>&1; then echo "✅ API-KA déployée et en bonne santé sur $NODE." else echo "⚠️ /health ne répond pas encore sur $NODE — vérifier les services (systemctl status apika-*)." exit 1 fi