VPS で個人用 Misskey サーバを構築する

こんにちは。
株式会社アドグローブ ソリューション第一事業部の徳村です。

X (Formally Twitter) に暗雲立ち込める時勢の中、SNS の移行を検討されている方も多いのではないでしょうか。
その中で、今は亡き青い鳥に代わり、Mastodon を始めとした Fediverse が注目されています。

今回はこの Fediverse から、Misskey を自分のためだけに構築していきたいと思います。
何の準備もしていない の状態から羽ばたくべく、VultrCloudflare に全力で頼っていきます。

構成

  • Misskey

    version: 2023.10.0 (作業時の最新版) github.com

  • Virtual Private Server (VPS)

    今回は初挑戦ということもあり、 Vultr で一番安くあげられそうなスペックで借りました。
    以下の構成で月$6です。

    インストール/アップデート時以外の負荷はそこまで掛からないらしく、今のところ不便はありません。
    もちろん、ある程度の人数を捌けるサーバーとして運用したい場合は、余裕を持った性能にした方が良いでしょう。
    後からスケールアップすることも可能なため、最初は様子見で、足りないようであれば増やす、といった流れでも良いかもしれません。

    項目 内容
    Server Vultr Cloud Compute
    Location Tokyo
    OS Ubuntu 22.04
    Application NodeJS
    Storage 25 GB NVMe
    vCPU/s 1 vCPU
    RAM 1024.00 MB
    Additonal Enable IPv6
  • DNS

    Cloudflare Registrar でドメインを取得、管理します。

  • Object Storage

    Cloudflare R2 を利用します。
    Misskey のメディアの保存先と、バックアップ先として使用します。

    10 GB / 月 まで無料で利用することができます。
    大規模な運用をしないのであれば、十分な量です。

手順

ドメインの購入から Misskey の起動までの一連の流れを記載していきます。

Cloudflare で Domain の取得

Cloudflare で好みのドメインを購入していきます。

このドメインが、ユーザの所属するサーバーを示す識別子としてアカウントの ID に付与されますので、慎重に決めましょう。
@syuilo@misskey.io ←の2つ目の@以降の部分となります。

Cloudflare にログインして、ダッシュボードを開きます。
左のサイドバーから ドメイン登録 > ドメインの登録 を開いてください。

redisterDomain1
Cloudflare ダッシュボード

好みのドメイン名で検索すれば、利用可能な類似のドメイン名が一覧で表示されます。
利用できないドメイン名であれば、その旨も表示されるので再考してください。

registerDomain2
利用可能なドメインの検索

利用したいドメイン名を選択できたら、購入を完了します。

Vultr で VPS を構築する

Vultr にログインし、新規サーバーを作成します。

Choose Server で Cloud Compute を選択します。

choiceVultrVps1
Cloud Compute

CPU & Storage Technology で好きなものを選んでください。
左2つが無難かと思います。

choiceVultrVps2
CPU & Storage Technology

Server Location で近所を選択します。

choiceVultrVps3
Server Location

Server Image の Operatins System で Ubuntu の LTS を選択します。

choiceVultrVps4
Operatins System

Server Image の Marketplace Apps で NodeJS を選択します。

choiceVultrVps5
Marketplace Apps

Server Size で好みのスペックを選択してください。

choiceVultrVps6
Server Size

Add Auto Backups もお好みで選択してください。

choiceVultrVps7
Add Auto Backups

Additional Features で Enable IPv6 を選択します。

choiceVultrVps8
Additional Features

Server Hostname & Label で任意の名前を入力してください。

choiceVultrVps9
Server Hostname & Label

Deploy を開始します。

choiceVultrVps10
Depley Now

インストールが終了したら、VPS の構築は完了です。

作成された VPS の詳細画面を開いて、
DNS の設定のため、IP AddressIPv6 Address
SSH の設定のため、root ユーザの Password を確認しておいてください。

checkVpsInfo
VPS情報の確認

Cloudflare で DNS の設定

