#!/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 ]