iSTEP
iSTEP Lv2

安装篇

前言

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 pip
1
2
3
sudo apt update
sudo apt install python3-pip
pip install --upgrade pip # 升级一下pip
docker-compose
1
2
pip install docker-compose  # 或者pip3
docker-compose version # 显示版本号,确认安装成功
vim
1
sudo apt install vim
git
1
sudo apt install git
curl
1
sudo apy install curl
docker
1
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
  1. 安装必要的依赖

    1
    2
    3
    sudo apt-get update && sudo apt-get install -y vim python3-pip curl git
    pip3 install --upgrade pip
    pip install docker-compose
  2. 安装 Docker

    使用脚本一键安装

    1
    sudo curl -sSL https://get.daocloud.io/docker | sh

    详细步骤参照: https://docs.docker.com/install/

Windows环境不推荐

Windows 下的安装仅供体验,勿在生产环境使用。如有必要,请使用虚拟机安装 Linux 并将 OJ 安装在其中。

以下教程仅适用于 Win10 x64 下的 PowerShell

  1. 安装 Windows 的 Docker 工具
  2. 右击右下角 Docker 图标,选择 Settings 进行设置
  3. 选择 Shared Drives 菜单,之后勾选你想安装 OJ 的盘符位置(例如勾选D盘),点击 Apply
  4. 输入 Windows 的账号密码进行文件共享
  5. 安装 Pythonpipgitdocker-compose,安装方法自行搜索。

开始安装

  1. 请选择磁盘空间富余的位置,运行下面的命令

    TODO: 替换为 iSTEP

    1
    git clone -b 2.0 https://github.com/QingdaoU/OnlineJudgeDeploy.git && cd OnlineJudgeDeploy
  2. 启动服务

    1
    docker-compose up -d

根据网速情况,大约5到30分钟就可以自动搭建完成,全程无需人工干预。

等命令执行完成,然后运行 docker ps -a,当看到所有的容器的状态没有 unhealthyExited (x) xxx 就代表 OJ 已经启动成功。

尽情享用吧

通过浏览器访问服务器的 HTTP 80 端口或者 HTTPS 443 端口(默认可本地访问),就可以开始使用了。后台管理路径为/admin, 安装过程中自动添加的超级管理员用户名为 root,密码为 rootroot请务必及时修改密码

这里是QingDaoU的文档


部署篇

前端

文件夹 解释
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
2
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash  -  # 8可改为需要的版本,本项目要求8
sudo apt-get install -y nodejs # ubuntu

Windows只需下载相应文件,添加环境变量即可:

系统属性=>高级=>环境变量=>系统变量=>选择 'PATH' 编辑=>添加 node.js 安装路径

以往的版本 | Node.js (nodejs.org)

本地运行前端

Linux
1
2
3
4
5
6
7
8
9
10
11
npm install
# we use webpack DllReference to decrease the build time,
# this command only needs execute once unless you upgrade the package in build/webpack.dll.conf.js
export NODE_ENV=development
npm run build:dll

# the dev-server will set proxy table to your backend
export TARGET=http://Your-backend

# serve with hot reload at localhost:8080
npm run dev
Windows
1
2
3
4
5
6
7
8
9
10
11
npm install
# we use webpack DllReference to decrease the build time,
# this command only needs execute once unless you upgrade the package in build/webpack.dll.conf.js
set NODE_ENV=development
npm run build:dll

# the dev-server will set proxy table to your backend
set TARGET=http://Your-backend

# serve with hot reload at localhost:8080
npm run dev

部署前端代码

打开终端,将当前位置切换到相应的目录,然后执行

1
npm run build

等待一会,会提示成功,目录下会多出一个 dist 文件,结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
➜  OnlineJudgeFE git:(master) ✗ tree dist  # [sudo apt install tree]
dist
├── admin
│ └── index.html
├── index.html
└── static
​ ├── css
​ │ ├── admin.127f3da5b09451926728de2829ebb32e.css
​ │ ├── loader.css
​ │ ├── oj.0ba722f43ddbeb758cde2f9dc804455e.css
​ │ └── vendor.f033d6c4c74b6b40e92ca86f168fd0be.css
​ ├── fonts
​ │ ├── KaTeX_AMS-Regular.3d8245d.woff2
​ │ ├── KaTeX_AMS-Regular.ac1d46d.woff
....
....

dist 文件夹复制到服务器上某个目录下,比如 ~/backend/dist,然后修改 docker-compose.yml,在 oj-backend 模块中的 volumes 中增加一行 - ~/backend/dist:/app/dist (冒号前面的请修改为实际的路径),然后 docker-compose up -d 即可。

