GentooサーバーにMisskeyインスタンスを建てる

目次

Misskey v13がリリースされたので、Gentoo Linuxのサーバー上に建ててみた記録。
間違い等あれば syobon@misskey.io まで。

基本は公式のドキュメントを参照すればよい。
本記事もこのドキュメントに沿うような形になっている。

必要ソフトウェアのインストール・設定

Nodejs

MisskeyはNodejs上で動くため、インストールしておく。

emerge -a net-libs/nodejs 

Nodejsは非常に巨大なパッケージであるので、ビルドにはかなりの時間を要する。

Misskey v13から、ビルドにはyarnではなくpnpmを使用するようになった。以下で有効にする。

corepack enable

PostgreSQL

MisskeyはデータベースにPostgreSQLを使用する。

Misskey v13よりPostgreSQL 15以上が必要になったが、2023年1月現在、Gentooでamd64のキーワードがついたPostgreSQLは14までである。~amd64キーワードを許可して15系が入るようにする。

/etc/portage/package.accept_keyword/postgresqlを作成し

<=dev-db/postgresql-15.0 ~amd64

と記述したのち、

emerge -a dev-db/postgresql

でバージョン15がインストールできる。

インストールしただけでは起動できないので、設定を行う。/etc/conf.d/postgresql-<Version>に設定ファイルがあるので、編集した後(よくわからなければデフォルトでも問題ない)

emerge --config dev-db/postgresql

を実行する。

これで準備ができたので、以下のコマンドでサービスを有効化し、起動する。

OpenRCの場合

rc-update add postgresql-<Version> default
rc-service postgresql-<Version> start

SystemDの場合

systemctl enable --now postgresql

次にPostgreSQLの設定を行う。

psql -U postgres

で対話モードに入り

CREATE ROLE misskey WITH LOGIN PASSWORD 'password';

でユーザーを作成。
misskeyの部分はユーザー名、passwordの部分はパスワードである。自由に設定して問題ない。

そして

CREATE DATABASE misskey OWNER misskey;

でデータベースを作成する。
一つ目のmisskeyはデータベース名であり、こちらも自由に設定して問題ない。
二つ目のmisskeyには先程作成したユーザー名を入力する。

問題なく設定できたら

\q

で対話モードを終了する。

Redis

データベースの管理などに使用される。

emerge -a dev-db/redis

特に設定は必要ないので、

OpenRCの場合

rc-update add redis default
rc-service redis start

SystemDの場合

systemctl enable --now redis

でサービスを有効化し、起動する。

nginx

リバースプロキシとして使用する。

emerge -a www-servers/nginx

USE_Expandの数が非常に多いが、おそらくデフォルトで問題ない。

設定は後で行うので、サービスの有効化と起動のみしておく。

OpenRCの場合

rc-update add nginx default
rc-service nginx start

SystemDの場合

systemctl enable --now nginx

ファイアウォール

公式ドキュメント同様、ufwを使用する。

いくつかのカーネルモジュールが無いと動かないので、必要に応じてカーネルをリビルドする。
必要な設定はGentoo WikiのIptablesのページを参考にすると良いだろう。
また、必要なコンフィグが不足している場合ufwのインストール時にメッセージが表示されるので、それも見ておくこと。

emerge -a net-firewall/ufw

サーバーにsshで接続している場合、このまま起動してしまうと接続が切断されてしまうため

ufw allow ssh

でsshを許可する。
なお、この場合LAN外からのsshアクセスも許可される。LAN内のみを許可したい場合は上記コマンドの代わりに

ufw allow from 192.168.0.0/24 to any port 22

とすること。

また、ufw allowコマンド実行時に

ERROR: problem running

と表示される場合があるが、設定自体は保存されているようなので問題ない。
気になる場合はdev-python/pipをインストールすることで直るらしい。

問題がなければ

ufw enable

でファイアウォールを有効化する。

