ななめも

メモ書き的なブログ的なメモ的なブログ

サルでもできるMastodonインスタンス閉鎖

この記事は以下のような生物を対象にしています。

  1. Mastodonが建てられる程度の知識がある人間、ゴリラ、サル
  2. できる限り静かにMastodonインスタンスを閉鎖したいサーバー管理者

サーバーの電源落とすだけじゃだめなの?

接続されているサーバーのSidekiqに無限に再試行が積まれるのでやめましょう。

じゃあ何をすればいいの?

閉鎖を周知する

公開インスタンスの場合、特に重要です。
自分のサーバーのユーザーや接続されているインスタンスの管理者に閉鎖をきちんと伝えましょう。(お一人様で無言に消えたいなら次の項目だけやっとけばいい気もする)
十分に閉鎖までに余裕を持って告知しましょう。

下の画像は悪い例です。ちなみにこれを投稿したのは末代再起動の30分ぐらい前で末代再起動とともにインスタンスが消滅しました。本当に悪い例です。 f:id:Non0920:20181205172109p:plain

410を返す

v2.6.1からはやらなくていいと書いている記事もありますが、やった方がいいと私は思います。(お一人様で無言で消えたい場合とかはとりあえずこれだけやっとけば文句は言われないと思う)
接続されているインスタンスがすべてv2.6.1以上とは限らないので。

Mastodon用のNginxを

map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}

