noellabo's tech blog

@noellaboの技術ブログ

Misskeyのサーバを設置する(v11系)

Misskeyは、自分でサーバを用意して設置することで、自分の好きなように運営することができます。

当記事では、Misskey v11以降の設置方法について、具体例を交えて紹介します。

用意するモノ

  • Misskeyを実行するサーバ
  • ドメイン
  • メールサーバー
  • オブジェクトストレージ
  • 作業用PC

これらもあった方が良いです

  • Fediverse上のSNSアカウントいくつか
  • Misskeyを設置・運用している友人・知人

Misskeyを実行するサーバ

常時インターネットに接続されているサーバが必要です。

Node.js、PostgreSQL、Redisなどが実行できる、メモリが2GB以上ある環境を用意してください。

自宅にPCを設置して運用してもいいですし、サーバを借りても良いでしょう。

ここでは、Vultrで下記のスペックのサーバを借りることにします。

項目 内容
VPS Vultr Cloud Compute
CPU 1
Memory 2GB
SSD 55GB
OS Ubuntu 19.10 x64
Cost $10 / 月

もっとミニマムな環境で動かないの?

Vultrにメモリ512MBで月額3.5ドルのサーバがありますが、試してみたところ、工夫次第でちゃんと動くようです。

新規インストール・アップデート時のビルドにメモリを要しますが、それ以外はだいたい大丈夫です。クライアントがリッチで重めのMisskeyですが、サーバ側は普通のスペックでいけると思います。

ドメイン

専用のドメインを用意していない場合は、新規に取得するか、既に持っているドメインのサブドメインで運用しましょう。選定したドメインは、Fediverseにおけるサーバやユーザー名の構成要素となります。あとから変更できず、長く維持する必要がありますので、よく考えて決めてください。

Webサイトのドメインと比べて、比較的ユーザーが意識して目にすることになりますし、手入力が必要な場合もありますので、わかりやすく短いドメイン名が望ましいところです。Misskeyがメインであればホスト名なし、他のサービスも考えている場合はmimisskeyなどのホスト名つきのドメインで運用します。たとえばnoesky.xyzを取得してホスト名無しで運用すれば、ユーザー名が noel@noeskey.xyz のようになります。ホスト名つきでmisskey.noellabo.comとすれば noel@misskey.noellabo.com のようになります。

なお、ドメインを新規に取得する場合、使えるようになるまでに時間が掛かりますので、早めに手続きを開始してください。

ドメインを取得したら、信頼できるDNSサーバを選定して(契約して)ネームサーバに指定します。

ここでは、既に所有しているnoellabo.comというドメインのサブドメインとして、misskey.noellabo.comという名前で運用することにします。

また、Cloudflareの無料プランを契約し、noellabo.comでCloudflareを利用するようセットアップされているものとします。

なお、例に使用したこのドメインは2016年7月23日にムームードメインで取得し、現在はCloudflareに移管して更新しています。ムームードメインでの新規取得・1年目にかかる費用は999円、2年目以降の更新が1,480円、Cloudflareでの更新に切り替えてからは8.03ドル(執筆時点で853円ぐらい)です。

メールサーバー

パスワードの再発行などのために、メール送信を引き受けてくれるサーバが必要です。

既に運用しているメールサーバや、借りているメールサービスがある場合はそれを利用することもできます。

ここでは、mailgunを利用します。利用頻度は低いので、無料の範囲で足りると思います。

オブジェクトストレージ

ユーザーが添付したりリモートから取得するメディア等のファイルは、サーバのローカルストレージに保存する動作が標準ですが、オブジェクトストレージに保存する方が管理・運用し易くなります。最初からオブジェクトストレージを利用しましょう。

オブジェクトストレージは、Amazon Simple Storage Service(S3と呼ばれる)のAPIがデファクトスタンダードとなっていて、MisskeyもS3互換のAPIであれば、様々なオブジェクトストレージサービスを利用できます。

ここでは、リリースされたばかりのVultrのオブジェクトストレージを利用します。月額5ドルで250GBの保存容量とダウンロード1TB/月、超過分は従量課金となります。保存容量が0.02ドル/GB、ダウンロードが0.01ドル/GBです。

Misskeyは他のSNSと比較して、ユーザーに様々なファイルの取り扱いを許しており、ユーザー毎に保存領域を持てるようになっています。サーバに付属する固定容量のストレージでは容量の制限が厳しくなるので、ほぼ無限に容量を拡大できるオブジェクトストレージを上手に活用してください。

なお、今回は手順を割愛しますが、バックアップデータの保存にも便利です。

作業用PC

作業用のPCからsshでサーバに接続し、インストールや更新を行います。

