👨‍👨‍👦‍👦

Matrix自鯖メモ(docker-compose, synapse, Caddy)

2022/04/10に公開

2022-04-11: リンクタイポ修正


Matrix is

https://matrix.org/

Imagine a world...
...where it is as simple to message or call anyone as it is to send them an email.
...where you can communicate without being forced to install the same app.
...where you can choose who hosts your communication.
...where your conversations are secured by E2E encryption.
...where there’s a simple standard HTTP API for sharing real-time data on the web.
This is Matrix.
Matrix is an open source project that publishes the
Matrix open standard for secure, decentralised, real-time communication, and its > > > Apache licensed reference implementations.

最初に書いておきますが、Matrixのチャットに参加するだけならServer建てたりクライアントウェブアプリを用意する必要はないです[1]。まあしかし、分散型SNSは1人1鯖立てるからこそという気持ちもあり、自前で立ててみることに。サーバの実装とかはしません。

参考資料

Motive

  • そろそろdocker-composeの練習をする
  • Caddy使ってみたい

別案件でdocker-composeとCaddy使いたいものがあり、練習がてら、良い感じの参考例があるものをやってみることにした感じです。

version

立てたときは

  • synapse:1.55.2
  • redis:6.2.6-alpine
  • postgres:14.2-alpine
  • caddy:2.4.6-alpine

セキュリティアップデート可能性もあるので最初の構築ではこれって備忘です。

elementはDockerコンテナ使っていないし割愛。

docker-compose差分ぽいところ

synapse:
    restart: always
    image: matrixdotorg/synapse:v1.55.2
    container_name: synapse
    volumes:
      - ../data:/data
    environment:
      - SYNAPSE_SERVER_NAME=<matrix.domain>
      - SYNAPSE_REPORT_STATS=yes
      - UID=xxx
      - GID=xxx
    networks:
      - external_network
      - internal_network
    ports: 
      - "8008:8008"
  caddy:
    image: caddy:2.4.6-alpine
    ports:
      - "8448:8448"
      - "80:80"
      - "443:443"
    volumes:
      - ../caddy/config:/config
      - ../caddy/data:/data
      - ../caddy/Caddyfile:/etc/caddy/Caddyfile
      - ../static:/var/www
    restart: unless-stopped
    networks:
      - external_network
    labels:
      org.label-schema.group: "monitoring"

synapseにcontainer_nameを設定しています。Caddyfileの設定を書くときにグッと楽になります。

staticディレクトリにelementのファイル一式を置いていて、/var/wwwにマウントしています。Caddyのリバースプロキシでlocalhostで配信しているところへ渡すわけですね。

GID,UID

synapseのDockerコンテナが用意している環境変数です。Docker上で走らせるとき、マウントした場所で書き込みをしようとすると失敗することがあります。パーミッションの問題なワケですが、GIDとUIDをsynapseのコンテナに渡すとこの問題を回避できるわけですね。DB書き込みは上手くいっていたので油断してたよ。

なぜElementはDockerコンテナでないのか

参考資料でElementはnginxによる静的配信なんですが、これもDocker使った方が気持ちいいんではと変えようと思ったんです。が、Element公式のDockerコンテナ見て(nginxが立って静的配信している)Caddyでの静的配信に落ち着いた。

後のCaddyの設定ファイルでelementのリバースプロクシはlocalhostでsynapseはsynapseとなっているのはこういうことやね。

ドメイン

メインのアドレスのドメインで、ゾーン情報を編集し、サーバ用アドレスmatrix.とクライアント用アドレスelement.をAとAAAAで生やし、VPSのIPアドレスへ向けました。

Caddy

{
    email <emailaddress>
}

<matrix.domain> {
    reverse_proxy /_matrix/* http://synapse:8008
    reverse_proxy /_synapse/client/* http://localhost:8008
}

<matrix.domain>:8448 {    
    reverse_proxy http://synapse:8008
}

<element.domain> {
    file_server
    encode zstd gzip
    root * /var/www
}

参考ページではnginxだったところをCaddyだとこう書けるよって。SynapseやElementのGitHubページにCaddyでのリバースプロクシ例があるので助かった。

docker-composeによって各コンテナ名で内部アクセスができるって話、ちゃんと取説見ないとダメですね……。

Caddyはデフォルトでhttpsになるので(80の場合はポート番号を明示的に指定するか、デフォルト挙動を変えるか)、それ理解せず「上手く動かない……」というのもやってた。

この辺の挙動、ドメインまわり設定しないローカル環境Dockerではやらんから暫くハマって、気づいて意気消沈して数日「誰もお前を愛さない……」と机に埋ずくまった。

メール

メールサーバは自前運用したくない。そのためにプロプライエタリサービスに依存することになってもだ!!

hidarumaはGoogle Workspace Enterpriseを一人で契約しているので独自ドメインのメールアドレスを持っています。「ここまで苦労談してきて急に太い実家が出てくる」みたいな展開ですが、そこそこクリティカルなサービスで自分で運用しない場合は金を払っているサービスを使った方がまだ良いと思っているので……。GoogleでやるならBuisinessプランとかでも独自ドメイン使えます。

まあ送信の仲介に使うだけなので、やることば単純です。synapseの設定ファイルにemailの箇所があります。

GoogleでSMTPを設定する場合、2022年現在は2段階認証設定が必要になります。2段階認証はそんなこと関係なく設定しておいた方が良い世界ですが。

このメモを書くタイミングが遅かったために手順を忘却したんですが、Googleのサイトを注意深く探して諦めてGoogle検索すると手順のページが多分出ます。公式以外だとWordpress用にGoogleのSMTP設定している人が多いみたいですね。

# homeserver.yaml
email:
  # The hostname of the outgoing SMTP server to use. Defaults to 'localhost'.
  #
  smtp_host: smtp.gmail.com

  # The port on the mail server for outgoing SMTP. Defaults to 25.
  #
  smtp_port: 587

  # Username/password for authentication to the SMTP server. By default, no
  # authentication is attempted.
  #
  smtp_user: <gmailuser>
  smtp_pass: <gmailpassword>

感想

homeserver.yamlというか、設定ファイル全般の話なんですが、数千行のコメント読むのは辛いね。エディタの都合で全部コメントアウト色になってしまう。

脚注
  1. 今日からMatrixを使い始める人へ|Amane Katagiri ↩︎

Discussion