Matrix自鯖メモ(docker-compose, synapse, Caddy)
2022-04-11: リンクタイポ修正
Matrix is
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鯖立てるからこそという気持ちもあり、自前で立ててみることに。サーバの実装とかはしません。
参考資料
- https://lemmy.juggler.jp/post/759 本記事はほぼこの記事を踏襲しています。ので差分部分だけ書きたい
- https://github.com/matrix-org/synapse リバースプロクシにCaddyを使う場合も基本的に書いてある
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というか、設定ファイル全般の話なんですが、数千行のコメント読むのは辛いね。エディタの都合で全部コメントアウト色になってしまう。
Discussion