利用开源QDOJ进行二次操作。
https://github.com/QingdaoU/OnlineJudg
增加判题机
- 在新机子上部署QDOJ,修改docker-compose.yml
version: "3"
services:
judge-server:
image: registry.cn-hangzhou.aliyuncs.com/onlinejudge/judge_server
container_name: judge-server
restart: always
read_only: true
cap_drop:
- SETPCAP
- MKNOD
- NET_BIND_SERVICE
- SYS_CHROOT
- SETFCAP
- FSETID
tmpfs:
- /tmp
volumes:
- ./data/backend/test_case:/test_case:ro
- ./data/judge_server/log:/log
- ./data/judge_server/run:/judger
environment:
# 本机的ip和判题机端口
- SERVICE_URL=http://xx.xx.xx.xx:8081
# 域名和主机的judge_server的端口号
- BACKEND_URL=http://xx.xx.xxx.xx:10000/api/judge_server_heartbeat/
- TOKEN=ctguqmx
# - judger_debug=1
ports:
# 端口自己修改
- "0.0.0.0:8081:8080"
oj-rsync-slave:
image: registry.cn-hangzhou.aliyuncs.com/onlinejudge/oj_rsync
container_name: oj-rsync-slave
volumes:
- ./data/backend/test_case:/test_case
- ./data/rsync_slave:/log
environment:
- RSYNC_MODE=slave
- RSYNC_USER=ojrsync
# 密码和主判题机设置一样
- RSYNC_PASSWORD=xxx
# 域名
- RSYNC_MASTER_ADDR=xx.xx.xx
- 记得重新运行docker-compose up -d
- 主机的yml配置如下:
version: "2"
services:
oj-redis:
image: redis:4.0-alpine
container_name: oj-redis
restart: always
volumes:
- ./data/redis:/data
oj-postgres:
image: postgres:10-alpine
container_name: oj-postgres
restart: always
volumes:
- ./data/postgres:/var/lib/postgresql/data
environment:
- POSTGRES_DB=onlinejudge
- POSTGRES_USER=onlinejudge
- POSTGRES_PASSWORD=onlinejudge
judge-server:
image: registry.cn-hangzhou.aliyuncs.com/onlinejudge/judge_server
container_name: judge-server
restart: always
read_only: true
cap_drop:
- SETPCAP
- MKNOD
- NET_BIND_SERVICE
- SYS_CHROOT
- SETFCAP
- FSETID
tmpfs:
- /tmp
volumes:
- ./data/backend/test_case:/test_case:ro
- ./data/judge_server/log:/log
- ./data/judge_server/run:/judger
environment:
- SERVICE_URL=http://judge-server:8080
- BACKEND_URL=http://oj-backend:8000/api/judge_server_heartbeat/
- TOKEN=ctguqmx
# - judger_debug=1
oj-backend:
image: registry.cn-hangzhou.aliyuncs.com/onlinejudge/oj_backend
container_name: oj-backend
restart: always
depends_on:
- oj-redis
- oj-postgres
- judge-server
volumes:
- ./data/backend:/data
- ./data/backend/dist:/app/dist
environment:
- POSTGRES_DB=onlinejudge
- POSTGRES_USER=onlinejudge
- POSTGRES_PASSWORD=onlinejudge
- JUDGE_SERVER_TOKEN=ctguqmx
# - FORCE_HTTPS=1
# - STATIC_CDN_HOST=cdn.oj.com
ports:
- "0.0.0.0:10000:8000"
- "0.0.0.0:444:1443"
oj-rsync-master:
image: registry.cn-hangzhou.aliyuncs.com/onlinejudge/oj_rsync
container_name: oj-rsync-master
volumes:
- ./data/backend/test_case:/test_case:ro
- ./data/rsync_master:/log
environment:
- RSYNC_MODE=master
- RSYNC_USER=ojrsync
- RSYNC_PASSWORD=xxx
ports:
- "0.0.0.0:873:873"
- 判题机就配置完成了,可以在主机子后台进入查看判题机的状态
修改前端
- 将这个 https://github.com/QingdaoU/OnlineJudgeFE ,克隆或者fork到本地。
- 在git中操作,第一次修改前端需要执行下面的命令,以后不需要
npm install
NODE_ENV=development npm run build:dll
- 然后执行
# 自己的oj域名
target=http://xx.xxx.com npm run dev
- 等待即可
- 本地会拉取线上api进行测试,本地修改不影响线上
- 修改完毕以后可以运行 npm run build,会生成一个dist文件夹
- 放在oj的OnlineJudgeDeploy/data/backend/ 下
- 相对应的docker-compose已经配置好 ,看上面的配置, 不做说明
开放权限
- 开放的是普通人员可以看到自己错误了多少案例的权限,之前管理员才可以看到
- docker ps 查看有哪些容器
- 进入oj-backend容器中
- docker exec -it 48b sh
- -it后面是容器id
- 在 app/submission/views/oj.py中修改get函数 注释掉过滤判断和查询
- 在 /app/deploy/nginx/nginx.conf 中修改
- upstream backend的端口由8080改为8081
注意:由于本人无法杀掉8080对应进程 所以只能采取这种方法。 - exit退出容器
- OnlineJudgeDeploy 目录下重启容器
- docker stop 48b
- docker start 48b
- 48b也为id 到时候docker ps 自行查看
- 重新进入docker
- 在app目录下运行
- nohup python manage.py runserver 0.0.0.0:8081 &
- 代表后台在8081端口运行
- netstat -nptl查看发现已经成功
注意:由于没有设置定时任务,一旦发现oj503或者后台有问题
请进入 oj-backend的容器中查看manage.py文件是否运行,直接用运行的命令即可,要是更改了nginx文件端口得用stop和start操作容器,现在修改后端直接修改文件即可,保存以后 manage.py文件会自动运行