設定を行う。
ここでは、80番(HTTP)と443番(HTTPS)ポートのみを許可し、それ以外はブロックするように設定する。

ufw allow to any port 80
ufw allow to any port 443

正しく設定できたらサービスを有効化し、再起動後にもファイアウォールが有効になるようにする。

OpenRCの場合

rc-update add ufw default

SystemDの場合

systemctl enable ufw

Cloudflare

CDNの設定やキャッシュの設定などはここでは割愛する。

以下のオプションは正しく設定されていない場合不具合の原因になりうるため、必ず設定すること。

  • Speed→最適化 にある ”Rocket Loader™”を無効
  • Speed→最適化 にある ”Auto Minify”から”JavaScript”と”CSS”のチェックをオフ
  • セキュリティ→ボット にある ”ボット ファイト モード”を無効
  • Scrape Shield にある ”Hotlinkの保護”を無効

ボット ファイト モード以外は構成ルールによってページごとに設定できるので、サブドメイン上などで公開する場合はそちらを利用するとよい。

証明書の設定

Gentooにはcertbot-dns-cloudflareパッケージが存在しないため、pipからインストールする。

emerge -a dev-python/pip
pip install --user certbot-dns-cloudflare

なお、pipをroot権限で実行することは推奨されておらずpipに警告されるが、certbotはroot権限で実行される必要があるためここでは無視する。

Cloudflareのトークンを取得する。 CloudflareのAPIトークンページを開き、「APIキー」セクションの「Global API Key」の右にある「表示」をクリックする。
パスワードの入力とCaptchaの解除が求められるので従うと取得できるので、コピーやメモしておく。

次に/etc/cloudflare/cloudflare.iniを作成し、以下のように編集する。

dns_cloudflare_email = <Cloudflareに登録したメールアドレス>
dns_cloudflare_api_key = <先程取得したAPIキー>

このデータは第三者に読み取られると危険なので、アクセス権限を設定する。

chmod 600 /etc/cloudflare/cloudflare.ini

ここまでできたら、以下のコマンドを発行する。

/root/.local/bin/certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/cloudflare/cloudflare.ini --dns-cloudflare-propagation-seconds 60 --server https://acme-v02.api.letsencrypt.org/directory -d '<ドメイン>' -d '*.<ドメイン>'

<ドメイン>の部分にはMisskeyインスタンスを公開する予定のドメインのルートドメインを入力する。

Misskeyのインストール・公開設定

Misskeyのビルド

作業用のアカウントを作成し、アカウントを変更する。

useradd -m misskey
su - misskey

Gitリポジトリをクローンする。

cd /home/misskey
git clone --depth 1 --recursive -b master https://github.com/misskey-dev/misskey.git
cd misskey

依存パッケージをインストールする。

NODE_ENV=production pnpm install --frozen-lockfile

.config/example.yml.config/default.ymlにコピーし、.config/default.ymlを編集する。
コメントが付されているので、それを参考に編集すればよい。わからなければ公式のガイドを見るのがよいだろう。

できたら

NODE_ENV=production pnpm run build
pnpm run init

を実行してMisskeyのビルドと初期設定を行う。

nginxの設定

これでMisskeyを実行できるようになったので、外部からアクセスできるように設定する。
基本は公式のガイドにあるものをコピーアンドペーストすればよいのだが、Gentooの場合は少し手を加える必要がある。

まずはrootアカウントに戻る。

exit

/etc/nginx/nginx.confをエディタで開き、最後にある}の前に一行挿入、以下を入力する。

