Repository navigation
SForum v3.0.16
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 以 400NotImplemented拒绝该头,导致探测(以 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 三态下拉(复用既有SFExtensionSettingsFieldUSelect 渲染与 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.16Update 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
- GitHub Repository
- 中文部署文档
- English Deployment Guide
- 完整变更记录 / Full Changelog:
v3.0.15...v3.0.16