长毛象 Mastodon 建站指南 | 第六章:部署媒体文件外部存储服务

站点运行一段时间后,随着来自本站和跨站的媒体文件的增加,可能会出现服务器空间不够用的情况。给服务器扩容的成本往往高于使用外部存储服务的成本,且运营一段时间后从服务器将文件迁移到外部存储服务可能会耗费大量时间或造成可能的服务停顿。因此,建议长毛象站长在建站之初就使用适合自己的外部存储服务存储媒体文件。

选择外部存储服务提供商

常见的长毛象外部存储服务提供商如下:

AWS S3

Scaleway object storage

  • 按存储空间、流量计费。
  • 存储空间免费限额 75 GB,出站流量免费限额 75 GB,因此适合小型长毛象站点——只要定期清理跨站媒体内容,保持在免费限额之内,就可以免费使用。
  • 价格表:https://www.scaleway.com/en/pricing/#object-storage

Wasabi.com

  • 按存储空间计费,流量免费。
  • 存储空间 US $0.0059/GB/Month,单位价格低且流量免费是巨大优势,但 Wasabi 从 $5.99/month (1TB) 起步计费,且文件即使删除,也按照保留90天计费。也就是说,即使储存了1TB 以下的媒体文件,也按照 1TB 计费至少90天,因此适合中大型长毛象站点
  • 价格表:https://wasabi.com/cloud-storage-pricing/#three-info

Backblaze B2

下文将以 Scaleway 为例进行说明。

外部存储的节点位置选择

以 Scaleway 为例,该服务商提供如下位置的节点:

  • Amsterdam, The Netherlands:
    • Region: nl-ams
    • Endpoint: https://s3.nl-ams.scw.cloud
  • Paris, France:
    • Region: fr-par
    • Endpoint: https://s3.fr-par.scw.cloud
  • Warsaw, Poland:
    • Region: pl-waw
    • Endpoint: https://s3.pl-waw.scw.cloud/

我们可以登录长毛象服务器的 SSH,利用 Ping 命令来测试从长毛象服务器到外部存储节点的延迟,Ping 的结果数值越低则延迟越小。

