Slide 1

Slide 1 text

ゆるゆるMastodon鯖缶生活 S.H. 東京Ruby会議12 前夜祭 2025-01-17

Slide 2

Slide 2 text

自己紹介 S.H.(Shun Hiraoka) Mastodonの管理者(鯖缶) 島根県在住 Hamada.rb ESM アジャイル事業部 一日一Halo

Slide 3

Slide 3 text

各種SNSなど Github: S-H-GAMELINKS Mastodon: [email protected] Honk: honk.gamelinks007.net/u/sh Mixi2: S_H_ 基本的にはMastodonかHonkにいます

Slide 4

Slide 4 text

東京Ruby会議12

Slide 5

Slide 5 text

Rubyと暮らす

Slide 6

Slide 6 text

Mastodonとの暮らし

Slide 7

Slide 7 text

mastodon(prod)> Account.second => #

Slide 8

Slide 8 text

ゆるゆると7年ほど Mastodonと暮らす

Slide 9

Slide 9 text

RubyとRails なんもわからん

Slide 10

Slide 10 text

RubyとMastodonに パッチを投げる

Slide 11

Slide 11 text

そこまでの 歴史を話します

Slide 12

Slide 12 text

今日話すこと Mastodonとの出会い やらかしと成長 砂場としての楽しさ 現在の鯖缶生活

Slide 13

Slide 13 text

Mastodonとの出会い

Slide 14

Slide 14 text

出会い 2017年4月に日本で第一次Mastodonブームが 起きた Matzがシェアした記事経由で知った

Slide 15

Slide 15 text

Mastodonの面白さ 連合という概念 RubyとRailsで作られている 個人でSNSを運用できる

Slide 16

Slide 16 text

連合とは サーバ同士が同じプロトコルでやり取りができる 連合先のアカウントをフォローしたりできる

Slide 17

Slide 17 text

RubyとRailsとの距離 当時はまだRubyとRailsを触りはじめたばかり だった 勉強のため何か良い題材はないかと悩んでいた RubyとRailsでできたサービスを運用すると知 見が溜まるのではないかと考えた

Slide 18

Slide 18 text

個人でSNSを運用できる面白さ 大手SNSの規約に縛られない自由さがあった 当時は趣味でフリーゲームをC/DxLibとかで 作っており、創作活動する人向けの場を作りた いという思いもあった

Slide 19

Slide 19 text

「Mastodon建てよう!!」

Slide 20

Slide 20 text

2017年当時のサーバを建てる方法 さくらインターネット提供のスタートアップスクリプト があった 多くのサーバがスタートアップスクリプトで建立さ れていた

Slide 21

Slide 21 text

サーバは建てたけど…? ユーザーが自分しかいない 連合先がないので他にどんなサーバがあるのか がわからない 別のサーバのアカウントをフォローしていないの で連合先がない

Slide 22

Slide 22 text

サーバ建てた後のアレコレ 交流のあった人を自分のサーバに招待した TwitterでMastodonのサーバを建てた人を 探してフォローして、連合先を増やした RubyでシンプルなBotを作って、そこを経由し て連合先を増やしたりもした

Slide 23

Slide 23 text

Mastodonの鯖缶生活 の始まり

Slide 24

Slide 24 text

やらかしと成長

Slide 25

Slide 25 text

7年間にいくつもの やらかしをした

Slide 26

Slide 26 text

二大やらかし Let’s Encryptのルート証明書の切り替えで 自分のサーバからの投稿の配送が詰まってし まった メンテナンスをサボっていたために、関連gemの mimemagicがyankされていた問題を踏んで しまった

Slide 27

Slide 27 text

やらかし その①

Slide 28

Slide 28 text

Let’s Encryptのルート証明書 Let’s Encryptのルート証明書が2021年9月 30日で切り替わる 切り替えにより、Mastodonの一部のサーバで 証明書のエラーが起きるのではないかと危惧さ れていた

Slide 29

Slide 29 text

ウチは大丈夫でしょう

Slide 30

Slide 30 text

そんなことはなかった

Slide 31

Slide 31 text

