From 3cace7ab428146560f156946a33c2d64bafa9e55 Mon Sep 17 00:00:00 2001 From: mosen <181942704@qq.com> Date: Mon, 15 Jun 2026 00:55:21 +0800 Subject: [PATCH] Fix PM2 startup and harden server entry detection. Use a bash launch script for production and pathToFileURL-based main-module checks so sourcing.simosen.cn listens reliably under PM2. Co-authored-by: Cursor --- deploy/ecosystem.config.cjs | 4 ++-- deploy/start.sh | 4 ++++ src/server.js | 13 +++++++++++-- 3 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 deploy/start.sh diff --git a/deploy/ecosystem.config.cjs b/deploy/ecosystem.config.cjs index 6e3cf99..e925b15 100644 --- a/deploy/ecosystem.config.cjs +++ b/deploy/ecosystem.config.cjs @@ -3,8 +3,8 @@ module.exports = { { name: "product-sourcing", cwd: "/www/wwwroot/sourcing.simosen.cn/app", - script: "src/server.js", - interpreter: "node", + script: "deploy/start.sh", + interpreter: "/bin/bash", env: { NODE_ENV: "production", PORT: "9477", diff --git a/deploy/start.sh b/deploy/start.sh new file mode 100644 index 0000000..224b7ad --- /dev/null +++ b/deploy/start.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail +cd "$(dirname "$0")/.." +exec /root/.nvm/versions/node/v20.20.2/bin/node src/server.js diff --git a/src/server.js b/src/server.js index 9963e31..5746d27 100644 --- a/src/server.js +++ b/src/server.js @@ -2,7 +2,7 @@ import { createReadStream } from "node:fs"; import { readdir, readFile, stat } from "node:fs/promises"; import { createServer as createHttpServer } from "node:http"; import { extname, join, normalize, resolve } from "node:path"; -import { fileURLToPath } from "node:url"; +import { fileURLToPath, pathToFileURL } from "node:url"; import { buildDashboard, buildStyleGroups, toCsv } from "./core.js"; import { JsonStore } from "./store.js"; @@ -867,7 +867,16 @@ function crc32(buffer) { return (crc ^ 0xffffffff) >>> 0; } -if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { +function isMainModule() { + if (!process.argv[1]) return false; + try { + return import.meta.url === pathToFileURL(resolve(process.argv[1])).href; + } catch { + return false; + } +} + +if (isMainModule()) { try { await readFile(join(DEFAULT_PUBLIC_DIR, "index.html")); } catch {