虽说理论上既然自己搭 OJ 就应该仿真一点,搭个 DomJudge 之类的官方用品;但是对于博主而言,好看就是生产力,所以就选择了界面相对更加美观,且由中国人开发的 SYZOJ 了;毕竟搭建 OJ 本身也没啥意义,我也不会出题,比赛的话使用现成的 vjudge 不知道高到哪里去了(
硬要说意义的话…… 只能说是熟悉一下服务器部署?或者说给一成不变的生活去找一些乐子?大概也就这样吧 ==
因为官方已经有详尽的部署指南,所以已经有的东西就不再重复说明了,只重点介绍本人踩坑。
事前准备
因为是回忆性质的文章,很多东西也不会讲的很详细很有条理;我尽力:
- Vultr 超低级服务器 *1(1 vCore & 1 GB RAM & 25 GB SSD & 1Mbps & Ubuntu 18.04)
- Xshell 6(学生可以白嫖阉割版,但是已经够用了)
- 机场为你提供的纸飞机(不推荐了,推荐了你站就没了==)
一个域名,增加 A 记录解析到你的服务器(如果是国内域名还需备案)其他的服务器,用来搞分布式评测提升效率和使用体验(有钱我也想)
有了这些,我们就可以一边参考官方的部署指南来配置了;
在 Vultr 上购买了服务器并且成功启动之后,可以将得到的 IPv4 地址在这个网站上过一遍,确保在国内的服务是正常的;毕竟在某一个时期似乎很流行购买 Vultr 服务器去搭建 SSR,再加上 Vultr 的 IP 地址更换非常容易,导致它很多的 IP 都已经被大陆 GFW 给 ban 了;如果你还希望在国内可以访问这个服务器,建议一直更换到上面的检测通过反正就一毛钱;
配置 SSH 代理
就算上面的服务器可以通过测试,也不代表着你可以舒服的使用它:因为墙的存在总会或多或少的阻挠你,而且服务器远在国外,本身连接的速度就相对比较慢还可能有高的无法忍受的延迟;所以要做些什么才行——
国内服务器?确实配置更高,对于带学生的价格也更加优惠;但是你想要忍受国内那离谱的备案程序吗?
在正式开始之前先说一下 VPN 和 sock5 代理的区别:
VPN & sock5
一般来说,像纸飞机这样的代理程序和 VPN 是不一样的:VPN 是你计算机网络的唯一出口,甚至你还会获得 VPN 分配的虚拟 IP;VPN 会接管所有的流量,等同于你处在另一个网络中;而 sock5 代理则是启动一个基于较低层次的网络协议的服务,sock5 协议只负责发送数据包,而不在意顶层应用层的协议因而速度较快;客户端(比如纸飞机)会在计算机上启动一个端口,并监听发送到该端口的所有数据,通过远程的服务器进行转发从而实现科学上网;
所谓的纸飞机全局代理模式,是利用 Windows 10 提供的代理功能,将电脑上所有的流量转发到它所在的服务端口;由它进行转发从而实现所谓的“代理全局流量”;事实上当开启了全局模式的 Shadowsock 不正确退出时,因为没有回收 Windows 10 中的代理配置,从而导致无法上网。
Windows 10 的这项功能在 设置 > 网络和 Internet > 代理 中;有一项是全局代理;这里已经体现了 代理 ≠ VPN 的概念。
SSH Proxy
在 Linux 中,终端不走代理是默认设置,而在 Windows 中却比较少见——但并不是不存在;我原本使用 Fluent Terminal 自带的 SSH 客户端,但是因为实在无法忍受其速度,外加上不可配置最终切换了 Xshell;
和 ping 不同,我原以为 SSH 连接也是低层网络,但是 Juice SSH 客户端是可以使用 SSR 加速的;所以 PC 端也可以通过代理来提升连接质量:在 Xshell 的会话属性中,可以指定代理服务器;我们将它设置为 http://127.0.0.1:1080/
—— IP 地址是 localhost 的默认值,而 1080 是 ShadowsocksR 运行的默认本地端口,就可以让 ssh 的连接通过代理访问远程服务器。
安装 Yarn
Yarn 在我还在搞前端开发搬砖的时候已经使用过很多次了;Windows 的安装十分方便:去官网下载 msi 安装包,使用 Windows 的包管理器 Chocolatey / Scoop 安装,或者直接使用 Node.js 的 npm
来安装都可以;但是在 Linux 中似乎却没有这么容易:
如果你使用 sudo apt install yarn
,你只会获得一个 0.32 的阴间版本的 yarn;在任何一个有 yarn.lock
,你认为可以执行脚本的情况下它都会报错“缺少 scenario”;正确的安装方法是需要先增加 yarn 的仓库:
1 | curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - |
注意,在运行在 WSL 1 上的 Ubuntu 20.04 上执行代码会出现 gpg
的错误;参考 stackoverflow 得知这是由于 Ubuntu 20.04 不再支持 WSL 1 导致;当在 Debian 10 WSL 上执行这些命令的时候是可以正常工作的(当然可能会出现因为下载 GPG 公钥失败导致的错误)
增加仓库之后再执行 apt
的安装命令就可以安装正常可用的 yarn 了:
1 | sudo apt-get update && sudo apt-get install yarn |
当然也可以使用 npm install -g yarn
来安装 yarn:可是当你已经安装了来自 apt 的低版本 yarn 后,这样可能不会成功;
评测端的沙箱
Wiki 中给定的从 Github 下载的镜像只能在国外的云服务器上正常下载;如果你需要在国内的服务器上下载沙箱文件,可以使用开发者 HeRaNO 的seafile镜像处下载;
此外,下载的 .tar.xz
文件中已经包含了 rootfs
目录;如果按照教程上的做法新建文件夹,可能会导致这个文件夹被嵌套两次(HeRaNO 的知乎文章);所以可以将该部分命令替换成如下内容:
1 | # 源地址:https://github.com/syzoj/sandbox-rootfs/releases/download/181202/sandbox-rootfs-181202.tar.gz |
下载完成后可以计算 MD5 值来确定文件在下载过程中没有损坏;
安装 redis
虽然上面安装 yarn 已经搞得我对 apt
非常害怕,但是 redis 还是可以通过 apt
来安装的:
1 | sudo apt install -y redis-server |
但是需要注意的是安装之后的服务名既不是 redis.service
也不是 redisd.service
;
安装 Node.js 10
默认 Ubuntu 18.04 的 apt
安装的 node 是 8.1.0 版本的,这比启动 SYZOJ 评测端所要求的最低版本 10.0 要低;参考上面说到的 yarn 的安装方法,我们需要在使用 apt
安装 node 之前更新存储库:
1 | curl -sL https://deb.nodesource.com/setup_10.x | sudo bash |
更新存储库后就可以安装新版本的 Node.js 了;同样,安装 yarn
包管理器也需要增加对应存储库:
1 | curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - |
之后才可以通过 apt
安装正常版本的 yarn
。
systemd 守护进程
首先需要在 /usr/lib/systemd/system/
目录下创建自己的守护进程的服务文件 *.service