自宅サーバーにお一人様Misskeyサーバーを構築してみた
はじめに
自宅にあるサーバー機に、私が一人で使うためのMisskeyサーバーを構築してみました。難しいことはしたくなかったので極力シンプルな構成にしてみました。
使った技術
- Arch Linux
-
Docker及びDocker Compose
postgres
-
redis
- (まぁ私は勝手に
eqalpha/keydb
にしてしまったのですが……)
- (まぁ私は勝手に
- Cloudflareのいろいろなサービス
Misskeyとその周辺の技術について
MisskeyはOSSとして開発されている分散型SNSのひとつです。バックエンド・フロントエンドともにTypeScriptで開発されていて、Gitでバージョン管理されています。ですのでMisskey本体を動かすには、ソースコードやデフォルト設定が書かれたファイルを取得するためのGitやサーバーサイドのJavaScript実行環境であるNode.jsが必要です。
Misskeyは様々なデータをPostgreSQLによるデータベースへ保存します。ですのでこちらもMisskeyとは別に起動しておく必要があります。また、NoSQLのインメモリデータベースとしてRedisも使っているため、そちらも必要です。さらに、MisskeyはHTTPS接続のためにnginxのようなリバースプロキシを必要とします。
画像などを保存するオブジェクトストレージに関しては任意です。デフォルトではローカルのファイルシステム上に保存されるようになっています。
ノートを検索できるようにするためにはMeilisearchが必要ですが、検索機能が必要ない場合はいりません。
あとはBot制御のためにCAPTCHAが必要だったり、URLからそのWebページの情報を得るSummary Proxyが必要だったり、メール配信サーバーが必要だったりします。
私の場合
Misskeyを動かすサーバーとしては、すでに自宅で開発用に使っていたLinux機があったためそれを流用しました。ドメインはブログ用にokayurisotto.net
を所有していたため、サブドメイン(misskey.okayurisotto.net
)を使うことにしました。
あまり難しい環境構築をしても何かあったときに大変だろうと考え、Misskey公式サイトで紹介されているDocker Composeを使った方法を選択しました。
ただ上記公式サイトの例ではmaster
ブランチのMisskeyをビルドするようになっているのですが、Docker Hubにはすでにビルド済みMisskeyイメージがありますので、そちらを使うようにしました。
また個人的に少し興味があったため、RedisをKeyDBで置き換えてみました。
自宅サーバーを直接インターネットに公開するようなことはしたくなかったので、Cloudflare Tunnelを使うことにしました。そのためnginxのような追加のリバースプロキシは使っていません。
オブジェクトストレージは必須ではないのですが、バックアップなどを考えるのが面倒だったのでCloudflare R2を使うことにしました。Cloudflare R2は10GB/monthまで無料で使えます。お一人様としては十分すぎるでしょうし、何かあったら支払いでも移行でもなんでもするだけです。
ノート検索機能は個人的にあまり必要としていないため、Meilisearchサーバーの構築は見送りました。今以上にSNS廃人になったら考えます。
Bot制御のためのCAPTCHAとしては、CloudflareのTurnstileを使うことにしました。そもそも招待制のサーバーですのでBotがどうこう、という話とは無縁なように思えますが一応……。前々からTurnstileには興味がありましたので。
Summary Proxyについては詳しくないため、暫定的にhttps://summaly.arkjp.net
を使わせていただくことにしました[1]。
メール配信機能はお一人様なので必要性を見いだせず、設定していません。設定するときには、SendGridなどを使うようになるらしいです。メールサーバー構築はだいぶ大変らしいですからね。
構築
Misskey Hubを参照してください。
今回はv13.13.2のMisskeyを構築することにしました。
まず、デフォルトのdocker-compose.yml
とデフォルトの設定ファイルが置かれた.config
ディレクトリに用があるため、Misskeyのリポジトリをクローンしてきます。ソースコード自体は今回はいらないため、削除しても構いません。
$ git clone --filter=blob:none --branch=13.13.2 https://github.com/misskey-dev/misskey.git
.config
ディレクトリの中には3つのファイルがあります。
-
docker_example.env
- Docker Composeを使った構築で
docker-compose.yml
に参照されるenvファイル - PostgreSQLの設定が書かれています
- Docker Composeを使った構築で
-
docker_example.yml
- Docker Composeを使った構築のために使われるデフォルトの設定ファイル
- 説明付きですので説明を読みながら編集してください
-
example.yml
- デフォルトの設定ファイル(今回はいらない)
というわけですので、次のようにします。
$ mv docker_example.env docker.env
$ mv docker_example.yml default.yml
あとはファイルの中身を読んでいい感じに理解し、いい感じに編集してください。基本的にはデフォルトで十分でしょう。
私の場合のより具体的な話
Cloudflare TunnelについてもDocker Composeで構築したかったことなどから、最終的には次のようになりました。
.
├── backup.sh
├── config
│ ├── cloudflared.env
│ ├── default.yml
│ └── postgres.env
└── docker-compose.yml
# cloudflared.env
TUNNEL_TOKEN=ここにトークンをコピペ
# postgres.env
POSTGRES_PASSWORD=ここにパスワード
POSTGRES_USER=misskey
POSTGRES_DB=misskey
# docker-compose.yml
version: "3"
services:
cloudflared:
image: cloudflare/cloudflared:latest
restart: always
env_file:
- ./config/cloudflared.env
command: tunnel --no-autoupdate run
depends_on:
- misskey
misskey:
image: misskey/misskey:13.13.2
restart: always
depends_on:
postgres:
condition: service_healthy
keydb:
condition: service_healthy
volumes:
- ./config:/misskey/.config:ro
keydb:
image: eqalpha/keydb:alpine
restart: always
volumes:
- keydb:/data
healthcheck:
test: "keydb-cli ping"
interval: 5s
retries: 20
postgres:
image: postgres:15-alpine
restart: always
env_file:
- ./config/postgres.env
volumes:
- postgres:/var/lib/postgresql/data
healthcheck:
test: "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"
interval: 5s
retries: 20
volumes:
keydb:
postgres:
この例ではサービス名を変更した都合で、default.yml
側の各host
を調整する必要があります。また、Cloudflareのダッシュボード側でhttp://misskey:3000
をうまくmisskey.okayurisotto.net
と紐付けるようなPublic hostnamesを追加する必要があります。
構築後の設定
とりあえずコントロールパネルからすべての設定項目を確認するとして、わからない点はこの記事をありがたく参考にしました。
オブジェクトストレージに関する設定も見ればわかると思います。参照に使うBase URL(私の場合はmisskey-r2.okayurisotto.net
にしました)やEndpoint(foobar.r2.cloudflarestorage.com
)などを設定すればいいだけです。Cloudflareのダッシュボードの操作方法も、見ればわかると思います。
バックアップ
Misskeyはデータベースさえ飛ばさなければどうにでもなるからデータベースだけはなんとしても守った方がいい
https://blog.arkjp.net/2021/12/1003io/
らしいので、バックアップスクリプトを組みました。今は気分でバックアップしていますが、あとで定期的に実行するようにsystemdで設定するつもりです。
# backup.sh
NOW="$(date --iso-8601=minutes)"
SERVICE_NAME='postgres'
DB_USERNAME='misskey'
OUTPUT_FILENAME_PREFIX='misskey_db_'
OUTPUT_FILENAME_SUFFIX='.zst'
OUTPUT_FILENAME="${OUTPUT_FILENAME_PREFIX}${NOW}${OUTPUT_FILENAME_SUFFIX}"
docker-compose exec "${SERVICE_NAME}" pg_dumpall -U "${DB_USERNAME}" \
| zstd \
> "${OUTPUT_FILENAME}"
おわりに
Dockerに関する知識がすでにある人であれば、Cloudflareのお世話になることでだいぶ簡単に構築できると思います。
TwitterでAPI制限問題が起きたことでMisskeyが過去最大級にバズり、最大手サーバーであるioが不安定になってしまったため、急遽、持病で入院中であるにも関わらず自宅サーバーにsshしてお一人様を構築する形になったのですが、なんとかなってくれてよかったです。
Tips
現時点でも行われているのかは不明ですが、Misskey.ioはスパム防止のため新しいサーバーを一定期間自動的にブロックしているようです。
実際これが原因かはわかりませんが、構築直後のお一人様のURLはio上で照会できずにいました。(ioのURLをお一人様で照会することは可能。)
まぁ、気付いた頃(記事執筆時点、構築から1週間ほど経った頃)にはioからの照会ができるようになっていたのでそこまで深刻な問題にはならないと思います。一応念のため、Tipsとして書き残しておきます。
Discussion