#!/usr/bin/env bash # Déploiement d'Immbot AI sur le nœud M3U96b du cluster MacLustr, avec www.immbot.ai (ngrok). # Réexécutable : rsync incrémental + rebuild + restart PM2. set -euo pipefail NODE=M3U96b APP=immbot-ai PORT=3070 DOMAIN=www.immbot.ai REMOTE_BASE='~/apps' LOCAL_ROOT="$(cd "$(dirname "$0")/.." && pwd)" COURSES_ROOT="$(dirname "$LOCAL_ROOT")" echo "== 1/6 Synchronisation du code et des cours vers $NODE ==" ssh $NODE "mkdir -p $REMOTE_BASE" rsync -az --delete \ --exclude node_modules --exclude .next --exclude data --exclude backups \ "$LOCAL_ROOT/" "$NODE:$REMOTE_BASE/$APP/" rsync -az --delete --exclude .git --exclude plateforme_ateliers --exclude __pycache__ \ "$COURSES_ROOT/IMM1003-20/" "$NODE:$REMOTE_BASE/IMM1003-20/" rsync -az --delete --exclude .git --exclude plateforme_data --exclude __pycache__ \ "$COURSES_ROOT/IMM1033-20/" "$NODE:$REMOTE_BASE/IMM1033-20/" rsync -az "$COURSES_ROOT/output/course-analysis/" "$NODE:$REMOTE_BASE/output/course-analysis/" echo "== 2/6 .env de production (créé s'il n'existe pas — la clé vient du .env local) ==" scp -q "$LOCAL_ROOT/.env" "$NODE:$REMOTE_BASE/$APP/.env.local-copy" ssh $NODE "cd $REMOTE_BASE/$APP && if [ ! -f .env ]; then cp .env.local-copy .env sed -i '' 's|^APP_URL=.*|APP_URL=https://$DOMAIN|' .env fi; rm -f .env.local-copy" echo "== 3/6 Installation + seed + ingestion + build ==" ssh $NODE "export PATH=/opt/homebrew/bin:\$PATH && cd $REMOTE_BASE/$APP && \ (command -v pnpm >/dev/null || sudo npm i -g pnpm --silent || npm i -g pnpm --silent) && \ pnpm install --silent && \ node --env-file=.env scripts/seed.ts && \ node --env-file=.env scripts/ingest-courses.ts --force && \ ./node_modules/.bin/next build" echo "== 4/6 PM2 : application ==" ssh $NODE "export PATH=/opt/homebrew/bin:\$PATH && cd $REMOTE_BASE/$APP && \ pm2 delete $APP 2>/dev/null; \ pm2 start ./node_modules/.bin/next --name $APP --interpreter none -- start -p $PORT && pm2 save" echo "== 5/6 PM2 : tunnel ngrok ($DOMAIN) ==" ssh $NODE "export PATH=/opt/homebrew/bin:\$PATH && \ pm2 delete immbot-ngrok 2>/dev/null; \ pm2 start ngrok --name immbot-ngrok -- http --url=$DOMAIN $PORT && pm2 save" echo "== 6/6 Healthcheck ==" sleep 6 ssh $NODE "curl -s http://localhost:$PORT/api/health" && echo curl -s "https://$DOMAIN/api/health" && echo || echo "(le domaine peut prendre quelques secondes)" echo "✅ Déployé : https://$DOMAIN — penser à mettre à jour ~/Desktop/cluster-skill/cluster-deployments.json"