Node.js
自宅サーバー
misskey
ActivityPub
fediverse

Misskeyインスタンスを開設したかった

はじめに

https://joinmisskey.github.io/
Misskeyとはどういうものか、こちらのサイトでご覧ください。
Mastodonに似たようなソフトウェアです。 @syuilo 氏が2014年から開発し、2018年にActivityPubに対応しました。

更新した

Misskeyのビルド方法がかなり変わったため、初版の姿は影も形もありません。

Let's install!

公式の記事で十分ですが、一応すべてのコマンドとつっかかったところをまとめてみます。
https://github.com/syuilo/misskey/blob/master/docs/setup.ja.md

そもそもどうやって動くのか

MisskeyはNode.jsで動き、MongoDBとRedisが必要です。
つまり静的ホスティングは無理なので、お金をかけて自宅サーバーを建てるかVPSを借りる必要があります。

環境

純粋なlUbuntu 18.04 LTS
ここでは一般ユーザー(ユーザー名:yuza)を使用しているものとします。
また、自宅サーバーでの実行を想定し、CloudflareをDDNSとして利用し、リバースプロキシとしてCaddyを利用します。
Misskeyをlocalhost:8080でホストします。使うドメインはmiss.keyとします。
家でもサーバーを建てられるように記事が書かれています(というか建てたとき実行したコマンドを書いています)。
VPSなどを利用しているときはもう少し楽をすることができるでしょう。

ユーザー

Misskeyを実行するときには専用のユーザーで実行するほうがよいでしょう。以下のように設定します:
bash
sudo adduser --disabled-password --disabled-login misskey

misskeyに切り替えるときはsudo su - misskey、戻るときはsu - yuzaを実行します。
この記事ではこの2つを適宜切り替えていく必要があります。

サーバーにアクセスできるように

まずはサーバーにアクセスできるようにします。

サーバーに外からアクセスできるように

通常の家庭の環境ではサーバーを立てても外部からアクセスできません。
アクセスを許可するよう設定します。
VPSを借りている場合は不要です。

ルーターを設定

「静的IPマスカレード」を設定する
プロトコルはUDP&TCP両方、変換ポートと宛先ポートを443,80それぞれ同じに設定。宛先IPアドレスをサーバーのLAN内のアドレス(192.168...)に設定

ファイアウォールの設定

(yuzaで実行)

sudo ufw enable
sudo ufw allow 80
sudo ufw allow 443

サーバーを再起動

Node.js

NVMでnode.jsを導入します。

(yuzaで実行)

wget https://raw.githubusercontent.com/creationix/nvm/master/install.sh
mv install.sh /home/misskey/

(misskeyで実行)

bash install.sh

出力された最後の3行を実行する

nvm install node

参考 http://blog.mobnia.com/installing-node-with-nvm-on-a-debian-server/

MongoDB

(yuzaで実行)

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list
sudo apt update
sudo apt remove curl
sudo apt autoremove
sudo apt install mongodb-org

curlを削除しているのはこの記事のような問題があるためとりあえず手っ取り早く削除してしまっています。
また、1つめのコマンドは変更されるので公式記事を一回確認してください。

インストールが完了したので、MongoDBを起動します。

sudo service mongod start

Misskeyに必要な設定を行います。
ここでした設定は記憶しておいてください。

まず、Mongo全体の管理者を設定し鍵をかけます。
ここではユーザー名をadmin, パスワードをkanrishaとします。

mongo
use admin
db.createUser({user: "admin", pwd: "kanrisha", roles: [{role: "userAdminAnyDatabase", db: "admin"}]})
exit

/etc/mongodb.confを設定します

/etc/mongodb.conf
auth = true

mongodを再起動します

sudo systemctl restart mongod 

Misskeyで利用するデータベースを設定します。
データベース名をmisskey, Misskeyでログインするユーザーのユーザー名をsyuilotan, パスワードをkawaiiとします。

まずは先ほど鍵をかけたので認証します

mongo
use admin
db.auth("admin", "kanrisha")

データベースmisskeyを使うようにし、ユーザー情報を登録します

use misskey
db.users.save({dummy: "dummy"})
db.createUser({user: "syuilotan", pwd: "kawaii", roles: [{role: "readWrite", db: "msiskey"}]})

参考 https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/

Redis

(yuzaで実行)

sudo apt install redis

いまのところ、パスワードを設定するとだめみたいなので(Misskeyのバグ)、設定しません。

色々なダウンロードや設定をする

必要なパッケージをインストールします(yuzaで実行)

sudo apt install git build-essential

