Skip to content

Latest commit

 

History

History
110 lines (91 loc) · 3.23 KB

S3.md

File metadata and controls

110 lines (91 loc) · 3.23 KB

部署 S3 服务

此文档是部署文档的一部分,其中的一部分信息在概览文档中提及。如果尚未阅读该文档,请先阅读概览文档

我们使用的 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。

最后一行代理是为了和之前的图床兼容。