fix: 恢复本地 Convex Auth 链路
- 修复 desktop 脚本在 Linux 下优先使用后端虚拟环境可执行文件 - 移除 Convex Auth 的本地密钥兜底,回到真实 deployment env - 首页未登录时先跳转 /auth,避免根路由直接触发 workspace 初始化失败
This commit is contained in:
+74
-7
@@ -19,12 +19,38 @@ const net = require("net");
|
||||
const { URL } = require("url");
|
||||
const fs = require("fs");
|
||||
|
||||
const rootDir = path.resolve(__dirname, "..");
|
||||
const frontendDir = path.join(rootDir, "wolai-frontend");
|
||||
const backendDir = path.join(rootDir, "wolai-backend");
|
||||
|
||||
const pythonBin = process.env.PYTHON_BIN || "python";
|
||||
const celeryBin = process.env.CELERY_BIN || "celery";
|
||||
const rootDir = path.resolve(__dirname, "..");
|
||||
const frontendDir = path.join(rootDir, "wolai-frontend");
|
||||
const backendDir = path.join(rootDir, "wolai-backend");
|
||||
|
||||
function resolveBackendExecutable(envName, fallbackName) {
|
||||
const fromEnv = (process.env[envName] || "").trim();
|
||||
if (fromEnv) return fromEnv;
|
||||
|
||||
const isWin = process.platform === "win32";
|
||||
const candidates = isWin
|
||||
? [
|
||||
path.join(backendDir, ".venv", "Scripts", `${fallbackName}.exe`),
|
||||
path.join(backendDir, ".venv312", "Scripts", `${fallbackName}.exe`),
|
||||
path.join(backendDir, "venv", "Scripts", `${fallbackName}.exe`),
|
||||
]
|
||||
: [
|
||||
path.join(backendDir, ".venv-linux", "bin", fallbackName),
|
||||
path.join(backendDir, ".venv", "bin", fallbackName),
|
||||
path.join(backendDir, "venv", "bin", fallbackName),
|
||||
];
|
||||
|
||||
for (const candidate of candidates) {
|
||||
if (fs.existsSync(candidate)) {
|
||||
return candidate;
|
||||
}
|
||||
}
|
||||
|
||||
return fallbackName;
|
||||
}
|
||||
|
||||
const pythonBin = resolveBackendExecutable("PYTHON_BIN", "python");
|
||||
const celeryBin = resolveBackendExecutable("CELERY_BIN", "celery");
|
||||
const celeryPoolFromEnv = (process.env.CELERY_POOL || "").trim();
|
||||
const skipCelery =
|
||||
(process.env.SKIP_CELERY || "").toLowerCase() === "1" ||
|
||||
@@ -89,11 +115,44 @@ async function findFreePort(startPort) {
|
||||
}
|
||||
|
||||
function getListeningPidsByPort(port) {
|
||||
const pids = new Set();
|
||||
|
||||
if (process.platform !== "win32") {
|
||||
try {
|
||||
const out = execSync(`ss -ltnp 'sport = :${port}'`, { encoding: "utf8" });
|
||||
for (const match of out.matchAll(/pid=(\d+)/g)) {
|
||||
const pid = Number(match[1]);
|
||||
if (Number.isFinite(pid) && pid > 0) {
|
||||
pids.add(pid);
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
// ignore
|
||||
}
|
||||
|
||||
if (pids.size > 0) {
|
||||
return [...pids];
|
||||
}
|
||||
|
||||
try {
|
||||
const out = execSync(`lsof -nP -iTCP:${port} -sTCP:LISTEN -t`, { encoding: "utf8" });
|
||||
for (const line of out.split(/\r?\n/)) {
|
||||
const pid = Number(line.trim());
|
||||
if (Number.isFinite(pid) && pid > 0) {
|
||||
pids.add(pid);
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
// ignore
|
||||
}
|
||||
|
||||
return [...pids];
|
||||
}
|
||||
|
||||
try {
|
||||
// 说明:netstat 输出示例:
|
||||
// TCP 0.0.0.0:3000 0.0.0.0:0 LISTENING 12345
|
||||
const out = execSync("netstat -ano -p tcp", { encoding: "utf8" });
|
||||
const pids = new Set();
|
||||
for (const line of out.split(/\r?\n/)) {
|
||||
if (!line.includes(`:${port}`)) continue;
|
||||
if (!/LISTENING/i.test(line)) continue;
|
||||
@@ -110,6 +169,14 @@ function getListeningPidsByPort(port) {
|
||||
}
|
||||
|
||||
function getProcessNameByPid(pid) {
|
||||
if (process.platform !== "win32") {
|
||||
try {
|
||||
return execSync(`ps -p ${pid} -o comm=`, { encoding: "utf8" }).trim();
|
||||
} catch {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
// 输出为 CSV,示例:
|
||||
// "Image Name","PID","Session Name","Session#","Mem Usage"
|
||||
|
||||
Reference in New Issue
Block a user