HydroOJ 从入门到入土(23)大版本5.0.0正式发布

hydro 5.0.0 大版本正式更新,新增了作业、比赛、训练的搜索功能,以及批量小组管理等等,修复了在线编辑器的右键功能,还有一些小 bug,值得尝试升级。本篇记录一下升级中出现的问题以及解决方法。

[!CAUTION]

5.0 的 api 变动很多,很多插件可能会直接爆炸。建议先备份,然后有条件的可以先在备用站尝试升级。

更新 node.js 的版本:

# 先查看 node 的版本,如果
node -v

# 备份当前包版本,以防以后需要降级
yarn global list > ~/backup/versions.txt

# 开始更新
nix-channel --update # 这一步可能会卡网络,不行多试几次
nix-env -iA nixpkgs.nodejs nixpkgs.yarn # yarn 需要更新环境,放心版本号不会更新,还是 1.22.22

更新HydroOJ 本体

yarn global upgrade-interactive --latest
pm2 restart hydrooj --update-env

static 机制更改

static 机制更改!每次都会覆盖刷新,所有缓存内容重启 hydrooj 之后全部被清除,以下方法全部失效。

  • 通过直接修改 ~/.hydro/static/theme-x.xx.x.css 文件的方式调整字体
  • gzip / brotli 预压缩缓存节约带宽
  • 题目编辑和题解区域的 monaco 默认字号大小
  • 线编辑器(scratchpad)里边的默认字号
  • 其他类似修改

具体源代码位置:packages/hydrooj/src/entry/worker.ts line 70-78

if (process.env.NODE_APP_INSTANCE === '0') {
        const staticDir = path.join(os.homedir(), '.hydro/static');
        await fs.emptyDir(staticDir); __清空__ `~/.hydro/static` 目录
        // Use ordered copy to allow resource override
        for (const f of Object.values(global.addons)) { //复制所有已安装的 addon 插件的 public 目录
            const dir = path.join(f, 'public');
            // eslint-disable-next-line no-await-in-loop
            if (await fs.pathExists(dir)) await fs.copy(dir, staticDir);
        }

其他注意事项:

插件兼容性

建议先用测试服务器做好兼容性测试,再备份后更新。

如果插件出现兼容性出问题,可以参考 @gtn1024 编写的 AI skill,让AI 根据这个修改。如果能用,希望能给原作者提 pr。

@gtn1024:

https://github.com/gtn1024/hydro-dev-skills 前阵子搞了个 hydro 开发的 skills 来着。上对 llm 写 Hydro 插件有一定帮助。可以尝试尝试。
同时让 LLM 搞了个 api reference 文档,可以尝试。内容不一定全对,不过大概率还是能用的 https://hydro-plugin-api-reference.pages.dev/meta/llm-txt.html

NodeJS 版本至少为 22

Hydro v5 要求 NodeJS 版本至少为 22 , 使用

nix-channel --update && nix-env -iA nixpkgs.nodejs

更新 。

Hydro v5 为大版本更新,内含数据库表结构调整,升级后无法回退至旧版本,建议升级前进行备份。

沙箱不工作 System Error Checker returned with status 127.

HydroJudge 新版本依赖 awk 指令,可通过

nix-env -iA nixpkgs.gawk && pm2 restart hydro-sandbox

安装,安装后重启沙盒。

MongoDB 漏洞

mongodb全版本出现漏洞 建议各位立刻从防火墙直接关闭 27017 端口的外部访问

解决方案:

  1. 备份系统(快照)
  2. 查看当前安装的 mongodb 版本: mongod --version
  3. 关闭 mongodb: pm2 stop mongodb
  4. 更新 channel: nix-channel --update
  5. 根据你的 mongodb 版本在下方选择大版本相同的,覆盖安装:
    nix-env -iA hydro.mongodb4
    nix-env -iA hydro.mongodb5
    nix-env -iA hydro.mongodb6
    nix-env -iA hydro.mongodb7
  6. 确认新安装的是以下版本之一:4.4.30, 5.0.32, 6.0.27, 7.0.28
  7. 启动 mongodb: pm2 start mongodb --update-env
  8. 重启 Hydro: pm2 restart hydrooj

评测返回显示:Wrong Answer 0[object Object]

5.0.2~5.0.3出现,过两天就会修复。临时修复手段(2026.6):

hydrooj patch 98538cafd7c02d8495a2d40d521122e676a8268f

Python 默认版本调整为 3.13

hydro 5 默认是 Python3.13,所以如果之前装了很多包,控制面板里的配置得修改一下,环境变量需要修改.

PYTHONPATH=/lib/python3.1x/site-packages

修改完了要 pm2 重启所有 hydro 开头的服务

另外,xeger 和 cyaron 目前在 hydro 的 nix channel上仅提供 3.13 版本。

Breaking API change

  • vjudge: 使用 vjudge.mount 表替代 domain.mount
  • judge: breaking: 不再支持在 checker 等的编译阶段读取选手代码
  • core: 强制要求使用 inject 声明插件依赖
  • core: 移除旧版本 bus 调用
  • core: 移除 global.Hydro.service
  • core: 移除 global.Hydro.ui.template
  • core: 移除 global.Hydro.lib
  • core: 移除 String.prototype.translate (使用 ctx.i18n.translate)
  • core: 升级至 Mongo Driver 6
  • core: 移除 registerResolver, registerValue, registerUnion (使用 ctx.api.resolver/...)
  • core: 移除 paginate, rank (使用 ctx.db.paginate, ctx.db.ranked)
  • core: 移除 setting.yaml
  • core: oauth: 改为使用 ctx.oauth.provide() 注册
posted @ 2026-06-23 17:42  Bowen404  阅读(126)  评论(0)    收藏  举报