SYZOJ 的开发版本部署过程异常的繁琐,十分容易挂掉,所以我选择了 Docker 来部署 SYZOJ。但在过程中也踩了许多的坑。

首先切换到 root 用户:

sudo su root

1. 安装 Docker

卸载旧版本

旧版本的 Docker 被称为 dockerdocker.iodocker-engine。如果安装了这些,请卸载它们:

安装方法

可以根据需要以不同方式安装 Docker Engine

大多数用户设置 Docker 的存储库并从中安装,以便于安装和升级任务。这是推荐的方法。

一些用户下载 DEB 包并手动安装并完全手动管理升级。这在诸如在无法访问互联网的气隙系统上安装 Docker 等情况下非常有用。

在测试和开发环境中,一些用户选择使用自动化的便捷脚本来安装 Docker

使用存储库安装
在新主机上首次安装 Docker Engine 之前,您需要设置 Docker 存储库。之后,您可以从存储库安装和更新 Docker

设置存储库
更新 apt 包索引并安装包以允许 apt 通过 HTTPS 使用存储库:

$ sudo apt-get update
$ sudo apt-get install \
 ca-certificates \
 curl \
 gnupg \
 lsb-release

添加 Docker 的官方 GPG 密钥:

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr

安装 Docker 引擎

首先更新 apt 软件包索引,并安装最新版本的 Docker 引擎和容器:

$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

2. 配置内核参数

SYZOJ 的评测全部在沙箱中进行。其沙箱实现基于 Linux 内核中一些不默认开启的特性,我们需要开启这些特性.
编辑 /etc/default/grub,在 Ubuntu 下,推荐的方法是使用 vim:

vim /etc/default/grub

在其中

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

之后加入 cgroup_enable=memory swapaccount=1 systemd.unified_cgroup_hierarchy=0 syscall.x32=y,变为:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash cgroup_enable=memory swapaccount=1 systemd.unified_cgroup_hierarchy=0 syscall.x32=y"

运行以下命令更新 GRUB 2 的配置,然后重新启动。

update-grub && reboot

在执行下一步之前,再次切换到 root 用户。

3. 安装 SYZOJ 2

使用以下命令安装 Docker Compose:

curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
mkdir -p /etc/docker/compose
cat > /etc/systemd/system/docker-compose@.service <<EOF
[Unit]
Description=%i service with docker compose
Requires=docker.service
After=docker.service

[Service]
Type=simple
WorkingDirectory=/etc/docker/compose/%i
EnvironmentFile=/etc/docker/compose/%i/env
ExecStart=/usr/local/bin/docker-compose up --remove-orphans

[Install]
WantedBy=multi-user.target
EOF

SYZOJ 2Docker Compose 配置文件位于 https://github.com/syzoj/syzoj-compose 仓库,将对应配置复制到 /etc/docker/compose 目录下即可启动 Online Judge

复制配置文件

复制配置文件,假设服务名以 my-oj 为例:

git clone https://github.com/syzoj/syzoj-compose /tmp/syzoj-compose
cp -r /tmp/syzoj-compose/web-mariadb-redis-judge-rabbitmq /etc/docker/compose/my-oj

修改配置(必须!)

cd /etc/docker/compose/my-oj
vim env-app # 修改配置
vim env     # 修改配置

Web + Judge(全套配置)

# env
SYZOJ_WEB_LISTEN=127.0.0.1:5283 
# SYZOJ Web 在宿主机监听的 IP 和端口,127.0.0.1 仅能内网访问,外网访问请填写 0.0.0.0,直接访问 ip 的话,端口请填 `80`
# env-app

# 三个密钥,请生成随机字符串填写
SYZOJ_WEB_SECRET_SESSION=12331231234555
SYZOJ_WEB_SECRET_JUDGE=32131231231233
SYZOJ_WEB_SECRET_EMAIL=11123321114321

随机字符串推荐使用下面这条命令生成:

echo $(dd if=/dev/urandom | base64 -w0 | dd bs=1 count=20 2>/dev/null)

启动 SYZOJ 2

# 尝试启动(第一次启动会下载镜像,如果包含评测端,则需要下载数 GB 的镜像,比较慢)
docker-compose up
# 确认可用后开启 systemd 启动
systemctl enable --now docker-compose@my-oj

4. 创建全站管理员

执行 docker ps -a,然后列表会有一个名字叫什么 mariadb_1 的,复制左边的一串乱码;然后执行 docker exec -it 乱码 /bin/bash;就进入了名字叫 mariadb 的容器。

执行 mysql -u syzoj -p syzoj,输入密码 syzoj

全站管理员是 SYZOJ 中权限最高的一类用户。因为 SYZOJ 网页端无法修改全站管理员,所以必须通过数据库修改。

授予 ID 为 1 的用户全站管理员权限(其中 syzoj 为数据库名,下同):

UPDATE `syzoj`.`user` SET `is_admin` = 1 WHERE `id` = 1;

取消 ID 为 1 的用户全站管理员权限:

UPDATE `syzoj`.`user` SET `is_admin` = 0 WHERE `id` = 1;

授予用户名为 Sky390 的用户全站管理员权限:

UPDATE `syzoj`.`user` SET `is_admin` = 1 WHERE `username` = 'Sky390';

取消用户名为 Sky390 的用户全站管理员权限:

UPDATE `syzoj`.`user` SET `is_admin` = 0 WHERE `username` = 'Sky390';

修改后请重启网站端。

感谢 @Riwkii 提供的帮助。

本文部分参考自官方文档

Last modification:December 3rd, 2021 at 05:51 pm
赠人玫瑰,手有余香。您的赞赏是对我最大的支持!