Urara-Blog/urara/2023-09-10-akkoma-media/+page.md
2023-09-10 22:11:28 +08:00

16 KiB
Raw Blame History

title created summary
Akkoma / Pleroma 的媒体相关配置 2023-09-10 配置 Cloudflare R2、Media Proxy、Varnish Cache、Media Cache 的简明流程

前言

刚开始装的时候,我试过用 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 为 S3Filter 选择可以参考文档中的 Cheat SheetConfiguration 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 Token image.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,但是我没试过,具体命令:

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

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

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

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

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 目录下:

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

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

cd /etc/varnish
sudo rm -rf default.vcl
  • 启动 Varnishsudo 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 的部分加上MediaProxyWarmingPolicy image.png

大功告成。

后言

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