Skip to content

SForum v3.0.14

Choose a tag to compare

@github-actions github-actions released this 23 Oct 15:23
· 85 commits to main since this release

Maintainable, plugin-first open-source forum framework.

本次更新

  • 编辑器:链接标记固定为不蔓延(inclusive: false),粘贴或插入链接后继续输入不再被并入链接;工具栏在空选区下改为插入 URL 作为链接文字,不再写入 stored mark 把后续正文全部链接化。代码块内多行粘贴保持字面文本,HTML-only 剪贴板与逐行 <pre> 代码 HTML 都合并成单个 fenced block,多段选区切换代码块只产生一个块(列表 / 引用等多块嵌套选区仍为原生行为,已知限制)。
  • AI:「调用成功却不回复」不再被记成成功。既无正文也无工具调用判为失败并带 finish_reason / reasoning / usage 上下文,空结果永不进入回复结果缓存;回复结果独立成账(新增 ai_reply_outcomes,六种稳定 outcome,同触发已发布则幂等跳过、写失败不回滚发布)。后台观测台新增「回复结果」区块、缓存命中徽标与「仅缓存命中」筛选,新增 GET /admin/ai/reply-outcomes 与排障 CLI sforum ai:reply --topic-id N [--confirm](真实帖子与真实配置、禁缓存、不发布、不写结果表)。
  • 论坛:首页排序文案统一为 最近活跃 / 最新发表 / 热门,默认仍是 active;空或非法 sort 解析为站点默认并最终兜底 active,不再静默落到 latest。后台「列表默认排序」按现有排序选项渲染并把 active 标为推荐,补充活跃排序与活动索引的说明。
  • Web 可靠性:无法连接后端 API 弹窗改为缓冲探测确认——连接失败先进 pending 并按 1s→2s→4s 退避探测 /health,跨过 15s 宽限才打开模态,恢复后自动关闭并出 toast;安全方法(GET)单次原地重试,默认超时放宽到 GET 15s / 写操作 30s 以容忍慢站点。/_nuxt/** chunk 加载失败与动态 import 失败分流为「站点刚发布了新版本,正在刷新」提示加自动刷新(10s 冷却防循环),不再误报后端断线。
  • 安全依赖:dompurify 升到 3.4.17,修两条本日公开的公告(GHSA-cg2g-xh64-v4q7:SAFE_FOR_TEMPLATES 经拼接模板表达式绕过;GHSA-mrv2-3pqr-j5jr:IN_PLACE 模式下移除父/兄弟节点的 hook 导致残留)。正文清洗与 mermaid 渲染共用同一个实例,无需改调用方。

升级提示

  • 新增数据库迁移 202610250001_ai_reply_outcomes.sql(建表 + 三条索引 + outcome CHECK),升级时自动执行,无手工步骤。
  • AI 执行记录里缓存命中行的 0 ms / 0 token 是正确值,不再是需要排查的异常;empty_completion 从现在起计入失败,成功率与用量统计口径随之变化。
  • 排序:URL 不带 sort 仍是站点默认;已把默认排序存为 latest 的实例不会被自动改写,可在后台一键恢复推荐默认值。
  • 本次为正式版,会移动 latest 与 3.0 镜像标签;从 v3.0.13 升级无配置项移除,无需改 env。
  • 允许游客或未受信作者发帖的站点建议尽快升级:正文清洗依赖的 dompurify 两条公告已公开,本轮已切到修复版本。

Installation

Docker images:

docker pull ghcr.io/zhuchunshu/sforum-api:v3.0.14
docker pull ghcr.io/zhuchunshu/sforum-migrate:v3.0.14
docker pull ghcr.io/zhuchunshu/sforum-web:v3.0.14

Update an existing installation with a verified bootstrap:

(
  set -eu
  cd /path/to/sforum
  bootstrap_dir="$(mktemp -d .sforum-bootstrap.XXXXXX)"
  trap 'rm -rf "$bootstrap_dir"' EXIT HUP INT TERM
  curl -fsSLo "$bootstrap_dir/sforum-bootstrap.sh" https://github.com/zhuchunshu/SForum/releases/download/v3.0.14/sforum-bootstrap.sh
  curl -fsSLo "$bootstrap_dir/SHA256SUMS" https://github.com/zhuchunshu/SForum/releases/download/v3.0.14/SHA256SUMS
  (
    cd "$bootstrap_dir"
    awk '$2 == "sforum-bootstrap.sh" { print }' SHA256SUMS > sforum-bootstrap.sha256
    test "$(wc -l < sforum-bootstrap.sha256 | tr -d '[:space:]')" = 1
    if command -v sha256sum >/dev/null 2>&1; then
      sha256sum -c sforum-bootstrap.sha256
    else
      shasum -a 256 -c sforum-bootstrap.sha256
    fi
    if command -v gh >/dev/null 2>&1; then
      gh attestation verify sforum-bootstrap.sh --repo zhuchunshu/SForum
    fi
  )
  install -m 0755 "$bootstrap_dir/sforum-bootstrap.sh" ./sforum-bootstrap.sh
  rm -rf "$bootstrap_dir"
  trap - EXIT HUP INT TERM
  ./sforum-bootstrap.sh upgrade --version v3.0.14
)

Fresh install with the verified deploy bundle:

(
  set -eu
  mkdir -p sforum
  cd sforum
  curl -fsSLo sforum-deploy.tar.gz https://github.com/zhuchunshu/SForum/releases/download/v3.0.14/sforum-deploy.tar.gz
  curl -fsSLo SHA256SUMS https://github.com/zhuchunshu/SForum/releases/download/v3.0.14/SHA256SUMS
  awk '$2 == "sforum-deploy.tar.gz" { print }' SHA256SUMS > sforum-deploy.sha256
  test "$(wc -l < sforum-deploy.sha256 | tr -d '[:space:]')" = 1
  if command -v sha256sum >/dev/null 2>&1; then
    sha256sum -c sforum-deploy.sha256
  else
    shasum -a 256 -c sforum-deploy.sha256
  fi
  if command -v gh >/dev/null 2>&1; then
    gh attestation verify sforum-deploy.tar.gz --repo zhuchunshu/SForum
  fi
  tar -xzf sforum-deploy.tar.gz --strip-components=1
  ./sforum-bootstrap.sh install --yes --version v3.0.14
)

Manual download: Download the matching Linux or macOS archive from the assets below.

Documentation