121 lines
5.4 KiB
Bash
121 lines
5.4 KiB
Bash
|
|
#!/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 ]
|