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_log
やerror_log
などを記述すること。
記述できたら、忘れずに実行権限を付与する。
chmod +x /etc/init.d/misskey
有効化し、実行する。
rc-update add misskey default
rc-service misskey start
しばらくするとアクセスできるようになるはずである。画面に従い初期設定を完了させる。aqz氏のこちらの記事を参考にするのがよいだろう。
以上でMisskeyインスタンスが立ち上げられる。以下はおまけ。
おまけ:藍の導入
藍と言えばMisskey、Misskeyと言えば藍。
事前準備
- 藍用のアカウントを作成しておく。
@ai
などがよいだろう。 - 設定→API→アクセストークンの発行 からトークンを生成してメモしておく。
- 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氏に感謝)。