Repository navigation
Upgrade.zh CN
新安装默认目录为 /opt/LLMOJ。已有实例保留原目录;原先安装到 /opt/LibreOJ 的实例请明确使用 --prefix /opt/LibreOJ。修改默认值不会迁移文件或服务。
本工具用于已完成官方一键安装的 all 或 web 实例,更新应用代码和网页资源,同时保留已有账号、题目、提交、对象存储、AI 配置及主密钥、评测槽数、CPU 绑定和原有服务定制。它不会重新运行安装器或初始化管理员。
本版包含个人主页的私人团队、题目页内题解、Fake、提交详情 Hack、NOI 比赛可选 Self Eval 和严格 IOI,并为数据库与评测运行代码设置固定合同;在数据库副本和正式维护阶段验证。结构、独立迁移入口、旧 AI 题解分类和回滚保护见 社区功能升级。旧注册审核入口或首批社区功能入口不能安装完整合并版,请使用目标完整源码中的入口。
本版支持官方 version-3 安装元数据、本机 MariaDB/Redis/MinIO、单实例后端及 Node 24.21.0 / pnpm 11.13.1 的已知布局。运行时、依赖锁文件、原生代码和 rootfs 配方须与目标版本兼容;从原始评测代码过渡到经审核的 Hack/自测运行时,须遵循按文件固定旧、新哈希的契约,且只对官方 all 角色自动执行(web 需单独协调远程评测端,自动入口拒绝这一步)。其他评测源码、评测协议和沙箱改动可以升级:在 all 安装中,升级器会离线重建有改动的原生沙箱与评测扩展,在暂存副本中运行评测端原生测试、类型检查和回归测试;沙箱有改动时,还会在维护窗口内、修改数据库之前用真实沙箱运行检查。评测协议只能追加取值,删除或修改已部署的取值会被拒绝。依赖、锁文件、基础设施和其他共享包仍保持冻结。数据库只允许注册审核/申请保护、十二张社区表、首版 Hack 表的可空 STD 内容字段追加、讨论分类列与索引、两张两步验证表(user_two_factor、user_passkey)、两张持久评测队列表(judge_job、judge_job_attempt)、评测机排空标记(judge_client.draining)、Fake/Hacked 追加、八个新增权限,以及两个比赛字段:不删除数据地将 rule 扩为 varchar(16)、新增可空 ruleOptions longtext 保存 simple-json。赛制仅有 NOI / OI、IOI、ICPC、严格 IOI;Self Eval 仅在 NOI / OI 比赛中按开关提供,手工维护 make/std 并沿用正式 SPJ。追加权限和状态会先核对全部旧枚举值及顺序;删除、重命名、重排或其它未知值均不在自动升级范围。
仓库链接、组件描述及 bootstrap 显示标题的本次品牌修正不会被误判为依赖变化:升级器仅允许指定文件中的已知 LibreOJ → LLMOJ 文案/仓库地址变换,包名、依赖、脚本、API/CDN 地址及其他配置仍须符合原兼容要求。源码完整性检查仍使用原始文件内容。
默认实例服务与 AI/临时文件目录须保持官方布局;后端或评测通过 EnvironmentFile 注入环境、将 AI 主密钥或工作目录改到其它位置时,本版会拒绝自动处理。已有 CPU 绑定、评测槽数和内存限制等受支持的服务定制会保留。
它不承诺从任意历史版本升级。Git 管理的部署、未知安装布局、自定义数据库连接、未知数据库结构改动或依赖/原生模块变化会被拒绝,应先设计相应迁移。拒绝预检不会覆盖配置,也不应通过删除旧数据或重新安装来绕过。
先确认目标文件已上传到 GitHub。中文入口:
curl -fsSL https://raw.githubusercontent.com/houyhlouis/LLMOJ/main/upgrade.zh-CN.sh -o /tmp/llmoj-upgrade.zh-CN.sh && \
sudo bash /tmp/llmoj-upgrade.zh-CN.sh --prefix /opt/LLMOJ自定义安装目录请替换 --prefix。脚本将 main 解析为固定的完整提交,再下载该提交的完整源码,避免下载期间分支变化混用版本。可通过 --ref 完整提交SHA 选择已审阅的提交;这不能绕过兼容性检查。
只读预检:
sudo bash /tmp/llmoj-upgrade.zh-CN.sh --prefix /opt/LLMOJ --plan--plan 检查部署与运行时,并列出尚未完成的检查;它不会构建、创建数据库副本或停服务,因此预检通过不等于升级已完成。完整源码的构建和数据库副本迁移验证在实际升级的暂存阶段进行。
开始前暂停新提交、出题导入和 AI 任务,等待正在运行及排队的普通评测、Hack、自测和预测试准备任务结束;远程评测节点也必须排空。脚本会要求在终端输入 UPGRADE 确认。它会再次检查数据库中的活动任务,但不能自动替你协调所有远程节点。
- 获取实例维护锁,核对服务实际使用的目录、配置、来源、磁盘空间和运行时。
- 在实例的私有备份目录内复制独立的构建环境,构建后端、前端并验证网页资源清单,不写入正在运行的依赖目录。
- 备份配置、AI 主密钥和数据库;将数据库备份恢复到临时库,审查并试运行已知的表结构变更和注册申请迁移。不兼容则在切换前停止。
- 在维护窗口停止 Nginx、评测及后端,重新备份数据库并复查迁移,再切换代码和网页资源。
- 检查新后端及原先启用的本机评测,最后恢复网页入口。服务恢复到升级前的启停状态;原本未运行的服务不会被永久开启。
备份在 <安装目录>/backups/upgrade/<时间-随机后缀>/,路径会显示在终端。SQL、配置、构建日志等备份是 root 私有文件,可能包含敏感信息,不要上传 GitHub。脚本保留备份,升级成功后请按自己的保留策略管理;本工具不会删除已有题库、评测数据或旧备份。注册审核旧版产生的未激活空账户会按下方严格规则迁为独立申请。
升级器新增独立服务配置:
/etc/systemd/system/libreoj-backend.service.d/90-libreoj-schema-sync.conf
它将 LIBREOJ_SCHEMA_SYNC=0 固定到后端服务,禁止启动时自动改表;在第一条社区 DDL 执行前就安装,迁移中途失败也会保留。迁移由升级器在备份及检查后执行。已有同名自定义文件会被拒绝覆盖。其它 systemd 配置、Nginx、数据库密码、API Key 和评测配置保留。
网站管理的注册方式使用现有 settings 表的独立键,不需要新增表或字段。升级保留网页覆盖和首页内容;未保存覆盖时继续使用 YAML 默认值。
新版待审核/已拒绝申请不创建主站账户,通过时才分配用户 ID。升级器在数据库副本中先验证旧申请迁移,并在正式停服务后重新检查、事务执行:
- 保留已有正式账户及已通过审核账户的 ID、密码与业务数据。
- 将符合旧版默认值的未激活空账户转为独立申请,保存密码哈希、申请时间及审核记录;清除对应空账户记录,旧 ID 不回收。
- 旧账户存在内容、权限、定制资料、未知关联、跨库外键或身份冲突时,拒绝迁移,保留原数据,等待人工审查。正常拒绝操作产生的审核日志保留用于追溯。
- 不把旧备份直接导回覆盖当前数据。数据迁移成功后若部署切换失败,旧代码可能不识别新申请,自动回滚会保守拒绝并保持应用停止,应修复新版部署后开放。
不能只覆盖前端文件或删除旧审核表来完成升级。完整状态规则见 注册审核。
确认维护窗口已排空后,无交互运行可用:
sudo bash /tmp/llmoj-upgrade.zh-CN.sh --prefix /opt/LLMOJ --apply --drained--drained 是操作者对维护状态的明确声明,不是自动取消任务的指令。不要对仍有用户操作、远程评测或 AI 作业的站点添加这个参数。
已经有经过审核的完整源码时,可以使用其中的入口;不能把只含修改文件的 ZIP 当作完整源码:
sudo bash /path/to/LLMOJ/deploy/upgrade.sh \
--prefix /opt/LLMOJ --source /path/to/LLMOJ --plan预检显示 sourceSha256。核对来源及文件内容后,在实际执行时同时提供 --source /path/to/LLMOJ --source-sha256 完整64位哈希。也可用 python3 /path/to/LLMOJ/deploy/upgrade.py --source /path/to/LLMOJ --source-digest 只读计算源码树哈希。哈希用于发现内容变化,本身不能证明未经核验的源码可信。
已有团队、题解、Fake/Hacked、Hack STD 配置或记录、自测数据、严格 IOI 比赛、已保存功能选项、新增显式权限授权/拒绝或已开启两步验证的账号时,回滚目标必须支持对应的访问和行为规则;否则回滚被拒绝,应修复新版。社区结构已添加时,禁止自动同步的保护会保留,不能通过回滚重新开启自动改表。
构建或数据库副本校验失败时,原运行实例保持原版本。进入维护切换后失败时,脚本尝试恢复原代码和服务状态;如自动恢复失败,会明确报告并保持应用服务停止,保留恢复记录。不要在看到失败信息后假定已升级或已恢复。
完成故障排查后可用相同参数重试。注册审核的建表及申请迁移可重复执行,已迁移的申请不会重复创建;未知结构变更仍会拒绝。不要删除数据库、私有配置或密钥来重试。
需要手动回滚时,先排空并暂停业务,使用日志中的本实例备份目录:
sudo bash /opt/LLMOJ/deploy/upgrade.sh --prefix /opt/LLMOJ \
--rollback /opt/LLMOJ/backups/upgrade/实际备份目录 --drained回滚代码和升级器自身的服务配置,保留数据库、对象存储及兼容的新增审核/申请表,不会把旧 SQL 备份覆盖到现在的数据库,因此不会主动丢弃升级后的提交。存在待审核或被拒绝的旧账号或新版申请时,本版会保守拒绝代码回滚,防止旧代码绕过审核门槛;应保留支持审核的版本并修复问题。如果在停服务后的复查中发现新产生的未激活账号,服务会保持停止,须恢复支持审核的版本后再开放。SQL 备份用于独立灾难恢复,不是日常降级按钮。
如果这次升级迁移过旧待审核/已拒绝的未激活空账号,即使后来这些申请全部获批,脚本仍拒绝按该备份进行普通代码回滚,避免旧代码无法识别已迁移的申请和审核历史。应修复新版部署;需要恢复旧版时,须单独审查数据恢复方案。
如果已保存网页注册方式,回滚目标又不支持网站管理设置,升级器会拒绝降级,避免旧代码忽略数据库策略。应先在当前版本的“网站管理”点击“恢复服务器配置”,确认当前 YAML 默认方式符合预期,再安排回滚;原有待审核/已拒绝申请和数据迁移限制仍然适用。此操作不会自动通过任何申请。
升级保留原注册方式。要启用审核,管理员可按 注册审核 在网站管理选择需审核并保存,无需重启。若曾在 Nginx 阻断注册 API,需自行调整该规则。
简体中文
- LLMOJ Wiki
- AI 运行环境变量与固定限制
- AI 配置、权限与执行流程
- 后端配置完整参考
- 团队、题解、作废、Hack 与自测升级
- 配置总览与生效规则
- 比赛赛制
- 分布式评测与网页分离
- Docker 源
- 环境变量、构建与维护工具
- 前端与 bootstrap 配置
- HTTPS 与反向代理
- Hack
- 安装与端口配置
- 评测端完整配置与 CPU 扩缩容
- 基础服务与安装后运维配置
- 发布源码、版本与 GitHub Wiki
- 新用户注册审核
- 独立评测机安装
- Self Eval(NOI / OI 比赛预测试)
- 题解
- 评测记录 Fake
- 评测记录预览
- 团队
- 两步验证
- 保留配置与数据的一键升级
English
- LLMOJ Wiki
- AI configuration, permissions and execution
- AI runtime environment and fixed limits
- Complete backend configuration reference
- Teams, solutions, moderation, Hack and self-evaluation upgrade
- Configuration overview and activation
- Contest rules
- Distributed judging and web/judge separation
- Docker sources
- Environment, builds, and maintenance tools
- Frontend and bootstrap configuration
- HTTPS and reverse proxies
- Hacks
- Installation and ports
- Complete judge configuration and CPU resizing
- Infrastructure and post-install operations
- Source, release and GitHub Wiki publishing
- Registration approval
- Independent judge installation
- Self Eval for NOI / OI contests
- Solutions
- Fake submission moderation
- Submission previews
- Teams
- Two-factor sign-in
- Upgrading while preserving configuration and data