96 lines
2.7 KiB
JavaScript
96 lines
2.7 KiB
JavaScript
|
|
#!/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(`打开 H5:pnpm open:local-test`);
|