MastodonでBackblaze B2を使う
Mastodon のオブジェクトストレージとして Backblaze B2 を使う
設定方法
Backblazeをそのまま使う場合
mstdn.love 鯖缶さんのblog (thx to find @AWS@fedibird.com)
下り転送料がかかる
Cloudflareを挟む場合
bz002.heguro.comに CNAME f002.backblazeb2.com を設定
code:.env.production.cf.ini
# File storage (optional)
# -----------------------
S3_ENABLED=true
S3_BUCKET=media-nofed01hegurocom
AWS_ACCESS_KEY_ID=略
AWS_SECRET_ACCESS_KEY=略
S3_REGION=us-west-002
#S3_PROTOCOL=https
#S3_HOSTNAME=bz002.heguro.com/file/media-nofed01hegurocom
S3_ENDPOINT=https://s3.us-west-002.backblazeb2.com
S3_ALIAS_HOST=bz002.heguro.com/file/media-nofed01hegurocom
S3_HOSTNAMEは、S3_ENDPOINTとS3_ALIAS_HOSTを指定してればどこにも適用されず不要っぽい
下り転送量無料らしい
Backblaze B2 に独自ドメイン設定がないので、 /file/<bucket-name> 指定が要る
Cloudflareを挟んでもっといい感じにする
Backblaze B2 + Cloudflare の複数サブドメインに使う方法を適用
Mastodonのコード変更
まだ未完成
code:.env.production.cf2.ini
# File storage (optional)
# -----------------------
S3_ENABLED=true
S3_BUCKET=hegurocom
AWS_ACCESS_KEY_ID=略
AWS_SECRET_ACCESS_KEY=略
S3_REGION=us-west-002
S3_ENDPOINT=https://s3.us-west-002.backblazeb2.com
S3_ALIAS_HOST=media-nofed01.heguro.com
S3_PREFIX=media-nofed01.heguro.com/
S3_ALIAS_REMOVE_PREFIX=1
事例
ない
検索しても S3 互換 API 実装後の事例がほぼ無い
S3 互換になる前に、プロキシで B2 API に変換して何とかしている人が居た (今も Google 検索上位に居る)
古い情報なので参考にしないほうがよいと思う
唯一出てきたのが mstdn.love 鯖缶さんがテストインスタンスで使った例
以下雑メモ
Cloudflareを挟んだうえでもっといい感じにしたい
いい感じとは
bucket名を隠して、Cloudflareを迂回されて転送料が上がるリスクを減らす
URLから /file/<bucket-name> を無くす
Backblaze B2 + Cloudflare の複数サブドメインに対する手法を適用する
MastodonのS3連携にはPaperclipというライブラリが使われている
deprecatedらしい
PaperclipのS3用オプション
aws-sdk-s3のオプション
bucket内の指定したdirに入れたうえで、URLからは指定したdirを外したい (逆ALIAS_HOST)
S3_BUCKETを bucket-name/dirname 指定はできない
code:結果.log
method=POST path=/api/v2/media format=html controller=Api::V2::MediaController action=create status=500 error='ArgumentError: bucket name must not contain a forward-slash (/)'
aws-sdk-s3の該当部
それはそう
Paperclipオプションの s3_prefixes_in_alias がめっちゃそれっぽい気がする
S3におけるprefixはディレクトリっぽい文字列のことを指すらしい
これだった
できた
Mastodonの改造は必要だけど
優先度低: Misskey,Groundpolisはどうなってる?
Misskeyは最初からprefix設定があるっぽい
そもそもNode.jsだからPaperclip使ってないし全然違いそう