mastodon

Mastodon 保守メモ

備忘録として残しておきます

Mastodon専用ユーザにて、Mastodonのインストールディレクトリにて操作することを前提にしています。
(非Dockerならliveディレクトリ)

参考資料

Rakeタスクの一覧

https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/List-of-Rake-tasks.md

あるいは

# すべてのRakeタスクを表示
$ RAILS_ENV=production bundle exec rails -T

# Namespace "mastodon" のタスクのみ表示
$ RAILS_ENV=production bundle exec rails -T mastodon

で、定義されているタスクが一覧(+簡単な説明文)表示される。

タスク一覧の出力例
rails mastodon:add_user                                     # Add a user by providing their email, username...
rails mastodon:confirm_email                                # Manually confirms a user with associated user...
rails mastodon:daily                                        # Execute daily tasks (deprecated)

Rakeタスクの実体

https://github.com/tootsuite/mastodon/tree/master/lib/tasks

Rails Consoleへの入り方

非Docker

$ pwd
/home/mastodon/live
$ RAILS_ENV=production bundle exec rails console
irb(main):001:0>

Docker

$ docker-compose run --rm web rails console
irb(main):001:0>

※ Docker環境がないので、動作確認はしていません

メディアファイル系

外部インスタンスの古いメディアファイルを消す

デフォルトでは7日以前のメディアファイルを消す
空き容量に困ったらとりあえず流す感じになっている

$ RAILS_ENV=production bundle exec rails mastodon:media:remove_remote

外部インスタンスユーザのアバターとヘッダ画像を更新する

全インスタンスに対して行う場合は、Rakeタスクが用意されている。
時間がかかる上、エラー落ちすることがあるので注意。

$ RAILS_ENV=production bundle exec rails mastodon:media:redownload_avatars

特定のインスタンスのみ、ということであれば、下記Rails Consoleコードを実行する。
where部分を書き換えたり追加したりすれば、様々な条件で引っ掛けることが可能

Account.where(domain: "nagoyadon.jp").find_each do |account|
    printf("%s@%s\n", account.username, account.domain)
    account.reset_avatar!
    account.reset_header!
    account.save
end; 0

引っ掛けられるカラムは、モデルを見ればだいたい分かるかも
https://github.com/tootsuite/mastodon/blob/master/app/models/account.rb

たまに効かないユーザが居るのが謎。

アカウント系

アカウントを追加する

インタラクティブに作成できる、Rakeタスクが用意されている。

$ RAILS_ENV=production bundle exec rails mastodon:add_user
  • ユーザ名とメールアドレスが必要
  • 確認メールを送信するかしないか選べる
  • パスワードはランダムに生成される(作成後に表示される)

メールアドレスを確認する

確認メールが届かねえ! そもそもメールサーバの設定してねえ! って時に

$ RAILS_ENV=production bundle exec rails mastodon:confirm_email USER_EMAIL=hoge@example.tld

特定のユーザを管理者あるいはモデレータにする、権限を剥奪する

管理者

$ RAILS_ENV=production bundle exec rails mastodon:make_admin USERNAME=hogehoge

モデレータ

$ RAILS_ENV=production bundle exec rails mastodon:make_mod USERNAME=hogehoge

権限を剥奪(一般ユーザ化)

$ RAILS_ENV=production bundle exec rails mastodon:revoke_staff USERNAME=hogehoge

管理者とモデレータの権限比較

操作 備考 管理者 モデレータ 一般
サイト設定 インスタンスの基本設定 × ×
カスタム絵文字 カスタム絵文字の登録、輸入 ×(できそうで出来ない) ×
バックエンド情報表示 Sidekiq, WebSub, PgHeroへのアクセス × ×
レポート処理 通報の確認、コメント、対応 ×
アカウント情報表示 一覧、確認、編集等 ×
招待 招待URLの生成 △(サイト設定による) △(サイト設定による) △(サイト設定による)
既知のインスタンス 一覧、再講読 × ×
ドメインブロック 一覧、ブロック、サイレンス × ×
メールブラックリスト 一覧、追加、削除 × ×

モデレータ権限でも、ローカルユーザのメールアドレスとか見えちゃうので
信頼のおける人にだけ権限を付与しよう!
※パスワードは管理者でも見えない。

存在しないリモートユーザをパージする

リモートユーザが本当に存在するか実際に問い合わせを行い、存在しなければパージする。

$ RAILS_ENV=production bundle exec rails mastodon:maintenance:purge_removed_accounts

