さくらVPS上に misskey インスタンスを立てる

2023/05/09に公開

はじめに

突然ですが、皆様 Misskey というOSSをご存じでしょうか。Twitter の度重なる仕様変更でいんたーねっつ疲れを起こしていた私ですが、Misskey に出会い、初めてインターネットに出会ったときの感動を思い出しました。

Misskey は Mastodon 等と同じく ActivityPub に対応した分散型SNSですが、その素晴らしさの詳細は公式ページや Yahoo Newsの記事 等を参考にしていただくとして、ここでは簡単にさくらVPS上に misskey インスタンスを立てたときの備忘録を掲載します。

注意事項

  • あくまで自学用のインスタンスを立てる程度の物となります。
  • misskey.io のような大規模インスタンスを運営するのに適していません。(その場合は素直にAWS等のクラウドサービスを使ったほうがいいでしょう。)

さくらVPSを選んだ理由としては、使い慣れてて、どれだけ酷使しても固定費で済む程度の物です。深い理由はありません。

1. VPSインスタンスのセットアップ

今回は 「さくらVPSの4Gプラン Docker 実行環境」を選択しました。理由としては、2Gだと docker compose 実行時にメモリ不足で失敗する可能性があるという話を見かけたため(ソースはどこか忘れた。ガセビアかもしれない。そもそもローカルでビルドしてイメージをアップすればいいだけなのでは?という話もある)

また、手元のマシンが Ubuntu on WSL2 なため、コマンドなどの操作感も一緒で楽が出来そうだと思いこれにしました。

パケットフィルターを確認する

さくらVPSにはパケットフィルターという機能があり、デフォルトではSSH以外のポートは全てふさがれています。(AWS でいうセキュリティグループのような物)

インスタンス側で、 iptables や ufw をいくら設定しても上手く通信できないときは、さくらVPSのコントロールパネルから、パケットフィルターを確認すると良いでしょう。


※: 画像では80/443も封鎖しているけど、外部公開時には80/443 は公開してください。

