Files
memind/scripts/check-local-test.mjs
Your Name b0f5d6a51c Extract memind_adm admin server, add local dev tooling, and remove image-generation.
Split platform admin and ops APIs into standalone admin-server.mjs with network guards; simplify billing to RMB token pricing, refactor user auth, and add rsync deploy plus local-test scripts and docs.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-17 16:39:39 -07:00

96 lines
2.7 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env node
import fs from 'node:fs';
import http from 'node:http';
import https from 'node:https';
import {
ADMIN_HOST,
allHostsConfigured,
H5_HOST,
H5_PUBLIC_BASE,
OPS_HOST,
PLAZA_HOST,
PLAZA_PUBLIC_BASE,
PUBLIC_PORT,
USES_LOCALHOST,
publicUrl,
} from './local-test-config.mjs';
function checkUrl(url) {
const parsed = new URL(url);
const transport = parsed.protocol === 'https:' ? https : http;
return new Promise((resolve) => {
const req = transport.request(
{
hostname: parsed.hostname,
port: parsed.port || (parsed.protocol === 'https:' ? 443 : 80),
path: `${parsed.pathname}${parsed.search}`,
method: 'GET',
rejectUnauthorized: false,
headers: parsed.hostname === PLAZA_HOST ? { Host: `${PLAZA_HOST}:${process.env.PLAZA_PORT ?? 3001}` } : {},
},
(res) => resolve(res.statusCode ?? 0),
);
req.on('error', () => resolve(0));
req.setTimeout(3000, () => {
req.destroy();
resolve(0);
});
req.end();
});
}
console.log('==> 本地开发环境诊断');
console.log(` 模式:${USES_LOCALHOST ? '*.localhost (:8443)' : 'custom tkmind.cn domains'}`);
console.log('');
const issues = [];
if (!USES_LOCALHOST && !allHostsConfigured()) {
issues.push('DNS 未配置 → sudo pnpm setup:local-test');
} else if (USES_LOCALHOST) {
console.log('✓ *.localhost 无需 /etc/hosts');
} else {
for (const host of [H5_HOST, ADMIN_HOST, PLAZA_HOST, OPS_HOST]) {
console.log(`✓ DNS ${host}`);
}
}
const tlsDir = new URL('../.local/local-test-tls/', import.meta.url);
if (!fs.existsSync(new URL('./local-test.cert.pem', tlsDir))) {
issues.push('TLS 证书缺失 → pnpm setup:local-test');
} else {
console.log('✓ TLS 证书已生成');
}
console.log('');
console.log(`==> HTTPS 入口 (:${PUBLIC_PORT}pnpm dev:local-proxy)`);
const checks = [
['H5', `${H5_PUBLIC_BASE}/`, 200],
['memind_adm', `${publicUrl(ADMIN_HOST)}/healthz`, 200],
['Plaza', `${PLAZA_PUBLIC_BASE}/plaza`, 200],
['Ops', `${publicUrl(OPS_HOST)}/ops/`, 200],
];
for (const [label, url, expected] of checks) {
const code = await checkUrl(url);
if (code === expected || (label === 'Plaza' && [200, 307, 308].includes(code))) {
console.log(`${label.padEnd(12)} ${url}${code}`);
} else {
console.log(`${label.padEnd(12)} ${url}${code || '不可达'}`);
if (code === 0) {
issues.push(`${label} 不可达:pnpm dev && pnpm dev:local-proxy`);
}
}
}
console.log('');
if (issues.length) {
console.log('待处理:');
for (const issue of issues) console.log(` - ${issue}`);
process.exit(1);
}
console.log('本地开发环境正常。');
console.log(`打开 H5pnpm open:local-test`);