要求:首先你必要有一台Ubuntu服务器,熟悉Ubuntu的基本明亮行。了解docker容器的基本概念和原理,以及使用方法
#正式部署说明
以下均是在 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 和 docker-compose
因为国内特殊网络环境,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
。
##pull 需要的镜像(目前只提供阿里云镜像一种方式)
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
注意:
运行 docker images
就能看到所有的镜像了。
##配置 docker-compose
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}都是代表一个变量,使用时请去除大括号)是需要自己修改或者配置的密码。
##启动oj_web_server需要的容器
机器上已经安装有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安装成功 如果可以访问了,请在 {server_ip}/login/
处登录 root 用户,然后访问{server_ip}/admin/
添加一道题目试试吧。但是现在还不能判题。
##配置判题 同上,在 dockerfiles/judger
文件夹也有一个 docker-compose.example.yml
文件,请先复制一份为docker-compose.yml
。其中 {YOUR_PASSWORD}
自行修改,后面会用到。
然后运行 docker-compose up -d
。
docker inspect --format='{{json .NetworkSettings.Networks}}' {JUDGER_CONTAINER_ID}
(container_id的获取方法见上文),查看它分配的ip地址,端口为8080,名字任意,密码即是刚才docker-compose.yml
里配置{YOUR_PASSWORD}
。 在 admin 界面 判题服务器
tab 里面,填写ip、端口和密码,创建一个判题服务器就可以了。
如果出现invalid-token
的情况,请检查admin里面判题服务器密码和docker-compose.yml中的rpc_token
是否一致。docker-compose.yml中的大括号是为了区分变量,修改的时候请去掉。
##网站名称和smtp密码
请自行修改oj/custom_settings.py
文件
部署效果 ;www.hgacm.com