第三十八章 升级与版本更新
升级分程序文件与数据库两部分;版本号怎么读、在线与离线两种走法、黑名单、失败怎么退与升级后必查的六页。
这一章解决什么
Ju7CMS 的升级分成两件事:程序文件更新(lib、ju7、插件、模板等)与数据库迁移(新增列、补数据)。升级包把两者放在一起,但执行时有严格的版本判断、文件黑名单和升级前备份。本章讲清版本号怎么读、在线与离线两种升级怎么走、出问题怎么退回去。
版本号怎么读
版本号是 14 位数字:yyyymmddHHMMSS。例如 20261023140736 表示 2026-10-23 14:07:36 打包。它没有「主版本.次版本」的概念,比较大小就是比时间。
| 位置 | 存什么 |
|---|---|
auth_pkgver | 本机当前程序版本 |
| 升级包清单 | 包的目标版本 |
| 授权系统 | 签发升级包时使用的版本与文件摘要 |
系统只接受严格更新的包:新版本必须是 14 位数字,且数值大于当前版本。相同版本不重复装,旧版本不能拿来降级。这条判断在服务端,改前端按钮没有用。
在线升级:后台一条栏
位置:登录后台 → 工作台(首页)→ 顶部升级栏。只有超级管理员能看到可执行按钮。
| 状态 | 界面文字 | 能做什么 |
|---|---|---|
| 有新版 | 存在可用更新,更新日期:… | 点【立即更新】执行 |
| 已最新 | 当前主程序已是最新版本 | 无操作 |
| 连不上 | 暂时没连上厂商的升级服务,站点照常使用 | 点【检查更新】重试;不影响站点 |
| 没查过 | 在线升级还没检查过,点右边的【检查更新】查一次 | 先检查 |
打开后台时不会自动出网检查,避免每次登录都卡几秒;状态来自上一次检查的缓存,只有点【检查更新】或升级完成后才真正请求厂商。连不上这一态缓存 5 分钟,避免反复重试。
执行时发生了什么
- 校验登录态、超级管理员身份、同源请求与 CSRF 令牌。
- 从厂商取回签名的升级包,校验版本严格更新、包摘要与文件清单。
- 把正式数据库备份到
data/databackup/pre-migrate-<时间>.bak。 - 按清单落盘程序文件;随后执行数据库迁移。
- 写新的
auth_pkgver,清缓存,刷新升级栏状态。
落盘请求由专用端点 ju7/upgpost.asp 接单,而不是工作台本身。原因很实际:IIS 会在请求期间锁住入口脚本,如果包里正好含这个文件,升级就会卡在「写自己被拒绝」。这个端点被列入黑名单,永远不会出现在包内,所以能写其他所有文件。
升级包的黑名单
打包端与安装端用同一把尺子,命中任意一条就拒收整个包,不做部分安装:
| 类别 | 被拒内容 | 原因 |
|---|---|---|
| 数据目录 | data/ upfile/ upload/ uploads/ log/ logs/ cache/ cachelist/ backup/ databackup/ temp/ tmp/ | 这些是本站数据,不能被厂商包覆盖 |
| 授权目录 | plug/authorize/update/ | 授权票据与升级缓存不能打进包 |
| 敏感扩展名 | config mdb ldb bak old | 配置、数据库、备份不随程序走 |
| 站点身份文件 | andvar.asp | 里面是本站的 theme_root、站点目录、数据库连接等,覆盖即换站 |
| 本站密钥 | lib/sms.asp | 短信等站点级凭据不能被统一版本覆盖 |
| 清单与通道 | update.xml、update.bak.xml、plug/authorize/update.xml、ju7/upgpost.asp | 清单自引用与接单端点都会造成死锁或伪造入口 |
这与「整站回灌」不是一回事:回灌是主题自带的数据包,会覆盖 upfile/、block/ 甚至数据库;升级包只动程序文件,且有上面的黑名单保护。
离线/手工升级
服务器不能出网,或厂商只给了压缩包时,按下面顺序做:
- 备份。功能 → 数据备份,生成一份并下载走;再把
config/、andvar.asp、theme/单独复制一份。 - 核对版本。确认包的目标版本高于本机
auth_pkgver;相同或更低不要装。 - 解包检查。包内不应出现上表任何一类路径。出现就整包退回,不要手工挑文件装。
- 覆盖程序文件。保留
data/、upfile/、cache/、log/、config/、andvar.asp、theme/(除非本次升级明确要换主题)。 - 执行数据库迁移。访问后台首页,让系统跑迁移;或按包内说明执行对应脚本。
- 清缓存并验证。缓存管理 → 清模板、页面、内存缓存;打开首页、列表、详情、后台各一页。
- 写版本号。确认后台显示的版本已是新版本,避免下次又提示升级。
升级失败怎么退
| 现象 | 先看 | 处置 |
|---|---|---|
| 提示包被拒 | 拒绝原因与包内路径 | 整包退回,让打包方重做;不要删掉黑名单规则绕过 |
| 落盘中途失败 | 错误记录、磁盘空间、文件占用 | 用 pre-migrate-*.bak 恢复数据库,再用文件备份覆盖程序目录 |
| 升级后整站 500 | 错误记录里的文件与行号 | 先恢复上一版程序文件;数据库迁移通常可重复执行,不要急着重灌库 |
| 升级后页面 200 但空白 | 模板编译缓存、模板语法 | 清模板缓存;仍是空白就恢复该模板文件 |
| 版本号没变,反复提示 | auth_pkgver 是否写入 | 确认迁移完成;必要时手工写入正确版本(先备份库) |
回滚的顺序是「先库、后文件」还是「先文件、后库」取决于本次升级有没有改表结构。最稳的做法是:两边都恢复到升级前同一时刻的备份,再重新排查,不要只退一半。
升级后必须回归的六页
- 首页:版块、轮播、图片是否完整。
- 一个列表页:分页、侧栏、SEO 标题。
- 一个详情页:正文、图片、上一章/下一章。
- 留言表单:能打开、能提交、验证码能发。
- 后台工作台:无报错、升级栏状态正常。
- 错误记录:没有新增的持续 500。
接下来怎么读
- 授权与版本的关系:第三十六章。
- 升级后页面空白/500 的排查:第四十章。
- 常见提示原文对照:第四十四章。
微信扫码聊需求