Merge branch 'master' of http://82.157.175.59:3000/GenarrativeAI/Genarrative
Some checks failed
CI / verify (push) Has been cancelled

This commit is contained in:
2026-04-18 13:05:39 +08:00
21 changed files with 305 additions and 6711 deletions

71
scripts/deploy.sh Normal file
View File

@@ -0,0 +1,71 @@
#!/usr/bin/env bash
set -euo pipefail
usage() {
cat <<'EOF'
用法:
./scripts/deploy.sh <backend_dir>
示例:
./scripts/deploy.sh /work/server-node
说明:
1. 进入指定后端目录
2. 构建后端
3. 重启已有的 genarrative-server
4. 如果 PM2 进程不存在,则使用 ecosystem.config.cjs 创建
注意:
- 不会执行 git pull
- 不会同步文件
- 不会构建前端
EOF
}
require_command() {
local command_name="$1"
if ! command -v "$command_name" >/dev/null 2>&1; then
echo "[deploy] 缺少命令: $command_name" >&2
exit 1
fi
}
BACKEND_DIR="${1:-}"
if [[ -z "${BACKEND_DIR}" || "${BACKEND_DIR}" == "-h" || "${BACKEND_DIR}" == "--help" ]]; then
usage
if [[ -z "${BACKEND_DIR}" ]]; then
exit 1
fi
exit 0
fi
require_command npm
require_command pm2
if [[ ! -d "${BACKEND_DIR}" ]]; then
echo "[deploy] 后端目录不存在: ${BACKEND_DIR}" >&2
exit 1
fi
if [[ ! -f "${BACKEND_DIR}/ecosystem.config.cjs" ]]; then
echo "[deploy] 缺少 PM2 配置文件: ${BACKEND_DIR}/ecosystem.config.cjs" >&2
exit 1
fi
echo "[deploy] 后端目录: ${BACKEND_DIR}"
cd "${BACKEND_DIR}"
# 重新构建后端产物。
echo "[deploy] 构建后端"
npm run build
# 优先重启;如果进程还不存在,就直接创建。
echo "[deploy] 重启或创建 PM2 服务"
pm2 restart genarrative-server --update-env \
|| pm2 start ecosystem.config.cjs
echo "[deploy] 完成"

View File

@@ -10,6 +10,9 @@ const viteCliPath = fileURLToPath(new URL('./vite-cli.mjs', import.meta.url));
const serverTsxCliPath = fileURLToPath(
new URL('../server-node/node_modules/tsx/dist/cli.mjs', import.meta.url),
);
const serverTsxLoaderPath = fileURLToPath(
new URL('../server-node/node_modules/tsx/dist/loader.mjs', import.meta.url),
);
const envExamplePath = fileURLToPath(new URL('../.env.example', import.meta.url));
const envLocalPath = fileURLToPath(new URL('../.env.local', import.meta.url));
const bundledNodePath = fileURLToPath(
@@ -194,6 +197,7 @@ mergedEnv.NODE_SERVER_TARGET =
mergedEnv.NODE_SERVER_TARGET || resolveServerTarget(mergedEnv.NODE_SERVER_ADDR);
mergedEnv.DATABASE_URL =
mergedEnv.DATABASE_URL || DEFAULT_DEV_DATABASE_URL;
mergedEnv.VITE_DEV_HOST = mergedEnv.VITE_DEV_HOST || '127.0.0.1';
prependEnvPath(mergedEnv, runtimeNodeDir);
mergedEnv.npm_config_scripts_prepend_node_path = 'true';
@@ -224,6 +228,7 @@ console.log(`[dev:node] PROJECT_ROOT=${mergedEnv.PROJECT_ROOT}`);
console.log(`[dev:node] NODE_SERVER_ADDR=${mergedEnv.NODE_SERVER_ADDR}`);
console.log(`[dev:node] NODE_SERVER_TARGET=${mergedEnv.NODE_SERVER_TARGET}`);
console.log(`[dev:node] DATABASE_URL=${redactDatabaseUrl(mergedEnv.DATABASE_URL)}`);
console.log(`[dev:node] VITE_DEV_HOST=${mergedEnv.VITE_DEV_HOST}`);
console.log(`[dev:node] NODE_RUNTIME=${runtimeNodePath}`);
const children = new Set();
@@ -298,7 +303,13 @@ function registerChild(name, child, siblingProvider) {
});
}
const serverProcess = existsSync(serverTsxCliPath)
const serverProcess = existsSync(serverTsxLoaderPath)
? spawn(runtimeNodePath, ['--watch', '--import', serverTsxLoaderPath, 'src/server.ts'], {
cwd: serverRoot,
env: mergedEnv,
stdio: 'inherit',
})
: existsSync(serverTsxCliPath)
? spawn(runtimeNodePath, [serverTsxCliPath, 'watch', 'src/server.ts'], {
cwd: serverRoot,
env: mergedEnv,
@@ -319,7 +330,7 @@ const serverProcess = existsSync(serverTsxCliPath)
const viteProcess = spawn(
runtimeNodePath,
[viteCliPath, '--port=3000', '--host=0.0.0.0'],
[viteCliPath, '--port=3000', `--host=${mergedEnv.VITE_DEV_HOST}`],
{
cwd: repoRoot,
env: mergedEnv,

76
scripts/update.sh Normal file
View File

@@ -0,0 +1,76 @@
#!/usr/bin/env bash
set -euo pipefail
usage() {
cat <<'EOF'
用法:
./scripts/update.sh
说明:
1. 对当前仓库执行 git pull
2. 只构建前端
3. 固定同步前端 dist 到 /work/dist
4. 固定同步 server-node 到 /work/server-node
注意:
- server-node 同步时会排除 dist 和 node_modules
- 不会构建后端
- 不会执行 npm ci
- 不会重启 PM2
EOF
}
require_command() {
local command_name="$1"
if ! command -v "$command_name" >/dev/null 2>&1; then
echo "[update] 缺少命令: $command_name" >&2
exit 1
fi
}
if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
usage
exit 0
fi
require_command git
require_command npm
require_command rsync
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd -- "${SCRIPT_DIR}/.." && pwd)"
CLIENT_TARGET_DIR="/work/dist"
SERVER_TARGET_DIR="/work/server-node"
echo "[update] 仓库目录: ${REPO_ROOT}"
echo "[update] 前端目标目录: ${CLIENT_TARGET_DIR}"
echo "[update] 后端目标目录: ${SERVER_TARGET_DIR}"
cd "${REPO_ROOT}"
# 先拉取当前分支的最新代码。
echo "[update] 拉取当前分支最新代码"
git pull
# 只构建前端,不处理后端构建。
echo "[update] 构建前端"
npm run build
# 固定创建 /work 下的目标目录。
echo "[update] 创建目标目录"
mkdir -p "${CLIENT_TARGET_DIR}" "${SERVER_TARGET_DIR}"
# 同步前端构建产物。
echo "[update] 同步前端 dist -> ${CLIENT_TARGET_DIR}"
rsync -a --delete "${REPO_ROOT}/dist/" "${CLIENT_TARGET_DIR}/"
# 同步 server-node 源码和配置,但保留目标目录自己的 dist 和 node_modules。
echo "[update] 同步 server-node -> ${SERVER_TARGET_DIR}"
rsync -a --delete \
--exclude 'dist/' \
--exclude 'node_modules/' \
"${REPO_ROOT}/server-node/" "${SERVER_TARGET_DIR}/"
echo "[update] 完成"