場末中華

餃子は酢胡椒で食え

Misskey を R2 でバックアップした(Wrangler をブラウザログインせずに使う版)

人の記事を読んで真似したらうまくいかなくて改造した話

Wranglerをブラウザログインせずに使う

せっかちな人のために先に結論を書いておく

Misskey の DB のバックアップに興味がある方は一度飛ばしてください

  1. API Tokens から 「トークンを作成する」(En: Create Token)
  2. テンプレートは選択せず、下の「カスタムトークン」(Custom Token) を選ぶ
  3. こんな感じにする。権限はトークン生成後にも変更可 トークン名はなんでもいい。できたら[進む]→[作成]
    cloudflare
  4. token が発行されるのでメモする。また、同時にテスト用のコマンド(curl)が表示されるので試してみる。良い感じだと↓みたいなjsonが帰ってくる
$ curl -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify" \
     -H "Authorization: Bearer YOUR_TOKEN_HOGE" \
     -H "Content-Type:application/json"
{"result":{"id":"YOUR_ID_FUGA","status":"active"},"success":true,"errors":[],"messages":[{"code":10000,"message":"This API Token is valid and active","type":null}]}

ここまでできたら、あとはwranglerを使いたいディレクトリで以下をやるだけ。

export CLOUDFLARE_API_TOKEN="YOUR_TOKEN_HOGE"

これでok

必要であれば.envにでも書いて都度 source .env すれば困らない

ref:

developers.cloudflare.com

Misskey の自鯖のDBを Cloudflare R2 にバックアップしたい

先日の記事から苦節1日、自鯖はすっかり自立していてよちよち歩きを始めたところだ。

こいつ→ misskey.iorar.net

そろそろDBのバックアップを自動化する年頃だろうと思ったので、↓の記事を参考に構築しはじめた

この記事は完全にこれを下敷きにしている zenn.dev

WranglerCLIのみでログインしづらい問題

この記事の途中でこんな内容がある

移動先でnpx wrangler loginでログインします。

GUIを求められるためCLI環境ではログインできませんでした。なんとかしてGUI環境でログインしてください。もしかしたらドキュメントを読み漁ったら別のやり方でできるかもしれません。

Wrangler は Cloudflare の用意してくれている Workers を構築するための補助ツールである(多分)。

ここらへんは詳しくはググってもらうとして、デプロイ用のソフトがGUI無しでログインできないということはないだろう。

と思ったのだが、確かに素朴にnpx wrangler login したところ、しっかりブラウザが裏で動くのであった。あらら…

PowerShellから見たWranglerくん

ここは

ssh user@server
$ sudo su - secret_user -s /bin/bash

してようやくたどり着けるサーバーの奥地なので、当然GUIなんてないしXポートフォワーディングも効かない。

AuthToken を使って WranglerAPI を叩く

普通にWranglerの公式にAuthTokenを使った使い方が書いてあったので実施してみた

冒頭のタームを参照して操作すれば wrangler login をせずにAPIを叩くことができる

MisskeyのDBのバックアップに使う場合、AuthTokenに以下の権限を登録しておく

Misskey のバックアップ目的にR2 AuthTokenを作る

Misskey DB の鯖をDBでバックアップする

さっき紹介した記事のシェルスクリプトはそのままでは動かないので、以下のように改造した。

#!/bin/bash

# ref: https://zenn.dev/waya0125/articles/6192cc4784d5c4

# Get the date of when it was executed. Include date if necessary.
# original→ $(date +\%Y\%m\%d_\%H-\%M-\%S)
TIME=$(date +\%Y\%m\%d)

# PLEASE PUT .env FILE in /home/misskey/misskey-auto-backup
########## .env example ##########
# CF_MISSKEY_BU_BUCKET=BUCKET_NAME
# CLOUDFLARE_API_TOKEN=TOKEN
##################################

# Set your wrangler dir path
MISSKEY_WRANGLER_PATH=/home/misskey/misskey-auto-backup

# Run as postgres user
su - postgres << BASH
  echo "Backup start."
  # Make backup to tmp directory
  cd /tmp
  # Require install to p7zip-full or 7-zip.org
  pg_dumpall | 7z a -si db.7z
  # Transfer permissions to allow misskey users to read and write
  chmod 744 db.7z
  chgrp misskey-db-backup db.7z
  echo "Backup create."
BASH

# Run as misskey user
su - misskey -s /bin/bash << BASH
  echo "Send backup file."
  # Powered by CloudflareR2 and Cloudflare wrangler.
  cd $MISSKEY_WRANGLER_PATH
  pwd
  source .env
  # Date of transmission is added to the file name at the time of transmission
  # db.7z -> db_YYYYmmDD.7z
  npx wrangler r2 object put "\${CF_MISSKEY_BU_BUCKET}/db_$TIME.7z" --file=/tmp/db.7z
  echo "Backup complete."
BASH

# Delete send db if you want to reduce capacity
# Normaly, this file is overwrittten with newer one
# su - postgres << BASH
#   rm /tmp/db.7z
# BASH

さらに、スクリプト実行前に以下をの準備をする。

sudo useradd -G misskey-db-backup misskey
sudo useradd -G misskey-db-backup postgres

通常、misskey ユーザーはrootグループにいないので、postgresとファイルを共有するために共有のグループを作っておく。

面倒ならchmod 777で解決できるが、元記事の方はそれを嫌っていたので尊重

sudo su - misskey -s /bin/bash
cd /home/misskey/misskey-auto-backup
echo \
CF_MISSKEY_BU_BUCKET=BUCKET_NAME \
CLOUDFLARE_API_TOKEN=TOKEN > .env

BUCKET_NAME は作ったR2のバケットの名前(例:misskey-db-backup)

TOKEN にはCloudflareで作ったトークンを入れる

cronで自動化する

このスクリプトルート権限が必要なのでcrontabも同様に設定してやる必要がある。

sudo crontab -e

でエディタが開くので、nanoを選択して

0 0 * * * /bin/bash /path/to/db-backup.sh

と追記してやればok。詳しくはググってほしいが、上記だと毎日9:00AMにバックアップが実行される

追記

翌朝、cronが動かぬ姿となって発見された

なんと、cronがJSTに従って動いていたのである。ちなみに $CRON_TZ は未定義だった。環境によってはそういうこともあるのか..

不安な場合は1分後に仕掛けて、コマンド部分を /bin/bash /path/to/db-backup.sh >> /var/log/misskey-db-backup.log として実験しよう

/path/to/db-backup.sh は上記のシェルスクリプトを置いたパスにすること