例如你想要测试到 [s3.nl-ams.scw.cloud](<http://s3.nl-ams.scw.cloud>) 的延迟,则输入命令:

ping s3.nl-ams.scw.cloud

使用 Ctrl + C 停止发送 Ping 请求。

如下图,从 Mastodon.im 服务器到 [s3.fr-par.scw.cloud](<http://s3.fr-par.scw.cloud>) 节点的延迟最低,因此我们选择法国的节点。

创建 Project

点击 Create Project 创建一个项目:

创建 Bucket

注册 Scaleway 账户后,点击右上角的 Create 按钮,创建一个 Bucket:

  • Name your bucket
    • 如果使用自定义域名绑定储存桶,储存桶的名称务必填写媒体服务的子域名,如 i.mastodon.immedia.mastodon.im 等,便于 Cloudflare的绑定。
    • 本教程中,因为我们要绑定 i.mastodon.im 作为媒体域名,我们将储存桶命名为 i.mastodon.im
  • Choose a Region
    • 选择一个距离你的长毛象服务器位置最近的地点(见上方如何选择节点)
  • Visibility
    • 设置为 Private。请不要设置为 Public,否则任何人都可以看到媒体文件列表。

创建 Bucket 成功后,点击右上角账户名 > Credentials 获取 API Key。

或者在 Project 中选择 Credentials 标签页,然后点击 Generate new API Key。

你会得到一组密钥,只会显示一次,请立即记录下来。

回到长毛象服务器的 SSH,编辑长毛象配置文件:

sudo nano /home/mastodon/live/.env.production

添加以下内容,注意替换为你的 Bucket 密钥信息:

S3_ENABLED=true
S3_BUCKET=你的储存桶名字
AWS_ACCESS_KEY_ID=你的_ACCESS_KEY
AWS_SECRET_ACCESS_KEY=你的_SECRET_ACCESS
S3_REGION=你的储存桶地区
S3_PROTOCOL=https
S3_HOSTNAME=你的储存桶地区地址
S3_ENDPOINT=https://你的储存桶地区地址/

S3_ALIAS_HOST=你的Cloudflare储存桶域名(可选)

在本例中,我们填写的是:

S3_ENABLED=true
S3_BUCKET=i.mastodon.im
AWS_ACCESS_KEY_ID=XXXXXXXXXX
AWS_SECRET_ACCESS_KEY=YYYYYYYYYY
S3_REGION=fr-par
S3_PROTOCOL=https
S3_HOSTNAME=s3.fr-par.scw.cloud
S3_ENDPOINT=https://s3.fr-par.scw.cloud/

S3_ALIAS_HOST=i.mastodon.im
  • S3_BUCKET
    • 填写的是我们创建的桶名称
    • 如果使用 Cloudflare,需要以绑定 Cloudflare 的存储桶域名一致
  • AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
    • XXXXXXXXXX 和 YYYYYYYYYY 分别是我们刚刚在 Credential 页面获取的 Key 和 Secret。
  • S3_REGION

    按地区,以 Scaleway 为例:

    • Amsterdam, The Netherlands 节点:
      • S3_REGION 填写: nl-ams
      • S3_HOSTNAME 填写: s3.nl-ams.scw.cloud
    • Paris, France 节点:
      • S3_REGION 填写: fr-par
      • S3_HOSTNAME 填写: s3.fr-par.scw.cloud
    • Warsaw, Poland 节点:
      • S3_REGION 填写: pl-waw
      • S3_HOSTNAME 填写: s3.pl-waw.scw.cloud
  • S3_ALIAS_HOST
    • 填写了我们绑定 Cloudflare 的存储桶域名

编辑完成后,使用 ctrl + X 退出,按 Y 、回车保存。

保存后,重启 Mastodon:

systemctl restart mastodon-web mastodon-sidekiq mastodon-streaming

绑定 Cloudflare

添加一条 CNAME 记录指向我们刚创建的存储桶:

目标为:

Bucket名称.s3.地区.scw.cloud 

如:

i.mastodon.im.s3.fr-par.scw.cloud

你也可以在 Scaleway 面板的 Bucket Settings 标签页中找到目标地址:

Cloudflare 面板 > DNS > 添加记录 > CNAME,填入名称和目标,点亮代理状态:

Cloudflare 页面规则

添加 DNS 记录后,可以创建页面规则,加大力度缓存媒体文件。特别是对于流量收费的存储服务,可以大大降低成本。

发一张图片,确保图片可以正常上传、显示。

Enjoy ~

定期清理外站媒体文件

以 mastodon 用户登录:

su mastodon

编辑定时任务:

crontab -e

写入以下内容,则备份任务会在每天服务器时间的 3:00 执行备份任务

0 3 * * * cd /home/mastodon/live && RAILS_ENV=production ./bin/tootctl media remove --days=90

以上命令是删除 90 天以外的外站媒体文件,如果需要删除 30 天以外的外站媒体文件,可以修改为:

0 3 * * * cd /home/mastodon/live && RAILS_ENV=production ./bin/tootctl media remove --days=30

编辑完成后,使用 ctrl + X 退出,按 Y 、回车保存。

你可以使用 crontab.guru 这个网站来检查定时任务的命令是否写对了。

https://crontab.guru/#0_3_*_*_*

定时定期清理外站媒体文件的任务配置完成。

除此之外,还有一些其他的定时任务,可以帮助节约服务资源。请参考这篇嘟文

以下定时任务会在每天服务器时间的3点清理缓存 14 天以上的外站媒体文件、“无主”媒体文件、同本站任何用户产生关联的 90 天以上的 toot:

0 3 * * * cd /home/mastodon/live && RAILS_ENV=production /home/mastodon/live/bin/tootctl media remove --days=14
0 3 * * * cd /home/mastodon/live && RAILS_ENV=production /home/mastodon/live/bin/tootctl media remove-orphans
0 3 * * * cd /home/mastodon/live && RAILS_ENV=production /home/mastodon/live/bin/tootctl statuses remove --days=90

具体可参考 admin CLI 官方文档

本章节完。