Add argon2 polyfill and unified preview/API startup for admin login.

Node < 24 lacks crypto.argon2Sync; wire @node-rs/argon2 fallback and start Admin API alongside vite preview in local and remote deploy flows.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
John
2026-06-17 16:38:58 -07:00
parent 9ecfa73831
commit 7a5b9cc912
7 changed files with 414 additions and 21 deletions
+43
View File
@@ -0,0 +1,43 @@
#!/usr/bin/env node
import { spawn } from 'node:child_process';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
const root = path.join(path.dirname(fileURLToPath(import.meta.url)), '..');
const args = process.argv.slice(2);
function spawnChild(command, args, label) {
const child = spawn(command, args, {
cwd: root,
stdio: 'inherit',
env: process.env,
});
child.on('exit', (code, signal) => {
if (signal) return;
if (code && code !== 0) shutdown(code ?? 1);
});
return child;
}
let server;
let web;
let stopping = false;
function shutdown(code = 0) {
if (stopping) return;
stopping = true;
server?.kill('SIGTERM');
web?.kill('SIGTERM');
setTimeout(() => process.exit(code), 200).unref();
}
process.on('SIGINT', () => shutdown(0));
process.on('SIGTERM', () => shutdown(0));
console.log('==> 启动 Admin API (memind_adm/server)');
server = spawnChild('node', ['server/index.mjs'], 'server');
setTimeout(() => {
console.log('==> 启动 vite preview @ http://127.0.0.1:5174');
web = spawnChild('npm', ['run', 'dev:preview', ...args], 'web');
}, 800);
+23 -3
View File
@@ -4,9 +4,12 @@ set -euo pipefail
ROOT="${ADM_ROOT:-/Users/john/Project/memind_adm}"
PORT="${ADM_PORT:-5174}"
NODE_PATH="${LAN_NODE_PATH:-/opt/homebrew/opt/node@22/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin}"
NODE_PATH="${LAN_NODE_PATH:-/opt/homebrew/opt/node@24/bin:/opt/homebrew/opt/node@22/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin}"
API_PORT="${ADM_API_PORT:-8085}"
LOG="${ROOT}/adm-preview.log"
API_LOG="${ROOT}/adm-api.log"
PID_FILE="${ROOT}/.adm-preview.pid"
API_PID_FILE="${ROOT}/.adm-api.pid"
export PATH="${NODE_PATH}:${PATH}"
command -v node >/dev/null 2>&1 || { echo "❌ 未找到 node" >&2; exit 1; }
@@ -23,19 +26,36 @@ if [[ ! -d node_modules ]]; then
npm install
fi
echo "==> 停止旧进程 (port ${PORT})..."
echo "==> 停止旧进程 (port ${PORT}, ${API_PORT})..."
lsof -ti "TCP:${PORT}" -sTCP:LISTEN 2>/dev/null | xargs kill 2>/dev/null || true
lsof -ti "TCP:${API_PORT}" -sTCP:LISTEN 2>/dev/null | xargs kill 2>/dev/null || true
sleep 1
lsof -ti "TCP:${PORT}" -sTCP:LISTEN 2>/dev/null | xargs kill -9 2>/dev/null || true
lsof -ti "TCP:${API_PORT}" -sTCP:LISTEN 2>/dev/null | xargs kill -9 2>/dev/null || true
echo "==> 启动 Admin API @ 127.0.0.1:${API_PORT}..."
nohup node server/index.mjs >>"${API_LOG}" 2>&1 &
echo $! >"${API_PID_FILE}"
sleep 2
if ! curl -sf "http://127.0.0.1:${API_PORT}/health" >/dev/null; then
echo "❌ Admin API 启动失败,最近日志:" >&2
tail -n 40 "${API_LOG}" >&2 || true
exit 1
fi
echo "==> 启动 vite preview @ 127.0.0.1:${PORT}..."
nohup npm run preview -- --host 127.0.0.1 --port "${PORT}" >>"${LOG}" 2>&1 &
nohup npm run dev:preview -- --host 127.0.0.1 --port "${PORT}" >>"${LOG}" 2>&1 &
echo $! >"${PID_FILE}"
sleep 2
if curl -sf "http://127.0.0.1:${PORT}/" >/dev/null; then
echo "✅ memind_adm 已就绪: http://127.0.0.1:${PORT}/"
curl -sf "http://127.0.0.1:${PORT}/" >/dev/null && echo " 首页 OK"
curl -sf -X POST "http://127.0.0.1:${PORT}/auth/login" \
-H 'Content-Type: application/json' \
-d '{"username":"admin","password":"981122"}' >/dev/null \
&& echo " 登录 OK" || echo " ⚠️ 登录接口异常,请检查 ${API_LOG}"
else
echo "❌ 启动失败,最近日志:" >&2
tail -n 40 "${LOG}" >&2 || true