Discordを卒業:DockerでMatrix SynapseとElementをセルフホストする

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

会話のコントロールを取り戻す

日々のチャットログについて考えてみてください。WhatsApp、Telegram、Discordは便利ですが、本質的には自分のデータを所有していないブラックボックスです。HomeLab愛好家やDevOpsエンジニアにとって、この依存関係は重大な懸念事項です。私は常に、最も機密性の高いデータであるプライベートな会話は、自分たちが所有し、監査できるハードウェアに置くべきだと主張してきました。

連合型(フェデレーション型)の通信システムをデプロイすることは、現代のアーキテクトにとって不可欠なスキルです。これは単なるプライバシー対策ではありません。分散システムがオープンウェブ上でアイデンティティ、状態、セキュリティをどのように管理しているかを深く掘り下げることができます。Matrixは単なるチャットアプリではありません。機能と暗号化の両面でシリコンバレーの巨大プラットフォームに匹敵する、実績のあるオープン標準です。

スタック:SynapseとElement

ターミナルを操作する前に、コンポーネントを確認しましょう。Matrixプロトコルはメールによく似た仕組みです。サーバー(ホームサーバー)とクライアント(アプリ)があります。全員が1つの企業のサーバーに閉じ込められるSlackとは異なり、Matrixでは独自のインスタンスをホストしながら、「フェデレーション(連合)」を介して他のサーバーのユーザーとチャットすることができます。

  • Synapse: エンジン部分です。Pythonで書かれ、高性能なRustコンポーネントを含んでおり、データベース管理、E2EE鍵交換、ルーム同期などの重い処理を担当します。
  • Element: インターフェースです。モバイル版やデスクトップ版もありますが、今回はウェブ版をセルフホストします。これにより、公式のElement.ioサーバーを経由せずに、どこからでもブラウザで安全なチャットにアクセスできます。

前提条件:必要なもの

ハードウェア要件は控えめですが、RAMを惜しまないでください。スムーズな体験のために、少なくとも2GBのメモリを推奨します。

  • Linux環境(Ubuntu 22.04またはDebian 12が最適です)。
  • Docker および Docker Compose (v2.20以上を推奨)。
  • matrix.yourdomain.comのようなドメイン名。MatrixはDNSレコードを使用して他のサーバーを見つけます。
  • Nginx Proxy ManagerやTraefikなどのリバースプロキシ。エンドツーエンド暗号化(E2EE)にはHTTPSが必要なため、有効なSSL証明書が必要です。

ステップ1:ワークスペースの整理

ディレクトリが乱雑だとバックアップの失敗につながります。管理を容易にするため、Dockerスタックは /opt に置くようにしています。

mkdir -p /opt/matrix/data
cd /opt/matrix

ステップ2:設定ファイルの生成

Synapseを開始するには、ボイラープレート設定が必要です。Synapseのイメージ自体を使用してこのファイルを生成します。サーバー名は慎重に選んでください。 これはあなたのアイデンティティ(例:@user:chat.domain.com)になります。後でこれを変更するのは非常に困難で、通常はデータベースの完全な消去が必要になります。

docker run -it --rm \
    -v /opt/matrix/data:/data \
    -e SYNAPSE_SERVER_NAME=chat.yourdomain.com \
    -e SYNAPSE_REPORT_STATS=no \
    matrixdotorg/synapse:latest generate

これにより、データフォルダ内に homeserver.yaml が作成されます。次のステップで、データベースを切り替えるためにこれを調整します。

ステップ3:PostgreSQLへの移行

デフォルトでは、SynapseはSQLiteを使用します。簡単なデモには十分ですが、データベースが数百メガバイトに達すると動作が重くなります。2、3人以上のユーザーを想定している場合、PostgreSQLは必須です。 PostgreSQLは、同時書き込みや大規模なルーム履歴をはるかに効率的に処理します。

/opt/matrix/data/homeserver.yaml を開きます。database セクションを見つけ、SQLiteの行をコメントアウトし、Postgresの準備をします。その際、registration_shared_secret をコピーしておいてください。後で手動でユーザーを作成する際に必要になります。

ステップ4:Docker Composeファイル

この docker-compose.yml は、エンジン、データベース、フロントエンドを連携させます。チャット履歴の文字エンコーディングが壊れないよう、特定のPostgres引数を含めています。

version: '3.8'

services:
  db:
    image: postgres:15-alpine
    restart: always
    environment:
      POSTGRES_USER: synapse
      POSTGRES_PASSWORD: ここに強力なパスワードを設定してください
      POSTGRES_DB: synapse
      # 文字エンコーディングの設定
      POSTGRES_INITDB_ARGS: "--encoding=UTF-8 --lc-collate=C --lc-ctype=C"
    volumes:
      - ./postgresdata:/var/lib/postgresql/data

  synapse:
    image: matrixdotorg/synapse:latest
    restart: always
    volumes:
      - ./data:/data
    depends_on:
      - db
    environment:
      - SYNAPSE_CONFIG_PATH=/data/homeserver.yaml
    ports:
      - 8008:8008

  element:
    image: vectorim/element-web:latest
    restart: always
    volumes:
      - ./element-config.json:/app/config.json
    ports:
      - 8080:80

設定した認証情報を使用して、db サービスを指すように homeserver.yaml を更新してください。

ステップ5:起動と検証

いよいよ公開です。最初の起動時には、隠れたデータベース接続エラーをキャッチするために、常にログを監視します。

docker-compose up -d && docker-compose logs -f synapse

“Synapse now listening on port 8008″(Synapseがポート8008で待機中)というメッセージを探してください。それが確認できたら、リバースプロキシの転送先を 8008(Synapse用)と 8080(Element用)に設定します。

ステップ6:管理者ユーザーの作成

セキュリティのため公開登録は無効にしておくべきなので、最初のユーザーはCLI経由で登録する必要があります。ここは多くの人がつまずくポイントです。

docker exec -it matrix_synapse_1 register_new_matrix_user \
    -c /data/homeserver.yaml http://localhost:8008

スクリプトがパスワードの入力を求めてきます。ユーザーを管理者にすべきか尋ねられたら、必ず ‘yes’ と答えてください。これでサーバーの完全な制御が可能になります。

運用上の注意点とメンテナンス

セルフホストは長期的なコミットメントです。サーバーを安定して稼働させ続けるためのヒントを紹介します。

ストレージ容量に注意

Matrixは、ルーム内で送信されたすべての画像や動画を保存します。#matrix:matrix.org のような大規模な公開ルームに参加すると、data フォルダは1ヶ月で簡単に10GB以上に膨れ上がることがあります。メディアリポジトリのクリーナーツールを毎週実行するよう、cronジョブを設定してください。

データベースのバックアップは命

ファイルは簡単に置き換えられますが、データベースはそうはいきません。pg_dump を使用して、毎晩Postgresコンテナのバックアップを取ってください。データベースや data フォルダ内の署名鍵を紛失すると、Matrixネットワーク上でのサーバーのアイデンティティは事実上消滅します。

まとめ

独自のメッセージングハブを構築することは、デジタル主権に向けた大きな飛躍です。家族のメッセージが広告のキーワード抽出のためにスクレイピングされていないと知ることは、素晴らしい安心感を与えてくれます。DNSやリバースプロキシの設定は少しトリッキーかもしれませんが、一度設定してしまえばDocker上のSynapseの安定性は非常に高いです。次は、サーバーをTelegramやSignalにリンクさせる「ブリッジ」を検討し、すべてのチャットを1つの安全な場所に集約してみるのも良いでしょう。

Share: