[Linux] 架設Online Judge

主機

Ubuntu 24.04 LTS 可以支援至2029年
安裝套件:SSH、docker

安裝OJ

青島大學 OnlineJudge

$ git clone -b 2.0 https://github.com/QingdaoU/OnlineJudgeDeploy.git
$ cd OnlineJudgeDeploy

安裝SSL證書

Let’s Encrypt 是一個提供免費 SSL/TLS 憑證的認證機構,致力於讓所有網站都能夠使用加密連線保護用戶隱私與資料安全。

安裝 certbot

$ sudo apt install certbot

生成證書

1. 執行這步前先確認目前 80 port 沒有在被使用中,如果你前面不小心把 docker run 起來了話,請先停用它

2. 去防火牆暫時打開 80 port
$ sudo certbot certonly --standalone

成功畫面

網站啟用 HTTPS


把上一步產生的 fullchain.pem 跟 privkey.pem 傳進 OnlineJudgeDeploy/data/backend/ssl裡
$ sudo cp  /etc/letsencrypt/live/onlinejudge2.coolsea.net/fullchain.pem data/backend/ssl/server.crt
$ sudo cp /etc/letsencrypt/live/onlinejudge2.coolsea.net/privkey.pem data/backend/ssl/server.key
$  sudo chmod 666 data/backend/ssl/server.*

$ sudo vim docker-compose.yml
打開docker-compose.yml把其中FORCE_HTTPS=1取消註解

OJ 啟動!

$ sudo docker-compose up -d

Tip.

  • 90 天候證書過期可以回到 安裝 SSL 證書 這步更新
  • 考慮之後直接寫進 crontab,但要注意最外層防火牆:目前預設關掉 80 port
  • judge 這個容器無法正常運作judge-server ( unhealthy)
    docker-compose.yml 裡強制 FORCE_HTTPS=1,會導致 judge無法正常運作
    反而不要註解FORCE_HTTPS=1 這樣 judge才能運作,這問題留作下次解決!
  • 如果網站執行跳錯,可能是 docker 剛剛關起來,忘了打開了
$ docker start [Container ID] 

# 補充
停止所有容器運行:docker stop $(docker ps -a -q)
刪除所有停止運行的容器:docker rm $(docker ps -a -q)

補充

#拷貝數據到數據庫所在容器
docker cp db_backup_xxxxxxx.sql oj-postgres:/root

#進入數據庫所在容器
docker exec -it oj-postgres bash

#登錄數據庫
psql -U postgres   

#刪除原有數據庫
drop database onlinejudge;

#退出
\q

#覆制數據庫,執行sql語句
psql -f /root/db_backup_xxxxxxx.sql -U postgres

參考:QingdaoU OnlineJudge 数据备份与恢复