Skip to content

Releases: keeptrue/SForum

SForum v3.0.23

Choose a tag to compare

@github-actions github-actions released this 27 Oct 23:03

Maintainable, plugin-first open-source forum framework.

修复 Security 门禁的 x/net 可达漏洞(GO-2026-6866 / GO-2026-6860),8 个内置插件同步 patch 抬版


Installation

Docker images:

docker pull ghcr.io/keeptrue/sforum-api:v3.0.23
docker pull ghcr.io/keeptrue/sforum-migrate:v3.0.23
docker pull ghcr.io/keeptrue/sforum-web:v3.0.23

One-line install (latest stable, same one-liner as the README):

curl -fsSL https://github.com/keeptrue/SForum/releases/latest/download/sforum-install.sh | bash

One-line update (does not trust the local bootstrap):

curl -fsSL https://github.com/keeptrue/SForum/releases/latest/download/sforum-install.sh | bash -s -- upgrade

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

Fresh install with the verified deploy bundle:

(
  set -eu
  mkdir -p sforum
  cd sforum
  curl -fsSLo sforum-deploy.tar.gz https://github.com/keeptrue/SForum/releases/download/v3.0.23/sforum-deploy.tar.gz
  curl -fsSLo SHA256SUMS https://github.com/keeptrue/SForum/releases/download/v3.0.23/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 keeptrue/SForum
  fi
  tar -xzf sforum-deploy.tar.gz --strip-components=1
  ./sforum-bootstrap.sh install --yes --version v3.0.23
)

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

Documentation

SForum v3.0.22

Choose a tag to compare

@github-actions github-actions released this 27 Oct 22:24

Maintainable, plugin-first open-source forum framework.

修复 web 层把入口代理写入的真实客户端 IP 整组删除:会话、审计与写限流不再记成容器地址


Installation

Docker images:

docker pull ghcr.io/keeptrue/sforum-api:v3.0.22
docker pull ghcr.io/keeptrue/sforum-migrate:v3.0.22
docker pull ghcr.io/keeptrue/sforum-web:v3.0.22

One-line install (latest stable, same one-liner as the README):

curl -fsSL https://github.com/keeptrue/SForum/releases/latest/download/sforum-install.sh | bash

One-line update (does not trust the local bootstrap):

curl -fsSL https://github.com/keeptrue/SForum/releases/latest/download/sforum-install.sh | bash -s -- upgrade

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

Fresh install with the verified deploy bundle:

(
  set -eu
  mkdir -p sforum
  cd sforum
  curl -fsSLo sforum-deploy.tar.gz https://github.com/keeptrue/SForum/releases/download/v3.0.22/sforum-deploy.tar.gz
  curl -fsSLo SHA256SUMS https://github.com/keeptrue/SForum/releases/download/v3.0.22/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 keeptrue/SForum
  fi
  tar -xzf sforum-deploy.tar.gz --strip-components=1
  ./sforum-bootstrap.sh install --yes --version v3.0.22
)

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

Documentation

SForum v3.0.21

Choose a tag to compare

@github-actions github-actions released this 27 Oct 20:40

Maintainable, plugin-first open-source forum framework.

安装弹窗只在还有动作时给管理页入口;跳转前先卸载弹窗,修「到了插件页弹窗还在」


Installation

Docker images:

docker pull ghcr.io/keeptrue/sforum-api:v3.0.21
docker pull ghcr.io/keeptrue/sforum-migrate:v3.0.21
docker pull ghcr.io/keeptrue/sforum-web:v3.0.21

One-line install (latest stable, same one-liner as the README):

curl -fsSL https://github.com/keeptrue/SForum/releases/latest/download/sforum-install.sh | bash

One-line update (does not trust the local bootstrap):

curl -fsSL https://github.com/keeptrue/SForum/releases/latest/download/sforum-install.sh | bash -s -- upgrade

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

Fresh install with the verified deploy bundle:

(
  set -eu
  mkdir -p sforum
  cd sforum
  curl -fsSLo sforum-deploy.tar.gz https://github.com/keeptrue/SForum/releases/download/v3.0.21/sforum-deploy.tar.gz
  curl -fsSLo SHA256SUMS https://github.com/keeptrue/SForum/releases/download/v3.0.21/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 keeptrue/SForum
  fi
  tar -xzf sforum-deploy.tar.gz --strip-components=1
  ./sforum-bootstrap.sh install --yes --version v3.0.21
)

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

Documentation

SForum v3.0.20

Choose a tag to compare

@github-actions github-actions released this 27 Oct 16:40

Maintainable, plugin-first open-source forum framework.