Windows 10やmacOSにはsshクライアントが最初から入っていますので、それを利用します。LinuxやFreeBSDなどからの接続も同様です。

Fediverse上のSNSアカウントいくつか

動作確認をするために、既存のFediverse上のSNSにアカウントを持っていた方が良いでしょう。

Misskey、Pleroma、Mastodonのアカウントがそれぞれあると便利です。

Misskeyはmisskey.io(公式インスタンス)が良いでしょう。私の運営するのえすきーを利用していただいてもかまいません。

Pleromaはこれといって特にオススメがありませんが、私の運営するのえろまを利用していただいてもかまいません。

MastodonはFedibirdをお薦めします。私の運営するサーバですが、Fediverseの活動拠点を志向しており、LTLがないため他の利用者に遠慮なく活動できるため、テストに最適です。

Misskeyを設置・運用している友人・知人

Misskeyに詳しい知り合いがいると、ちょっとした問題が起きても対処が簡単です。

少人数で開発されている進化の速いサービスは、だいたいドキュメント整備が追いついていません。行き詰まったらFediverseで助けを求めましょう。誰か知っている人が反応してくれると思います。

情報はどこを参照すべきか

当記事も含め、非公式の情報は時間経過とともに内容が古くなり、現在の状況に適合しなくなることが常です。できるだけ、開発者が直接関わっている公式の一次情報をあたります。

Githubの公式リポジトリ

なんといっても、まずはコレ。公式のリポジトリです。 - syuilo/misskey

README.mdに、主要な情報のインデックスがまとまっていますね。

Misskey Wiki

Wikiも参考になります。 - https://misskey.wiki/

情報の鮮度としては古くなりがちですが、Wikiというカタチでないと記録されにくい、過去から現在にかけての経緯を説明した文章や、開発者、インスタンス情報と運営者、関連ソフトウェア・アプリ、Bot、機能の解説などの情報が参照できます。

joinmisskey

Misskeyへの玄関口として設置されたサイトです。

いくつかのコンテンツと、情報へのポインタがまとまっています。

その他

VPSサーバを借りて、環境を整備する

さて、具体的な手順の説明に入ります。まずは、Vultrに登録して、新しいサーバを借ります。

VPSを選択

f:id:noellabo:20201018091601p:plain

  1. Cloud Compute を選択
  2. Tokyo を選択
  3. Ubuntu の 19.10 x64 を選択
  4. 55GB SSD $10/mo 1 CPU 2048MB Memory 2000GB Bandwidth を選択
  5. Enable IPv6 を選択
  6. Server Hostname や Label に『Misskey』など自分でわかりやすい名前を入力
  7. Deploy Now

f:id:noellabo:20201018091624p:plain

インストールが始まるので、StatusがRunningになるまで待ちます。

サーバを選択して、

