はんドンクラブ 運営ブログ

Mastodonインスタンス「handon.club」の運営ブログです。コラムなど,Mastodonに関する一般的な記事も投稿予定です。

はんドンクラブの独自機能・特徴

この記事ははんドンクラブの独自機能や構成をまとめたものです。誰がいるか,どう使われているかは記載していません。管理人のメモ(仕様書)として使うことも想定しています。随時更新されます。

追加機能

Mastodonの内部処理を書き換えている追加機能で,ブラウザでも3rdパーティー製のクライアント(アプリ)でも影響するものです。

DMをホームTLに表示しない

Mastodonは,Twitterなど他のSNSと違い,ダイレクトメッセージ(DM)もホームTLに表示されます。しかし,はんドンクラブでは,①初期設定では,DMをホームTLに表示しない ②希望する場合,DMをホームTLに表示することもできる 仕様に変更しています。つまり,DMの表示は以下のとおりです。

通常 はんドンクラブ
ホーム欄 表示される* 表示されない(設定で表示される*にも変更可)
通知欄 表示される 表示される
ダイレクトメッセージ欄 表示される 表示される

*フォローしている場合に限る

設定を変更したい場合,設定→ユーザ設定→その他→DMをホームTLに表示しない で変更してください。

プロフィール絵文字

自分または他人のアイコンをカスタム絵文字のように使えます。私のアイコンであれば :@highemerly: とすることで,誰でも利用できます。best-friends.chat さんの実装を参考に,だいぶ書き換えてます。

他のサーバの実装では3rdパーティのクライアントでプロフィール絵文字が表示されない場合が多いのですが,はんドンクラブでは3rdパーティのクライアントであっても表示可能な実装に書き換えています。API上,通常のカスタム絵文字かのように絵文字の情報を渡しています。

連合については,以下の仕様となります。

  • ○ はんドンクラブのユーザは,他のサーバのユーザのアイコンを使ったプロフィール絵文字は投稿できる
  • ○ はんドンクラブのユーザは,他のサーバのユーザのプロフィール絵文字の投稿を表示できる
  • ○ プロフィール絵文字に対応しているサーバのユーザは,はんドンクラブのユーザのプロフィール絵文字の投稿を表示できる*
  • × プロフィール絵文字に対応していないサーバのユーザは,はんドンクラブのユーザのプロフィール絵文字の投稿を表示できない

* はんドンクラブの実装と同様の実装の場合。

全文検索機能

自分の投稿やお気に入り・ブックマークした投稿は全文検索が可能です。もともとMastodonある機能なのですが,別コンポーネントが必要なため有効にしているサーバは多くありません。

はんドンクラブでは,日本語検索を最適化するため,日本語専用の形態素分析を行うプラグインを導入しています。kuromojiを使っており,利用するためにソースコードを修正しています。

アナウンス機能

投稿欄の下に私からのアナウンスが表示される欄です。mstdn.maud.io さん の実装を参考に,いじっています。間違って押してしまうということで苦情が来ているので,いつか別の形で実装し直そうと思っています。実はjsonでも取れます。

パラメータのチューニング内容

追加機能というほどではありませんが,いくつか通常よりも制限を緩和しているものがありますので紹介します。ブラウザでも3rdパーティー製のクライアント(アプリ)でも影響します。

メディアファイルの制限

はんドンクラブへ投稿できる画像や動画のサイズ上限を以下のように変更しています。なお,実際にサーバに保存される画像や表示される画像は,リサイズ・圧縮・フォーマット変換が行われる場合があります。

項目 通常 はんドンクラブ
画像ピクセル数上限 1920x1080px 2880x1440px
画像サイズ上限 10MB 15MB
動画サイズ上限 40MB 65MB

その他の上限などが知りたい方は,以下のソースコードを参照してください。

github.com

投票(poll)の選択肢の制限

投票機能では,選択肢の数と投票可能期間をより柔軟に選択できるようにしています。

項目 通常 はんドンクラブ
選択肢の上限 4 16
投票期間 5,30分/1,6時間/1,3日 1,5,10,30分/1,2,6時間/1,3日

タイムライン取得上限値

タイムラインは,過去に遡れる上限値があります。400投稿から1,200投稿に増やしています。

トレンドの選出閾値

トレンドに選出される条件にはいくつかの閾値が設定されています。トレンドに選出されやすいように少々いじっています。

Webの表示形式の変更内容

3rdパーティー製のクライアント(アプリなど)では関係のない,ブラウザでの見た目だけの項目です。一番簡単にカスタマイズできるので,結構いじっています。

3.x系風UIへの修正

4.0になってUIが使いにくくなったとの声が多かったので、3.x風のUIに修正を行っています。

  • タイムライン中の無駄な余白を削除
  • タイムライン中のアイコン画像とその余白を縮小
  • タイムライン中のリプライ表記とその余白を縮小
  • スマホからのアクセス時、投稿ボタンをサイドバーに追加
  • 「投稿」を「トゥート」表記に変更
  • その他余白の微修正

