Skip to content

SForum v3.0.16

Choose a tag to compare

@github-actions github-actions released this 23 Oct 22:41
· 79 commits to main since this release

Maintainable, plugin-first open-source forum framework.

本次更新

  • 附件存储(重要兼容性修复):内置 S3 兼容存储插件(sforum.storage-s3 1.0.9 → 1.0.10)现可直连 Cloudflare R2。此前仅填 endpoint / bucket / API token 无法工作,根因有二:其一,aws-sdk-go-v2(service/s3 v1.97.x)默认 RequestChecksumCalculation=when_supported,每个 PutObject 都附加 x-amz-checksum-crc32 头,而 R2 以 400 NotImplemented 拒绝该头,导致探测(以 PutObject 起步)与全部上传失败;其二,SDK 默认 Virtual-host 寻址生成的 <bucket>.<account>.r2.cloudflarestorage.com 域名在 R2 无 DNS,同样不可达。现改为:请求/响应校验和统一切到 when_required(仅 API 要求时发送);寻址方式由布尔升级为三态 auto|true|false,auto(新默认)对一切非 amazonaws.com 自定义端点自动解析 Path-style、对 AWS 保持 Virtual-host;旧存量布尔值继续兼容;空 region 对 R2 端点解析为 auto(AWS 仍回退 us-east-1),显式配置始终优先。
  • 大附件下载修复:代理读取(Open)不再用 60 秒操作超时约束响应体生命周期——大附件此前会在流中途被掐断;改为共享 *http.Client 承载拨号 / TLS / 响应头超时,Put 仍按 manifest 供应商超时上限 120 秒。
  • 管理端配置:use_path_style 由布尔开关升级为 Auto(推荐)/ Path-style / Virtual-host 三态下拉(复用既有 SFExtensionSettingsField USelect 渲染与 Host 选项校验),region 与公开基础 URL 文案补充 R2 说明;插件 README 新增 Cloudflare R2 快速配置章节。Host 代码零改动,供应商槽位、SecretStore 与实例协议不变。
  • 决策记录:knowledge/decisions/2026-10-24-s3-compatible-auto-addressing.md 记载三态寻址 + when-required 校验和姿态及已否决的备选方案(供应商预设下拉、全局 path-style 默认、multipart/直传,本次均不在范围内)。

升级提示

  • 无数据库迁移,升级无手工步骤。已存储的 use_path_style 布尔值自动按原语义解析,无需改动配置。
  • 使用 Cloudflare R2 的运维:端点填 https://<account_id>.r2.cloudflarestorage.com、region 填 auto、寻址方式保持 Auto(推荐);公开基础 URL 可选填 R2 自定义域名或 r2.dev 公开地址,留空则公开附件继续走 Host 代理。保存前用「测试草稿配置」做 Put/Head/Get/Delete 回环探测,凭据或权限有误时会展示供应商原始错误。
  • API 消费方与前端无破坏性变化;附件公开访问、上传与 /media/... 代理路径行为不变。

Installation

Docker images:

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

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

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

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

Documentation