Cloudflare のダッシュボードにて、左のサイドバーから ドメイン登録 > ドメインの管理 を開きます。

先程購入したドメインが追加されているので、該当ドメインの 管理 を選択します。

dnsSetting1
ドメインの管理

クイックアクションの DNS の設定を更新する を選択します。

DNS レコードの管理画面が表示されるので、レコードの追加 を選択し、以下の内容で保存します。

名前には利用したいサブドメインを設定してください。
ドメインがexample.comだった場合、サブドメインをmkとすると、mk.example.comがサーバーのURLとなります。
サブドメインを付与したくない場合は、@を入力します。

タイプ 名前 アドレス
A (サブドメイン) (VPS の IP Address)
AAAA (サブドメイン) (VPS の IPv6 Address)

dnsSetting2
レコードの追加

SSH 接続の設定

VPS サーバーにローカルから SSH 接続が出来るよう、設定していきます。

  1. SSH Key の生成

    SSH Key を生成します。

    保存先ファイルの指定はデフォルトで問題ありません。
    パスフレーズは空でも生成できますが、セキュリティ面から設定しておいた方が良いでしょう。

     ssh-keygen -t ed25519
    

    作成後、以下のように保存先が表示されるため、確認しておきます。

     Your identification has been saved in C:/Users/USERNAME/.ssh/id_ed25519
     Your public key has been saved in C:/Users/USERNAME/.ssh/id_ed25519.pub
    
  2. .ssh/config の記述

    VPS への接続情報を .ssh/config に記述します。

    config ファイルが既にある場合はそれに追記してください。
    なければテキストエディタで新規に作成します。

     Host misskey                          # 任意の接続先名
           User {{YourUserName}}           # この後 VPS 上に作成する作業用ユーザ
           Hostname xx.xx.xx.xx            # VPS の IP Address
           IdentityFile ~/.ssh/id_ed25519  # 上記で作成した SSH Key のファイルパス
    
  3. SSH で VPS に接続

    まず root ユーザで VPS サーバに接続します。
    初回接続時のみ接続を続けるか確認されるため、yesを入力してください。
    root ユーザのパスワードを要求されるため、Vultr で確認した Password を入力します。

     ssh root@misskey
    
  4. 作業用ユーザを作成する

    新しいユーザを作成します。

     adduser {{YourUserName}}
    

    作成したユーザに sudo 実行を許可します。

     usermod -aG sudo {{YourUserName}}
    
  5. VPS に SSH Key を保存する

    作業用ユーザに切り替えて、SSH Key の保存先を作成します。

     sudo -iu {{YourUserName}}
     mkdir .ssh
     chmod 700 .ssh
     cd .ssh
     touch authorized_keys
     chmod 600 authorized_keys
     nano authorized_keys
    

    nano エディタが開くので、1. でローカルに生成した id_ed25519.pub ファイルの内容を転記してください。
    Ctrl+S で保存し、Ctrl+X でエディタを終了できます。

  6. sshd の設定

    sshd_config を開きます。

     sudo nano /etc/ssh/sshd_config
    

    以下の項目からコメントアウト(#)を削除し、設定を変更してください。

    • PermitRootLogin no : ルートのログインを禁止する
    • PasswordAuthentication no : パスワードでのログインを禁止する

    sshd の設定をテストします。

     sudo sshd -t
    

    問題がなければ、sshd を再起動します。

     sudo systemctl restart sshd
    
  7. ファイアウォールの設定

    SSH 接続だけを許可します。

     sudo ufw allow 22/tcp
     sudo ufw enable
    
  8. 接続確認

    ここまでの設定で、意図通り SSH 接続ができることを確認しましょう。

    新しくコマンドプロンプトを開き、以下のコマンドで接続します。
    パスフレーズを設定した場合は、入力してください。

     ssh misskey
    

    作成した作業用ユーザで接続が出来ていれば、SSH の設定は完了です。

Misskey のインストール用スクリプトの実行

インストール用の shell script が公式に提供されています。
以下記事の手順に従いオプションを選択していけば、簡単にインストールを完了することができます。
Misskey install shell script v3.0.0 | Misskey Hub

途中で Cloudflare の API Key を要求されます。
書かれている通りに Cloudflare のダッシュボード を開き Global API Key を表示、コピー/ペーストしましょう。

checkCloudflareApiKey
Cloudflare API キー

筆者の選択したオプションは以下になります。
新しいもの好きなので develop branch を選んでいますが、デフォルトの master branch を選んでおくのが無難です。

Install script option Value
Do you use systemd to run Misskey? Y (Use Systemd)
Repository url where you want to install https://github.com/misskey-dev/misskey.git (default)
The name of a new directory to clone misskey (default)
Branch or Tag develop
Enter the name of user with which you want to execute Misskey misskey (default)
Enter host where you want to install Misskey (Own Host Name, e.g. example.com)
Do you want to setup nginx? Y
Misskey port 3000 (default)
Do you want it to open ports, to setup ufw or iptables? u (To setup ufw)
SSH port 22 (default)
Do you want it to setup certbot to connect with https? Y
Do you use Cloudflare? Y
Enter Email address you registered to Cloudflare (Own Email Address)
Cloudflare API Key (Own Cloudflare API Key)
Tell me which port Misskey will watch 3000 (default)
Do you want to install postgres locally? Y
Database user name misskey (default)
Database user password (Any password)
Database name mk1 (default)
Do you want to install redis locally? Y
Redis password (Any password)

スクリプトが問題なく完了すれば、Misskey の立ち上げは完了です。
Misskey のバージョンアップをしたいときも、上記の記事にてアップデート用のスクリプトが提供されています。

設定した Misskey の URL にアクセスし、管理者アカウントを作成してください。

Cloudflare R2 でオブジェクトストレージの設定

Cloudflare のダッシュボードを開きます。
左のサイドバーから R2 > 概要 を開き、バケットの作成を選択します。

createBucket1
R2 概要

任意のバケット名を入力して作成します。

createBucket2
バケットの作成

バケットの詳細画面を開き、S3 API を確認しておいてください。

createBucket3
バケット詳細画面

r2.dev アクセスを許可します。
また、パブリック r2.dev バケット URL を確認しておいてください。

createBucket4
r2.dev アクセスの許可

左のサイドバーから R2 > 概要 に戻り、R2 API トークンの管理 を選択します。

createR2token1
R2 概要

API トークンの管理画面で、API トークンを作成する をします。

API トークンの作成画面で、任意のトークン名を入力してください。
また、権限で オブジェクトの読み取りと書き込み を選択します。

createR2token2
API トークンの作成

作成された API トークンが表示されます。
S3 クライアント用の アクセス キー IDシークレット アクセス キー を確認してください。

この画面は一度しか表示されないため、閉じてしまわないよう注意してください。

createR2token3
API トークンの確認

Misskey のコントロールパネルから 設定 > オブジェクトストレージ を開きます。
以下の項目を設定してください。

Column Value
Base URL (パブリック r2.dev バケット URL)
Bucket (作成したバケット名)
Prefix (任意の Prefix)
Endpoint (S3 API の FQDN)
Region us-east-1
Access Key (API トークンのアクセス キー ID)
Secret Key (API トークンのシークレット アクセス キー)

Proxy を利用する無効 に、 アップロード時に'public-read'を設定する有効 にします。

settingObjectstorage
オブジェクトストレージ設定

Misskey のドライブに画像をアップロードし、画像がボケていなければ設定は完了です。

Cloudflare R2 でバックアップの設定

  1. バックアップ用の R2 の用意

    Misskey のオブジェクトストレージと同様に、バックアップ用のバケットを作成します。

    任意のバケット名を入力して作成します。
    バケットの詳細画面を開き、S3 API を確認しておいてください。

    更に、設定下部の オブジェクトのライフサイクル ルール を設定します。
    任意の定期的な期間で、ファイルが順次削除されるよう設定しておきましょう。

    lifecycleSetting
    ライフサイクル ルール の設定

  2. R2 API トークンの用意

    Misskey のオブジェクトストレージと同様に、R2 API トークンを作成します。

    任意のトークン名を入力し、権限を オブジェクトの読み取りと書き込み とします。
    作成された S3 クライアント用の アクセス キー IDシークレット アクセス キー を確認しておいてください。

  3. aws configure プロファイルの作成

    Misskey サーバーに接続し、postgres ユーザに切り替えます。

     ssh misskey
    
     sudo su - postgres
    

    aws configure プロファイルを作成します。

    プロファイル名には任意の名前を入力してください。
    AWS Access Key ID と AWS Secret Access Key には 1. で確認したものをそれぞれ入力します。

     aws configure --profile {{AnyProfileName}}
     AWS Access Key ID [None]: {{YourAccessKeyID}}
     AWS Secret Access Key [None]: {{YourSecretAccessKey}}
     Default region name [None]:
     Default output format [None]: json
    
  4. シェルスクリプトの配置

    引き続き postgres ユーザでバックアップ用のスクリプトを配置します。

     nano backup-psql-all.sh
    

    以下のスクリプトを、それぞれの環境用に置き換えた後、backup-psql-all.sh にペーストしてください。
    YourBucketName には 1. で作成したバケット名を入力します。
    YourProfileName には 3. で作成したプロファイル名を入力します。
    YourEndpointName には 1. で確認した S3 API を入力します。(.com以前まで)

    S3 API sample
    S3 API

     #!/bin/bash
     TIME=$(date +%Y%m%d_%H-%M-%S)
     cd /tmp
     pg_dumpall > dumpall_psql.dmp
     tar czf dumpall_psql.tar.gz dumpall_psql.dmp
     chmod 700 dumpall_psql.tar.gz
     aws s3 cp dumpall_psql.tar.gz s3://{{YourBucketName}}/dumpall_psql_$TIME.tar.gz --profile {{YourProfileName}} --endpoint-url {{YourEndpointName}}
     rm dumpall_psql.tar.gz dumpall_psql.dmp
    

    スクリプトの権限を変更します。

     chmod 744 backup-psql-all.sh
    

    スクリプトを実行し、dumpall_psql_yyyyMMdd_HH-mm-ss.tar.gz のようなファイルが R2 にアップロードされていれば、スクリプトの設定は成功です。

     bash ./backup-psql-all.sh
    
  5. crontab の設定

    引き続き postgres ユーザで crontab を編集します。

     crontab -e
    

    毎日 04:00 (JST) にバックアップ実行する場合は、以下のように編集してください。
    サーバーは UTC で動作しているため、JST 基準で設定するには +09:00 する必要があります。

     0 19 * * * bash backup-psql-all.sh
    

(おまけ)ノート検索の許可

デフォルトではノート検索は無効になっています。

検索を有効にしたい場合、
コントロールパネル > 管理 > ロール > ベースロール 内の ノート検索の利用はい に変更します。

changeSearchPermission
ノート検索の許可

あとがき

Misskey の持つ大きな特徴の一つとして、カスタム絵文字とそれを使ったリアクションの存在があります。
このカスタム絵文字を自由に登録し、自分だけのリアクションデッキを構築したい!と考えたことが、今回の動機の一つです。あと早く新機能を試したかった。
このような邪心でも、手軽に自分だけの城を構築できるのが、Fediverse の掲げる分散型SNSの良いところのひとつですね。

また、以下の方法で外部とのやりとりを無効化し、社内用SNSのように運用することも可能なようです。
あなたの会社でも導入してみてはいかがでしょうか。
社交性の乏しい私でも、Misskey ベースの呟きでなら、同期たちと交流できるかもしれません ;)

Misskeyでソースを変更せずに連合を完全無効化する方法 - CookieRamen

参考

偉大なる開発者たちと先駆者たちに深く感謝


現在アドグローブでは、さまざまなポジションで一緒に働く仲間を募集しています。
詳細については下記からご確認ください。みなさまからのご応募お待ちしております。
hrmos.co