オプションとして -f あるいは --force を与えると、確認メッセージ無しでパージを実行する。

リモートに存在せず(HTTP 404ないし410が返された場合)、
かつパージを明示的に指示した場合、そのアカウントをパージ、つまり 抹消する

証明書切れ、DNS名前解決に失敗、HTTP 404/410以外のエラーコードが返されたとき、などはスルーされる。
(メンテナンス作業中であった場合等を考慮した措置だと思われる)

https://github.com/tootsuite/mastodon/blob/master/lib/tasks/mastodon.rake#L717

その他のタスク

誰もフォローしていないユーザの購読をパージ

連合タイムラインを整理したい時に。

$ RAILS_ENV=production bundle exec rails mastodon:push:clear

アクティブユーザのホームタイムラインを再構築

ホームタイムラインが表示されない(Redisのデータが壊れた)時に。

$ RAILS_ENV=production bundle exec rails mastodon:feeds:build

システム系

Mastodonサービスのログを見たいとき

$ sudo journalctl -r -u mastodon-web
$ sudo journalctl -r -u mastodon-sidekiq
$ sudo journalctl -r -u mastodon-streaming

-r で新しいものを先に表示
-u で表示するモジュールを指定
-f も付ければ、継続監視が可能(tailみたいに)

Nginxのログを見たいとき

$ sudo cat /var/log/nginx/access_log
$ sudo cat /var/log/nginx/error_log

継続して監視したい時は、 tail -f が便利

データベースなどのバックアップを取得したいとき

アップデート手順内にメモってあるので、それを参考に実施
( pg_dump でデータベースダンプファイル取得、tarでPublicディレクトリのアーカイブ化)

https://qiita.com/kumasun/items/f17754e57120f7b13a06

Ruby Gem を再インストールしたい時

稀に壊れたりすることがあるようです。。。

$ bundle exec gem uninstall -aIx
$ bundle install

引数 -aIx で、「全てを確認無しでアンインストール」
その後、通常通りインストールする

bundler 経由で操作しないと、グローバル環境のGemに作用する?らしいので注意。

アセットをゼロから作り直したい時

$ RAILS_ENV=production bundle exec rails assets:clobber
$ RAILS_ENV=production bundle exec rails assets:precompile

clobber で webpackの出力を全消しできる

あるドメインのMXレコードを調べたいとき

MXレコード = 電子メールの配送先。

スパム登録等を避けるために「メールブラックリスト」があるが、ドメイン部分をころころ変えられていたちごっこ。ということ、よくありますよね。
実は「メールブラックリスト」機能はMXも調べてくれるのです!

メールのドメインが違っても、同じMXを使い回しているような場合は、そこを抑えれば一網打尽にできます。

しらべかた

たとえば evil.example.com のMXレコードを調べたい時

nslookup を使う例。
Windows 10 / Linux(Fedora)にて動作確認。

$ nslookup -type=mx evil.example.com
Server:         192.168.xxx.xxx
Address:        192.168.xxx.xxx#53

Non-authoritative answer:
evil.example.com   mail exchanger = 0 mail.evil.example.com.

Authoritative answers can be found from:

dig を使う例。
Linux(CentOS)にて動作確認。

$ dig mx evil.example.com

; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> mx evil.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34355
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1280
;; QUESTION SECTION:
;evil.example.com.                  IN      MX

;; AUTHORITY SECTION:
evil.example.com.           299     IN      SOA     mail.evil.example.com. 1 3600 300 2419200 300

;; Query time: 351 msec
;; SERVER: xxx.xxx.xxx.xxx#53(xxx.xxx.xxx.xxx)
;; WHEN: Wed Jul 25 14:28:50 JST 2018
;; MSG SIZE  rcvd: 127

この結果から、メールの配送先は mail.evil.example.com であることが分かる。

その他、非技術的な部分

  • 独自にオープンインスタンスを立てた場合、各地域の総合通信局に「電気通信事業届出」をしておいた方が無難。
  • 「サイト設定」内に連絡先を記載。メールアドレス、管理者欄を埋める。他のインスタンスのアカウントなどがあれば併記しておく。インスタンスに何かあったときに、誰かが知らせてくれるかも。

あとがき

  • 自分用にメモした内容です。必要に応じて読み替えてください。
  • こうしたほうがいいよ的なアドバイスを頂けると大変助かります
  • こんなのないの? 的なご質問には分かる範囲でお答えいたします(あまり期待しないでください)

以上