五分钟从零建立你自己的 Online Judge

发布于 2021-06-26  7.88k 次阅读


写在前面

利益相关:作者本人为本文所介绍系统 Hydro 官方站 HydroOJ 的站长。

但是保证本文内所有评价、参数对比等内容均不受主观影响。

近日看到了一篇 Luogu 前几年的日报文章:一小时从零建立你自己的 Online Judge

遗憾的是其所推荐的 QDUOJ 项目与 HustOJvj4(Vijos)UOJ 一样,由于开发者开发时间减少,开发速度跟不上发展速度,虽然在今日仍被广泛部署,但是产生功能少、漏洞多、界面旧等诸多问题。虽然网上针对这些系统的部署教程较多,但是我们并不推荐站长使用这些系统搭建自己的 OJ。(当然准备对系统进行二次开发的除外)

(不过 vfk 跟我说 UOJ 开发组正在准备全新的 UOJ 系统,希望新的 UOJ 系统能在更多方面上有所提升吧)

现在开源的 OJ 系统中维护活跃的,在 OI 界中有名的系统几乎只有 SYZOJ 以及其开发中版本 SYZOJ NG 了。(LibreOJ 即基于 SYZOJ NG 搭建)但是由于网上存在大量有关 SYZOJ 部署类的教程,所以本文并不介绍 SYZOJ。本文将介绍一个全新的在线评测系统——Hydro

关于 Hydro

undefined 的知乎回答官方文档介绍、官方站 HydroOJ

Hydro 参考了 vj4 的优秀架构,由 undefined 耗时两年多写成。功能方面相比于其他开源系统有明显的优势(比较表格)。从 GitHub 仓库 可以看出功能增加速度、漏洞修复速度、提问回答速度均相当地快,根据开发组规划在接下来的一段时间内还将持续增加更多有趣的功能。

这里列举一些优秀功能:

  1. 评测支持文件 IO,testlib IO 交互,多种格式 Special Judge(CCR,Cena,HustOJ,Lemon,QDUOJ,SYZOJ,testlib),设置子任务,子任务依赖,子任务独立设置时空限制,无配置文件时自动匹配测试数据。
  2. 域功能(下文会展开讲述),权限细化的权限组。
  3. vjudge 式 remote judge 功能(近期新开发,目前仅支持 codeforces)。

当然由于 Hydro 尚处开发阶段,且由于知名度不高,没有足够使用量,仍有很多漏洞没有发现,所以在使用过程中遇到漏洞的可能性会较高。不过不用担心,在发现漏洞后你可以通过 Github Issue 等方式将漏洞向开发者反馈,开发者一般会在数日内立即修复。

部署 Hydro

使用域功能部署

介绍

如果您仅是想要找到一个平台作为自己的个人题库;或者想找到能够提供出题组等团队需要的题库、评测、比赛、成员权限设置等功能的平台;或者想要在正式部署 Hydro 之前感受 Hydro 的管理使用体验;甚至想要在零花费情况下创建一个功能与完整 OJ 几乎没有区别的,还不需要自己花费时间和精力维护的 OJ,可以尝试使用域功能部署 Hydro。所以对于需要使用 OJ 功能的个人和小规模组织,我们建议使用域功能搭建。

域,可以简单地理解为 OJ 中的子 OJ。你可以在任意一个允许用户创建域的基于 Hydro 运行的 OJ 上创建属于自己的一个域。这里推荐在 Hydro 官方站 HydroOJ 上创建域,该站会受到 Hydro 开发组第一时间的技术支持,并且能够提供相对较好的服务器资源。

在同一个 OJ 下的域之间是相互逻辑隔离的。域之间除了共用同一套用户注册信息以外默认没有任何联系。在你创建的域中,你可以自由地创建题目、设置作业、举办比赛、进行评测等。特别的,Hydro 还为域提供了权限系统,域管理员能够通过更改权限组设置限制所有成员(除全站超级管理员)在域中的每一项权限。对于想要将域作为公开 OJ、私有题库、邀请制团队等的用户均可通过配置权限组达到对应目的。

这边展示了 HydroOJ 官方出题组 Hydro 出题组所用域的权限组配置:

借助权限组,任何人都可以在五分钟内快速零成本地配置出自己的 Online Judge。

部署方法

在基于 Hydro 运行的 OJ 注册账号并登录,进入“我的域”页面。

点击“创建域”。

根据说明填写域信息,然后点击“创建”。

域就创建成功了!

接下来可以参考 官方文档有关章节 进行进一步的域的配置,文档中同样含有题目测试数据格式,比赛、作业创建方法等内容。

使用源码部署

介绍

使用源码部署可以满足一些用户对数据安全性要求严格的要求,并且站长可以根据自己的需要调整服务器资源。因此使用源码部署比较适合需要使用 OJ 功能的大型组织使用。

部署方法

我们建议使用 Ubuntu Server 20.04 作为服务器操作系统,非 Ubuntu 版本的操作系统不保证一定能部署成功。

自动安装脚本部署

没有特殊需要的用户请务必使用自动安装脚本部署。

执行下面这行代码(网络良好情况下大约运行三分钟),若执行过程中没有出现错误信息,则执行结束后 HydroOJ 就已部署成功。

wget https://s3.undefined.moe/public/install -O install && chmod +x install && ./install

手动安装

对于有特殊需要并且有足够专业知识的用户(如 MongoDB、S3 存储设备与 Hydro 核心不在同一台服务器上),可以尝试手动安装。

自动安装脚本 保存至本地,修改对应语句后运行该脚本即可。

开发者模式部署

如果用户需要对 Hydro 源码进行二次开发,请使用该部署方式。由于内容相对专业化,这里不展开讲述,具体可参考 开发者模式文档

写在最后

希望 Hydro 能给各位带来好的使用体验。如果各位在使用 Hydro 过程中发现了漏洞或是有自己的意见之类的,可以加入 Hydro 源码用户群(1085853538)。


我缓慢吐出一串啊吧啊吧并不再想说话