2021年10月1日以降 サーバでインストールされている証明書が廃止 されるものだった それにより外部のサーバへの配送が詰まり、 Sidekiqで再試行ジョブが詰まっていた しかし、外部のサーバからの投稿に関してはタイ ムラインに流れていた

Slide 32

Slide 32 text

状況確認と調査 スタートアップスクリプトでサーバを建てていた のでそのあたりに何かないか確認した サーバのOSとしてCentOS 7を使っていること が判明した CentOS 7関連で同じ問題を踏んでいる人を 探せばなんとかなりそう

Slide 33

Slide 33 text

暫定的な対応 調査の結果、ca-certificatesをアップデートす れば対応できそう Sidekiqのスレッド数などを調整して一時的に 処理する数を増やしてジョブをさばいた sudo yum update ca-certificates

Slide 34

Slide 34 text

なんとかなった

Slide 35

Slide 35 text

反省点 ルート証明書の切り替えの影響を受けるかどう かの確認がないまま対応不要と判断してしまっ ていた 定期的なメンテナンスをサボっていたので環境 の確認に手間取ってしまった

Slide 36

Slide 36 text

やらかし その②

Slide 37

Slide 37 text

サーバを建てて 4年以上が経過した

Slide 38

Slide 38 text

だんだんメンテナンス しにくくなってきた

Slide 39

Slide 39 text

サーバの移行を やらないといけないか

Slide 40

Slide 40 text

サーバの移行 Let’s Encryptのルート証明書の件もあり、 サーバの移行を検討しはじめた また以前からC拡張のgemもインストールでき ないケースもあったことも移行を考える後押しに もなった Mastodonの公式ドキュメントで推奨されてい るUbuntuに移行することにした

Slide 41

Slide 41 text

現状の確認 少し前のMastodonのバージョン(v3.0.1)を 使っていた AWS S3にメディアファイルは移行済み PostgreSQLとRedisを同じサーバ内で動か していた DBとRedisのバックアップを取って移行先に流 し込めば移行は簡単そう

Slide 42

Slide 42 text

やることの洗い出し ユーザーと連合先の鯖缶向けにサーバ移行のア ナウンス 移行元のサーバを停止 PostgreSQLとRedisのバックアップと流し込 み 移行先のサーバでMastodonのセットアップ

Slide 43

Slide 43 text

なんとかなりそう

Slide 44

Slide 44 text

DBとRedisの移行まで 完了

Slide 45

Slide 45 text

あとはMastodonの セットアップだけ

Slide 46

Slide 46 text

bundle installが 失敗する

Slide 47

Slide 47 text

You'll need to update your bundle to a version other than mimemagic (0.3.3) that hasn't been removed in order to install.

Slide 48

Slide 48 text

mimemagicがない

Slide 49

Slide 49 text

mimemagicのyank mimemagicがGPLライセンスに変更された件 で、古いmimemagicがすべてyankされてい た件の影響を受けた bundle installが通らずMastodonのセット アップが完了しない

Slide 50

Slide 50 text

Mastodonの対応を確認 mimemagicに依存しないRailsにアップデート して対応していた ただし、最新のバージョン(v3.4.1)で対応され ており、うちのサーバのバージョン(v3.0.1)では 未対応 Mastodonのアップデートもやらないとだめそう

Slide 51

Slide 51 text

対応方針 サーバの移行はやる Mastodonのアップデートも同時にやる 両方やらないといけないというのがだいぶ辛い

Slide 52

Slide 52 text

リリースノートを読みつつ アップデート

Slide 53

Slide 53 text

祈りながら マイグレーションを 走らせる

Slide 54

Slide 54 text

なんとか対応できた

Slide 55

Slide 55 text

対応完了後 ユーザーと連合先の鯖缶向けにサーバの移行が 完了したアナウンスを流す サーバを止めていた間の配送が処理されるのを 確認

Slide 56

Slide 56 text

教訓 ソフトウェアはメンテナンスしなくなると動かなく なる 定期的なメンテナンスが大事

Slide 57

Slide 57 text

トラブルのある鯖缶生活

Slide 58

Slide 58 text

経験を積めた

Slide 59

Slide 59 text

慣れてきたころ

Slide 60

Slide 60 text

色々手を出し始める