f:id:noellabo:20201018091644p:plain

  1. IPアドレスをコピーします(ここでは45.77.128.78
  2. Usernameを確認します(だいたいroot
  3. Passwordをコピーします(ここではBv#96eRhJ)qT{sp)

IPv6アドレスを有効にする

f:id:noellabo:20201018091708p:plain

  1. Settingsを選択
  2. IPv6を選択
  3. Assign IPv6 Networkを選択
  4. Assign IPv6 Networkを選択

f:id:noellabo:20201018091734p:plain

  1. IPv6アドレスをコピーします(ここでは2001:19f0:7001:35fb:5400:02ff:fe36:3bd5

VultrのIPv6アドレスは、ここで有効にしただけではUbuntuから使えないので、後ほど必要な設定することで利用可能になります。ここでは、DNSの設定のためにアドレスを把握するところまでとします。

オブジェクトストレージ

VultrのWebから、オブジェクトストレージを作成します。先に手順から。

  1. Products、Objectsをたどり、Add Object Storageを選択 f:id:noellabo:20201018091757p:plain

  2. Locationを選択(今はNew Jerseyしかない)し、名前をつけて、Addを選択 f:id:noellabo:20201018091836p:plain

  3. ちょっと時間がかかるので、Readyになるまで待ち、鉛筆マークを選択 f:id:noellabo:20201018091852p:plain

  4. Bucketsをたどり、Create Bucketsを選択。バケット名を入力して下のCreate Bucketsを選択 f:id:noellabo:20201018091908p:plain

  5. バケットが出来上がったら、Overviewに戻る f:id:noellabo:20201018091921p:plain

  6. S3 Credentialsの各項目をメモ(右側のコピーボタンを活用する) f:id:noellabo:20201018091937p:plain

  7. オブジェクトストレージ自体に付ける名前は、単なるラベルなので何でもかまいません。

  8. バケットの名前は、Hostonameとあわせて、参照するURLの一部になります。ただし、CDNの裏側に隠蔽して使うことが多いので、それほど気にしなくても大丈夫です。
  9. バケットの名前は、VultrのLocation単位で、他の利用者が使っていないユニークな(他と重複のない唯一の、という意味でユニークと言います)名前をつける必要があるので、ドメイン名などを含めるなど工夫が必要です。
項目 設定値
Hostname ewr1.vultrobjects.com
Secret Key gx7V5iVW16WdzlucRVs63CMXY9pqjfHLZKTSQbPv
Access Key JJ7CR6BKS2AEVZ3HX9KF

作業マシンのsshの準備

作業マシンで、ssh接続の準備。

  1. ssh-keygenコマンドでsshの鍵を作っておきます
  2. ~/.ssh/configに、借りたサーバの設定を記述しておきます
  3. rootでログインして、作業用のユーザーを作り、鍵で接続できるように公開鍵を登録します
  4. 作業用ユーザーで接続し直します。以降はssh misskeyなどで簡単に接続できるようになります
$ ssh-keygen -t ed25519 
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/noel/.ssh/id_ed25519): 
Created directory '/Users/noel/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/noel/.ssh/id_ed25519.
Your public key has been saved in /Users/noel/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:bfI7vZf1WNtM5AvrKCBDALJOteCd3hFhNTFQyr8GnXg noel@macbook.local
The key's randomart image is:
+--[ED25519 256]--+
|.o.. ==*.        |
|o.+.= o o        |
|.o +.+           |
|o . ..= ..      .|
| . ..+ ES o    o |
|     oo..+   .  =|
|      oo. ..  oB=|
|      .  ...o.+o+|
|          ooo+   |
+----[SHA256]-----+

-t ed25519で、鍵の種類を指定。保存場所と保存名はデフォルトでOK。パスフレーズは空でも良いですが、指定しておけば、盗まれても悪用されにくくなります。

この操作で、秘密鍵が~/.ssh/id_ed25519に、公開鍵が~/.ssh/id_ed25519.pubに生成されます。この公開鍵の内容を後ほどサーバの~/.ssh/authorized_keysにコピーして登録することで、秘密鍵を使ってサーバに接続できるようになります。

$ cat .ssh/id_ed25519.pub 
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOus1eozuQCKRhnEOye9oqCqGc02JFjZj1j64KHYGmOt noel@macbook.local

次に.ssh/configを記述します。メモ帳やvi、nanoなどでファイルを作成します。

Host misskey
        User noel
        Port 22
        Hostname 45.77.128.78
        IdentityFile ~/.ssh/id_ed25519
  • Hostにこれからこのサーバに接続する際に使いたい任意の名前をつけます。ここではmisskeyとします。
  • Userに、サーバ上に作成する作業用ユーザー名を記述します。ここではnoelとします。
  • Portに、SSHで使用するポート番号を記述します。標準のポートであれば不要ですが、変更する場合はここを任意の番号に書き換えておきます。ここでは22とします。
  • Hostnameに、サーバのIPアドレスを記述します。DNSで解決できるようにしてあれば、ドメイン名を記載してもOKです。ここでは先ほどメモした45.77.128.78とします。
  • IdentityFileに、秘密鍵のファイルパスを記述します。ここでは先ほど作成した~/ssh/id_ed25519とします。

sshでサーバに接続

初回はrootで接続し、SSHのポートも標準の22のままなので、さきほどつけたHost名とあわせてssh root@misskey -p 22というコマンドで接続します。

$ ssh root@misskey -p 22
The authenticity of host '45.77.128.78 (45.77.128.78)' can't be established.
ECDSA key fingerprint is SHA256:URuzNYTBTrq1bmIWmkJthdMdb7eP+vGGlagyFt1QN80.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '45.77.128.78' (ECDSA) to the list of known hosts.
root@45.77.128.78's password: 
  • はじめて接続するサーバなので、接続先ホストの鍵のfingerprintを表示して、ホントにこのサーバに接続していいか確認されます。yesと答えると、~/.ssh/known_hostsに記録され、次回から確認は出なくなります。同じIPアドレス(またはドメイン名)で別のサーバにすり替えられている場合に検出されるので、より安全になります。
  • rootのパスワードを聞かれますので、Vultrからコピーしてきたrootのパスワードをペーストします。

無事にログインできましたか?

作業用ユーザーを作成

rootでssh接続するのは推奨されません。代わりに、作業用のユーザーつくります。

adduser noel

パスワードを聞かれますので、設定してください。その他の設定は、空のままで大丈夫です。

作業ユーザーを、sudoを許可するグループに追加します。

usermod -aG sudo noel

作業ユーザーに切り替えて、sshを鍵で接続できるように設定します。

sudo -iu noel
mkdir .ssh
chmod 700 .ssh
cd .ssh
touch authorized_keys
chmod 600 authorized_keys
nano authorized_keys

authorized_keysに、あらかじめ手元で作ってある公開鍵をコピペします。

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOus1eozuQCKRhnEOye9oqCqGc02JFjZj1j64KHYGmOt noel@macbook.local

sshdの設定を変更します。

sudo nano /etc/ssh/sshd_config
  • コメントアウトされている(行の最初に # がついてる)場合は無効になっているので、設定したい項目の # を削除します。
  • ポートを標準から変更したい場合は Port 22 を任意のポート番号にします
  • ルートのログインを禁止するよう設定します PermitRootLogin no
  • パスワードログインを禁止します PasswordAuthentication no

最後に、sshdの設定をテストします。エラーがあった場合は、メッセージを頼りに修正してください。間違ったままだとsshで接続できなくなってしまいますので、慎重にやりましょう。

sudo sshd -t

問題なければ、設定を有効にするために、sshdを再起動します。

sudo systemctl restart sshd

ファイアウォールを設定して、特定のポートの接続だけを許可します。

ここでは、ufwを使って、ssh接続だけを許可して、有効化します。22の部分は、先ほど設定したポート番号を指定してください。これを間違うと、接続できなくなります。

sudo ufw allow 22/tcp
sudo ufw enable

設定ができたら、もう一つターミナル/コマンドプロンプトを開いて、ssh接続できることを確認します。

ここまで正しく設定できていれば、さきほど~/.ssh/configに設定した作業用のユーザーとポート番号、登録した公開鍵に対応する秘密鍵で接続できるはずです。

ssh misskey

パスフレーズを設定している場合は聞かれます。さて、無事に接続できましたか?

問題があったら、先に接続したターミナル/コマンドプロンプトの方の画面で、サーバの設定を見直します。切断しなければ操作を続行できます。

接続できるようになったら、最初にrootで接続した方は、ログアウトして切断しておきます。

最後に、次の作業にうつるまえに、システムのアップデートをかけておきます。

sudo apt update
sudo apt upgrade

メモリの少ない環境向けの追加設定

Misskeyのビルドには、概ね2GB以上のメモリが必要です。不足はスワップファイルで補います。2GBだとかなりギリギリなので、もう少し足しておいた方が良いと思います。

まず、現状の確認です。(512MBのサーバの例です)

$ free
              total        used        free      shared  buff/cache   available
Mem:         490424      254632       50468        6316      185324      209692
Swap:             0           0           0

足りないですね……。では、swapを追加します。ここでは2GB追加します。

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo nano /etc/fstab

/etc/fstabには下記の内容を追記します。

/swapfile none swap sw 0 0

さて、どうなったかな?

$ free
              total        used        free      shared  buff/cache   available
Mem:         490424      254632       50468        6316      185324      209692
Swap:       2097148      146944     1950204

これならなんとか大丈夫そうですね。

VultrのIPv6アドレスを有効にする

Vultrの場合の設定です。このへんの事情はVPSによってまったく異なります。

sudo nano /etc/netplan/10-ens3.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    ens3:
      dhcp4: yes
      addresses:
        - '2001:19f0:7001:35fb:5400:02ff:fe36:3bd5/64'
sudo netplan apply

ip aなどとして、IPv6アドレスが割り当てられていることが確認でき、外部からpingして応答があればOKです。

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 56:00:02:36:3b:d5 brd ff:ff:ff:ff:ff:ff
    inet 45.77.128.78/23 brd 45.77.129.255 scope global dynamic ens3
       valid_lft 86397sec preferred_lft 86397sec
    inet6 2001:19f0:7001:35fb:5400:2ff:fe36:3bd5/64 scope global dynamic mngtmpaddr noprefixroute 
       valid_lft 2591997sec preferred_lft 604797sec
    inet6 fe80::5400:2ff:fe36:3bd5/64 scope link 
       valid_lft forever preferred_lft forever

ドメインの設定

Cloudflareでドメインを管理しているという前提で、ホストの追加設定を行います。

ここではnoellabo.comというドメインに、misskeyというホストを設定します。また、オブジェクトストレージに保存するメディアの参照専用に、misskey-mediaというホストも設定します。

メールに関する設定は、とりあえず後回しにします。

f:id:noellabo:20201018092034p:plain

Type Name Value
A misskey 45.77.128.78
A misskey-media 45.77.128.78
AAAA misskey 2001:19f0:7001:35fb:5400:02ff:fe36:3bd5
AAAA misskey-media 2001:19f0:7001:35fb:5400:02ff:fe36:3bd5

オレンジ色の雲(cloud)マークはクリックすると切り替えられますが、オレンジにしておくと、Cloudflareによりキャッシュされ、IPアドレスが隠蔽(本当のIPの代わりにCloudflareのIPになる)されます。

Misskeyをセットアップ

公式のセットアップ手順は、こちらに記載があります。当記事と記載内容に違いがある場合は、公式の手順に従って下さい。 https://github.com/syuilo/misskey/blob/develop/docs/setup.ja.md

まずは、PostgreSQLと、redis、nginx、ビルドツールとpythonをaptでインストールしておきます。

sudo apt install postgresql redis-server nginx build-essential python

PostgreSQLの設定

PostgreSQLにmisskeyというユーザー(ROLE)と、misskeyデータベースを作っておきます。パスワードを設定してください。ここではC&U#eb2CMkDiEivD$C9Uとしています。

sudo -u postgres psql
CREATE ROLE misskey LOGIN CREATEDB PASSWORD 'C&U#eb2CMkDiEivD$C9U';
CREATE DATABASE misskey OWNER misskey;
\q

Misskeyのインストール

ドキュメントに従って、misskeyユーザーを作って、リポジトリをcloneするところまでやります。

sudo adduser --disabled-password --disabled-login misskey
sudo -iu misskey
git clone -b master git://github.com/syuilo/misskey.git

nodejsとyarnをnodenvでインストールする

nodejsとyarnのインストールについては、nodenvで行います。

nodenvを取ってきて、

git clone https://github.com/nodenv/nodenv.git ~/.nodenv
cd ~/.nodenv && src/configure && make -C src

.bashrcの末尾に、nodenvのPATHと初期化を追記します。 ついでに、メモリの少ない環境でyarn buildがHeap不足にならないように、NODE_OPTIONSも指定しておきます。

nano ~/.bashrc

下記の内容を~/.bashrcの末尾に追加します。

export PATH="$HOME/.nodenv/bin:$PATH"
eval "$(nodenv init -)"

export NODE_OPTIONS=--max_old_space_size=4096

一旦シェルを抜けて、もう一度入り直し

logout
sudo -iu misskey

node installできるようにプラグインを追加

mkdir -p "$(nodenv root)"/plugins
git clone https://github.com/nodenv/node-build.git "$(nodenv root)"/plugins/node-build

一緒にyarnをインストールできるようにするプラグインを追加

git clone https://github.com/pine/nodenv-yarn-install.git "$(nodenv root)/plugins/nodenv-yarn-install"

nodenvをupdateするためのプラグインを追加

git clone https://github.com/nodenv/nodenv-update.git "$(nodenv root)"/plugins/nodenv-update

で、misskeyディレクトリに入って、.node-versionファイルを確認。 misskeyが想定しているnodeのバージョンになります。

cd misskey
cat .node-version 

ここではv12.6.0となりました。nodenvで、12.6.0をインストールします。

nodenv install 12.6.0

無事にインストールされたか、nodeとyarnのそれぞれのバージョンを確認します。

node -v
yarn -v

Misskeyのインストールの続き(データベース初期化とビルド)

最新のリリースをチェックアウトして、

git checkout master

yarnで依存関係をインストールします。

package.jsonに記載されている、Misskeyが利用しているパッケージ(ソフトウェア部品)のインストールです。Misskeyがバージョンアップした場合は、package.jsonの内容も変更されることがありますので、必ず実行します。変更されたものだけを検出して高速に実行されます。

yarn install

設定ファイルのひな形をコピーして、編集します。

cp .config/example.yml .config/default.yml
nano .config/default.yml

だいたいいじるのはこのあたりになるでしょう。

url: https://misskey.noellabo.com/
port: 3000
db:
  user: misskey
  pass: C&U#eb2CMkDiEivD$C9U
  • コメントアウトされている(行の最初に # がついてる)場合は無効になっているので、設定したい項目の # を削除します。
  • Misskeyを設置するURL、今回はmisskey.noellabo.comという名前で運用するつもりですのでurlにそのように記述します。
  • portはここでは3000を使用します。外部からの接続はnginx(プロキシサーバ)に任せて、nginxからMisskeyへport 3000で接続する流れです。
  • dbuserは、先に作成したPostgreSQLのROLEです。ここではmisskeyと設定します。
  • dbpassは、先に作成したPostgreSQLのROLEに設定したパスワードです。ここではC&U#eb2CMkDiEivD$C9Uと設定します。

では、Misskeyをビルドします。

yarnでpackage.jsonに記載のbuild手順を実行します。webpackgulp buildを実行するように記述があります。webpackの手順はwebpack.config.tsに、gulpの手順はgulpfile.tsに記載があります。

NODE_ENV=production yarn build
  • NODE_ENVは、開発やテスト、実運用の切替の設定です。productionにすると、実運用環境であると認識して、アセットの圧縮など最適化をしっかりかけて、開発やテストだけに必要な動作を行わないようになります。
  • この手順は、CPU時間とメモリを大量に消費するため、不足すると失敗します。
  • 待ち時間が長いので、先にやっておけることを済ませておいた方が良いでしょう。
  • Misskeyがバージョンアップした場合は、必ずビルドが必要です。

ビルドが完了したら、データベースを初期化します。あらかじめ空のデータベースを作ってありますので、ここで行うのは、テーブルやインデックスの作成です。

yarn run init
  • 実行する手順は多いですが、あっという間に実行されます。
  • Misskeyがアップデートされた場合は、yarn migrateでマイグレーションを行います。マイグレーションは、最新のプログラムで必要な、データベースに対する変更を実行する手順です。
  • この手順が完了すると、Misskeyを起動する準備が整います。

systemdの設定

先の手順で、Misskeyを起動する準備が整いましたが、VPSサーバの起動とともに起動し、バックグラウンドで実行し続けるために、systemdの設定が必要です。

Misskeyをサービスとして起動するための、systemdのユニットファイルを設定します。

sudo nano /etc/systemd/system/misskey.service

下記の内容を記述します。

[Unit]
Description=Misskey daemon

[Service]
Type=simple
User=misskey
ExecStart=/home/misskey/.nodenv/shims/yarn start
WorkingDirectory=/home/misskey/misskey
Environment="NODE_ENV=production"
TimeoutSec=60
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=misskey
Restart=always

[Install]
WantedBy=multi-user.target

ユニットファイルの変更を反映(daemon-reload)し、有効に(enable)し、実行(start)します。

sudo systemctl daemon-reload
sudo systemctl enable misskey
sudo systemctl start misskey

停止する場合はstop、開始がstart、再起動がrestartです。

Misskeyのバージョンアップの際などに、マイグレーション前に停止し、マイグレーション後に開始する、などの操作を行います。

nginx(リバースプロキシ)

Misskeyは、それ自身がWebサーバとしての機能を備えていますが、こうしたWebアプリケーションでは、外部からのアクセスを一度nginx等のリバースプロキシが引き受けて、必要に応じてアプリケーションに転送する構成をとることが一般的です。

nginxがSSLを処理したり、キャッシュを利用して高速に応答したり、多数のアクセスを上手に捌いてくれることで、アプリケーションは自身の機能を実現することに専念できるようになります。

また、アプリケーションをメンテナンスのために停止する場合にも、適切な応答を返すことができるなどのメリットもあります。

  • ファイアウォールで必要なポートへのアクセスを許可する
  • 証明書を取得する
  • サイトの設定ファイルを適切な場所に配置する

ufwでhttps接続を許可する

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

証明書

certbotを使って取得・更新します。

私が書いた記事の中では、これの後半が参考になるかと思います。 https://noellabo.qrunch.io/entries/54MFy6cuWRsKUhQg

ここではmisskey.noellabo.comをcloudflareのDNSで管理している前提で、DNS認証で証明書を取得する手順を示します。

まず、certbotと、cloudflare用のDNS認証を自動化するプラグインをインストールします。

sudo apt install certbot python3-certbot-dns-cloudflare

cloudflareにプログラムから必要な指示を行うため、IDとなるメールアドレスと、APIのキーを設定したファイルを作成します。

cd /etc/letsencrypt
sudo nano .cloudflare_credentials

ファイルの内容に、cloudflareで登録したメールアドレスと、取得したAPIのキーを設定します。(noel@example.comはダミーのアドレスです。キーも実際のものとは異なるサンプルです)

dns_cloudflare_email = noel@example.com
dns_cloudflare_api_key = 7acb35a7f2d629a63b10e0b2ba5

重要情報なので、rootだけが見られるようにアクセス権を設定し、

sudo chmod 600 .cloudflare_credentials

certbotコマンドに--dry-runオプションをつけて動作を確認し、

sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials .cloudflare_credentials -d misskey.noellabo.com -d misskey-media.noellabo.com -m noel@example.com --manual-public-ip-logging-ok --agree-tos --no-eff-email --dry-run

問題ないようであれば--dry-runをはずし、実際に取得を行います。

sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials .cloudflare_credentials -d misskey.noellabo.com -d misskey-media.noellabo.com -m noel@example.com --manual-public-ip-logging-ok --agree-tos --no-eff-email

オプションの意味を一覧しておきます。

オプション 意味
--dns-cloudflare CloudflareDNS認証プラグインを使用する
--dns-cloudflare-credentials .cloudflare_credentials 認証情報の書かれたファイルを指定
-d misskey.noellabo.com 一つ目のドメインを指定(証明書のファイル名に使われる)
-d misskey-media.noellabo.com 二つ目のドメインを指定(メディアプロキシ用)
-m noel@example.com 証明書の期限通知など連絡用メールアドレス
--manual-public-ip-logging-ok グローバルIPアドレスを認証局が記録することを許可します
--agree-tos ACME 利用規約に同意します(初めて利用する場合は、このオプションを指定せず、内容を確認いしてください)
--no-eff-email 電子フロンティア財団(certbot開発元)とメールアドレスをシェアする許可

certbotでは、証明書の更新が実際に行われた場合にだけ実行するスクリプトを定義しておくことができます。nginxなどは、証明書が更新されても、nginxに再読込を指示しないと、古い証明書の内容をいつまでも覚えていて実際に新しい証明書が使用されません。自動的に証明書などが再読込されるように設定しておきます。

sudo nano renewal-hooks/deploy/reload.sh

内容は、下記の通りです。

#!/bin/bash
systemctl reload nginx

これに実行権を設定しておきます。

sudo chmod +x renewal-hooks/deploy/reload.sh

aptでインストールしたcertbotの場合、cronによって自動的に更新処理を定期実行するよう、あらかじめ/etc/cron.d/certbotというファイルが仕掛けられています。証明書の有効期限が1ヶ月を切ると、取得の際に使ったバラメータに基づいて再取得が行われ、nginxのreloadが行われて、新しい証明書が使われるようになります。

もし、証明書の取得に失敗していると、設定したメールアドレスに、期限が迫っている旨、メールが届きます。放置するとマズイので、メールが届いたらすぐに設定を確認することをお勧めします。

nginxの設定

nginxの方は、misskeyのリポジトリにあるサンプルを利用して、ドメインと証明書のパスを書き換えて、所定のディレクトリに配置し、シンボリックリンクを張ります。

サンプルファイルはこれです。 https://github.com/syuilo/misskey/blob/develop/docs/examples/misskey.nginx

このファイルは、gitでリポジトリごと取得済みですので、misskeyディレクトリのdocs/examplesにmisskey.nginxというカタチで保存されています。

サンプルファイルの冒頭に記載されているように、

  1. Replace example.tld to your domain
  2. Copy to /etc/nginx/sites-available/ and then symlink from /etc/nginx/sites-ebabled/ or copy to /etc/nginx/conf.d/

ということですから、

sudo cp /home/misskey/misskey/docs/examples/misskey.nginx /etc/nginx/sites-available/misskey.noellabo.com
cd /etc/nginx/sites-enabled
sudo ln -s ../sites-available/misskey.noellabo.com

という感じで設定ファイルをコピーして、シンボリックリンクを配置します。

順序が逆ですが、ファイルを編集して、ドメインと証明書のパスを設定します。

sudo nano /etc/nginx/sites-available/misskey.noellabo.com

設定ファイルを書き換えたら、必ずチェックします。エラーが出たら、OKでるまで直して再実行します。

sudo nginx -t

nginxをリロードすれば、nginx経由でmisskeyに繋がるようになります。

sudo systemctl reload nginx

オブジェクトストレージのポリシーの設定

Vultrのオブジェクトストレージに保存されたファイルを誰でも閲覧できるようにするために、s3cmdでポリシーを設定しておきます。

sudo apt install s3cmd
s3cmd --configure

Vultrでオブジェクトストレージを作成した際にメモした、Access Key、Secret Key、S3 Endpointだけ設定すれば、あとはEnterで大丈夫かと思います。

で、こういうファイルをmisskey-media_policyというファイル名で保存します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AddPerm",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::misskey-noellabo-com/*"
    }
  ]
}

バケット名misskey-noellabo-com以下の全てのファイルに、s3:GetObjectを許可するポリシーです。これを、実際に適用します。

s3cmd setpolicy misskey-media_policy s3://misskey-noellabo-com

オブジェクトストレージにnginxでプロキシ接続

今後、オブジェクトストレージを変更した際にURLが変わらないようにすること、Cloudflareによるキャッシュを利用するために、nginxに設定を追加してプロキシ接続できるようにします。

設定ファイルを作成して、

sudo nano /etc/nginx/sites-available/misskey-media.noellabo.com  
server {
    listen 80;
    listen [::]:80;
    server_name misskey-media.noellabo.com;

    location / { return 301 https://$host$request_uri; }
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name misskey-media.noellabo.com;
    ssl_session_cache shared:ssl_session_cache:10m;

    ssl_certificate     /etc/letsencrypt/live/misskey.noellabo.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/misskey.noellabo.com/privkey.pem;

    ssl_protocols TLSv1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:AES128-SHA;
    ssl_prefer_server_ciphers on;

    location / {
      proxy_ignore_headers set-cookie;
      proxy_hide_header set-cookie;
      proxy_set_header cookie "";
      proxy_hide_header etag;
      resolver 8.8.8.8 valid=100s;
      proxy_pass https://misskey-noellabo-com.ewr1.vultrobjects.com$request_uri;
      expires max;
    }
}

シンボリックリンクを張って、

cd /etc/nginx/sites-enabled  
sudo ln -s ../sites-available/misskey-media.noellabo.com

ミスがないかチェックして、

sudo nginx -t

設定ファイルを再読込

sudo systemctl reload nginx

オブジェクトストレージを使用する設定

Misskeyの管理者設定画面から行います。

  1. 右上のアカウント名のところからドロップダウンするメニューの、管理を選択します f:id:noellabo:20201018092157p:plain

  2. 左の項目からインスタンスを選択し、ドライブの設定で『オブジェクトストレージを使用する』を選択します f:id:noellabo:20201018092212p:plain

  3. 各項目を設定し、保存します

設定項目 設定値
URL https://misskey-media.noellabo.com
バケット名 misskey-noellabo-com
プレフィックス media
エンドポイント ewr1.vultrobjects.com
アクセスキー JJ7CR6BKS2AEVZ3HX9KF
シークレットキー gx7V5iVW16WdzlucRVs63CMXY9pqjfHLZKTSQbPv
SSLを使用 オン

メール送信の設定

メール送信は、自前で設置するよりも外部に委託した方が良いと思います。ここではMailgunを利用します。Mailgunを利用開始するための登録方法の解説は割愛します。

  1. Domains、Add New Domainと辿り、 f:id:noellabo:20201018092243p:plain

  2. ドメイン名を入力(mg.noellabo.com)、US、Create DKIM Authority、2048を選び、Add Domainで確定。ドメインは素のまま使うこともできるが、mg.付きで設定する方が切り分けられて良い。この場合でも、メールアドレスはmg.無しのものが使用できる f:id:noellabo:20201018092308p:plain

  3. DNSに設定が必要な内容が一覧されるので、これを見ながら(コピーしながら)Cloudflareで入力する f:id:noellabo:20201018092323p:plain

Type Name Value
TXT mg v=spf1 include:mailgun.org ~all
TXT smtp._domainkey k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0+IF0TB3bpPpZ1Iyj1O9LwOxZQy1tk5d60iLYHY/noFoJWCY6hR04A2RciSeUqcpF0O+tyrcvTWue5+YPpT/xnua77N5Y1n8enujmR2kVUmoOltZNuJ8wR7L+hGaHqc2s5xXhjH9xmZhZ4LFb3NObkl9I17GmAZ/dtLyRFZcrSCoHEd1jaEhIEVxslOns2nM0RsvoiF9O6Qono94MN7lsxfyuB70vcUsnGd+79Zb/Efyz726Bf2LOyehdGxe3XHgeZUDeJtm6zsz/QOrWaUi9dP/0qGbntJk1nEtXrCJaQ9Ccca4MqERGxMbPe136lO2scq4E4giJF+yDmwbaEZl2QIDAQAB
MX mg 10 mxa.mailgun.org
MX mg 10 mxb.mailgun.org
CNAME email.mg mailgun.org
  1. Cloudflareでは、Nameの入力内容にドメイン名部分(noellabo.com)は不要なので注意。また、CNAMEはオレンジの雲ではなくグレーにする必要があるので注意(クリックすると切り替わる) f:id:noellabo:20201018092405p:plain

  2. 正しくDNSに設定して反映を待ち、Check DNS Records Nowでチェックが完了すると、以下のようなグリーンのチェックがついてMailgunが利用できるようになる。設定に食い違いがあると表示されるので、確認して修正すること f:id:noellabo:20201018092418p:plain

  3. Domain SettingsからSMTP credentialsを辿り、Reset Passwordした画面。ここから必要な情報を拾う f:id:noellabo:20201018092432p:plain

設定項目 設定値
サーバー smtp.mailgun.org
ポート 465
ユーザー postmaster@mg.noellabo.com
パスワード 7a90afe0005bf35034b0d0bc671897b6-898ca80e-df05107a
  1. Misskeyの管理、インスタンスから、メールサーバーの設定で、拾った情報を入力する。メールアドレスは利用するドメインで任意のものを設定して保存ボタンを押す f:id:noellabo:20201018092446p:plain

  2. インスタンスの管理者アドレスの設定が同じ管理画面の上の方にあるので、そこにメールを受け取れるアドレスを記載して、メールの送信テストボタンを押す。すべて正しければ、テストメールが届く