自 v3.0.18 以来(v3.0.19 因当时 main CI 未通过,没有发布任何制品):

  • 插件 Host API 新增 SecretService.Put/Clear,插件可写入自己声明的 secret 设置
  • 附件新增引用计数核对与后台维护面板(默认 dry-run),清理/核对请求体非法时明确报错
  • 扩展管理三页改为行内「可升级 / 重启后生效 / 激活后生效」徽章,新增「只看有更新」视图
  • 后台用户管理支持新增用户(POST /users)与创建弹窗,列表/详情错误呈现收敛
  • 首页右栏问候语按时段生成;修复设置页中心列裁切与移动端分类页头像点击
  • 一行安装支持交互选择安装目录(默认 ./sforum),非交互模式全程不问
  • Web SDK 发布 @sforum/admin-sdk@1.3.1、@sforum/plugin-ui@1.1.1
  • 发布链路:补齐内置插件版本契约、GHCR 合并 inspect 增加有限重试

升级前必读:旧镜像命名空间(v3.0.13 及更早的安装)

GitHub 账号改名后,镜像已从 ghcr.io/zhuchunshu 迁到 ghcr.io/keeptrue。如果 .env.production 里仍然固定着旧前缀,升级会在「检查目标版本的数据库兼容性」这一步失败:

Error response from daemon: No such image: ghcr.io/zhuchunshu/sforum-migrate:v3.0.20

原因是升级脚本按新前缀拉取镜像,而迁移步骤按 .env.production 的旧前缀解析镜像名。此时数据库没有被改动——迁移容器根本没有启动,旧版本已自动恢复,不需要还原备份。

升级前先改掉前缀,再执行一键脚本:

cd /path/to/sforum
sed -i 's|^SFORUM_REGISTRY=.*|SFORUM_REGISTRY=ghcr.io/keeptrue|' .env.production
# 或者直接删掉这一行:compose 的默认值已经是 ghcr.io/keeptrue

只想让这一次生效、不改文件:curl -fsSL .../sforum-install.sh | SFORUM_REGISTRY=ghcr.io/keeptrue bash。

English: if .env.production still pins ghcr.io/zhuchunshu, the upgrade fails at the database compatibility check with No such image. Pulls use the new namespace while the migrate step resolves the old one from .env.production. No migration ran and the database is untouched — rewrite SFORUM_REGISTRY to ghcr.io/keeptrue (or delete the line) and re-run the updater.


Installation

Docker images:

docker pull ghcr.io/keeptrue/sforum-api:v3.0.20
docker pull ghcr.io/keeptrue/sforum-migrate:v3.0.20
docker pull ghcr.io/keeptrue/sforum-web:v3.0.20

One-line install (latest stable, same one-liner as the README):

curl -fsSL https://github.com/keeptrue/SForum/releases/latest/download/sforum-install.sh | bash

One-line update (does not trust the local bootstrap):

curl -fsSL https://github.com/keeptrue/SForum/releases/latest/download/sforum-install.sh | bash -s -- upgrade

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

Fresh install with the verified deploy bundle:

(
  set -eu
  mkdir -p sforum
  cd sforum
  curl -fsSLo sforum-deploy.tar.gz https://github.com/keeptrue/SForum/releases/download/v3.0.20/sforum-deploy.tar.gz
  curl -fsSLo SHA256SUMS https://github.com/keeptrue/SForum/releases/download/v3.0.20/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 keeptrue/SForum
  fi
  tar -xzf sforum-deploy.tar.gz --strip-components=1
  ./sforum-bootstrap.sh install --yes --version v3.0.20
)

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

Documentation

SForum v3.0.20-beta.2

SForum v3.0.20-beta.2 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 27 Oct 15:59

Maintainable, plugin-first open-source forum framework.

  • 内置插件基线漂移时点名具体插件与共享运行时
  • 共享插件运行时变更后补齐内置插件版本与发布基线
  • Web SDK 补丁版本抬升,修复发版时 npm 内容冲突
  • 一行安装交互选择安装目录并全程显示绝对路径

Installation

Docker images:

docker pull ghcr.io/keeptrue/sforum-api:v3.0.20-beta.2
docker pull ghcr.io/keeptrue/sforum-migrate:v3.0.20-beta.2
docker pull ghcr.io/keeptrue/sforum-web:v3.0.20-beta.2

One-line install (this release):

curl -fsSL https://github.com/keeptrue/SForum/releases/download/v3.0.20-beta.2/sforum-install.sh | bash

One-line update (does not trust the local bootstrap):

curl -fsSL https://github.com/keeptrue/SForum/releases/download/v3.0.20-beta.2/sforum-install.sh | bash -s -- upgrade

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/keeptrue/SForum/releases/download/v3.0.20-beta.2/sforum-bootstrap.sh
  curl -fsSLo "$bootstrap_dir/SHA256SUMS" https://github.com/keeptrue/SForum/releases/download/v3.0.20-beta.2/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 keeptrue/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.20-beta.2
)

Fresh install with the verified deploy bundle:

