Skip to content

SForum v3.0.15

Choose a tag to compare

@github-actions github-actions released this 23 Oct 21:23
· 81 commits to main since this release

Maintainable, plugin-first open-source forum framework.

本次更新

  • 论坛(重要缺陷修复):带图发帖/评论在正文包含 2 张及以上图片 时必然失败并返回 500「服务器暂时不可用」。根因是 202607110015 把槽位型唯一索引 (resource_type, resource_id, context) 建到了所有资源上,第二条附件引用必然违反约束并回滚整个发布事务;0–1 图成功而多图失败让它看起来像"偶发"。现已收窄为槽位型部分索引(站点品牌图 / SEO 图 / 用户头像 / 扩展图标仍一槽一图),论坛正文引用恢复多值语义;库中无历史漂移,升级无回填。
  • 错误可诊断性:正文附件失效(已删除/已转私有/非本人上传)从裸 500 改为具名 422 forum.attachment_unavailable,data.fields.content 携带字段级原因,前端直接提示"重新上传这张图";附件引用写入的唯一约束冲突兜底为具名 409 forum.attachment_conflict。附件写入幂等化(ON CONFLICT DO NOTHING)、行锁按 id 排序防并发死锁、reference_count 按引用行重算并在写入时自愈历史漂移。

升级提示

  • 新增数据库迁移 202610260001_attachment_reference_scope_unique.sql(索引替换),升级时自动执行,无手工步骤。
  • API 消费方:POST/PATCH /topics 与评论写路径新增两个错误 reason(422 forum.attachment_unavailable、409 forum.attachment_conflict),OpenAPI 已登记;此前把附件相关失败一律按 500 处理的客户端可按新 reason 细化提示。
  • 唯一性边界变化:topic/comment 一条内容可绑多图(基表 UNIQUE (attachment_id, resource_type, resource_id, context) 兜底),site/seo/user/extension 槽位仍一槽一图;迁移的 Down 方向在存在多值数据时会刻意失败(fail-closed)。

Installation

Docker images:

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

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.15/sforum-bootstrap.sh
  curl -fsSLo "$bootstrap_dir/SHA256SUMS" https://github.com/zhuchunshu/SForum/releases/download/v3.0.15/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.15
)

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.15/sforum-deploy.tar.gz
  curl -fsSLo SHA256SUMS https://github.com/zhuchunshu/SForum/releases/download/v3.0.15/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.15
)

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

Documentation