2025-11-11 (Tue) [長年日記]
_ Mastodonアカウントの引っ越し
Mastodonはruby.socialを使っていたが、tDiaryのサーバをKAGOYA CLOUD VPSに移したついでにsocial.shugo.netにインスタンスを立ててアカウントを引っ越した。 Mastodonにはアカウントの引っ越し機能があるので、とりあえずruby.socialではじめて必要なら後で引っ越せばいいやと思っていたのだが、投稿データの引き継ぎが行われないのは誤算だった(データのアーカイブは取得できる)。 これからMastodonのアカウントを作る人はちゃんと考えた方がいいですよ。
CPU 2コア、メモリ2GBのプランのVPSにtDiaryも同居という構成なので、Dockerは使わずに公式ドキュメントのInstalling from sourceの手順でインストールした。
不要なデータの削除やバックアップなどの定期実行処理については上記の手順には書れていなかったので、適当に検索して出てきたcleanup.shやかゆいところに手が届くインスタンス運用の初級テクニック集を参考に、以下のスクリプトをcronで動かすことにした。
cleanup.sh:
#!/bin/bash
set -eu
CACHE_RETENTION_DAYS=7
echo "=> Cleanup"
cd /home/mastodon/live
export RAILS_ENV=production
echo "=> Retention days set to ${CACHE_RETENTION_DAYS}"
echo "==> media cache ..."
./bin/tootctl media remove --days=${CACHE_RETENTION_DAYS}
echo "==> orphaned media ..."
./bin/tootctl media remove-orphans
echo "==> preview cards ..."
./bin/tootctl preview-cards remove --days=${CACHE_RETENTION_DAYS}
echo "==> prune profiles ..."
./bin/tootctl media remove --prune-profiles --days=${CACHE_RETENTION_DAYS}
echo "==> remove headers ..."
./bin/tootctl media remove --remove-headers --days=${CACHE_RETENTION_DAYS}
echo "==> clear cache ..."
./bin/tootctl cache clear
echo "==> remove unreferenced statuses ..."
./bin/tootctl statuses remove --days=${CACHE_RETENTION_DAYS}
echo "==> prune accounts ..."
./bin/tootctl accounts prune
backup.sh:
#!/bin/bash
set -euo pipefail
# Configurable variables
INSTANCE_DIR="/home/mastodon/live"
SYSTEM_DIR="/home/mastodon/live/public/system"
BACKUP_DIR="/home/mastodon/backup"
BACKUP_LIFETIME_DAYS=30
DATE_FORMAT="%Y%m%d"
DB_USER="mastodon"
DB_NAME="mastodon_production"
RCLONE_DB_DEST="r2:mastodon-db"
RCLONE_MEDIA_DEST="r2:mastodon-media"
# Error handling
trap 'echo "An error occurred. Exiting." && exit 1' ERR
backup_date="$(date +$DATE_FORMAT)"
# Database backup
echo -n "Backup DB... "
DB_BACKUP_FILE="$BACKUP_DIR/db_$backup_date.sql.gz"
pg_dump -Fc -U $DB_USER $DB_NAME | gzip -c >"$DB_BACKUP_FILE"
find "$BACKUP_DIR" -mtime +$BACKUP_LIFETIME_DAYS -name "db_*.gz" -exec rm -f {} \;
echo "Success!"
# Sync backup
echo -n "Backup to R2... "
rclone copy --max-age 30h --no-traverse "$BACKUP_DIR" $RCLONE_DB_DEST
rclone copy --max-age 30h --no-traverse --exclude="/cache/**" "$SYSTEM_DIR" $RCLONE_MEDIA_DEST
echo "Success!"
backup_monthly.sh:
#!/bin/bash
set -euo pipefail
# Configurable variables
INSTANCE_DIR="/home/mastodon/live"
SYSTEM_DIR="/home/mastodon/live/public/system"
RCLONE_MEDIA_DEST="r2:mastodon-media"
# Error handling
trap 'echo "An error occurred. Exiting." && exit 1' ERR
# Sync backup
echo -n "Backup all media to R2... "
rclone copy --exclude="/cache/**" "$SYSTEM_DIR" $RCLONE_MEDIA_DEST
echo "Success!"
crontab -e:
35 3 * * * /home/mastodon/cleanup.sh > /dev/null
50 3 * * * /home/mastodon/backup.sh > /dev/null
35 4 1 * * /home/mastodon/backup_monthly.sh > /dev/null
[ツッコミを入れる]