如何搭建一個(gè)屬于自己的OJ系統(tǒng)
在我的博客中閱讀更佳!在嗶哩嗶哩上代碼不會(huì)高亮!
https://blog.mxdyeah.top/?id=6
歡迎各位訪問我的OJ:mxd's Online Judge?(使用HUST OJ搭建)
正文:
Part 1 選擇一個(gè)適合自己的OJ
目前,在網(wǎng)絡(luò)上有很多的OJ系統(tǒng)可以讓我們一鍵部署,特別方便
比如以下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
其實(shí)官網(wǎng)內(nèi)容已經(jīng)很詳細(xì)了? ?https://github.com/zhblue/hustoj/
我來說幾個(gè)必踩的坑:
1.更換主題模板
修改?db_info.inc.php[默認(rèn)位置/home/judge/src/web/include]
?中?$OJ_TEMPLATE
?的值 就行
默認(rèn)是 syzoj 改成如下的值就可以使用其他主題!
bs3原版
sweet主題
syzoj主題?added by@renbaoshuo
bshark主題?added by?@yemaster
mdui主題?added by@renbaoshuo
2.SSL配置
如果你像我一樣用的是寶塔面板,只需要按照其他網(wǎng)站一樣部署就行了。特別簡(jiǎn)單
????

如果你沒有使用寶塔面板的,使用的是apache或nginx就要申請(qǐng)證書并且到apache/nginx當(dāng)中正確配置。
3.背景圖片
hust oj 默認(rèn)是從Bing每日一圖同步,可以在配置文件db_info.inc.php[默認(rèn)位置/home/judge/src/web/include]
?中?$OJ_BG 的值
比如我的就是這樣的:

其實(shí)db_info.inc.php這里面的注釋都寫的非常詳細(xì)的,各位可以自己研究一下
4.時(shí)間不同步(難點(diǎn))
這個(gè)可是重頭戲,困擾了我好久,就是代碼提交的時(shí)間跟當(dāng)前時(shí)間對(duì)不上,官方文檔里面也沒有但是最后還是被我解決了
具體狀態(tài)表現(xiàn)如下:電腦當(dāng)前時(shí)間14:36,在此時(shí)提交代碼 提交時(shí)間會(huì)晚8小時(shí)。 其實(shí)一眼就可以看出來是時(shí)區(qū)的問題

該怎么解決呢?(在ROOT身份下運(yùn)行)
timedatectl?set-timezone?Asia/Shanghai
timedatectl?set-local-rtc?1
搞定!然后reboot
sudo?reboot
重啟后還是不行?運(yùn)行一下timedatectl? ?
看看是不是像我這樣

再重啟試試!
Part 2.3 搭建 QDUOJ
前提:我是在Ubuntu 22.04?純凈系統(tǒng)?上完成的
我的系統(tǒng)上沒有部署過任何東西?。?/p>
CentOS我沒有測(cè)試過,你可以自己把a(bǔ)pt換成yum。
CentOS已經(jīng)很老了,建議換系統(tǒng)?。。。?/p>
安裝過docker的,請(qǐng)先完全卸載再操作??!以防萬一!??!
完全卸載docker:
https://blog.csdn.net/qq_45495857/article/details/113743109
更新一下軟件源
sudo?apt-get?update
什么?太慢?換個(gè)軟件源就是了!??https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/
清華大學(xué)換源鏈接,自己更改發(fā)行版!
然后:
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
國(guó)內(nèi)使用腳本一鍵安裝:sudo curl -sSL https://get.daocloud.io/docker | sh
國(guó)外使用腳本一鍵安裝:sudo curl -sSL get.docker.com | sh
然后選擇一個(gè)合適的目錄? 執(zhí)行? 空間一定大于5GiB??!
git?clone?-b?2.0?https://github.com/QingdaoU/OnlineJudgeDeploy.git?&&?cd?OnlineJudgeDeploy
建議更改配置文件(如果沒有特殊要求別操作!?。?
vim?docker-compose.yml
最后,docker-compose一下!(時(shí)間超級(jí)久 10-30min左右)
docker-compose?up?-d
當(dāng)你看見幾個(gè)綠油油的DONE過后就大功告成了?。?/p>
順帶說下,請(qǐng)確保80、3306、6379這幾個(gè)端口不要被占用
當(dāng)服務(wù)啟動(dòng)完成后,執(zhí)行下面命令查看容器運(yùn)行狀態(tài),如果沒有unhealthy
?或?Exited (x) xxx
?就代表 OJ 已經(jīng)啟動(dòng)成功。
現(xiàn)在就可以開始使用了。HTTP80端口或者HTTPS443端口。
云服務(wù)器的用戶記得放行對(duì)應(yīng)端口
后臺(tái)管理路徑為/admin
,自動(dòng)添加的超級(jí)管理員用戶名為?root
,密碼為?rootroot
,?請(qǐng)務(wù)必及時(shí)修改密碼。
//這幾句轉(zhuǎn)載自https://blog.csdn.net/qq_43058685/article/details/108871714?感謝!
自此,大功告成!各位可自行探索!
QDUOJ SSL 配置
HTTPS 相關(guān)問題
OnlineJudge 強(qiáng)烈推薦使用 HTTPS 協(xié)議
數(shù)據(jù)傳輸加密,提高安全性,防劫持
可以使用 HTTP2,加快訪問速度(默認(rèn)配置)
OnlineJudge 的部署腳本默認(rèn)情況下會(huì)生成一個(gè)自簽名證書,瀏覽器會(huì)提示不信任,可以自己去申請(qǐng)對(duì)應(yīng)域名的可信證書,OnlineJudge 也提供了下面兩個(gè)特性方便 HTTPS 證書的申請(qǐng)和使用。
申請(qǐng) HTTPS 證書
/.well-known
?的 url 前綴,會(huì)自動(dòng)使用?data/backend/ssl/.well-known
?目錄下面的文件,默認(rèn)情況下?data/backend/ssl/
?已經(jīng)存在,所以可以手動(dòng)的創(chuàng)建?.well-known
?及其子文件夾,比如需要 url 為?/.well-known/pki-validation/fileauth.txt
?的驗(yàn)證文件,就可以創(chuàng)建?data/backend/ssl/.well-known/pki-validation/fileauth.txt
?文件,內(nèi)容為指定的內(nèi)容。
然后替換?data/backend/ssl/
?下面的證書和私鑰文件,之后?docker exec -it oj-backend sh -c "cd /app/deploy; supervisorctl restart nginx"
。
FORCE_HTTPS
如果 HTTPS 配置成功,為了增強(qiáng)安全性,推薦重定向 HTTP 流量到 HTTPS 流量,這時(shí)候可以取消注釋?docker-compose.yml
?文件中的?FORCE_HTTPS=1
?這一行,然后?docker-compose up -d
?重啟即可。
Part 2.4 搭建Hydro OJ
搭建Hydro OJ, 官網(wǎng)說的也比較詳細(xì)? ?https://docs.hydro.ac/docs/install/
我也是說說必踩的坑:
1.SSL
這個(gè)困擾了我好久,最后看來官方文檔加上我的多次嘗試才成功

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
??}
}