Akkoma / Pleroma 的媒体相关配置

前言

刚开始装的时候,我试过用 Contabo Object Storage,但是当时没有配置成功,后面发现 Cloudflare R2 还蛮适合的,而且免费套餐对小型站点已经完全够用了,所以将本地的文件上传到了 Cloudflare R2 中并且后续文件都迁移到了这边。

下面我先讲一下这么配置,再说怎么迁移,再说 Media Proxy 的配置 和 Varnish 的配置,可以根据个人需要选用配置。因为时间过去太久了了,可能会有一些多余了我也不知道的配置,也可能会有 Bug,可以对照官方文档仔细检查一下。

下文比较长,我写得比较详细,但是配置起来并不是特别难,需要一点点耐心。

相关信息:

Part1:配置上传文件到 Cloudflare R2

0. 准备工作

  • Cloudflare 账号或者其他 S3 API 的对象存储服务的账号
  • 一个用来放媒体文件的域名,这个域名必须和所使用的 Cloudflare 账号绑定并且通过 Cloudflare 来做 DNS,但如果没有这样的域名也可以,但是会被限速并且一些 Cloudflare 的功能特点会无法使用,比如没有缓存功能,详情参考:Public buckets · Cloudflare R2 docs

1. 创建 Bucket

进入到 Cloudflare 后台 R2 的部分,点击 Create bucket 创建新的 Bucket(存储桶)

image.png

然后选择位置,我这里选择的是 Automatic,也可以根据自己的需要修改位置,确认好位置后,点击右下角的 Create Bucket 创建 Bucket: image.png

创建好之后就可以在 Overview 那边就可以看到创建好的 Bucket 了,点击 Bucket 名进入详情页。

image.png

2. 开启 Public Access

进入到详情页之后点击 Settings 标签页 image.png

下拉到 Public access 一栏绑定域名,先输入域名,然后点击Continue ,然后点击Connect domain,接着 Cloudflare 会自动处理 DNS 的事情。 image.png image.png 这样就是绑定好了: image.png

如果域名不满足条件就会报错: image.png 但这种情况也可以通过使用 R2.dev subdomain 来开启 Public Access,点击右边的Allow Access就可以开启了: image.png

3. 设置 CORS

为什么需要设置 CORS:

Cross-origin resource sharing (CORS) is a mechanism that allows restricted resources (e.g. fonts) on a web page to be requested from another domain outside the domain from which the first resource was served. A web page may freely embed cross-origin images, stylesheets, scripts, iframes, and videos. Certain “cross-domain” requests, notably Ajax requests, are forbidden by default by the

跨源资源共享 (CORS) 是一种机制,允许从提供第一个资源的域之外的另一个域请求网页上的受限资源(例如字体)。网页可以自由嵌入跨源图像、样式表、脚本、iframe 和视频。某些“跨域”请求,特别是 Ajax 请求,默认情况下被同源安全策略禁止。1