server {
  listen 80;
  listen [::]:80;
  server_name example.com;
  root /home/mastodon/live/public;
  # Useful for Let's Encrypt
  location /.well-known/acme-challenge/ { allow all; }
  location / { return 301 https://$host$request_uri; }
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name example.com;

  ssl_protocols TLSv1.2;
  ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
  ssl_prefer_server_ciphers on;
  ssl_session_cache shared:SSL:10m;

  ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

  return 410;
}

に書き換えてNginxを再起動するとできます。(example.comを自分のサーバーのドメインに置き換えて)
大体この状態で1~2ヶ月ほど放置すればいいと思います。(本当はもうちょっと放置した方がいいけど、資金面で負担になるから最低1ヶ月ぐらいを目安にしていいと思う)

MastodonのSystemd Serviceは全部停止して大丈夫です。

サーバーの処理

データは自分が規約に書いた期間、安全に保管してから確実に削除しましょう。

最後に

これを見た人に言う言葉ではないと思うんだけど楽しいSNSライフを!

Mastodonの~/liveを飛ばした時の復旧

Mastodonに強い人に会って話題に出したので復旧した時の手順を書いておく。
記憶を元に書いてるので合ってるかわからないけどそもそもこんな状態が稀だと思う。
Non Docker前提

飛ばすとどうなるのか

動かない。だって本体がないんだもの。

慌てない

ここで絶望して「もうだめだ...DBを飛ばして0からやりなおそう...」とか考えてはいけない。
まだDBは生きてるし設定ファイルもある。

とりあえずソースを戻す

MastodonLGPLなので、カスタムしてる場合は自分のリポジトリにソースがあるし、そうじゃないなら普通に公式にソースがあります。
(まさか自分のサーバーにzipで置いてるわけないよね?)

とりあえずそれをgit clone URLするなりなんなりして持ってくる。
私の場合はlive/でrm -rf *したのでgit checkout .で戻ってきた。

アップデートの要領で動作するようにする

cd ~/live
# 任意のバージョン
git checkout v1.4.7 
# ライブラリを復元
bundle install --deployment --without development test
yarn install --pure-lockfile
# どっかから.env.productionを持ってくる
cp ~/backup/2018/07/30/.env.production .
# 一応migrateしてprecompile
env RAILS_ENV=production bundle exec rails db:migrate
env RAILS_ENV=production bundle exec rails assets:precompile
# 再起。
systemctl restart mastodon-web
systemctl restart mastodon-sidekiq
systemctl restart mastodon-streaming

これでとりあえず動く(はず)。

画像をできるだけ復元

動いてもそこは画像がない虚無の世界です。
なので画像を復元します。

アイコン

まずローカルのアイコンはどうしようもないので、ローカルの人達に謝罪してアイコンを再設定してもらいましょう。
ユーザーが上げた画像はもう戻ってきません。これも同時に謝罪しましょう。

そしてリモートはリモートの鯖に画像があるのでとりあえず
env RAILS_ENV=production bundle exec rails mastodon:media:redownload_avatars
を叩きましょう。(そもそも本来の用途じゃないらしいのであまり効果は期待できない。)

それでも取得できない場合は、モデレーションのアカウントからアバターの更新を叩くと完全に再取得されます。(といっても全部叩くことになるとDBを飛ばしたくなる。)

カスタム絵文字

これはローカルのものも比較的安易に復元できます。

  1. まず自分の鯖のカスタム絵文字の一覧をどこかにメモしておく。この時自分の鯖の絵文字がコピーされている鯖もメモする。 f:id:Non0920:20180807210318p:plain

  2. カスタム絵文字をローカル、リモート見境なく全部消す。

  3. 自分の鯖のカスタム絵文字をコピーした鯖に行き、自分の鯖の自分のアカウント宛てにカスタム絵文字をDMで送る。
    f:id:Non0920:20180807210706p:plain

  4. 自鯖でそれをコピーする。コピーされてなかったものはがんばって復旧する。

他鯖の絵文字は時が復旧してくれます。(全部削除したので勝手に取得される。)

その後

私の鯖は、その後は普通に動作しています。
飛ばした場合に楽に復旧できないかMastodonに強い人に聞いたら「できる限り全部バックアップして」だそうです。

なのでバックアップを大事にして鯖運営しようね。

Mastodonが壊れた話

タイトルの通りです。運営しているMastodonが壊れました。そして直しました。

雑に言うと大体::1が悪いです。

環境

  • 一般的な自宅鯖
  • Non-docker Mastodon
  • Ubuntu 18.04
  • ネットワークをIPv4のみに制限

昨日この環境で再起動したらMastodonのSidekiqが暴走しました。

どうやらredisが動いていないようなので確認したところ

redis-server.service: Can't open PID file /var/run/redis-server.pid (yet?) after start: No such file or directory
redis-server.service: Start operation timed out. Terminating.
redis-server.service: Failed with result 'timeout'.

これを最初に見た時は完全にredis-server.service: Can't open PID file /var/run/redis-server.pid (yet?) after start: No such file or directoryしか見ていなくて「pidファイルが生やせないのか!?なぜだ!?」ってなったわけです。

そんなわけでパーミッションをいじったりconfigをいじったりしていたんですが、どうにもならないわけです。

そうして苦しんでいたらその時通話していた人から「IPv6を無効化してるとredisが起動できないとかいう記事が」って言ってきたんです。

ええ...と思いつつIPv6を有効化して再起動したら動きました。

どうやら/etc/redis/redis.confbind 127.0.0.1 ::1の行が地雷らしくbind 127.0.0.1にすると動きました。

やはりIPv6に対応しないと洗礼を受けるのか...(途中のコマンドミスで画像飛ばしたし...)

Mastodonのアカウントの全投稿を削除するスクリプトを作った話

ふと自分のアカウントの全投稿を削除したくなる事ってありますよね?

でもMastodonTwitterの様に豊富に投稿全削除ツールがあるわけではありません。

なので自作しました。

ホストとトークンを引数として渡すと/api/v1/accounts/verify_credentialsのIDを参照して/api/v1/accounts/#{id}/statusesの投稿を取得、取得した投稿を3秒ごとに1件ずつ削除するだけの簡単なスクリプトです。

Rubyとネットワーク環境があれば動作するのでアカウントを爆破したい方は↓からどうぞ

github.com

MC-R500を買った話

みなさん、ジャンクしてますか?
私は月始めに財布の半分を溶かす程度にはジャンクしてます。

というわけで勢いで秋葉原行ってきました。 f:id:Non0920:20180202214927j:plain

そして古いホッカイロArrowsとか通話ができない高級文鎮IS04が売っている中古屋に行ったらカゴに10台ぐらいPCが入っていて
そこで手に入れてきたのがタイトルにもなってるコイツ

f:id:Non0920:20180202215442j:plain

NECのMC-R500です。

いわゆるハンドヘルドPCというやつでスペックは以下の通りです。同時発売のMC-R300と同時にどうぞ。

型番 MC-R500 MC-R300
CPU NEC VR4111
RAM(最大) 16MB(32MB) 8MB(32MB)
OS Windows CE 2.0
液晶 8.1インチカラーSTN
(640×240ドット、256色)
7.3インチモノクロEL
(640×240ドット、4階調)
モデム 33.6kbps FAXモデム内蔵
インターフェイス RS-232C、モジュラージャックRJ-11、モニタ(VGA)、IrDA 1.0、PCMCIA Type2、コンパクトフラッシュスロット、マイク、スピーカー
標準バッテリ リチウムイオン 単3乾電池×2
駆動時間(非通信時) 約8時間 約30時間
サイズ(幅×奥行×高さ) 245×138×31.4mm 245×122×30.5mm
重量(電池含む) 850g 670g
標準仕様以外のアプリケーション MGメール、MG FAX、MGエディタ、MGパソコン通信、MG運用アシスタント、MGオートダイヤラー、MGボイスレコーダのほか、パソコン通信入会用プログラムなど

???「でもこんな低スペックじゃ何もできないでしょ?」

f:id:Non0920:20180202224705j:plain f:id:Non0920:20180202224717j:plain

普通に遊べます!楽しいです!

タッチパネルも生きてるしキーボードも快調です。

お値段3218円とお高いですが私は満足です。

初投稿がこれでいいのか?まあ気にしない!