如何搭建一个属于自己的OJ系统
欢迎各位访问我的OJ:mxd's Online Judge (使用HUST OJ搭建)
正文:
Part 1 选择一个适合自己的OJ
目前,在网络上有很多的OJ系统可以让我们一键部署,特别方便
比如以下OJ都支持一键部署:
HUST OJ https://github.com/zhblue/hustoj/
Hydro https://docs.hydro.ac/
QDUOJ https://opensource.qduoj.com/#/
还有很多,我就不一一列出来了
Part 2.1 搭建OJ
- 搭建HUST OJ
- 搭建Hydro
- 搭建QDUOJ
Part 2.2 搭建HUST OJ
其实官网内容已经很详细了 https://github.com/zhblue/hustoj/
我来说几个必踩的坑:
1.更换主题模板
修改 db_info.inc.php[默认位置/home/judge/src/web/include]
中 $OJ_TEMPLATE
的值 就行
默认是 syzoj 改成如下的值就可以使用其他主题!
syzoj主题 added by@renbaoshuo
mdui主题 added by@renbaoshuo
2.SSL配置
如果你像我一样用的是宝塔面板,只需要按照其他网站一样部署就行了。特别简单
如果你没有使用宝塔面板的,使用的是apache或nginx就要申请证书并且到apache/nginx当中正确配置。
3.背景图片
hust oj 默认是从Bing每日一图同步,可以在配置文件db_info.inc.php[默认位置/home/judge/src/web/include]
中 $OJ\_BG 的值
比如我的就是这样的:
其实db\_info.inc.php这里面的注释都写的非常详细的,各位可以自己研究一下
4.时间不同步(难点)
这个可是重头戏,困扰了我好久,就是代码提交的时间跟当前时间对不上,官方文档里面也没有但是最后还是被我解决了
具体状态表现如下:电脑当前时间14:36,在此时提交代码 提交时间会晚8小时。 其实一眼就可以看出来是时区的问题
该怎么解决呢?(在ROOT身份下运行)
timedatectl set-timezone Asia/Shanghai
timedatectl set-local-rtc 1
搞定!然后reboot
sudo reboot
重启后还是不行?运行一下timedatectl
看看是不是像我这样
再重启试试!
Part 2.3 搭建 QDUOJ
前提:我是在Ubuntu 22.04 纯净系统 上完成的
我的系统上没有部署过任何东西!!
CentOS我没有测试过,你可以自己把apt换成yum。
CentOS已经很老了,建议换系统!!!!
安装过docker的,请先完全卸载再操作!!以防万一!!!
完全卸载docker:
https\://blog.csdn.net/qq\_45495857/article/details/113743109
更新一下软件源
sudo apt-get update
什么?太慢?换个软件源就是了! https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/
清华大学换源链接,自己更改发行版!
然后:
sudo apt-get install -y vim python3-pip curl git
更新pip
pip3 install --upgrade pip
# 或者下面的 看情况
pip install --upgrade pip
然后通过pip 安装docker-compose
pip install docker-compose
下载docker
国内使用脚本一键安装:sudo curl -sSL https://get.daocloud.io/docker | sh
//来自作者2023/07/27提醒,今天我用这个时,已经失效!
国外使用脚本一键安装:sudo curl -sSL get.docker.com | sh
//换用这个就行!
然后选择一个合适的目录 执行 空间一定大于5GiB!!
git clone -b 2.0 https://github.com/QingdaoU/OnlineJudgeDeploy.git && cd OnlineJudgeDeploy
建议更改配置文件(如果没有特殊要求别操作!!!)
vim docker-compose.yml
最后,docker-compose一下!(时间超级久 10-30min左右)
docker-compose up -d
当你看见几个绿油油的DONE过后就大功告成了!!
顺带说下,请确保80、3306、6379这几个端口不要被占用
当服务启动完成后,执行下面命令查看容器运行状态,如果没有unhealthy
或 Exited (x) xxx
就代表 OJ 已经启动成功。
现在就可以开始使用了。HTTP80端口或者HTTPS443端口。
云服务器的用户记得放行对应端口
后台管理路径为/admin
,自动添加的超级管理员用户名为 root
,密码为 rootroot
, 请务必及时修改密码。
//这几句转载自https://blog.csdn.net/qq\_43058685/article/details/108871714 感谢!
自此,大功告成!各位可自行探索!**
QDUOJ SSL 配置
HTTPS 相关问题
OnlineJudge 强烈推荐使用 HTTPS 协议
- 数据传输加密,提高安全性,防劫持
- 可以使用 HTTP2,加快访问速度(默认配置)
OnlineJudge 的部署脚本默认情况下会生成一个自签名证书,浏览器会提示不信任,可以自己去申请对应域名的可信证书,OnlineJudge 也提供了下面两个特性方便 HTTPS 证书的申请和使用。
申请 HTTPS 证书
/.well-known
的 url 前缀,会自动使用 data/backend/ssl/.well-known
目录下面的文件,默认情况下 data/backend/ssl/
已经存在,所以可以手动的创建 .well-known
及其子文件夹,比如需要 url 为 /.well-known/pki-validation/fileauth.txt
的验证文件,就可以创建 data/backend/ssl/.well-known/pki-validation/fileauth.txt
文件,内容为指定的内容。
然后替换 data/backend/ssl/
下面的证书和私钥文件,之后 docker exec -it oj-backend sh -c "cd /app/deploy; supervisorctl restart nginx"
。
FORCE\_HTTPS
如果 HTTPS 配置成功,为了增强安全性,推荐重定向 HTTP 流量到 HTTPS 流量,这时候可以取消注释 docker-compose.yml
文件中的 FORCE_HTTPS=1
这一行,然后 docker-compose up -d
重启即可。
Part 2.4 搭建Hydro OJ
搭建Hydro OJ, 官网说的也比较详细 https://docs.hydro.ac/docs/install/
我也是说说必踩的坑:
1.SSL
这个困扰了我好久,最后看来官方文档加上我的多次尝试才成功
样例Canddy File
hydro.ac {
log {
output file /data/access.log {
roll_size 1gb
roll_keep_for 72h
}
format json
}
root * /root/.hydro/static
@static {
file {
try_files {path}
}
}
handle @static {
file_server
}
handle {
reverse_proxy http://127.0.0.1:8888
}
}