此文档是部署文档的一部分,其中的一部分信息在概览文档中提及。如果尚未阅读该文档,请先阅读概览文档。
我们使用的 s3 服务器是 minio。我们在 data 上部署它: (注意将密码替换为随机数, 这个密码一般用不到)
ssh 10.0.0.1 # 登录到 data 机
wget https://dl.min.io/server/minio/release/linux-amd64/minio_20220907222502.0.0_amd64.deb
sudo dpkg -i minio_20220907222502.0.0_amd64.deb
sudo useradd minio-user
sudo mkdir -p /srv/minio/
sudo chown minio-user:minio-user /srv/minio
cat << EOF | sudo tee /etc/default/minio
MINIO_ROOT_USER=root
MINIO_ROOT_PASSWORD=xxxxxxxx
MINIO_VOLUMES=/srv/minio/data/
MINIO_OPTS='--address ":9000" --console-address ":9001"'
EOF
sudo systemctl enable --now minio
在浏览器中打开 http://10.0.0.1:9001,会跳转到一个登录界面, 用刚才设置的密码登录。如果不能使用浏览器,也可以使用 minio 提供的 CLI:
for i in problems submissions artifacts images; do mcli mb oj/oj-$i; done
vim images.json # 填入下方 access policy
mcli anonymous set-json images.json oj/oj-images
vim service.json # 填入下方 access policy
mcli admin user svcacct add --access-key xxx --secret-key xxx --policy service.json oj root
创建四个 bucket,分别用来存储题目信息、用户提交的代码、编译中间文件和图床图片。 假设这四个 bucket 分别叫:
- oj-problems
- oj-submissions
- oj-artifacts
- oj-images
(minio 的 bucket 名称不能有大写字母。)
将 oj-images
的 Access Policy 设为 custom,填写下列 policy (允许任何人读取图床图片):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"*"
]
},
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::oj-images/*"
]
}
]
}
进入左侧 Identity → Service Accounts,创建一个 service account,把它的 policy 调整为:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:DeleteObject",
"s3:GetObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::oj-problems/*",
"arn:aws:s3:::oj-artifacts/*",
"arn:aws:s3:::oj-submissions/*",
"arn:aws:s3:::oj-images/*"
]
}
]
}
记下显示的 access key 和 secret key。
如果需要更进一步的访问控制,可以让 Web 和调度器用两个分开的 service account。
最后,我们需要让公网可以访问 s3 服务。配置 pub 机上的反向代理使得:
https://acm.sjtu.edu.cn/OnlineJudge/oj-problems/* -> http://10.0.0.1:9000/oj-problems/*
https://acm.sjtu.edu.cn/OnlineJudge/oj-submissions/* -> http://10.0.0.1:9000/oj-submissions/*
https://acm.sjtu.edu.cn/OnlineJudge/oj-images/* -> http://10.0.0.1:9000/oj-images/*
https://acm.sjtu.edu.cn/OnlineJudge-pic/* -> http://10.0.0.1:9000/oj-images/*
这些反向代理需要配置 Content-Disposition: attachment
头以防止 XSS。
最后一行代理是为了和之前的图床兼容。