今回は、操作用のSSH用22ポートと、misskey 用の 443ポート、ドメイン認証用の80ポートを開いておきます。(SSHは自分の家からのみアクセスしたいため、IPアドレスを指定してそれ以外からの通信を遮断しています。

パッケージのアップデートと、ufw の設定

お約束の手順です。

# デフォルトパッケージの最新化
sudo apt-get upgrade -y
sudo apt-get autoremove -y

# nginx のインストール
sudo apt-get install nginx

# ufw で ssh と nginx を許可する
sudo ufw allow 'OpenSSH'
sudo ufw allow 'Nginx Full'

# Nginx と SSH だけが許可されているかを確認する事
sudo ufw status

2. misskey をビルドし起動する。

公式の手順通りです。今回は docker による構築を選択していますので、 https://misskey-hub.net/docs/install/docker.html を確認しましょう。特に留意点はないですが、素直に master ブランチでビルドすることをお勧めします(最新機能を使いたいと思い develop ブランチでビルドしたら正常に動作しなかった事があるので、とりあえず動かしたいという場合は master ブランチでビルドするのが無難です)

3. SSLとドメインを取得し nginx に設定を施す

ドメインとそれに対するSSL証明書をさくらで取得し、それを利用します。

ActivityPubの仕様上、公開サーバーを立てる場合、一度運用を始めたインスタンスのドメインは変更してはいけないので、構築の一番最初で一気にやってしまうのが無難です。

ドメインを取得し、インスタンスに紐づける

まず、ドメインですが、さくらの管理画面で買う事が出来ます。

ドメインの取得申請を行ってから利用できるようになるまで、長くておおよそ1時間くらいの時間がかかります。無事取得出来たら、さくらのドメインコントロールから、契約したVPSインスタンスに紐づけます。

SSL証明書を発行する

次に、SSL証明書です。こちらもさくらの管理画面で買う事が出来ます。
どの証明書を選んでも良いですが、今回は最もシンプルにドメイン認証型の最も安いものを選択します。

インスタンス上でcsrファイルとkeyファイルをopenssl で作成します。

# openssl で csr と keyを作成する。
$ openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr
Generating a 2048 bit RSA private key
writing new private key to 'server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:JP(JPじゃなくても良いけど必ず2文字)
State or Province Name (full name) [Berkshire]:Okinawa(都道府県を英字で入力)
Locality Name (eg, city) [Newbury]:Naha-shi(市区町村を英字で入力)
Organization Name (eg, company) [My Company Ltd]:Hoge Piyo Company(組織名を英字で入力)
Organizational Unit Name (eg, section) []:Foo Bar Team(部署名を英字で入力。省略可)
Common Name (eg, your name or your server's hostname) []:www.moutasukarnaizo.com(コモンネームを英字で入力)
Email Address []:(空白、エンターのみ入力)

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:(空白、エンターのみ入力)
An optional company name []:(空白、エンターのみ入力)

この時出力された csr の内容を、SSL証明書の発行画面に入力し、crtファイルを取得します。

しばらくたつと、ファイル認証用の認証ファイルがメールで送られてくるので、このファイルの内容をインスタンス上のnginxのドキュメントルート上に作成します。

$ sudo vi /var/www/html/.well-known/pki-validation/[ランダムな文字列].txt
# 送られた来た認証情報

下記のnginxの設定を施した後、しばらくすると認証局がファイルを確認して認証し、CRTファイルが送られてきます。作成したkeyファイルと取得したcrtファイルは後ほどnginxで指定する必要があるため、それっぽい場所に置いておく必要があります。

nginx の設定を施す

nginx で施すべき設定は大きく3つです。

  1. misskey コンテナへのプロキシ
  2. SSL証明書
  3. 証明書の認証に必要なファイルへのパスを通す

これらをまとめてやってしまいます。

$ vi /etc/nginx/sites-available/default

# WebSocket
map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
}

server {
        # 80 -> 443 redirect
        listen 80;
        listen [::]:80;

        server_name mi.littlemars.org;

	# SSL証明書の発行認証を行うときだけ、このディレクティブを有効にします。
	# 発行が終わったら消す事。
        location / {
                root /var/www/html/;
        }

	# それ以外はコンテナに流す
        location / { return 301 https://$server_name$request_uri; }
}

proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=cache1:16m max_size=1g inactive=720m use_temp_path=off;

server {
        # SSL configuration
        #
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        ssl_certificate     /取得したCRTファイルへのパス.crt;
        ssl_certificate_key /作成したkeyファイルへのパス.key;

	server_name 取得したドメイン.com;

        location / {
                proxy_pass http://localhost:3000;
                proxy_set_header Host $host;
                proxy_http_version 1.1;
                proxy_redirect off;

                # for Web Socket
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection $connection_upgrade;

                # Cache settings
                proxy_cache cache1;
                proxy_cache_lock on;
                proxy_cache_use_stale updating;
                proxy_force_ranges on;
                add_header X-Cache $upstream_cache_status;
        }
}

4. 動作確認

misskeyのコンテナが起動し、nginx が正常にプロキシ出来ていれば、 https://取得したドメイン/ で misskey インスタンスにアクセスできるはずです。初回起動時に、管理者アカウントの発行について聞かれます。アカウントを発行し、自作の misskey インスタンスを楽しみましょう。
(デフォルト設定で「招待制」になっているため、あわてて設定を変更したり、インスタンスを外部から隠したりする必要はないはずです)


※ 画像ではlocalhost:3000になってるけど、ここにはちゃんとドメインが出る。

出来たインスタンス例がこちらです↓
かせいすきー
一時的に、アカウント登録を開放しています。ご興味を持たれた方、ぜひ登録してみてください。

本解説記事は以上になります。何かの参考になれば幸いです。
余談ですが私はゴールデンウィークを全てmisskeyに捧げました。

参考文献

Discussion