安装篇
前言
OJ(OnlineJudge)是在线判题系统,很多学校或者机构打比赛都有自己的OJ系统。iSTEP项目基于QingdaoU开源项目OnlineJudge。
项目物理环境:
阿里云ECS Intel(R) Xeon(R) Platinum 8269CY CPU @ 2.50GHz
4核 8G + 100G
系统环境安装
- pip
- docker-compose (安装这个需要pip)
- vim
- git
- curl
- docker
Linux 环境
detail
pip1 | sudo apt update |
1 | pip install docker-compose # 或者pip3 |
1 | sudo apt install vim |
1 | sudo apt install git |
1 | sudo apy install curl |
1 | curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun |
安装必要的依赖
1
2
3sudo apt-get update && sudo apt-get install -y vim python3-pip curl git
pip3 install --upgrade pip
pip install docker-compose安装 Docker
使用脚本一键安装
1
sudo curl -sSL https://get.daocloud.io/docker | sh
详细步骤参照: https://docs.docker.com/install/
Windows环境不推荐
Windows 下的安装仅供体验,勿在生产环境使用。如有必要,请使用虚拟机安装 Linux 并将 OJ 安装在其中。
以下教程仅适用于 Win10 x64 下的 PowerShell
- 安装 Windows 的 Docker 工具
- 右击右下角 Docker 图标,选择 Settings 进行设置
- 选择
Shared Drives
菜单,之后勾选你想安装 OJ 的盘符位置(例如勾选D盘),点击Apply
- 输入 Windows 的账号密码进行文件共享
- 安装
Python
、pip
、git
、docker-compose
,安装方法自行搜索。
开始安装
请选择磁盘空间富余的位置,运行下面的命令
TODO: 替换为 iSTEP
1
git clone -b 2.0 https://github.com/QingdaoU/OnlineJudgeDeploy.git && cd OnlineJudgeDeploy
启动服务
1
docker-compose up -d
根据网速情况,大约5到30分钟就可以自动搭建完成,全程无需人工干预。
等命令执行完成,然后运行 docker ps -a
,当看到所有的容器的状态没有 unhealthy
或 Exited (x) xxx
就代表 OJ 已经启动成功。
尽情享用吧
通过浏览器访问服务器的 HTTP 80 端口或者 HTTPS 443 端口(默认可本地访问),就可以开始使用了。后台管理路径为/admin
, 安装过程中自动添加的超级管理员用户名为 root
,密码为 rootroot
, 请务必及时修改密码。
部署篇
前端
文件夹 | 解释 |
---|---|
build | 项目构建相关webpack相关 |
config | 项目配置目录,端口之类的 |
deploy | 一部分配置文件 |
node_modules | npm加载的项目的依赖项,默认没有,执行npm install 后产生 |
package.json | 项目配置文件 |
README.md | 项目说明文档 |
src | 二次开发的主要目录,页面等 |
static | 静态文件,js,css文件 |
dist | 打包后的文件,用于部署,执行npm run build 后产生 |
Linux安装指定版本node.js(npm)
1 | curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - # 8可改为需要的版本,本项目要求8 |
Windows只需下载相应文件,添加环境变量即可:
系统属性=>高级=>环境变量=>系统变量=>选择 'PATH' 编辑=>添加 node.js 安装路径
本地运行前端
Linux
1 | npm install |
Windows
1 | npm install |
部署前端代码
打开终端,将当前位置切换到相应的目录,然后执行
1 | npm run build |
等待一会,会提示成功,目录下会多出一个 dist 文件,结构如下:
1 | ➜ OnlineJudgeFE git:(master) ✗ tree dist # [sudo apt install tree] |
将 dist
文件夹复制到服务器上某个目录下,比如 ~/backend/dist
,然后修改 docker-compose.yml
,在 oj-backend
模块中的 volumes
中增加一行 - ~/backend/dist:/app/dist
(冒号前面的请修改为实际的路径),然后 docker-compose up -d
即可。
注意,这种修改方式将覆盖容器内的前端文件,未来发布新版本前端的时候,请自行使用相同的方式更新。
后端
文件夹 | 解释 |
---|---|
配置本地后端环境
本地运行后端
- Pycharm 克隆项目后可直接运行:
1
2python manage.py runserver 127.0.0.1:8000
# OR: py manage.py runserver 127.0.0.1:8000 [运行的ip及端口]
部署修改的后端代码
通过
docker exec -it istep-backend sh
直接进入容器的/app
目录下修改,可以借助git
快速更新文件或者,直接将
/app
目录挂载到本地进行修改:1
2
3
4
5# docker-compose.yml
oj-backend:
volumes:
- 本地目录:/app【docker image中的位置】
# 注: 此时前端 [dist] 部署可直接在该目录修改如图:
打包镜像
(1) 在此之前:我们需要在阿里云上注册一个docker的镜像仓库。
(2) 然后我们需要将onlinejudge恢复到最初始的状态,就是你一键安装完毕那个状态。(如果你在上一步更改过docker-compose.yml 文件,记得改回来并重新docker-compose up -d)
(3) 然后切换到我们修改过的前端的目录下,先查看下我们前端镜像的ID
1 | docker ps -a |
(4) 先把oj-backend的容器ID拷贝下来,一会要用。
然后我们执行
1 | NODE_ENV=production npm run build:dll |
然后
1 | npm run build |
(5) 打包完成后,我们还是把dist里的内容注入到docker容器中,我们执行
1 | docker cp ./dist xxxxxxxxxxxxx:/app/ |
(6) 然后将注入后的容器打包成本地镜像
1 | docker commit -m "提示信息" -a "作者" 容器ID 镜像名称 |
执行docker images后会有以下界面,我们复制刚才我们创建的镜像ID: xxxxxxxxxxxxx
,一会要用。
(7) 把打包好的镜像push到阿里云仓库
根据这篇文章中提到的阿里云仓库的注册方法,阿里提供了pull到仓库的方法, 建议打开你自己复制下来以备后用。
1 | sudo docker login --username=你的用户名 registry.xxx.aliyuncs.com |
等待一会就push成功了。
在 阿里云控制台 “镜像版本” 可中看到上传的版本。
(8) 拉取镜像
复制上传完毕后的仓库的公有地址,把它替换到docker-compose.yml
文件中 image 参数的位置,注意镜像地址要带版本号。
保存之后,就在一键安装文件夹下面重新 执行 docker-compose up -d 生效。
迁移篇
如何备份
为了保证数据安全,请定期备份。
OnlineJudgeDeploy 目录中的 data
文件夹是系统的所有的数据,包括日志,数据库,测试用例,上传的文件等,其中需要备份的数据为 backend/public
,backend/test_case
两个目录。
对于数据库,请不要使用复制数据库数据文件的方法。在最新的 OnlineJudgeDeploy 中,backup
目录提供了数据库导出 sql 文件备份脚本,请每次备份后检查生成的 sql 文件的大小和内容,确保备份成功。
请不要把备份数据和 OnlineJudge 系统放在同一台机器上,这样数据丢失的风险仍然较高。
恢复备份
如果只是想不同机器之间迁移部署,docker stop $(docker ps -aq)
然后复制 OnlineJudgeDeploy
文件夹到新机器后重新 docker-compose up -d
即可。
如果要恢复数据,首先要保证已经新部署了一套 OnlineJudge,然后需要恢复数据和测试用例文件。
测试用例存储在 data/backend/test_case
文件夹中,覆盖即可。
在新的机器上执行下面的操作可以恢复数据库
docker cp db_backup_xxxxxxx.sql oj-postgres:/root
docker exec -it oj-postgres bash
psql -U postgres
然后运行drop database onlinejudge;
(请一定注意!!!看清楚在哪台机器上)\q
退出,然后psql -f /root/db_backup_xxxxxxx.sql -U postgres
多个评测机
多个评测机只需确保两点即可正常运行:
- JudgeServer Token 一致
- 进行测试用例的多机同步
iSTEP 使用 rsync
进行同步,步骤如下:
在部署好的机器上开启测试用例同步 master 服务
在已经部署好的服务器上,修改 OnlineJudgeDeploy
里的 docker-compose.yml
文件
将下列代码合并进去(即添加一个service,注意缩进), 并运行docker-compose up -d
:
1 | oj-rsync-master: |
请务必修改RSYNC_PASSWORD
,否则会导致测试用例的泄露
在新的机器上配置 JudgeServer 和测试用例同步 slave 服务
在新的的机器上按照 OnlineJudgeDeploy
项目初始化环境,修改 docker-compose.yml
,只需要保留 judge-server
一个 service,然后添加下面的 service 到文件中。
1 | oj-rsync-slave: |
请同步修改 RSYNC_PASSWORD
,并将 RSYNC_MASTER_ADDR
修改为运行了 oj-rsync-master
服务的地址,不需要端口号,如 example.com
或者 192.168.1.10
。
然后给 JudgeServer 添加
1 | ports: |
的端口配置,同时还需要修改
SERVICE_URL
为新的机器的地址BACKEND_URL
的域名为已部署好的主机的地址TOKEN
和已部署好主机TOKEN
一致。
运行 docker-compose up -d
即可启动一台新的 JudgeServer,tail -f data/rsync_slave/rsync_slave.log
可以看到测试用例同步进度,在已部署好主机的后台可以看到新的 JudgeServer 的心跳状态。
- 本文标题:iSTEP
- 本文作者:iSTEP
- 创建时间:2021-08-01 17:11:20
- 本文链接:https://istep.github.io/2021/08/01/iSTEP/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!