fix(editor): 删文章 EXDEV 修正 + 订阅口令不再阻断登录

1) 删除文章报 EXDEV(cross-device link not permitted)
   · 根因一:容器内 /blog 与 /app/trash 是两个独立 bind mount,
     rename(2) 跨挂载点必然 EXDEV —— 哪怕宿主机上它们同在一块盘。
   · 根因二:退化成 fs.cpSync 后,Windows 上遇到**中文目录名**会把
     Node 进程直接干崩(exit 127,不抛异常,stdout 缓冲丢失)。
     而文章目录名几乎必然含中文(<日期>-<中文标题>-<slug>)。
   · 修法:改用 readdirSync/copyFileSync 自己递归复制(宽字符路径,中文 OK);
     bootstrap.sh / compose 改成挂 BLOG_DIR 的父目录,让仓库与回收站
     落在**同一个挂载点**内,正常情况下 rename 直接成功、不再复制。

2) 登录页「订阅口令」填错会阻断整个登录
   · 它只是可选订阅模块的口令,不该 throw 掉登录流程。
   · rssApi() 无条件 searchParams.set('token', RSS_TOKEN),会用浏览器里
     记住的旧口令覆盖调用方刚传的值 → 正确口令也验不过。
   · 现在:填错只 toast 提示 + 清掉失效旧口令;rssApi 尊重调用方传的值。

3) wrangler.toml:EDITOR_API_BASE 改指国内机新域名 writeapi.usj.cc
   (原指向即将到期的境外机 post.usj.cc,且那台从未部署过 editor-api)

验证:api-e2e 44/44;front matter 往返 130/130;保存往返 130/130;
中文路径删除实测通过(目录 + 中文子目录 + 图片全部移入回收站,进程不崩)。
This commit is contained in:
zqlit committed 2026-10-04 22:11:02 +08:00
1 parent e8d13b9a6e
commit 96751b8143
5 files changed
+98 -18

No files matched your search

+22 -4
View File
@@ -103,6 +103,25 @@ umask 077
} > "$APP_DIR/.env"
say "4/5 生成 compose 并启动容器"
# ★ 仓库与回收站必须落在**同一个挂载点**里。
# 若容器内把它们挂成两个独立 bind mount,rename(2) 跨挂载点必返回 EXDEV
# ——哪怕宿主机上它们同在一块盘上。后端虽已能退化成「复制+删除」,但那是白搬一遍数据。
# 做法:挂载 BLOG_DIR 的**父目录**,让容器内路径 == 宿主机路径。
MOUNT_ROOT="$(dirname "$BLOG_DIR")"
if [ "${TRASH_DIR#"$MOUNT_ROOT"/}" != "$TRASH_DIR" ]; then
# 回收站就在仓库父目录下 → 一个挂载点搞定
BLOG_IN_CT="$BLOG_DIR"
TRASH_IN_CT="$TRASH_DIR"
VOLUMES=" - $MOUNT_ROOT:$MOUNT_ROOT"
else
# 回收站被指到别处 → 只能两条独立挂载(后端会自动复制+删除,只是慢一点)
BLOG_IN_CT=/blog
TRASH_IN_CT=/app/trash
VOLUMES=" - $BLOG_DIR:/blog
- $TRASH_DIR:/app/trash"
fi
cat > "$APP_DIR/docker-compose.yml" <<EOF
# 本文件由 bootstrap.sh 生成 —— 想改配置请改 bootstrap.sh 或 .env 后重跑
services:
@@ -115,8 +134,8 @@ services:
- "127.0.0.1:$BIND_PORT:8017"
environment:
EDITOR_TOKEN: \${EDITOR_TOKEN:?}
BLOG_ROOT: /blog
TRASH_DIR: /app/trash
BLOG_ROOT: $BLOG_IN_CT
TRASH_DIR: $TRASH_IN_CT
BIND_HOST: 0.0.0.0
GIT_BRANCH: main
PUSH_REMOTES: \${PUSH_REMOTES:-origin}
@@ -126,8 +145,7 @@ services:
MAX_UPLOAD_MB: "20"
GIT_PATHS: content,static
volumes:
- \$BLOG_DIR:/blog
- \$TRASH_DIR:/app/trash
$VOLUMES
healthcheck:
test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:8017/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"]
interval: 30s