当我们使用主域名(比如seviche.cc来访问子域名m.seviche.cc 上面的内容时,就会产生跨域问题,可以通过 CORS 来解决这个问题,在这里可以很方便地设置,滑动到下方 CORS Policy 的部分,点击右边按钮 Add CROS policy 添加: image.png 设置里默认添加了一个http://localhost:3000的 URL,可以删掉,然后在AllowedOrigins 下面添加 Akkoma 的链接,比如https://example.com,以及在AllowedMethods 里加上 POSTPUTDELETE, 如果下方没有任何报错就可以点右下角的 Save 保存,这部分就配置好了,但先不要关闭 Cloudflare 的页面。 image.png

4. 修改 Admin-Fe 中的设置

打开 Admin-Fe,打开很下面的 Upload 标签页,然后修改 Uploader 为 S3,Filter 选择可以参考文档中的 Cheat Sheet:Configuration Cheat Sheet - Akkoma Documentation

我的设置: image.png

Base URL 的部分,如果刚才没有绑定自定义域名,那么这里可以使用 Public R2.dev Bucket URL,可以在 Bucket -> Setting -> R2.dev subdomain 部分找到。

5. 配置 S3 Keys

我们先回到 Cloudflare 创建 API Token,进入 R2 Overview 页面,点击右边的 Manage R2 API Tokens: image.png

然后点击Create API Tokenimage.png

权限选择第三个 Object Read & Write,并在 Specify bucket(s) 里选择对应的 Bucket: image.png

下面的 TTL 设置可以随你喜欢。

在最下方的 Client IP Address Filtering 中 还可以设置阻止或者允许某些 IP,我在 Include 里添加了 Akkoma 实例所在服务器的 IP: image.png 确认好各项配置后,点击右下角的 Create API Token,接着滚动到 Token 结果页面,复制下方的 Access Key ID 和 Secret Access Key,粘贴到刚才打开的 Admin-Fe 的相应位置: image.png

image.png

Host 部分可以在 Bucket 内的 Setting -> Bucket Detail 中找到,后面的 /pleroma 和前面的https:// 都不需要: image.png

image.png

Region 写 auto,如果之前创建 Region 的时候有设置特殊 Region 的话这里是不能指明的,参考文档:S3 API compatibility · Cloudflare R2 docs image.png

6. 设置目标 Bucket

Pleroma.Uploaders.S3 部分填入 Cloudflare R2 的 Bucket 名字,比如我们之前设置的是 Pleroma: image.png

我的其他设置(什么也没设置): image.png

最后保存设置,重启 Pleroma。

7. 迁移本地 uploads 文件夹到 Bucket 中

我当时是使用 rclone 来复制迁移的。经过网友 Diara 的提醒,才发现有一个内置的 CLI 命令,可以很方便的迁移:Managing uploads - Akkoma Documentation,但是我没试过,具体命令:

bash
su akkoma -s $SHELL -lc "./bin/pleroma_ctl uploads migrate_local S3"

也可以迁移后删除本地文件:

bash
su akkoma -s $SHELL -lc "./bin/pleroma_ctl uploads migrate_local S3 --delete"

Part2. 配置 Media Proxy

这一部分和前面的部分可以说是完全不相干,这部分我是复制网友面条的设置,原帖文已经找不到了(Sorry

Media Proxy 的功能是给外站的媒体文件通过 Cloudflare 代理中转一下,这样访问一些外站媒体会更流畅一点。

1. 创建 Worker

首先在 Cloudflare 里的 Worker & Pages 部分点击 Create Application 创建 Worker: image.png

再点Create Worker: image.png

填入喜欢的名字,然后点击右下角 Deploy: image.png

2. 修改 Worker 配置

点击 Configure Worker 配置 Worker: image.png 接着点击右边Quick Edit 进入编辑页面: image.png

删掉默认代码,填入下面的代码(由网友面条提供):

js
function decodeBase64 (str) {
try {
return atob(str)
} catch (e) {
console.log(e)
return null
}
}
export default {
async fetch(request, env) {
const url = new URL(request.url)
const pathList = url.pathname.split('/') || []
const mediaUrl = decodeBase64(pathList[3] || '')
if (!mediaUrl) {
return new Response('')
}
console.log(mediaUrl)
return fetch(mediaUrl, {
headers: request.headers
})
}
}

点击右上角 Save and Deploy 保存: image.png

3. 使用自定义域名

当然不使用也可以,不使用自定义域名的话可以直接使用 Worker’s hostname,也就是这个部分: image.png

在 worker 页面,打开 Triggers 标签页,然后点下面的 Add Custom Domain :

image.png

然后填入自定义域名,比如: image.png 点击Add Custom Domain 就加好了

4. 配置 Admin-Fe

打开 Admin-Fe 的 Media Proxy 页面,修改 Base URL 为上一步中修改的 Custom Domain

image.png

如果没有设置 Custom Domain 的话可以用 Custom Domain 部分提供的production.proxy.<ID>.workers.dev URL: image.png 然后就设置好了,下面的其他部分我没有特殊设置,这里就不讲了。但我没开 Media preview proxy,之前开了会看不到图片,可能需要再做一些特殊设置,但感觉也没什么开的必要?

Part3. 配置 Varnish Cache

参考文档:Using a Varnish Cache - Akkoma Documentation

1. 安装 Varish

参考:Installing Varnish on Ubuntu - Varnish Developer Portal

2. 配置 Varnish

进入 Akkoma 目录,比如在/opt/akkoma 下,复制 Akkoma 预置的 Varnish 配置文件到 Varnish 目录下:

bash
cp /opt/akkoma/installation/akkoma.vcl /etc/varnish/akkoma.vcl

进入 Varnish 配置目录中,删除已有的default.vcl 配置:

bash
cd /etc/varnish
sudo rm -rf default.vcl
  • 启动 Varnish:sudo systemctl start varnish
  • 检查 Varnish 情况:sudo systemctl status varnish
  • 停止 Varnish: sudo systemctl stop varnish
  • 设置开机启动:sudo systemctl enable varnish

启动后可以通过curl -D- localhost:6081 检查运行情况,像这样就是正常运行了: image.png

3. 修改 Nginx 配置,可以修改下面的 upstream 端口为 6081

image.png

Part4. Storing Remote Media

建议参考文档:Storing Remote Media - Akkoma Documentation

这部分我的配置不保证不产生任何副作用,因为我配置之后有些路由会 503,不确定是上面和这个环节那里出了错,下面我的配置仅供参考:

proxy_cache_path /tmp/akkoma-media-cache levels=1:2 keys_zone=pleroma_media_cache:10m max_size=10g inactive=720m use_temp_path=off;
location /media { proxy_cache akkoma_media_cache; slice 1m; proxy_cache_key $host$uri$is_args$args$slice_range; proxy_set_header Range $slice_range; proxy_cache_valid 200 206 301 304 1h; proxy_cache_lock on; proxy_ignore_client_abort on; proxy_buffering on; chunked_transfer_encoding on; proxy_pass http://phoenix; } location /proxy { proxy_cache akkoma_media_cache; proxy_cache_lock on; proxy_pass http://phoenix; }

然后打开 Admin-Fe 中的 MRF 页面,在 Policies 的部分加上MediaProxyWarmingPolicyimage.png

大功告成。

后言

朋友 loikein 说像这种可能会重复说的话就可以整理成博客了,我觉得它说得很对,我以后会多整理一下这些回答过很多朋友的内容,之后或许:我离不开 Obsidian 的几个理由,还有很多想写的,但先不吹牛了。

%sveltekit.body%