HEZOJ 管理员使用指南
本教程面向零基础新手管理员,争取按照本教程指令,任何人都可以成功传题。
欢迎提出建议,欢迎各位后代管理员修改增删本文。
开始使用
Ubuntu
忘记了,大概方法是下载一个启动盘创建器,然后到官网下一个 Ubuntu,然后把 Ubuntu 放到 U 盘里,创建启动盘。
U 盘插进电脑,进 BIOS,然后把 U 盘的优先级调上去(这步我有点忘了)。然后你就可以进安装界面了。
BitLocker 这种不懂,Win 太智障了,真不行的话,可以把 Win 擦除了。
如果有问题可以问机房使用 Linux 的同学 / DeepSeek / 前几届管理员 / 上网搜。
ssh
忘记了,咕咕咕。
LemonLime
主要是用来修 CDF 的。
CJ 的 cdf 可能非常老,然后 LemonParser 就识别不了了。
这时就要下 LemonLime,打开 cdf,然后把题目名字重新写一遍——然后 cdf 就被重新写入,改好了。
下载 Lemon,首先到 github release 找到对的版本(Ubuntu 好像是下图),下下来应该可以直接 chmod +x 然后 ./ 运行。

但是你稍微找个 .cdf 测一下,发现程序无法运行!
这个原因是 Linux 命名空间什么的东西,我不太懂,但是解决方法是到 /etc/sysctl.d 里新建一个叫 100-enable-user-namespace.conf 的文件,里面写
kernel.unprivileged_userns_clone=1
kernel.apparmor_restrict_unprivileged_userns=0
然后重启,LemonLime 的权限就开机自启动了,你可以测评了。
然后还要下载一个靠谱的 testlib,到这里可以找到。(直接复制黏贴到本地就可以了)
Python
不过好像 Ubuntu 最新版的 Python 版本自动就是够的。
需要先把 Python 升级到最高版本,不然后面的操作可能出问题。
可以到 anaconda 下载 MiniConda。下载下来后,直接运行那个 .sh 文件(需要先 chmod +x)。然后你已经装好了。
这时主目录下会有一个 miniconda3 这样的东西。然后你在主目录里 vim .bashrc,加入这一行
export PATH="/home/your-computer-name/miniconda3/bin/:$PATH"
然后就可以使用 conda init 初始化,它会帮你把事情做好。
此时你新开一个终端,使用 conda activate,开头应该会跳出来一个 (base) ... 的东西,那已经对了。
检查的话可用 pip --version,如果版本够的话就可以了。
如果你觉得这个平时用不到,就可以用 conda config --set auto_activate_base false 把它关掉。重启终端即可。
要用的话就 conda activate。
LemonParser
先建一个你喜欢的文件夹,比如 lemonparser,用 git clone https://github.com/Xiaohuba/LemonParser.git lemonparser 把 lemonparser 下下来。
把 requirement 里面的的东西先下载了。比如下载 pdf2image 用 pip install pdf2image。但是更正确的方法是 pip install -r requirements.txt,如果你 Python 版本不够可能出问题,此时按照上面说的下 Python 就可以了。
OpenAI 的话,文件里边有一个隐藏文件,ls -a 即可显示,叫做 env.example,把里边的东西改成你的 API 即可。但是这个东西是一个 example,就是说它其实没用,你要搞一个真的 .env,内容和这个一样。
Linux 系统可能给你报一些奇怪的错,比如

