Files
boc/aamos-admin-upgrade/deploy.sh
T

121 lines
5.4 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
# Deploy script for AAMOS Admin Panel
set -uo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
AMOS_DIR="/opt/amos"
SERVER_MJS="$AMOS_DIR/scripts/server.mjs"
PUBLIC_ADMIN="$AMOS_DIR/public/admin"
PORT="${PORT:-3100}"
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; BLUE='\033[0;34m'; NC='\033[0m'
STEPS_OK=0; STEPS_FAIL=0
ok() { echo -e "${GREEN}${NC} $*"; STEPS_OK=$((STEPS_OK + 1)); }
fail() { echo -e "${RED}${NC} $*"; STEPS_FAIL=$((STEPS_FAIL + 1)); }
info() { echo -e "${BLUE}${NC} $*"; }
warn() { echo -e "${YELLOW}${NC} $*"; }
echo ""
echo "══════════════════════════════════════════════"
echo " AAMOS Admin — Deploy $(date '+%Y-%m-%d %H:%M:%S')"
echo "══════════════════════════════════════════════"
echo ""
# ── 1. Build Go backend ────────────────────────────────────────────────────────
info "Building Go backend..."
if (cd "$SCRIPT_DIR/backend" && go build -o bin/aamos-admin ./... 2>&1); then
ok "Go backend built → backend/bin/aamos-admin"
else
fail "Go backend build failed"
fi
# ── 2. Build Rust core ─────────────────────────────────────────────────────────
info "Building Rust core..."
if (cd "$SCRIPT_DIR/core" && cargo build --release 2>&1); then
ok "Rust core built → core/target/release/"
else
fail "Rust core build failed"
fi
# ── 3. Deploy web/ → /opt/amos/public/admin/ ──────────────────────────────────
info "Deploying web assets → $PUBLIC_ADMIN..."
mkdir -p "$PUBLIC_ADMIN"
if command -v rsync &>/dev/null; then
COPY_CMD="rsync -a --delete $SCRIPT_DIR/web/ $PUBLIC_ADMIN/"
else
COPY_CMD="cp -a $SCRIPT_DIR/web/. $PUBLIC_ADMIN/"
fi
if eval "$COPY_CMD" 2>&1; then
FILE_COUNT=$(find "$PUBLIC_ADMIN" -type f | wc -l)
ok "Web assets deployed ($FILE_COUNT files)"
else
fail "Web asset deploy failed"
fi
# ── 4. Ensure /admin route in server.mjs ──────────────────────────────────────
info "Checking /admin route in server.mjs..."
if grep -q "app.get('/admin'" "$SERVER_MJS"; then
ok "/admin route already present in server.mjs"
else
warn "/admin route missing — inserting..."
ANCHOR="app.get('/admin-strategic'"
if grep -q "$ANCHOR" "$SERVER_MJS"; then
# Insert admin block after the anchor line
sed -i "/$ANCHOR/a\\
app.get('/admin', requirePageAuth, requireAdminRole, (req, res) => res.sendFile(join(__dirname, '../public/admin/index.html')));\\
app.get('/admin/', requirePageAuth, requireAdminRole, (req, res) => res.sendFile(join(__dirname, '../public/admin/index.html')));" \
"$SERVER_MJS"
ok "/admin route inserted in server.mjs"
else
fail "Could not find anchor in server.mjs — add /admin route manually"
fi
fi
# ── 5. Restart AMOS (SIGHUP) ──────────────────────────────────────────────────
info "Sending SIGHUP to AMOS..."
if pkill -HUP -f 'node /opt/amos/scripts/server.mjs' 2>/dev/null; then
ok "SIGHUP sent — AMOS reloading"
sleep 4
else
warn "pkill found no matching process — AMOS may not be running"
fail "AMOS process not found"
fi
# ── 6. Health check — /admin live? ────────────────────────────────────────────
info "Waiting for /admin on port $PORT..."
MAX_TRIES=10; TRIES=0; HTTP_CODE="000"
while [ $TRIES -lt $MAX_TRIES ]; do
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" -m 5 \
"http://127.0.0.1:$PORT/admin" 2>/dev/null || echo "000")
# 200=ok, 302=redirect to login, 401=auth required — all mean the route exists
case "$HTTP_CODE" in
200|302|301|401) break ;;
esac
TRIES=$((TRIES + 1))
[ $TRIES -lt $MAX_TRIES ] && { info " HTTP $HTTP_CODE — retry $TRIES/$MAX_TRIES in 2s..."; sleep 2; }
done
if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "302" ] || [ "$HTTP_CODE" = "301" ] || [ "$HTTP_CODE" = "401" ]; then
ok "/admin is live — HTTP $HTTP_CODE"
else
fail "/admin unreachable after $MAX_TRIES tries (last HTTP $HTTP_CODE)"
fi
# ── Summary ───────────────────────────────────────────────────────────────────
echo ""
echo "══════════════════════════════════════════════"
TOTAL=$((STEPS_OK + STEPS_FAIL))
if [ $STEPS_FAIL -eq 0 ]; then
echo -e " ${GREEN}DEPLOY OK${NC}$STEPS_OK/$TOTAL steps passed"
echo " Admin URL: http://127.0.0.1:$PORT/admin"
else
echo -e " ${YELLOW}DEPLOY PARTIAL${NC}$STEPS_OK passed, $STEPS_FAIL failed (of $TOTAL)"
echo " Review errors above."
fi
echo "══════════════════════════════════════════════"
echo ""
[ $STEPS_FAIL -eq 0 ]