include /etc/nginx/conf.d/*.conf;

これで/etc/nginx/conf.d/以下の設定ファイルが読み込まれるようになったので、/etc/nginx/conf.d/misskey.confを作成し、Misskey Hubの設定例をコピーアンドペーストする。

今回はサーバーの前にCloudflareをはさむので、55行目

# If it's behind another reverse proxy or CDN, remove the following.

からはじまるブロックを削除する。

また、/etc/portage/make.confなどにおいてUSE="-ipv6"を設定している場合、11行目

listen [::]:80;

と23行目

listen [::]:443 ssl http2;

を削除しないとエラーが発生する。

ここまでできたら

nginx -t

で設定ファイルを確認し、問題がなければサービスを再起動する。

OpenRCの場合

rc-service nginx restart

SystemDの場合

systemctl restart nginx

Misskeyの起動

ここまできたら、後は起動するのみ。

まずは

su - misskey

を実行してMisskey用アカウントに入り、

cd ~/misskey
NODE_ENV=production pnpm run start

で起動する。正常に実行され、問題なくアクセスできることを確認した後Ctrl+Cで中断する。

正常に起動することが確認できたので、サービスを作成する。SystemDの場合はMisskey Hubのページに従えばよいので、ここではOpenRCの場合についてのみ言及する。

rootに戻る。

exit

/etc/init.d/misskeyを作成し、以下を記述する。

#!/sbin/openrc-run

export NODE_ENV=production

command="/usr/bin/pnpm"
command_args="run start"
command_user="misskey:misskey"
command_background=true
pidfile="/run/misskey.pid"
directory="/home/misskey/misskey"

この設定ではログは破棄される。保存したい場合はopenrc-runのmanページなどを参考にoutput_logerror_logなどを記述すること。

記述できたら、忘れずに実行権限を付与する。

chmod +x /etc/init.d/misskey

有効化し、実行する。

rc-update add misskey default
rc-service misskey start

しばらくするとアクセスできるようになるはずである。画面に従い初期設定を完了させる。aqz氏のこちらの記事を参考にするのがよいだろう。

以上でMisskeyインスタンスが立ち上げられる。以下はおまけ。

おまけ:藍の導入

藍と言えばMisskey、Misskeyと言えば藍。

事前準備

  1. 藍用のアカウントを作成しておく。@aiなどがよいだろう。
  2. 設定→API→アクセストークンの発行 からトークンを生成してメモしておく。
  3. mecabのインストール
emerge -a app-text/mecab

藍のインストール・設定・起動

再度Misskey用ユーザーに入る。

su - misskey

藍のリポジトリをクローンする。

cd /home/misskey
git clone https://github.com/syuilo/ai.git

クローンしたリポジトリのルートにconfig.jsonを作成する。
記述方法についてはリポジトリのREADMEを参照。
なお、Gentooではmecabの実行ファイルは/usr/bin/mecabに配置される。

完了したら

cd /home/misskey/ai
npm install
NODE_ENV=production npm run build
NODE_ENV=production npm start

で正常に実行できることを確認し、Ctrl+Cで停止する。

藍もサービス化する。SystemDの場合、古い情報ではあるがゆずりょー氏の記事の該当個所を参考にするとよいだろう。
当記事ではOpenRCの場合にのみ言及する。

/etc/init.d/misskey-aiを作成し、以下を記述する。

#!/sbin/openrc-run

export NODE_ENV=production

command="/usr/bin/npm"
command_args="start"
command_user="misskey:misskey"
command_background=true
pidfile="/run/misskey-ai.pid"
directory="/home/misskey/ai

こちらも忘れずに実行権限を付与し、有効化・起動をする。

chmod +x /etc/init.d/misskey-ai
rc-update add misskey-ai default
rc-service misskey-ai start

立ち上げたMisskeyインスタンス上で

@<藍用のアカウントID> ping

と送信し、

PONG!

と返ってきたら導入完了である。

おまけ2:後日談(という名のトラブルシュート録)

一部インスタンスと連合できない

misskey.io等一部インスタンスと連合できない問題。
DNSサーバーの問題のようなので、/etc/resolv.confを編集し(systemd-resolvedやdhcpcdによって管理されている場合が多いため、編集する前によく確認すること)

nameserver 1.1.1.1

のように記述することで解消する(情報提供者であるCyberRex氏に感謝)。