【个人笔记】将媒体文件同步到Scaleway存储桶(Docker部署长毛象)

本文最后更新于:2022年10月4日 晚上

docker部署站点的情况下,将媒体文件同步到Scaleway存储桶。本文仅作个人笔记与备忘用,非原创。

参考了以下文章,表示感谢:

https://pullopen.github.io/%E7%AB%99%E7%82%B9%E7%BB%B4%E6%8A%A4/2020/07/22/Move-mastodon-media-to-Scaleway.html
https://www.notion.so/3f645c4a2ab14f34aef37703ee286d3a

关于地区

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) 的延迟,则输入命令:

1
ping s3.nl-ams.scw.cloud

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

比如说 mstdn.homess3.nl-ams.scw.cloud 的延迟最低。(我尽力了)

1
2
3
4
5
6
7
8
$ ping s3.nl-ams.scw.cloud
PING s3.nl-ams.scw.cloud (163.172.208.8) 56(84) bytes of data.
64 bytes from 163.172.208.8 (163.172.208.8): icmp_seq=1 ttl=51 time=231 ms
64 bytes from 163.172.208.8 (163.172.208.8): icmp_seq=2 ttl=51 time=231 ms
64 bytes from 163.172.208.8 (163.172.208.8): icmp_seq=3 ttl=51 time=231 ms
64 bytes from 163.172.208.8 (163.172.208.8): icmp_seq=4 ttl=51 time=231 ms
64 bytes from 163.172.208.8 (163.172.208.8): icmp_seq=5 ttl=51 time=231 ms
64 bytes from 163.172.208.8 (163.172.208.8): icmp_seq=6 ttl=51 time=231 ms

创建 Bucket

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

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

获取API key

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

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

编辑配置文件

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

1
vim /home/mastodon/mastodon/.env.production

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

1
2
3
4
5
6
7
8
9
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_ALIAS_HOST的话,会直接从Scaleway的endpoint拉取媒体文件,但是这样从国内访问非常非常慢。用了S3_ALIAS_HOST可以加上Cloudflare的CDN,会快一些。

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

1
2
3
4
5
6
7
8
9
S3_ENABLED=true
S3_BUCKET=media.mstdn.homes
AWS_ACCESS_KEY_ID=xxxxxxxxxxxxx
AWS_SECRET_ACCESS_KEY=yyyyyyyyyyyyyyyyy
S3_REGION=nl-ams
S3_PROTOCOL=https
S3_HOSTNAME=s3.nl-ams.scw.cloud
S3_ENDPOINT=https://s3.nl-ams.scw.cloud
S3_ALIAS_HOST=media.mstdn.homes
  • 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:

1
2
【不适用】
systemctl restart mastodon-web mastodon-sidekiq mastodon-streaming

【docker适用】

1
2
3
4
5
cd /home/mastodon/mastodon
docker-compose down
docker-compose up -d

docker-compose run --rm web bin/tootctl search deploy

绑定 Cloudflare

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

目标为:

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

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

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/cb8fd59b-3b61-4b9d-a7b0-eefe63d8b0b9/Untitled.png

Cloudflare 面板 > DNS > 添加记录 > CNAME,填入名称和目标,点亮代理状态:
https://s3-us-west-2.amazonaws.com/secure.notion-static.com/6a718d17-3461-4247-b771-d9ff9bb082c1/Untitled.png

Cloudflare 页面规则

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

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/eca960ce-780e-446f-a2da-633aa926037c/Untitled.png

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

Enjoy ~

迁移已有媒体文件

安装并调试Aws-Cli

打开服务器,进入root用户。安装 awscli

aws官方文档如下:
https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html

1
2
3
curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

安装完会显示

1
You can now run: /usr/local/bin/aws --version

每次要/usr/local/bin/aws来使用aws很麻烦。为了方便我们创建软链接:

1
ln -s /usr/local/bin/aws /usr/bin/aws

就可以直接使用aws了。

1
aws configure

按指示依次输入Access Key和Secret Key。Region部分,如果你创建时选择的是巴黎则填写fr-par,阿姆斯特丹则填写nl-ams。Default output format直接回车即可。

1
2
3
4
AWS Access Key ID [None]: 
AWS Secret Access Key [None]:
Default region name [None]: nl-ams
Default output format [None]:

迁移原来的文件!

进入mastodon文件夹,先清理一下文件,运行同步命令:

1
aws s3 sync public/system s3://media.mstdn.homes --endpoint-url=https://s3.nl-ams.scw.cloud --acl public-read

因为运行时间可能比较长,可以挂在后台运行,将日志文件输出:

1
aws s3 sync public/system s3://mediafiles.mstdn.homes --endpoint-url=https://s3.nl-ams.scw.cloud --acl public-read >> /home/mastodon/log/sync.log &

如果迁移了原来的文件却发现以前的媒体文件打不开,很可能是 --acl public-read 参数没有加~

如果一切正常,就可以删除public/system文件夹了~


【个人笔记】将媒体文件同步到Scaleway存储桶(Docker部署长毛象)
https://pawswrite.xyz/posts/8799.html
作者
Rainbow
发布于
2022年5月17日
许可协议