注意,这种修改方式将覆盖容器内的前端文件,未来发布新版本前端的时候,请自行使用相同的方式更新。

后端

文件夹 解释

配置本地后端环境

本地运行后端

  1. Pycharm 克隆项目后可直接运行:
    1
    2
    python manage.py runserver 127.0.0.1:8000
    # OR: py manage.py runserver 127.0.0.1:8000 [运行的ip及端口]

部署修改的后端代码

  1. 通过docker exec -it istep-backend sh直接进入容器的/app目录下修改,可以借助git快速更新文件

  2. 或者,直接将/app目录挂载到本地进行修改:

    1
    2
    3
    4
    5
    # docker-compose.yml
    oj-backend:
    volumes:
    - 本地目录:/app【docker image中的位置】
    # 注: 此时前端 [dist] 部署可直接在该目录修改

    如图: image-20210730203946862

打包镜像

(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
2
docker cp ./dist  xxxxxxxxxxxxx:/app/
#这里 xxxxxxxxxxxxx 是我们刚才查看的oj-backend的容器ID,注意容器ID和冒号之间没有空格

(6) 然后将注入后的容器打包成本地镜像

1
2
3
4
docker commit -m "提示信息" -a "作者"   容器ID  镜像名称
docker images

# 其中, 容器ID是上面的 xxxxxxxxxxxxx, 镜像名称可以自己起一个, 成功之后会有一个值生成

执行docker images后会有以下界面,我们复制刚才我们创建的镜像ID: xxxxxxxxxxxxx,一会要用。

(7) 把打包好的镜像push到阿里云仓库

根据这篇文章中提到的阿里云仓库的注册方法,阿里提供了pull到仓库的方法, 建议打开你自己复制下来以备后用。

1
2
3
4
5
sudo docker login --username=你的用户名 registry.xxx.aliyuncs.com
sudo docker tag [镜像ID] registry.xxx.aliyuncs.com/你的命名空间/项目名字:[镜像版本号]
sudo docker push registry.xxx.aliyuncs.com/你的命名空间/项目名字:[镜像版本号]

# 注意,提交的时候没有中括号

等待一会就push成功了。

在 阿里云控制台 “镜像版本” 可中看到上传的版本。

(8) 拉取镜像

复制上传完毕后的仓库的公有地址,把它替换到docker-compose.yml文件中 image 参数的位置,注意镜像地址要带版本号。

保存之后,就在一键安装文件夹下面重新 执行 docker-compose up -d 生效。


迁移篇

如何备份

为了保证数据安全,请定期备份。

OnlineJudgeDeploy 目录中的 data 文件夹是系统的所有的数据,包括日志,数据库,测试用例,上传的文件等,其中需要备份的数据为 backend/publicbackend/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
2
3
4
5
6
7
8
9
10
11
12
oj-rsync-master:
image: registry.cn-hangzhou.aliyuncs.com/onlinejudge/oj_rsync
container_name: oj-rsync-master
volumes:
- $PWD/data/backend/test_case:/test_case:ro
- $PWD/data/rsync_master:/log
environment:
- RSYNC_MODE=master
- RSYNC_USER=ojrsync
- RSYNC_PASSWORD=CHANGE_THIS_PASSWORD
ports:
- "0.0.0.0:873:873"

请务必修改RSYNC_PASSWORD,否则会导致测试用例的泄露

在新的机器上配置 JudgeServer 和测试用例同步 slave 服务

在新的的机器上按照 OnlineJudgeDeploy 项目初始化环境,修改 docker-compose.yml,只需要保留 judge-server 一个 service,然后添加下面的 service 到文件中。

1
2
3
4
5
6
7
8
9
10
11
oj-rsync-slave:
image: registry.cn-hangzhou.aliyuncs.com/onlinejudge/oj_rsync
container_name: oj-rsync-slave
volumes:
- $PWD/data/backend/test_case:/test_case
- $PWD/data/rsync_slave:/log
environment:
- RSYNC_MODE=slave
- RSYNC_USER=ojrsync
- RSYNC_PASSWORD=CHANGE_THIS_PASSWORD
- RSYNC_MASTER_ADDR=YOUR_BACKEND_ADDR

请同步修改 RSYNC_PASSWORD,并将 RSYNC_MASTER_ADDR 修改为运行了 oj-rsync-master 服务的地址,不需要端口号,如 example.com 或者 192.168.1.10

然后给 JudgeServer 添加

1
2
ports:
- "0.0.0.0:80:8080"

的端口配置,同时还需要修改

  • 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 许可协议。转载请注明出处!
 评论