公式の記事をそのまま実行していきます。
(misskeyで実行)

git clone -b master git://github.com/syuilo/misskey.git
cd misskey
git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)
npm install

オプション

公式の記事から転載しています。

reCAPTCHAトークン

reCAPTCHAを有効にする場合、reCAPTCHAトークンを取得する必要があります。 https://www.google.com/recaptcha/intro/ にアクセスしてトークンを取得してください。

VAPIDキーペアの生成

ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります:
(misskeyで実行)

npm install web-push -g
web-push generate-vapid-keys

Caddy

かんたんにHTTPSサーバーを建てることができるCaddyを利用します。(完全に好みです!)

wget https://caddyserver.com/download/linux/amd64?plugins=tls.dns.cloudflare&license=personal&telemetry=off
mkdir caddy
tar -xzf caddy*.tar.gz -C caddy
sudo cp caddy/caddy /usr/local/bin
sudo chown root:root /usr/local/bin/caddy
sudo chmod 755 /usr/local/bin/caddy
sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

一回動くかどうか試してみます

mkdir proxy
cd proxy

Caddyfileを作成し例えば次のように編集します

Caddyfile
miss.key {
  tls {
    dns cloudflare
  }
  gzip
  header /files Cache-Control "public, max-age=31536000, immutable"
  header /assets Cache-Control "public, max-age=31536000, immutable"  
  proxy / localhost:8080 {
    transparent
    websocket
  }
}

CloufFlareに関する情報の変数を付加してCaddyを実行してみます

CLOUDFRALE_EMAIL=... CLOUDFLARE_API_KEY=... /usr/local/bin/caddy

doneと言われたらOK

(yuzaで実行)

caddy/init/linux-systemd/caddy.service[Service]の下にさきほどの変数を以下のように書き足す

caddy.service
Environment=CLOUDFLARE_EMAIL=...
Environment=CLOUDFLARE_API_KEY=...

また、「User」「Group」をmisskeyと書き換える

caddy.service
User=misskey
Group=misskey

必要なファイルをコピー・作成・権限を変更

sudo cp caddy/init/linux-systemd/caddy.service /etc/systemd/system/
sudo chown root:root /etc/systemd/system/caddy.service
sudo chmod 644 /etc/systemd/system/caddy.service

sudo mkdir /etc/caddy
sudo chown -R root:root /etc/caddy
sudo cp proxy/Caddyfile /etc/caddy/
sudo chown root:root /etc/caddy/Caddyfile
sudo chmod 644 /etc/caddy/Caddyfile

sudo mkdir /etc/ssl/caddy
sudo chown -R root:misskey /etc/ssl/caddy
sudo chmod 0770 /etc/ssl/caddy

サービスを開始

sudo systemctl daemon-reload
sudo systemctl start caddy.service
sudo systemctl enable caddy.service

ログを確認

journalctl --boot -u caddy.service

Your sites will be served over HTTPS automatically using Let's encrypt. と表示されればOK

参考 https://caddyserver.com/tutorial/beginner
参考 https://github.com/mholt/caddy/tree/master/dist/init/linux-systemd
参考 https://qiita.com/motiakoron/items/e39320b5f66f07bcf9fb#web%E6%8E%A5%E7%B6%9A%E3%81%BE%E3%82%8F%E3%82%8A

Misskeyの設定ファイルを書く

(misskeyで実行)

cd misskey
cp .config/example.yml .config/default.yml

テンプレートをdefault.ymlとしてコピーしたので、先ほどまで設定した色々な情報を基にdefault.ymlを編集します。

ビルドする

(misskeyで実行)

misskeyのディレクトリに移動して

npm run build

正式な環境では先頭にNODE_ENV=productionをつけてビルドしたほうがよさそう
yes we can

Misskeyを起動する

npm start

さきほどNODE_ENV=productionをつけた場合は同じようにする

MisskeyをDaemonとして実行する

bashで実行すると出力が溜まってえらいことになるので、サービスを作ります。

/etc/systemd/system/misskey.service
[Unit]
Description=Misskey daemon

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

[Install]
WantedBy=multi-user.target
/home/misskey/start.sh
#!/bin/bash
. /home/myapp/.nvm/nvm.sh
npm start

(yuzaで実行)

sudo chmod +x /home/misskey/start.sh
sudo systemctl daemon-reload
sudo systemctl enable misske
sudo systemctl start misskey

これでMisskeyがサービスとして起動するはずです。Misskeyの状態はsudo systemctl status misskeyで調べることができます。

参考 https://gist.github.com/joepie91/73ce30dd258296bd24af23e9c5f761aa