-
Notifications
You must be signed in to change notification settings - Fork 1.5k
正式部署文档
注意:本文档已经过时,最新的安装文档见 https://github.com/QingdaoU/OnlineJudgeDeploy
真的要往下面看么?
以下均是在 Ubuntu 14.04 64位系统上进行的测试。由于内核版本和Python版本等问题,建议不要使用更低的系统版本,如12.04。
首先选择一下安装目录,我选择的是 /home/
下,下面的操作不加特殊说明的话,都是相对这个目录的。如果需要更改,请自行替换所有的路径。
如果不是 root 用户,下面的命令需要的自行添加 sudo。
以下的安装需要git
、curl
、pip
、vim
,如果提示没有安装,请运行apt-get update && apt-get install -y git curl python-pip vim
。
git clone https://github.com/QingdaoU/OnlineJudge.git /home/OnlineJudge
因为国内特殊网络环境,Docker 的安装和使用并不方便,我们使用 DaoCloud 的安装镜像。但是有时候也会出现添加 key 失败的问题,这时候可以使用官方的安装方案。
curl -sSL https://get.daocloud.io/docker | sh
安装 docker-compose
pip install docker-compose
Docker 在运行的时候,如果没有配置目录映射,数据都是保存在 Docker 容器里面的,如果 Docker 容器被删除,数据就会丢失,所以需要将容器内的数据映射到服务器上存储。
我们使用下面的文件夹进行映射
-
/home/data/mysql
MySQL 的数据文件 -
/home/data/redis
Redis 的持久化文件 -
/home/test_case
上传的测试用例 -
/home/log
各种日志 -
/home/upload
上传的图片等
请自行创建相关的文件夹。命令参考mkdir -p /home/data/mysql /home/data/redis /home/test_case /home/log /home/upload
。
docker pull registry.aliyuncs.com/v-image/redis
docker tag registry.aliyuncs.com/v-image/redis redis
docker pull registry.aliyuncs.com/v-image/mysql
docker tag registry.aliyuncs.com/v-image/mysql mysql
docker pull registry.aliyuncs.com/v-image/nginx
docker tag registry.aliyuncs.com/v-image/nginx nginx
docker pull registry.aliyuncs.com/v-image/oj_web_server
docker pull registry.aliyuncs.com/v-image/judger
docker tag registry.aliyuncs.com/v-image/oj_web_server qduoj/oj_web_server
docker tag registry.aliyuncs.com/v-image/judger qduoj/judger
注意:
- 在服务器上运行 MySQL 至少需要1G内存,否则很容易出现异常退出的问题。
- 专业用户可以自己使用Dockerfile build需要的镜像
运行 docker images
就能看到所有的镜像了。
Docker Compose 是在使用 Docker 容器部署分布式应用时的工具,可以定义哪个容器运行哪个应用。使用Compose,你只需定义一个多容器应用的 yml 文件,然后使用一条命令即可部署运行所有容器。
在 dockerfiles/oj_web_server
和dockerfiles/judger
分别有一个 docker-compose.example.yml
。请复制一份为docker-compose.yml
。不要删除docker-compose.example.yml
文件。
在 dockerfiles/oj_web_server
下面还有一个docker-compose-nginx.exmaple.yml
,请复制一份为docker-compose-nginx.yml
。复制oj.example.conf
为oj.conf
先解释下文件中的部分参数
-
image
使用的镜像 -
volumes
目录映射,将冒号前面的服务器上的映射到冒号后面容器内的路径 -
env
容器内环境变量 -
link
两个容器的连接 -
ports
端口映射
如果你配置的映射目录或者端口有变化,修改对应的行就行。里面值为{YOUR_PASSWORD}
(注意从这开始,下文所有的{XXX}都是代表一个变量,使用时请去除大括号)是需要自己修改或者配置的密码。
机器上已经安装有nginx的,请先阅读这里。
在oj_web_server
目录中运行 docker-compose -f docker-compose.yml -f docker-compose-nginx.yml up -d
docker ps -a
可以看到所有的容器的运行状态。如果都是up的状态,说明成功启动了。如果有exited的状态,请先查看 CONTAINER ID,然后运行docker logs {CONTAINER_ID}
查看错误提示。还可以去log文件夹看日志,修复了问题之后,docker-compose up -d
重启容器。
需要进入 oj_web_server
容器,docker ps -a
可以看到这个容器是 running,然后复制 CONTAINER ID
运行
docker exec -i -t {CONTAINER ID} /bin/bash
然后容器中运行
python tools/create_db.py
python manage.py migrate
python manage.py migrate --database=submission
python manage.py initadmin
其中最后一个命令是创建了超级管理员用户,密码是随机生成的,请妥善保管。如果忘记超级管理员root密码,也可以使用 initadmin
命令。
然后运行 python tools/release_static.py
,以生成压缩版的js,此过程较慢,请耐心等候。(必须运行)
然后 exit
退出 docker 容器,docker restart {CONTAINER ID}
重启。
如果可以访问了,请在 {server_ip}/login/
处登录 root 用户,然后访问 {server_ip}/admin/
添加一道题目试试吧。但是现在还不能判题。
同上,在 dockerfiles/judger
文件夹也有一个 docker-compose.example.yml
文件,请先复制一份为docker-compose.yml
。其中 {YOUR_PASSWORD}
自行修改,后面会用到。
然后运行 docker-compose up -d
。
- 如果判题和web服务器在同一台服务器上,请运行
docker inspect --format='{{json .NetworkSettings.Networks}}' {JUDGER_CONTAINER_ID}
(container_id的获取方法见上文),查看它分配的ip地址,端口为8080,名字任意,密码即是刚才docker-compose.yml
里配置{YOUR_PASSWORD}
。 - 如果判题和web服务器不在同一台服务器上,ip为judger服务器的公网ip,端口为8085。
在 admin 界面 判题服务器
tab 里面,填写ip、端口和密码,创建一个判题服务器就可以了。
如果出现invalid-token
的情况,请检查admin里面判题服务器密码和docker-compose.yml中的rpc_token
是否一致。docker-compose.yml中的大括号是为了区分变量,修改的时候请去掉。
请自行修改oj/custom_settings.py
文件