Slide 61

Slide 61 text

砂場としての楽しさ

Slide 62

Slide 62 text

当時の状況 Ruby Hack ChallengeをきっかけにRuby へパッチを投げていた お仕事ではGoとReactで自社サービスの開発 をしていた お仕事でRubyを使っていないためコーナー ケースを踏む機会がほとんどなかった

Slide 63

Slide 63 text

そんなとき Rubyのmasterブランチでサービスを動かして いる話を聴く 色々と試す場所としてMastodonを使えないか と考えだす 新しい技術を試す砂場にできそう

Slide 64

Slide 64 text

やってみよう

Slide 65

Slide 65 text

Mastodonの砂場化 RubyとMastodonの開発ブランチでのサーバ を運用 TypeProfやSteepといった型解析ツールの試 験的導入 独自機能の導入とメンテナンス

Slide 66

Slide 66 text

開発ブランチでの運用 Ruby masterとMastodon mainでサーバを 運用 Ruby 3.1 から masterまでのバージョンでCI を回している 最新のRubyやMastodonに導入された新機能 を試し、バグなどがないかを確認 運用できないレベルのバグの場合は一旦バー ジョンを落とす

Slide 67

Slide 67 text

実際にRubyに投げたパッチ Universal Parserを有効化するとRipperのメモ リのバグを踏む Ripperの内部を知る良い機会になった

Slide 68

Slide 68 text

型周りのツールの導入 TypeProfで型を自動生成し、Steepで型チェッ クを行うように導入した Mastodon側の実装の問題を検知できた

Slide 69

Slide 69 text

実際の問題を検知ができたコード # デフォルト値ありの引数として定義されている def process(url, terminal = false) # ... end def process_html(response) # 実際にはキーワード引数で渡されていた process(json_link['href'], terminal: true) unless json_link.nil? end

Slide 70

Slide 70 text

独自機能 公開範囲「にゃーん」を実装 投稿に何を書いても最終的に「にゃーん」に置き換 えられる機能 当時Mastodon にはE2Eテストがなかった 公開範囲を選択して投稿されるまでのE2Eテスト が欲しくなった

Slide 71

Slide 71 text

cypress-railsの導入とパッチ cypress-railsを導入し、E2Eテストを追加 古い設定ファイルを使っており、そのままでは動作 しないので修正パッチを投げた

Slide 72

Slide 72 text

良いコントリビューション チャンスが得られた

Slide 73

Slide 73 text

現在の鯖缶生活

Slide 74

Slide 74 text

普段の鯖缶生活 RubyとMastodonの開発ブランチへの追従 他の鯖缶向けの新機能の共有 他のサーバのCI修正

Slide 75

Slide 75 text

開発ブランチへの追従 3日から7日程度の間隔で実施 過去にメンテナンスをサボっていたことの反省か ら間隔は短め Mastodonのみ変更差分を確認し、非互換や大 きな変更がないかをチェックしている Rubyに関しては随時変更を追っているのでメ ンテナンスのタイミングでは特に何もしない

Slide 76

Slide 76 text

メンテナンスの通知 変更差分をメンテナンス用のesaの記事にまとめる esaの記事を外部向けに公開すると、自動的に ユーザー向けメンテナンス終了のアナウンスが流れ るようにしている

Slide 77

Slide 77 text

他の鯖缶へ新機能の共有 メンテナンスの際に新機能などを確認 確認した内容をタイムラインにPostして共有

Slide 78

Slide 78 text

他のサーバのCI修正 連合先の鯖缶がCIが通らなくて困っていたので フォロー 開発ブランチに追従している際のCI修正の知見を 活かせた

Slide 79

Slide 79 text

ゆるゆると生活 しています

Slide 80

Slide 80 text

さいごに

Slide 81

Slide 81 text

ゆるゆると7年ほど 鯖缶を続けてきました

Slide 82

Slide 82 text

続けていると色々と できることが増えます

Slide 83

Slide 83 text

面白そうなことを見つけ たらやってみよう

Slide 84

Slide 84 text

無理せずゆるゆると続け ていくことが大事

Slide 85

Slide 85 text

自分の武器になるものが 見つかるかもしれません