ブックマークボタンの追加

各投稿にブックマークボタンが表示されるようにしています。通常はメニューの奥深くにありますが,はんドンクラブではブックマークしやすくしてあります。fedibird.com さんを参考にさせて頂いています。

→すでにバニラ(標準)にも実装されています。

カスタム絵文字のスタンプ機能

カスタム絵文字を一つだけ投稿すると,スタンプのように大きく表示されます。2つ以上投稿された場合や普通の文字(ユニコード絵文字を含む)が投稿されている場合は対象外ですが,クリックorタップすることで一時的に大きくなります。独自機能です。なお,スタンプのように大きく表示される機能は Tootoise にも実装されています。

カスタムテーマ

いくつかのカスタムテーマを取り入れています。Blacklead ThemeCanta Darkの他に,InstanceTickerを取り入れており,好きなものを選べます。

inst.ance.tk

Blacklead Theme,Canta Darkは,一部スタイルを変更し,文字を読みやすくしています。その他にもよさそうなテーマ(かつ,ライセンス上問題ないテーマ)があれば,随時取り入れていこうと考えています。

InstanceTickerは,アカウントが所属するサーバを見やすくしてくれるツールです。Type1のみ実装しています。また,自分と同一サーバのユーザのティッカーは非表示にしています。そのためローカルタイムラインにはティッカーが出現しません。

どんなテーマがあるか試してみたい方は,設定→ユーザ設定→外観→サイトテーマ から変更できます。

より見やすいVisibility

各投稿の右上にVisibility(公開範囲)を表すアイコンが表示されますが,見やすさを向上するため,以下表のような修正を行っています。

同一サーバのIDを赤文字で表示

同一サーバのユーザは,タイムライン上でのIDが赤文字になります。それ以外のユーザは,テーマに沿った色で表示されます。

はんドンロゴの表示

スマホからのアクセス時、 @inabap に頂いたはんドンクラブのロゴが表示されます。

ユーザコミュニティ

管理人が把握している外部のユーザコミュニティを紹介します。いずれも管理人は一切関与していません。

  • 投稿まとめ

hagetter.hansode.club

hndn.blazing.jp

  • おみくじ

donmikuji.netlify.app

また,私が見えていない範囲でこれ以外にもあるかもしれません。掲載を希望するものがあればお気軽に教えてください。

運営の考え方

サーバ運営の考え方をまとめたものです。

ガイドライン

handon.hatenablog.jp

カスタム絵文字の追加申請方法、アカウントの削除申請などはこちらに記載があります。

プライバシー

はんドンクラブは,全ての投稿の著作権は投稿者に帰属すると考えています。当然,日本国内の法律である改正個人情報保護法を遵守し,当該法に基づく自己の個人情報の照会はGoogle フォームで受け付けています。併せて,GDPRも一つの指針として捉えています。主に日本国内に向けてのみサービス提供しているためGDPR準拠は必須ではないと認識していますが,これを目標として設定することでユーザのプライバシー尊重に努めています。

詳しいプライバシーポリシーは以下を参照ください。

handon.club

その他法令(プライバシーを除く)

はんドンクラブは,直接料金を徴収していないものの寄附を募っていること,及びダイレクトメッセージ機能を提供していることから,電気通信事業法に基づき届出電気通信事業として総務省関東総合通信局へ届出を行っています。提供役務は「31 インターネット関連サービス(IP電話を除く。)」,提供区域は「全国」です。なお,利用者が少ないため即時報告の対象となることはありませんが,四半期報告の対象になる場合があります。

はんドンクラブは,プロバイダ責任制限法の適用を受けると考えています。発信者情報開示に関する請求や権利の侵害に関するお問い合わせは,Google フォームで行うことができます。

費用

fantia.jp

費用は原則として管理人のポケットマネーから捻出しています。しかし,よりよいサービス提供のため,ファンティアで寄附を募っています。スポット的な寄附ももちろん助かるのですが,サーバ代は月額で発生しますので,月額寄附が可能なファンティアを使っています。

また,2023年上期には毎月の収支報告ができるようにしたいと思っています。

サーバ構成

これ以降は技術的な話です。興味の無い方は読み飛ばしてください。

概要

規模

2023年3月現在

  • ヒット数: 25万〜30万アクセス / 1日
  • 転送容量: 20GB〜25GB / 1日
  • データベース容量: 28GB程度
  • メディアストレージ容量: 300GB程度

利用しているサービス・コンポーネント

サービスを提供するため,以下のサービス・コンポーネントを利用しています。

