正式部署文档

李扬 edited this page Aug 9, 2017 · 38 revisions

注意:本文档已经过时,最新的安装文档见 https://github.com/QingdaoU/OnlineJudgeDeploy



真的要往下面看么?


OnlineJudge正式部署说明

正式部署说明

以下均是在 Ubuntu 14.04 64位系统上进行的测试。由于内核版本和Python版本等问题,建议不要使用更低的系统版本,如12.04。

首先选择一下安装目录,我选择的是 /home/ 下,下面的操作不加特殊说明的话,都是相对这个目录的。如果需要更改,请自行替换所有的路径。

如果不是 root 用户,下面的命令需要的自行添加 sudo。

以下的安装需要gitcurlpipvim,如果提示没有安装,请运行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

注意:

  • 在服务器上运行 MySQL 至少需要1G内存,否则很容易出现异常退出的问题。
  • 专业用户可以自己使用Dockerfile build需要的镜像

运行 docker images 就能看到所有的镜像了。

配置 docker-compose

Docker Compose 是在使用 Docker 容器部署分布式应用时的工具,可以定义哪个容器运行哪个应用。使用Compose,你只需定义一个多容器应用的 yml 文件,然后使用一条命令即可部署运行所有容器。

dockerfiles/oj_web_serverdockerfiles/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.confoj.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

  • 如果判题和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中的大括号是为了区分变量,修改的时候请去掉。

网站名称和smtp密码

请自行修改oj/custom_settings.py文件

You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.