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がメインであればホスト名なし、他のサービスも考えている場合はmi
やmisskey
などのホスト名つきのドメインで運用します。たとえば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に、主要な情報のインデックスがまとまっていますね。
- [公式インスタンス] (https://misskey.io/)
- 既存のインスタンスを探す方法 (joinmisskey)
- 最新情報
- Setup and Installation Guide(en) / Misskey構築の手引き(ja)
Misskey Wiki
Wikiも参考になります。 - https://misskey.wiki/
情報の鮮度としては古くなりがちですが、Wikiというカタチでないと記録されにくい、過去から現在にかけての経緯を説明した文章や、開発者、インスタンス情報と運営者、関連ソフトウェア・アプリ、Bot、機能の解説などの情報が参照できます。
joinmisskey
Misskeyへの玄関口として設置されたサイトです。
いくつかのコンテンツと、情報へのポインタがまとまっています。
その他
VPSサーバを借りて、環境を整備する
さて、具体的な手順の説明に入ります。まずは、Vultrに登録して、新しいサーバを借ります。
VPSを選択
- Cloud Compute を選択
- Tokyo を選択
- Ubuntu の 19.10 x64 を選択
- 55GB SSD $10/mo 1 CPU 2048MB Memory 2000GB Bandwidth を選択
- Enable IPv6 を選択
- Server Hostname や Label に『Misskey』など自分でわかりやすい名前を入力
- Deploy Now
インストールが始まるので、StatusがRunningになるまで待ちます。
サーバを選択して、
- IPアドレスをコピーします(ここでは
45.77.128.78
) - Usernameを確認します(だいたい
root
) - Passwordをコピーします(ここでは
Bv#96eRhJ)qT{sp)
)
IPv6アドレスを有効にする
- Settingsを選択
- IPv6を選択
- Assign IPv6 Networkを選択
- Assign IPv6 Networkを選択
- IPv6アドレスをコピーします(ここでは
2001:19f0:7001:35fb:5400:02ff:fe36:3bd5
)
VultrのIPv6アドレスは、ここで有効にしただけではUbuntuから使えないので、後ほど必要な設定することで利用可能になります。ここでは、DNSの設定のためにアドレスを把握するところまでとします。
オブジェクトストレージ
VultrのWebから、オブジェクトストレージを作成します。先に手順から。
Products、Objectsをたどり、Add Object Storageを選択
Locationを選択(今はNew Jerseyしかない)し、名前をつけて、Addを選択
ちょっと時間がかかるので、Readyになるまで待ち、鉛筆マークを選択
Bucketsをたどり、Create Bucketsを選択。バケット名を入力して下のCreate Bucketsを選択
バケットが出来上がったら、Overviewに戻る
S3 Credentialsの各項目をメモ(右側のコピーボタンを活用する)
オブジェクトストレージ自体に付ける名前は、単なるラベルなので何でもかまいません。
- バケットの名前は、Hostonameとあわせて、参照するURLの一部になります。ただし、CDNの裏側に隠蔽して使うことが多いので、それほど気にしなくても大丈夫です。
- バケットの名前は、VultrのLocation単位で、他の利用者が使っていないユニークな(他と重複のない唯一の、という意味でユニークと言います)名前をつける必要があるので、ドメイン名などを含めるなど工夫が必要です。
項目 | 設定値 |
---|---|
Hostname | ewr1.vultrobjects.com |
Secret Key | gx7V5iVW16WdzlucRVs63CMXY9pqjfHLZKTSQbPv |
Access Key | JJ7CR6BKS2AEVZ3HX9KF |
作業マシンのsshの準備
作業マシンで、ssh接続の準備。
ssh-keygen
コマンドでsshの鍵を作っておきます~/.ssh/config
に、借りたサーバの設定を記述しておきます- rootでログインして、作業用のユーザーを作り、鍵で接続できるように公開鍵を登録します
- 作業用ユーザーで接続し直します。以降は
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
というホストも設定します。
メールに関する設定は、とりあえず後回しにします。
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で接続する流れです。db
のuser
は、先に作成したPostgreSQLのROLEです。ここではmisskey
と設定します。db
のpass
は、先に作成したPostgreSQLのROLEに設定したパスワードです。ここではC&U#eb2CMkDiEivD$C9U
と設定します。
では、Misskeyをビルドします。
yarnでpackage.json
に記載のbuild手順を実行します。webpack
とgulp 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
というカタチで保存されています。
サンプルファイルの冒頭に記載されているように、
- Replace example.tld to your domain
- 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の管理者設定画面から行います。
右上のアカウント名のところからドロップダウンするメニューの、管理を選択します
左の項目からインスタンスを選択し、ドライブの設定で『オブジェクトストレージを使用する』を選択します
各項目を設定し、保存します
設定項目 | 設定値 |
---|---|
URL | https://misskey-media.noellabo.com |
バケット名 | misskey-noellabo-com |
プレフィックス | media |
エンドポイント | ewr1.vultrobjects.com |
アクセスキー | JJ7CR6BKS2AEVZ3HX9KF |
シークレットキー | gx7V5iVW16WdzlucRVs63CMXY9pqjfHLZKTSQbPv |
SSLを使用 | オン |
メール送信の設定
メール送信は、自前で設置するよりも外部に委託した方が良いと思います。ここではMailgunを利用します。Mailgunを利用開始するための登録方法の解説は割愛します。
Domains、Add New Domainと辿り、
ドメイン名を入力(mg.noellabo.com)、US、Create DKIM Authority、2048を選び、Add Domainで確定。ドメインは素のまま使うこともできるが、
mg.
付きで設定する方が切り分けられて良い。この場合でも、メールアドレスはmg.
無しのものが使用できるDNSに設定が必要な内容が一覧されるので、これを見ながら(コピーしながら)Cloudflareで入力する
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 |
Cloudflareでは、Nameの入力内容にドメイン名部分(noellabo.com)は不要なので注意。また、CNAMEはオレンジの雲ではなくグレーにする必要があるので注意(クリックすると切り替わる)
正しくDNSに設定して反映を待ち、Check DNS Records Nowでチェックが完了すると、以下のようなグリーンのチェックがついてMailgunが利用できるようになる。設定に食い違いがあると表示されるので、確認して修正すること
Domain SettingsからSMTP credentialsを辿り、Reset Passwordした画面。ここから必要な情報を拾う
設定項目 | 設定値 |
---|---|
サーバー | smtp.mailgun.org |
ポート | 465 |
ユーザー | postmaster@mg.noellabo.com |
パスワード | 7a90afe0005bf35034b0d0bc671897b6-898ca80e-df05107a |
Misskeyの管理、インスタンスから、メールサーバーの設定で、拾った情報を入力する。メールアドレスは利用するドメインで任意のものを設定して保存ボタンを押す
インスタンスの管理者アドレスの設定が同じ管理画面の上の方にあるので、そこにメールを受け取れるアドレスを記載して、メールの送信テストボタンを押す。すべて正しければ、テストメールが届く