可以改成 pip install --break-system-packages --user -r requirements.txt 强制安装解决。
传题
HEZOJ 大致方法
首先建一个文件夹 data,然后把 solution.pdf, cdf 和数据、down 放在这个目录下面。注意题面必须叫 statement.pdf,题解必须叫 solution.pdf.
目录结构应该是这样的:
~/hezoj/data$ ls
data down lap.cdf solution.pdf
data 和 down 里边,要采用 HEZ 格式,每个题分别子文件夹,例如
data
|
|--- apple
|
|--- game
|
|--- coach
千万不要 down 里套 down!
然后运行 main.py,参数要加全:
python3 main.py -D -E -Z --noip-checker path/to/data
加上的参数是一些帮你干事的操作:自动提取 down,提取题解,自动生成压缩包,使用 NOIP 评测 checker。
然后 OJ 上新建题目,手动加上题目名称和 tag,进入数据页面,点上传数据,选择 .zip 文件上传。然后记得检验配置并更新数据。最后公开题目就可以了。
Trouble Shooting(OJ)
cdf 有问题
不同学校使用的 Lemon 和 cdf 格式都不太一样。比如
-
HSEFZ 每个题都有 checker,但是其实很多题是传统题,不用 checker,data 里也没 checker 文件。此时在 cdf 里搜索
specialJudge,把后面那个引号里的东西删掉即可。 -
CJ 使用的是老版本 cdf,具体解决方法看最上面的 LemonLime.
人家 solution 分 3 份写?
把 -Z -E 关掉,生成 to_uoj 后手动把 solution.pdf 放进去,并在 problem.conf 里按照 ttx 博客 的流程修改。
题解站传题方法
首先如果你改了 DNS 还是连不上题解站,可以尝试把网断了重新连接。
文件格式和结构是一样的。
使用这些选项:
python3 main.py --parse-pdf --statement-format json -S ../data
切 pdf 是一样的,difficulty 是这样的:
-
\(0\) 是暂无评定
-
\([1, 7]\) 是洛谷难度
-
\(8\) 是难以战胜,银牌题
-
\(9\) 是无法战胜,金牌题
想偷懒可以一路 enter 这个选项。implementation 这个应该也可以偷懒。public 最好设成 y。
这时你的 to_uoj 里应该有一堆 .json,一题一题传。
传到题解站上,要使用这个指令:
curl https://sol.internal.moeebius.top/problems/new/edit -H "Cookie: token=your-token" --data-binary @problem-name.json -H "Content-Type: application/json"
把 problem-name 换成题目名字,your-token 换成你的叫 token 的 cookie。举个例子,题目名字叫做 assign,你的 token 是 EZOI2025,那你应该用
curl https://sol.internal.moeebius.top/problems/new/edit -H "Cookie: token=EZOI2025" --data-binary @assign.json -H "Content-Type: application/json"
Trouble Shooting(Solution site)
不好我把题传了好多遍
千万不要手动删除!这样会永久丢失题号!
采用覆盖的方法。就是你把指令里的 new 变成要覆盖的题号,重新上传即可覆盖!
这个【】学校 sol 只有 markdown 源码
其实只要把后缀名强制改成 .pdf 然后传上去就可以了。可以显示的。
我想改题目又不想把包重新传一遍!
ssh hez-uoj@192.168.90.233
sudo docker exec -it uoj /bin/bash
cd /var/uoj_data/upload/PROBLEM_ID
可以改 problem.conf 了。
如果你要手动把 after contest 数据加上去?(说实话这个过程很吃时的,不如你把包下下来改)
首先要用 scp 把本地文件传到 OJ 的一个文件夹,比如桌面上。(这里以把一整个文件夹传过去为例):
scp -r /local/path/ hez-uoj@192.168.90.233:/target/path
然后再用 docker cp 传到 docker 里。docker 里的路径是,你进入 docker 后,去掉开头 root@ 那一段。
sudo docker cp /oj/path DOCKER-ID:/docker/path
【】你为什么文件名全都不对啊?
请手动使用 Ubuntu 批量重命名的功能(选中然后重命名(快捷键 F2))。
比赛相关
创建比赛
先点创建比赛,然后选择时间。
先把题传了,然后把题加进去。
设置比赛为 Unrated。赛制改成 IOI。不改成 IOI 的效果是默认 OI,然后啥提交都显示 100 分。
后台管理比赛
第一步,进后台。
sudo docker exec -it uoj /bin/bash
第二部分,进 mysql(你如果用 ls -R | grep contest 的话,可以发现一个叫 mysql 的文件夹里有很多神秘文件)
mysql -u root -p
密码可以在 /var/www/uoj/app/.config.php 里看,注意这是一个隐藏文件。
接下来的命令注意分号,没一次执行命令的结尾都要有分号,分号是分隔符。如果你发现忘加分号了,可以下一行再加。多行一个命令是合法的。
进入数据库。
SHOW DATABASES;
USE app_uoj233;
可以查看所有比赛的信息,并找到需要修改的比赛。
SELECT id, name, start_time FROM contests;
可以查看一个东西的结构。
DESC contests_registrants;
如果要加入一个用户,可以这样。下面的 gyydp123_LIM 请修改为用户名。
mysql> INSERT INTO contests_registrants (contest_id, username, user_rating) VALUES(51, 'gyydp123_LIM', 1500);
如果你不小心写挂了,需要后续修改(大概是下面这个东西):
mysql> UPDATE contests_registrants SET user_rating = (SELECT rating FROM user_info WHERE username = 'wosile') WHERE contest_id = 51 AND username = (SELECT username FROM user_info WHERE username = 'wosile');
你要手动改报名人数。
mysql> UPDATE contests
-> SET player_num = (SELECT COUNT(*) FROM contests_registrants WHERE contest_id = 51)
-> WHERE id = 51;
最后退出
EXIT;
修理 OJ 和服务器
FTP 相关
怎么开 FTP 呢?如果它告诉你域在线,那没事了。否则,把 ezoi 的 i 删掉,再把 i 输进去。然后点“应用”,然后再点那个钩子“将域置于在线”(反正大概这个名字),灯会变绿色。
出联考相关
不可不知的注意事项!
-
cdf 时限配对没有?
-
如果有 pretest,systest 出锅的时候修 pretest 了吗?
-
题面有没有问题?
-
有没有检查数据合法性?特殊性质的 gen 有没有写对?

浙公网安备 33010602011771号