(
  set -eu
  mkdir -p sforum
  cd sforum
  curl -fsSLo sforum-deploy.tar.gz https://github.com/keeptrue/SForum/releases/download/v3.0.20-beta.2/sforum-deploy.tar.gz
  curl -fsSLo SHA256SUMS https://github.com/keeptrue/SForum/releases/download/v3.0.20-beta.2/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 keeptrue/SForum
  fi
  tar -xzf sforum-deploy.tar.gz --strip-components=1
  ./sforum-bootstrap.sh install --yes --version v3.0.20-beta.2
)

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

Documentation

SForum v3.0.18

Choose a tag to compare

@github-actions github-actions released this 26 Oct 11:21

Maintainable, plugin-first open-source forum framework.

v3.0.17 已打 tag 但未发布:release.yml 在 publish-web-sdks 的打包校验阶段
失败(Vue 脚手架仍依赖 @sforum/admin-sdk@^1.2.0,而 SDK 已抬到 1.3.0)。失败发生
在任何 npm publish 之前,promote / github-release 均未执行 ⇒ npm 无包、GHCR 无
v3.0.17/latest 变更、无 GitHub Release。按仓库惯例不移动已推送的 tag,改为补发
本版。

本版 = v3.0.17 的全部内容 + 三项修复:

  • Vue 脚手架跟上 admin-sdk 1.3.0(并让单测从 SDK 清单派生期望版本,不再写死);
  • 把 Web SDK 包校验挂进主门禁 ci.yml(原本只在 release.yml,导致发版最后一步才发现);
  • dev 后端构建钉住工具链与 workspace:GOTOOLCHAIN 从模块 go.mod 的 go 行派生,
    文件系统 replace 改由临时 go.work 承载(replace 路径会被写进 buildinfo,而本地与
    CI 的目录深度必然不同)。⇒ manifest 的 backend.digest 可跨环境复现。

v3.0.17 的原始内容不变:首个带宿主动作 extension.install.enable 的发行版、
CoreCompatibilityVersion 从 git tag 派生、LifecycleRecovery、平台闸门、构建一致性。


Installation

Docker images:

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

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

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

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

Documentation

SForum v3.0.16

Choose a tag to compare

@github-actions github-actions released this 23 Oct 22:41

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

SForum v3.0.15

Choose a tag to compare

@github-actions github-actions released this 23 Oct 21:23

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

SForum v3.0.14

Choose a tag to compare

@github-actions github-actions released this 23 Oct 15:23

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

SForum v3.0.13

Choose a tag to compare

@github-actions github-actions released this 23 Oct 02:54

Maintainable, plugin-first open-source forum framework.

本次更新

  • 论坛体验:公开信息流改为纯追加加载,/ 与 /search 不再渲染页码控件,?page=N 仍是有效深链;正文支持 mermaid / chart / 公式围栏,编辑器支持表格;评论作者名与 OP 徽标同排;站外链接统一走中转页。
  • 身份与安全:登录人机验证新增「总是 / 新设备 / 管理员账号」三个可叠加触发条件;昵称支持自助修改、冷却与曾用名;零用户站点首位注册者注册后直接进入后台;修复角色权限全量替换与插件权限审批并发时的主键冲突;修复公开资产跨源头缺失导致的 QQ 内置浏览器 500。
  • 扩展与主题:内置插件自动更新(受保护内置插件启动时按 staged SemVer 自动晋升,带系统账号、管理端开关与安全闸);后台扩展安装页支持上传包与 URL;全新安装由 Host 自动批准受保护默认主题,不再停在 Core fallback;公开 L2 恒开;扩展数据面 E10、Core 附件扩展 API、管理端插件导航分组。
  • AI:观测轨迹与运行回放、eval 基线、工具目录与工具调用记录、可配置回复触发模式、回复图片输入、@提及与成员检索、AI 能力注册表。
  • 部署与运维:新增校验和验证的一键 bootstrap 与 sforum-latest.sh;部署交互可选 stable / prerelease / 指定版本,更新前同步完整托管工具链;migrate 使用绝对 EXTENSION_ROOT;Go 工具链升到 1.26.10(CVE-2026-111943);Web 生产构建默认堆上调;仓库全量门禁从 21:31 降到 7:24。
  • 修复:信息流移除页码后的仓库级静态契约、错误页 i18n 未安装时的崩溃、代码扫描告警、管理端多处保存与布局问题。

升级提示

  • SFORUM_V3_PUBLIC_L2 已移除,旧部署里继续设置会被静默忽略;公开 L2 依赖 exact-artifact trust,SFORUM_V3_TRUST_CHALLENGES=false 时仍按设计关闭。
  • 公开信息流不再有页码;分类、标签、评论等归档页仍保留页码。
  • 内置主题换了新 digest 后仍需在后台手动激活一次;全新安装由 Host 自动批准。
  • 从 v3.0.9 或任一 3.0.13 预发布升级:数据库迁移自动执行,无手工步骤;正式版会移动 latest 与 3.0 镜像标签。

Installation

Docker images:

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

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

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

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

Documentation