抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

今日、海を見た。もう怖くない

什么是syzoj什么是OJ

虽说理论上既然自己搭 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
2
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list

注意,在运行在 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
2
3
4
5
6
7
# 源地址:https://github.com/syzoj/sandbox-rootfs/releases/download/181202/sandbox-rootfs-181202.tar.gz
wget -O /sandbox-rootfs.tar.xz https://seafile.t123yh.xyz:2/f/124a91be48ad41b98668/?dl=1
md5sum /sandbox-rootfs.tar.xz
# 预计计算结果为 09fe4fc407e4580e9ae4de8e2af5918e sandbox-rootfs.tar.xz
mkdir -p /opt/syzoj/sandbox
cd /opt/syzoj/sandbox/
tar xvf /sandbox-rootfs.tar.xz

下载完成后可以计算 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
2
3
4
curl -sL https://deb.nodesource.com/setup_10.x | sudo bash
sudo apt update
sudo apt -y install gcc g++ make
sudo apt -y install nodejs

更新存储库后就可以安装新版本的 Node.js 了;同样,安装 yarn 包管理器也需要增加对应存储库:

1
2
3
curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt-get update && sudo apt-get install yarn

之后才可以通过 apt 安装正常版本的 yarn

systemd 守护进程

首先需要在 /usr/lib/systemd/system/ 目录下创建自己的守护进程的服务文件 *.service

评论