Repository navigation
SForum v3.0.20
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.productionstill pinsghcr.io/zhuchunshu, the upgrade fails at the database compatibility check withNo 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 — rewriteSFORUM_REGISTRYtoghcr.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.20One-line install (latest stable, same one-liner as the README):
curl -fsSL https://github.com/keeptrue/SForum/releases/latest/download/sforum-install.sh | bashOne-line update (does not trust the local bootstrap):
curl -fsSL https://github.com/keeptrue/SForum/releases/latest/download/sforum-install.sh | bash -s -- upgradeUpdate 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
- GitHub Repository
- 中文部署文档
- English Deployment Guide
- 完整变更记录 / Full Changelog:
v3.0.20-beta.2...v3.0.20