🏠

自宅サーバーにお一人様Misskeyサーバーを構築してみた

2023/07/09に公開

はじめに

自宅にあるサーバー機に、私が一人で使うためのMisskeyサーバーを構築してみました。難しいことはしたくなかったので極力シンプルな構成にしてみました。

https://misskey.okayurisotto.net/

使った技術

Misskeyとその周辺の技術について

https://github.com/misskey-dev/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を使った方法を選択しました。

https://misskey-hub.net/docs/install/docker.html

ただ上記公式サイトの例ではmasterブランチのMisskeyをビルドするようになっているのですが、Docker Hubにはすでにビルド済みMisskeyイメージがありますので、そちらを使うようにしました。

https://github.com/misskey-dev/misskey-hub/issues/240

また個人的に少し興味があったため、RedisをKeyDBで置き換えてみました。

https://github.com/misskey-dev/misskey/issues/10596#issuecomment-1504850943

自宅サーバーを直接インターネットに公開するようなことはしたくなかったので、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_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を追加する必要があります。

構築後の設定

とりあえずコントロールパネルからすべての設定項目を確認するとして、わからない点はこの記事をありがたく参考にしました。

https://hide.ac/articles/Y504SIabp

オブジェクトストレージに関する設定も見ればわかると思います。参照に使う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}"

https://zenn.dev/okayurisotto/articles/d85ad4602007bf

おわりに

Dockerに関する知識がすでにある人であれば、Cloudflareのお世話になることでだいぶ簡単に構築できると思います。

TwitterでAPI制限問題が起きたことでMisskeyが過去最大級にバズり、最大手サーバーであるioが不安定になってしまったため、急遽、持病で入院中であるにも関わらず自宅サーバーにsshしてお一人様を構築する形になったのですが、なんとかなってくれてよかったです。

Tips

現時点でも行われているのかは不明ですが、Misskey.ioはスパム防止のため新しいサーバーを一定期間自動的にブロックしているようです。

https://tools.misskey.io/block

実際これが原因かはわかりませんが、構築直後のお一人様のURLはio上で照会できずにいました。(ioのURLをお一人様で照会することは可能。)

まぁ、気付いた頃(記事執筆時点、構築から1週間ほど経った頃)にはioからの照会ができるようになっていたのでそこまで深刻な問題にはならないと思います。一応念のため、Tipsとして書き残しておきます。

脚注
  1. https://hide.ac/articles/Y504SIabp ↩︎

Discussion