2023年3月現在

  • サービス
    • コンピューティング: さくらVPS(データ保存あり: 運用は東京,バックアップは大阪)
    • オブジェクトストレージ: wasabi(データ保存あり: 東京)
    • メール送信: sendgrid
    • CDN: CloudFlare Proプラン
    • WAF: CloudFlare Proプラン
    • レジストラ: GMO
    • ネームサーバ: CloudFlare Proプラン
    • SSL証明書: Origin-CDN間はLet's Encrypt,CDN-ユーザ間はCloudFlareが提供
    • 監視: LINE
  • コンポーネントOSS
    • OS: CentOS 7.x系
    • リバースプロキシ: nginx 独自コンパイル
    • データベース: postgresql 17.x系 (with pgbouncer), redis 7.x系
    • 全文検索: Elasticsearch 7.x系
    • テレメトリ取得・監視・可視化: prometheus, grafana

CDNは画像・動画のキャッシュのために利用しており、投稿/プロフィールをはじめとするAPI応答が保存されることはありません(cache-control: private)。画像・動画もパーソナルデータであると考えていますが、重要な情報が抜かれることはないと考えていただいてよいと思います。

2つのWebサーバは,グローバルロードバランサによるロードバランシングではなく,DNSラウンドロビンによるロードバランスが行われます。しかし,ユーザが接続するのはCloudFlareのサーバですので,実際に接続するWebサーバを選択しているのはCloudFlareです。

監視系については,CPUやディスクなどのメトリクスの監視の他,外形監視を行っています。警報は管理人のLINEに飛ぶようになっています。以下の記事も参照ください。

handon.hatenablog.jp

運用状況は,一般ユーザからもuptimerobotで確認できます。ただし,管理人による監視は,上記記載のとおりprometheus+grafana+LINEで行われています。

stats.uptimerobot.com

セキュリティ

handon.hatenablog.jp

  • アプリケーションセキュリティ
    • Mastodon本体の脆弱性には1週間以内(目標:2日以内)に対応する体制を取っています。
    • Mastodonが直接依存するパッケージや関連するパッケージなどは定期的(目標:1ヶ月に一度)にアップデートする体制を取っています。
    • CloudFlareでWAFを利用しています。精度はよく分かりませんのであまり過信していません。
  • DDoS対応
    • 現状は全ての通信がCDNを通過するため,DDoSはCDN側で緩和されます。
    • はんドンクラブサーバのIPアドレスを直接外部に公開しないことで,CDNをバイパスする攻撃が発生しないようにしています。
  • ネットワークセキュリティ
    • ファイアウォールは一般的な対策(インターネット側インターフェースで必要最低限のポートのみ公開するなど)を完了しています。
    • 管理用SSHログインについては一般的な対策(公開鍵認証を必須とする,fail2banの導入など)を完了しています。
    • TORからのアクセスは原則ブロックしています。
  • 暗号化・署名
    • ユーザとの通信は全てTLSで暗号化されます。Origin-CDN間,CDN-ユーザ間ともに,TLS1.1以下を無効化し,1.2・1.3のみで運用しています。
    • SNIを利用しているため,ガラケー,Android2.x,Windows XPIEからはアクセスできません。
    • HSTSを設定しています。
    • CloudFlareの設定上,一部弱めの暗号化スイートもオファーされる場合がありますが,普通のブラウザやOSをお使いの方には十分安全な暗号化スイートが選択されます。
    • DNSトラヒックの暗号化(DoH、DoT)やレコードの署名(DNSSEC)は行っていないため、悪意のあるユーザーや雇用主などによって通信先が傍受・書き換えられるリスクがあります。署名(DNSSEC)の導入に向けて取り組んでいます。
  • 監査
    • ログは可能な限り90日以上保管されるように設定しています。
  • DR(Disaster Recovery)プラン
    • 1日2回のオフラインバックアップを行っています。詳細は,上記の記事を参照してください。

バッチ処理

日本時間の夜間帯にいくつかのバッチ処理を実行しています。

  1. 他サーバから受信したメディアファイルの削除
    • 他サーバに所属するアカウントが投稿した画像や動画のメディアファイルなどは,一度はんドンクラブ側にキャッシュされます。しかし,容量削減のため,約1ヶ月経過したメディアはバッチ処理によって削除されます。
    • 削除されたメディアのリンクは保持しているため,リンクから当該サーバにアクセスすれば閲覧可能です。
    • はんドンクラブに所属するアカウントが投稿した画像や動画のメディアファイルは,時間が経過しても削除されません。
  2. アカウントの削除
    • アカウントの削除は他の全てのサーバへその通知を送るため,サーバにとって非常に大きな負荷となります。そのため,アカウントの削除タイミングは管理人が管理しています。
    • 概ね依頼のあった翌日の夜間帯にバッチ処理が行われます。
  3. トレンドの更新
    • トレンド更新頻度がゆっくりなため,結構短い頻度で強制的に更新しています。

その他,いくつかバッチがありますが,主なものはこれくらいです。

ソースコード

MastodonはAPGLでライセンスされているため,はんドンクラブで運用しているコードも以下で公開しています。

github.com