资讯动态

Hydro 在线评测系统全景指南:从一键安装到插件化评测架构

发布时间:2026/10/15 18:08:51 来源:尧图企业网站定制
后端教育前端评测【免费下载链接】HydroHydro - Next generation high performance online-judge platform - 新一代高效强大的信息学在线测评系统 (a.k.a. vj5)项目地址https://gitcode.com/gh_mirrors/hy/Hydro点击查看免费下载Hydroa.k.a. vj5是新一代高效信息学在线测评系统Online Judge也是 HydroOJ 的开源核心。它以易安装、跨平台、多功能、可扩展、有题库为设计目标面向学校、机构与个人搭建 OJ 平台支持从单人部署到上千用户并发评测的规模化场景。本文基于仓库根目录 README.md 与对应源码系统梳理 Hydro 的核心能力、安装方式、数据管理、域Domain隔离、权限模型、评测架构与赛制实现帮助读者快速上手部署并理解其底层设计原理。一键安装从零到可用Hydro 为不熟悉 Linux 或不想手动运维的用户提供了两条路径免费在线版本官方提供开通即用的在线版本适合直接试用。自建部署将安装命令粘贴到控制台即可一键安装安装后注册的第一个用户自动获得超级管理员权限。官方推荐的一键安装命令为LANGzh . (curl https://hydro.ac/setup.sh)该命令兼容主流 Linux 发行版官方推荐使用 Debian 12并支持 arm64 设备如树莓派、Apple M1/M2。仓库内的安装脚本入口为 install/install.sh它检测 root 权限、创建/data/db、/data/file等数据目录并调用 install/install.ts 完成依赖安装Node.js、MongoDB、评测沙箱等与系统初始化。安装脚本会根据系统内存自动调整缓存参数如wtCacheSize默认设置vm.swappiness1以提升性能。此外仓库还提供了多种部署编排方案Docker / docker-compose见 install/docker/docker-compose.yml其中 backend 与 judge 各有独立镜像构建文件Kubernetes / Helm见 install/helm-single 的完整模板backend、judge、mongo 的 deployment 与 service 等Nix见 install/nix 的 flake 配置Nix 用户可直接通过 nix profile 安装 hydro-plugin 系列插件。从源码结构看packages/hydroojnpm 包名hydrooj是系统核心packages/hydrojudge是评测核心二者通过 MongoDB 中的任务集合解耦协作。模块化插件系统功能热插拔的架构基石插件机制与热更新Hydro 的核心亮点之一是模块化插件系统系统主体core与各功能模块插件分离可以在修改功能后仍然保证系统的可升级性所有历史版本均可平滑升级到最新版本。从源码结构看这一设计体现在两个层面核心进程packages/hydrooj/src/loader.ts 中的Loader服务负责插件的加载、解析与重载。它通过resolvePlugin按名称解析插件路径支持从 npm 包与 Nix 存储路径/nix/store加载插件reloadPlugin在插件配置变更时执行更新或应用操作并监听system/setting事件实现配置热重载。启动时load()会遍历所有 addon将插件版本写入global.Hydro.version。插件 APIpackages/hydrooj/src/plugin-api.ts 集中导出了插件开发所需的全部能力包括Context、Fiber、Service生命周期模型Handler/ConnectionHandler服务端处理框架以及UserModel、ProblemModel、RecordModel、DomainModel等数据模型。从该文件可以看出插件可以访问系统几乎全部的服务与模型从而实现修改功能而不动主代码。仓库packages/目录下的大量独立包即是插件化的直接体现博客blog、一键安装工具包onsite-toolkit、计分板scoreboard-xcpcio、Telegram 登录telegram、弹性搜索elastic、性能指标prom-client、题单导入import-hoj、import-qduoj、fps-importer、migrate等均以独立 npm 包形式存在可按需装载或卸载。插件安装与卸载从 packages/hydrooj/src/commands/install.ts 及更新日志可知Hydro 提供命令行快速管理插件hydrooj install 插件包名或路径 hydrooj uninstall 插件名插件既可以从 npmjs 自动安装也可以从本地 addons 目录或 Nix profile 加载loader.ts 中通过NIX_PROFILES环境变量读取 nix profile 中的hydro-plugin-*派生。核心进程通过getAddons()读取 addon 配置并在加载失败时向管理员推送系统通知。跨平台兼容与数据一键备份/恢复跨平台与架构支持Hydro 支持所有主流 Linux 发行版兼容 x86_64 与 arm64 架构设备可一键安装运行于树莓派、Apple M1/M2 等设备。评测沙箱实现由 packages/hydrojudge 承担在多种架构上均提供一致的隔离执行环境。hydrooj backup / restoreHydro 提供了全自动的数据备份与恢复命令无需手工干预hydrooj backup # 备份系统全部数据 hydrooj restore 备份文件名 # 从备份恢复从 packages/hydrooj/src/commands/db.ts 的实现可以看出备份机制的完整细节备份过程使用mongodump导出数据库默认排除opcount、event集合未指定--withLogs时也排除oplog再将测试数据文件/data/file一并打包为backup-时间戳.zip输出到当前工作目录。可选参数--dbOnly仅导出数据库不含测试数据文件--withAddons同时打包addons目录与addon.json插件配置--withLogs附带/data/access.log访问日志-r repo/-p password将备份推送至 restic 仓库支持增量备份。恢复过程restore接受 zip 文件、已解压目录或 restic 仓库执行前默认要求交互确认-y可跳过确认使用mongorestore --drop覆盖恢复数据库并将文件数据恢复至/data/file可选恢复 addons 配置。备份的目标是整个过程无需手工干预同时--withAddons保证插件配置与数据一并迁移实现整站迁移。另外CLI 还提供了hydrooj db命令直接进入 MongoDB 交互终端自动优先探测mongosh失败则回退旧版mongo以及hydrooj cli交互模式entry/cli.ts支持在交互式提示符中逐条执行模型方法便于运维调试。单系统多空间Domain班级/院校分开管理Hydro 提供单系统多空间支持一个部署实例可以创建多个独立域Domain为不同的班级、年级、院校等组织分别建立空间。从 packages/hydrooj/src/model/domain.ts 可以看出域是一个包含_id域 ID、owner域主、name、bulletin公告、roles角色表等字段的独立实体域的创建、编辑均通过DomainModel完成并触发domain/create等事件钩子。多空间机制的核心特性数据默认隔离不同域内除用户外题目、评测记录、讨论、比赛等数据默认互相隔离。这一点从各数据模型的查询方式可以得到印证——例如 packages/hydrooj/src/model/record.ts 中getMulti(domainId, query)强制以domainId作为查询前缀。独立管理员每个域可分配独立的管理员互不干扰。跨域题目复制题目可以跨域复制系统内仅占用一份空间。从 packages/hydrooj/src/model/problem.ts 的ProblemModel.copy可以看出复制时目标题目会写入reference: { domainId, pid }字段作为引用标记评测时 record.ts 的judge方法会解析pdoc.reference追溯到源域的题目数据source ${pdoc.domainId}/${pdoc.docId}从而做到多域共享同一份题目与测试数据。粒度精细的权限系统Hydro 的权限模型支持按比赛/作业分配给用户与按用户分组班级分配两种方式权限节点覆盖从查看、提交、评测管理到系统设置的全层级。从源码层面看权限常量定义于 packages/hydrooj/src/model/builtin.ts包括PERM_VIEW_PROBLEM_HIDDEN、PERM_VIEW_RECORD、PERM_VIEW_CONTEST_HIDDEN_SCOREBOARD、PERM_VIEW_HIDDEN_CONTEST、PERM_VIEW_HIDDEN_HOMEWORK、PERM_VIEW_USER_PRIVATE_INFO等查看类权限用户分组小组/班级机制支持按组批量授予权限也支持批量导入导出小组成员见更新日志中用户小组支持批量导入导出。从更新日志与 handler/contest.ts 的实现看权限的精细度延伸到了比赛场景例如封榜期间仅持有PERM_VIEW_CONTEST_HIDDEN_SCOREBOARD的管理员能查看实时榜单PERM_VIEW_DISPLAYNAME已更名为PERM_VIEW_USER_PRIVATE_INFO控制实名信息姓名/学号的可见性。规模化支持无状态架构与自动伸缩Hydro 系统本身是无状态的因此可以随意增删服务节点而不影响系统运行。评测任务通过 MongoDB 中的任务集合分发评测机上线即自动消费任务、下线即暂停消费天然支持弹性伸缩。这一设计的底层依据可以从两个源码文件得到印证任务生产packages/hydrooj/src/model/record.ts 的RecordModel.judge将评测任务批量写入任务集合task.addMany任务携带priority优先级、typejudge/remotejudge/generate、config、source等字段。其中submissionPriority会根据用户近 30 分钟的提交频率与排队数动态计算优先级实现公平调度。任务消费packages/hydrooj/src/model/task.ts 的Consumer类按{ priority: -1 }排序取出任务findOneAndDelete支持并发数控制setConcurrency与失败自动恢复destroyOnError并在数据库层面建立{ type, subType, priority: -1 }复合索引保证调度性能。在此基础上评测队列均衡分配多个评测机judge同时在线时任务被各评测机竞争消费从而在所有在线评测机之间自然均衡分布接入弹性伸缩组可根据服务器负载自动增删评测机配合无状态架构实现秒级扩展按需缓存测试数据与多数 OJ 不同Hydro 会统一管理各服务器间的测试数据缓存按需拉取评测机上线即用无需手动同步数据。从 packages/hydrojudge/src/hosts 的hydro.ts评测机与核心服务交互的主机实现可以看到评测机通过 WebSocket 连接核心服务并周期性发送心跳任务完成后将评测结果回传。全题型支持Hydro 支持所有常见题型包括传统题型标准输入输出比较Special JudgeSPJ特判文件输入输出文件 IO提交答案题IO 交互题函数交互题客观题选择/填空支持多选题与下拉菜单等见更新日志中客观题支持下拉菜单客观题允许多行答案评测端 packages/hydrojudge/src/judge 目录下按题型拆分了实现模块default.ts传统、communication.ts通信/交互、interactive.ts交互、submit_answer.ts提交答案、objective.ts客观题、generate.ts生成数据、hack.tsHack等。更新日志还显示新版本新增了 multi-pass 题型支持。安装相关运行环境后Hydro 甚至可以实现两类高级评测场景绘图比对调用小海龟turtle画图将输出与标准图片比对机器学习评测调用 GPU 运行机器学习模型并评测其结果。更多样例可参考仓库 examples/testdata 中的测试数据如 Special Judge 的 chk.cc 与 config.yaml了解题目配置文件的书写方式。丰富的题库与多平台导入Hydro 支持导入常见格式的题库文件Hydro 通用 zip 格式包含题目配置、测试数据、题面Markdown与标程HUSTOJ 导出的 FPSxml格式由 packages/fps-importer 插件负责解析导入QDUOJ 导出的压缩包由 packages/import-qduoj 插件处理旧系统迁移packages/migrate 提供了 HUSTOJ、JNOJ、POJ、SYZOJ、UniversalOJ、Vijos、UOJ 等多套历史系统的迁移脚本ICPC 题目包支持标准 ICPC package 格式导入更新日志中多次出现icpc package format相关优化。同时Hydro 内置VJudge 虚拟评测能力packages/vjudge可以直接在系统内接入其他 OJ 平台导入题目后修改题面、编入自己的作业或比赛快速搭建题库体系。当前支持的平台对应 packages/vjudge/src/providers 下的实现包括平台说明UOJ国内知名 OJ国家集训队常用Codeforces国外大型竞赛平台大量高质量题目洛谷使用此功能需要向洛谷购买授权HDUOJ杭州电子科技大学在线评测系统含多校训练题CSGOJ广东省赛与湖南省赛赛题评测平台SPOJ国内连接很不稳定不推荐POJ较为古董服务器稳定性差YACS上海市计算机学会竞赛平台单账号每日提交有限制HUSTOJ理论上支持所有 HUSTOJ 驱动的系统但各系统 UI 有差异通常需手动适配除 VJudge 外官方还提供可直接导入的免费题库资源如一本通编程启蒙深入浅出程序设计竞赛配套题库可参照压缩包内导入说明使用。多赛制支持Hydro 支持多种赛制其核心实现在 packages/hydrooj/src/model/contest.ts文件末尾的RULES注册表统一管理了所有赛制规则export const RULES: ContestRules { acm, oi, homework, ioi, ledo, strictioi, };各赛制特点如下ACM/ICPC 赛制acm按 AC 数降序、用时升序排名statusSort: { accept: -1, time: 1 }支持封榜lockAt——封榜后的提交会计入 Pendingnpending榜单冻结管理员可通过PERM_VIEW_CONTEST_HIDDEN_SCOREBOARD查看实时分数。罚时按 20 分钟/次错误提交累加penalty 20 * 60 * naccept。OI 赛制oi按总分排名支持赛后订正。IOI 赛制ioi与IOI-strictstrictioi在 IOI 与 OI 赛制下支持订正题目功能——学生赛后可在题库中提交对应题目订正分数显示在榜单旁边同时支持灵活时间功能——学生可在设定时间范围内自选 X 小时参赛tdoc.duration与tsdoc.startAt参与判定。乐多赛制ledo基于 OI 规则扩展特点是多次提交、多题得分式积分且对同一题允许重复提交计分submitAfterAccept: false。作业homework作为隐藏规则hidden: true提供作业布置与提交管理能力。从isLockedcontest.ts 第 78-81 行可以看到封榜判定逻辑当lockAt now且未显式解锁unlocked时视为封榜。新版还支持比赛结束后不公开榜单keepScoreboardHidden、比赛前移除参赛者提前退出比赛等精细化赛程控制。轻松添加其他编程语言Hydro 的语言设置并非硬编码于系统中而是使用配置文件——只要能写出对应语言的编译命令与运行命令Hydro 就可以进行判题。评测机侧的语言预设位于 packages/hydrojudge/langs.yaml其配置结构如下节选c: compile: /usr/bin/gcc -O2 -Wall -stdc99 -o foo foo.c -lm cc: compile: /usr/bin/g -O2 -Wall -stdc11 -o foo foo.cc -lm pas: compile: /usr/bin/fpc -O2 -ofoo foo.pas java: compile: /usr/bin/bash -c javac -d /w -encoding utf8 ./Main.java jar cvf Main.jar *.class /dev/null code_file: Main.java target: Main.jar execute: /usr/bin/java -Dfile.encodingUTF-8 -cp Main.jar Main time_limit_rate: 2 compile_time_limit: 30000 compile_memory_limit: 1024 py3: compile: /usr/bin/python3 -c import py_compile; py_compile.compile(/w/foo.py, /w/foo, doraiseTrue) code_file: foo.py execute: /usr/bin/python3 foo rs: compile: /usr/bin/rustc -O -o /w/foo /w/foo.rs compile_time_limit: 30000配置项说明compile编译命令其中foo代表编译产物/w为评测沙箱内的工作目录execute运行命令foo代表可执行文件code_file选手提交代码在沙箱内写入的文件名如 Java 要求Main.javatarget编译目标产物如Main.jartime_limit_rate/memory_limit_rate该语言相对基准时空限制的倍率如 Java 时限倍率 2compile_time_limit/compile_memory_limit编译阶段独立的时限与内存限制。评测机启动时通过 packages/hydrojudge/src/hosts/vj4.ts 等宿主实现读取并解析该配置文件parseLang(fs.readFileSync(...langs.yaml))因此管理员只需编辑此 YAML 即可为系统添加任意语言。系统还预置了 C/C、Pascal、Java、Python3、PHP、Rust、Haskell、JavaScript、Go、Ruby、C#Mono、Kotlin、PyPy3、R 语言、Bash、C20 等常用语言并支持按题目设置语言时空限制倍率、validAs语言别名、以及langs.domain等域级覆盖。更新日志亮点与版本演进README 附带了完整的更新日志Hydro 5.x / UI 4.5x 系列从中可以观察到项目的演进脉络5.0 系列升级到 React 19 与 MongoDB Driver 7新增 CLI 交互模式hydrooj cli、OIDC 模块、multi-pass 题型、pipe_proxy、比赛结束后不公开榜单、比赛补题模式等重构了插件注入强制inject声明依赖、移除了旧版 bus 调用与setting.yaml最低要求 Node 22。架构持续解耦framework 从 core 解离为独立包frameworkAPI 模块移入 serviceUI 端逐步将缓存迁移至 IndexedDB。运维能力增强hydrooj diag快速诊断工具、基于 restic 的增量备份、fixStorage修复脚本、--disable-worker启动选项、加载器多 profile 切换等。开源许可与贡献仓库采用混合许可策略framework、examples、install 目录下的内容采用MIT 协议可自由使用packages/ui-default 下的内容仅采用AGPL-3.0授权项目其余部分采用双重许可可在遵守 AGPL-3.0 许可证及附加条款的前提下免费使用也可联系作者购买闭源授权。附加条款基于 AGPL-3.0 第七条要求不可移除版权声明与作者/来源署名重分发修改版时需在软件名或版本号中注明修改不得未经许可以宣传为目的使用作者姓名。具体到部署场景部署 Hydro 时需保留页面底部Powered by Hydro字样其中Hydro需指向官方仓库或其 fork 的链接若对源码做出修改/扩展同样需以 AGPL-3.0-or-later 开源可按照Powered by Hydro, Modified by xxx格式在页脚注明。详细条款见 LICENSE。欢迎通过提交 Pull Request 完善文档、在 Issues 中反馈 bug 与功能建议贡献规范见 CONTRIBUTING.md。赞分享后端教育前端评测【免费下载链接】HydroHydro - Next generation high performance online-judge platform - 新一代高效强大的信息学在线测评系统 (a.k.a. vj5)项目地址https://gitcode.com/gh_mirrors/hy/Hydro点击查看免费下载相关推荐Hydro 在线评测系统实战指南从免费 SaaS 体验到一键部署与插件化扩展Hydro 在线评测系统实战指南从免费 SaaS 体验到一键部署与插件化扩展 本文围绕 Hydro 开源在线评测系统的英文官方说明展开系统讲解其高性能、易后端前端教育Hydro在线评测系统竞赛管理完全指南从新手到专家的实战手册Hydro在线评测系统竞赛管理完全指南从新手到专家的实战手册 想要组织一场专业的编程竞赛却不知从何下手Hydro在线评测系统为你提供了一站式的竞赛解决方案。后端教育前端评测Hydro插件完全指南10个必备插件大幅提升评测系统功能Hydro插件完全指南10个必备插件大幅提升评测系统功能 Hydro作为新一代高性能在线评测系统通过强大的插件机制为用户提供了无限扩展可能。无论你是编程竞赛后端教育前端评测创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