web analytics

ULOJ搭建完美教程

不知道那一天突然一下心血来潮,说是要建一个OJ出来,而且是全面的那种OJ,最后发现,自己其实写不出来OJ的,只好用别人开源的OJ那种。
找了很多OJ。什么UOJ,什么Hostoj,但是由于新疆特殊的地理原因,那两个优秀的OJ是使用不了的,其原因就是GitHub新疆上不去。当然如果你有办法在ubuntu server 上挂好VPN。其实也是可以装的,而且这两个OJ装起来也特别快。
因为青岛大学OJ是在阿里云上有docker 的镜像,所以下起来方便一点。所以这次教程的OnlineJudge的搭建就是采用的青岛大学的OJ。
特别感谢青岛大学的开源。

1 > 装Ubuntu Server

这次的系统就可以在Ubuntu Server 下载系统镜像。装系统应该是最简单的。
这里有几个细节要提一下。其他的如果装系统上有问题那就在百度上查,是可以查到的。

1,装系统上有什么不懂的一定要查,不会的单词要查 千万不要瞎基本搞,搞砸了又要重新来。

2,系统语言设成英文

由于ubuntu server这里有一个bug。如果设置成中文就会出现系统装不上的奇怪的现象,在安装系统的那一截就会莫名的出错。这个地方要注意。一定要修改。
当然系统语言设置完成。接下来的地区和键盘属性要选中国汉语什么的。你就看嘛,最起码的China Chinese还是可以看懂的。当然这里面中文系统是不会识别的,但是这不担心,我们后面会解决这个问题。

3,不装系统自装的这些东西

%e5%b1%8f%e5%b9%95%e5%bf%ab%e7%85%a7-2016-12-24-10-53-07
在这一步的时候其实可以选择第一个选项。会比较好。
%e5%b1%8f%e5%b9%95%e5%bf%ab%e7%85%a7-2016-12-24-10-53-18
这一步的时候。
注意!
这是关键。千万不要选择LANP 系统,还有一定要选择OPenSSh server。接下来的操作我们就会使用SSH来进行安装。

4,请做好 命令行会辣死眼睛 的 心理准备。

5,系统配置

现在呢,我们的系统就应该属于装好的。这次的教程不在装系统上下文章,所以不会一定要在网上查找。接下来便是这几个操作。

当然,这些操作建议通过SSH连接在别的可视化机子上进行操作,这样复制粘贴起来会变得很快捷。当然,我按的时候,全程都是手打命令,很难受。伤心x

具体的就是

之后yes 输入密码,就好了。
如果显示什么无法连接的那就。先在服务器端

1,往系统里加新的软件源。推荐163的源。具体操作查百度
1.1,sudo apt-get update
2,sudo apt-get install -y curl python-pip python-django vim
3,IP设置的什么。因人而异。
4,这是关键!!!此为安装中文字库 否则网站会一直502 很迷 sudo apt-get install language-pack-zh-hans

2>OJ计划开始

1,下载源码

青岛大学的OJ源码在github。但是呢,它也就只需要这一次下载就够了~.所以个人认为还是很方便的。

在新疆地区由于被墙,所以这里需要挂VPN。在别的机子上下好也行,给服务器挂上VPN下也行,最终,源码得在/home/OnlineJudge下就行,这样后面就不需要再进行什么改动了。

2,安装 Docker 和 docker-compose

docker是一种类似于容器一样的东西,我们可以直接下载别人写好的容器,直接启动就好,这里很方便,源码支持修改,而这个docker容器里面的东西感觉就像好像服务器配置一样的感觉。反正就是可以用就好了。
1,下载安装docker

2,下载安装docker-compose

3,配置目录映射

Docker 在运行的时候,如果没有配置目录映射,数据都是保存在 Docker 容器里面的,如果 Docker 容器被删除,数据就会丢失,所以需要将容器内的数据映射到服务器上存储。
我们使用下面的文件夹进行映射
/home/data/mysql MySQL 的数据文件
/home/data/redis Redis 的持久化文件
/home/test_case 上传的测试用例
/home/log 各种日志
/home/upload 上传的图片等
请自行创建相关的文件夹。命令参考

4,下载镜像,安装镜像

pull 需要的镜像(目前只提供阿里云镜像一种方式)

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

就能看到所有的镜像了。

5,配置 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}都是代表一个变量,使用时请去除大括号)是需要自己修改或者配置的密码。

6,启动oj_web_server需要的容器

机器上已经安装有nginx,或者apache2的一定要关掉。

之后在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重启容器。

7.创建数据表

需要进入 oj_web_server 容器,docker ps -a 可以看到这个容器是 running,然后复制 CONTAINER ID

运行

然后容器中运行

最后一个命令是创建了超级管理员用户,密码是随机生成的,请妥善保管。如果忘记超级管理员root密码,也可以使用 initadmin 命令。

运行

,会生成压缩版的js,可能会比较慢,耐心等候。
记住这一句话。如果在后期如果想修改图片或者是这个模板里面的字或者图的时候,改好之后。进入容器。在容器里继续运行它,渲染成功就好了。

然后 exit 退出 docker 容器,

此句为重启。

8,OJ是搭好了,但是判题服务器没有搭好

同上,在 dockerfiles/judger 文件夹也有一个 docker-compose.examlple.yml 文件,请先复制一份为docker-compose.yml。其中 {YOUR_PASSWORD} 自行修改,后面会用到。
其中的IP地址改成127.0.0.1 代表映射到本地服务器里

然后运行

运行:

(container_id的获取方法见上文),查看它分配的ip地址,端口为8080,名字任意,密码即是刚才docker-compose.yml里配置{YOUR_PASSWORD}。
如果判题和web服务器不在同一台服务器上,ip为judger服务器的公网ip,端口为8085。

之后登录你在前面docker-compose-nginx.yml里写的IP就可以应该可以进到服务器里了。

在 admin 界面 判题服务器 tab 里面,填写ip、端口和密码,创建一个判题服务器就可以了。

如果出现invalid-token的情况,请检查admin里面判题服务器密码和docker-compose.yml中的rpc_token是否一致。docker-compose.yml中的大括号是为了区分变量,修改的时候请去掉。

3>结束了

之后,整个OJ就应该搭建好了,可能由于各种原因,你会在各种地方出现各种奇怪的错误。从而导致又要重新开始。
尽管如此。千万不要放弃。直到搭好为止。这一切都是可能的。

4>美化

所有的界面都是在源码里有模板,所以,直接修改源码是一个不错的选择。
图片也都在git下来的源码里。什么网站图标啦。壁纸啦。这些都可以改,甚至可以加东西进去,当然这都是高端玩家可以尝试的html二次修改。这里就不过多赘述。

于是。OJ应该算是搭好了。接下来就是该各位dalao出题了。

结束了。

Post a Comment

You must be logged in to post a comment.