misskeyインスタンスの生やし方

#なにこれ
最近APを歌って踊れるようになったTwitterライクなSNS
syuilo氏がメイン開発者。 -> [git](https://github.com/syuilo/misskey)
※サーバ負荷が大変なので一時的にAP受信をオフったりしているようです。
何はともあれ見てみよう　->　[misskey.xyz](https://misskey.xyz) 

いいところ

* GUIがリッチでおしゃれ
* Service Workerが使われている
* ☆以外にいろんな種類のEmoteを投げられる(プリンを投げよう :thumbsup: )
* InstallBattleがわりと楽しい
* オセロができる
* ファイルのアップロードもできる

まだまだなところ

* 圧倒的！人手不足！
* Misskeyサーバ同士で相互接続できない :cry:
* 開発途上のため、メンテナンスが行き届いていない/動かない機能あり(elasticsearchとか)
* たまに動かない(ほんとぉ？ :thinking:)
 
⇒ 君もインストールして開発者になってよ！！あと[カンパ](https://github.com/syuilo/misskey/blob/master/docs/donate.ja.md)もしよう！（ダイマ）

本記事は
[公式ビルドガイド](https://github.com/syuilo/misskey/blob/master/docs/setup.ja.md)
[Misskeyインスタンスを開設したかった](https://qiita.com/tamaina/items/d7c1a758cb6c9d3eaaa5)
を参考にして作成しました。thx all!

#環境(例)

misskey nighthike ver 0.0.4771
  commit 17f4dd69a38097d92d60829e37cacdbb27b61f94
  Date:   Fri Apr 13 14:39:08 2018 +0900

* Ubuntu16.04 Xenial(1Core / 1GB)
* 一般権限ユーザをインストール時に使用(sudo可能であること)
* mongodb 1:2.6.10-0ubuntu1
* redis-server 2:3.0.6-1
* node v9.11.1
* npm 5.8.0

git上にtagは現在はありませんが、
基本的にmasterに上がってくるものは動作するとのこと。

#動作上必要なもの
##APIキー
google reCAPTCHAトークン：ユーザ登録時に必須 Googleに貰おう
VAPIDキーペア：ServiceWorker動作に必須 マシン上で生成する必要あり

##依存関係
* mongodb  -> ナウなヤングにバカウケのNoSQL DB。攻撃が増加傾向なので、セキュリティ対策はしっかりと。
* redis -> 爆速インメモリNoSQL DB(KVS)。Mastodonでもおなじみ。
* node.js -> I/O待ち時間から解放されよう。サーバサイドのJavaScript環境。
* npm -> node.jsパッケージ管理の大定番。
* ImageMagick -> 画像処理なら任せろーﾊﾞﾘﾊﾞﾘ 

misskeyは**ImageMagick7系を要求する**ため、
Ubuntuでは現在(18/04/13)のところ野良ビルドの必要アリ。

#オプション機能(なくても動く)
* elasticsearch(検索機能向上) -> elasticsearch6系ではmappingファイルが古いため動きません
* twitterアカウントを使ったログイン -> twitter APIを貰って来る必要アリ
* GoogleMapを使った現在地情報の投稿埋め込み -> GoogleMapsAPIのAPIキーが必要

インストール後にキーを追加する等で対応できるため、本ガイドではスルーします。

#依存関係のインストール
##パッケージ
まずは必要なものをリポジトリからもらってきます。
ImageMagickはリポジトリのものが6系なので、現状は古くてダメです。

```bash
$ sudo apt install git redis-server mongodb build-essential
```

##node.js環境
続いて[nvm](https://github.com/creationix/nvm)を利用してnode.jsとnpmを一気にインストールします。
パッケージ管理外で入ってくるので、インストール後は.bashrc等でPATHを読ませる必要あり。

```bash
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
$ source ~/.bashrc
$ nvm --version
```
バージョンが表示されれば、正しくインストールされています。

nvmを利用してnode.js/npmを一括インストール。

```bash
$ nvm install v9.11.1
$ npm --version
$ node --version
```

きっとここまでは楽勝。

##imagemagickのビルド
一気にややこしくなるのがImageMagickのビルド。
パッケージマネージャの手を離れます。

①ソースコードをダウンロード
②設定を確認し				./configure
③コンパイルしてから		make
④使える場所にインストール	sudo make install
していきます。
意味がわからない人は[この辺](http://www.itmedia.co.jp/help/tips/linux/l0302.html)を読んで概要を理解してから挑みましょう。

###ソースコードのダウンロード
imagemagick.orgからソースコードを貰ってきます。
ついでにまとめて展開しておきます。バージョンはあくまで現環境の例です。

```bash
$ cd /tmp
$ mkdir ./imagemagick-sources
$ cd imagemagick-sources
$ wget https://www.imagemagick.org/download/ImageMagick.tar.gz
$ wget http://www.imagemagick.org/download/delegates/jpegsrc.v9b.tar.gz
$ wget http://www.imagemagick.org/download/delegates/libpng-1.6.31.tar.gz
$ wget http://www.imagemagick.org/download/delegates/zlib-1.2.11.tar.gz
$ find ./ -type f -name "*.tar.gz" -exec tar zxf {} \;
```

###imagemagickが要求するライブラリのインストール
あとはzlib -> libpng -> jpegsrcの順で
それぞれのディレクトリに移動し、以下のコマンドを実行。
何かエラーが出ていないか、最終行当たりを確認しておきましょう。

```bash
$ ./configure
$ make
$ sudo make install
```

###imagemagickのインストール

最後は親玉のImageMagickです。

```bash
$ ./configure
$ grep -e "--with-png" -e "--with-jpeg" config.log
```
./configureの結果がconfig.logに出力されているので、pngとjpegの機能が有効になっているか確認しておきましょう。

```:configure.log
  JPEG v1           --with-jpeg=yes             yes
  PNG               --with-png=yes              yes
```
と表示されていればOKです。`sudo make install`しましょう。
右端がnoである場合、ライブラリを読み込めていません。
うまくいってないフォルダにて

```bash
$ ./configure --prefix=/usr/lib
$ make clean all
$ sudo make install
```

してから、imagemagickのconfigureをやりなおします。

```bash
$ ./configure
$ grep -e "--with-png" -e "--with-jpeg" config.log
```
と実行し、結果を確認しましょう。
jpeg,pngが有効になっていることを確認次第、installしていきます。

```bash
$ make clean all
$ sudo make install
```


```bash
$ magick identify --version
```
インストールが成功していればDelegates(built-in)にjpeg,pngが含まれているはずです。

※ここがうまくいっていなくても画像が表示されないだけなので、
解決できないときは先に進めてしまっても問題ありません。

#データベース系の設定
##Redis
パスワード設定してあげるのが筋かと思いますが、
このバージョンでは起動時に認証情報が拾えない？らしく、PW設定していると起動処理で転んでしまいます。
ローカルホストからの接続に限定されていることを確認しておき、FWで6379番の拒否設定をきっちりしておきましょう。
PWが使えるようになったら、requirepassのコメントを外して設定しておきましょう。

```/etc/redis/redis.conf
bind 127.0.0.1
.
.

#requirepass foobared
```
動作を確認しておきます。接続できれば十分です。
`keys *`でキーを確認できます。
今は何も登録していないので、中身が空というメッセージが出てくれば正常です。

```bash
$ redis-cli
127.0.0.1:6379 >
```

##mongoDB
全体の管理者アカウントを作成し、PWを設定。

全体管理者：admin
↑のPW：hogefuga
misskey用管理者：misskeyadmin
↑のPW：fugahoi

misskey用DB名：misskeydb

とします。


```bash
$ mongo
> use admin
> db.createUser({ user:"admin", pwd:"hogefuga", roles:[{ role:"userAdminAnyDatabase", db:"admin" }]})
> exit
```

パスワード認証を有効にする

```/etc/mongodb.conf
auth = true
```

再起動して設定読み込み直し。正常起動の確認。

```bash
sudo systemctl restart mongodb
sudo systemctl status mongodb
```

Misskey用のDBとユーザを作成し、PWを設定。

```bash
$ mongo
> use admin
> db.auth("admin","hogefuga")
> use misskeydb
> db.createUser({ user:"misskeyadmin", pwd:"fugahoi", roles:[{ role:"readWrite", db:"misskeydb" }]})
> exit
```

#Misskey本体のインストール
##ソースコードのダウンロード
```bash
$ cd path/to/install/misskeybinary
$ git clone https://github.com/syuilo/misskey.git
$ cd ./misskey
```

##依存パッケージのインストール

```bash
$ npm install
```
エラーが出る場合、それぞれメッセージを読んで対処していきましょう。
自分の環境ではjqueryが入ってこなかったので`npm install jquery@3.3.1`しました。

##設定
npm run config...と言いたいところですが、若干メンテナンスされていないようなので
サンプルファイルを元に書いていきます。

```bash
$ cp .config/example.yml .config/default.yml
```
あとはvimなりnanoなりemacsなりでdefault.ymlを編集していきましょう。

###APIキーまわり
####reCAPTCHA
[こちらのサイト](https://liapoc.com/recaptcha.html)を参考にキーを入手し、default.ymlに記載しましょう。
ドメイン名を正しく入れてあげないとreCAPTCHAが機能しないので要注意。
####ServiceWorker
```bash
$ npm install web-push -g
$ web-push generate-vapid-keys >> path/to/misskey/.config/default.yml
```
あとはdefault.ymlの末尾にキーが追記されているので、vimなりn(略)で修正しましょう。

###web接続まわり
外部接続の構成ですが、misskey単体でhttp/https接続を受け付けることが可能です。
この場合、Let's Encrypt等を利用して証明書を確保し、パスを記載してあげることで動作します。

自分は[Caddy](https://caddyserver.com)大好き人間なので、リバプロ構成を選択しました。
通信の流れは以下のようになっています。
https -80 or 443-> caddy -8080-> misskey. 

この場合、misskey側はhttps設定をコメントアウトし、
urlにhttps://から始まるものを記載しておけば大丈夫です。
待ち受けポートは80,443にバッティングしないものにしておきましょう。
※ちなみにウェルノウンポート(0-1023)を指定すると面倒なことになるので、
　1024以上の値をオススメします。


おまけのcaddyファイルはこちら。あくまで設定例です。

```:/etc/caddy/Caddyfile
example01.jp {
  tls your@email.address.here 
  gzip
  header /files Cache-Control "public, max-age=31536000, immutable"
  header /assets Cache-Control "public, max-age=31536000, immutable"  
  proxy / localhost:8080 {
    transparent
    websocket
  }
}
```

ということで、以下は全体の設定例です。


```yml:.config/default.yml
# サーバーのメンテナ情報
maintainer:
  # メンテナの名前
  name: hogehoge
  # メンテナの連絡先(URLかmailto形式のURL)
  url: http://example0.co.jp

# (Misskeyを動かす)URL
url: https://example1.co.jp
# 待受ポート
port: 8080

# TLSの設定(利用しない場合は省略可能)
#https:
#証明書のパス...
#  key:
#  cert:

# MongoDBの設定
mongodb:
  host: localhost
  port: 27017
  db: misskeydb
  user: misskeyadmin
  pass: fugahoi

# Redisの設定
redis:
  host: localhost
  port: 6379
#  pass:

# reCAPTCHAの設定
recaptcha:
  site_key: 'site_key_here'
  secret_key: 'secret_key_here'

# ServiceWrokerの設定
sw:
  # VAPIDの公開鍵
  public_key: 'public_key_here'
  # VAPIDの秘密鍵
  private_key: 'private_key_here'

# Google Maps API
#google_maps_api_key: 'api_key_here'

# Twitterインテグレーションの設定(利用しない場合は省略可能)
#twitter:
#  インテグレーション用アプリのコンシューマーキー
#  consumer_key: 'consumer_key_here'
#  インテグレーション用アプリのコンシューマーシークレット
#  consumer_secret: 'secret_here'
```

#Misskey本体のビルド
さあ、ここまできたらmisskey本体のビルドです。

```bash
$ NODE_ENV=production npm run build
```

【追記(18/04/19)】：NODE_ENV=productionを付けずにビルドする方法を記載していましたが、
別バージョンだと環境差異が出来てMisskey起動後に何も表示されなくなってしまいました。
ビルド時と実行時の環境は一致させるほうがベターなようです。
【追記ここまで】

*YES WE CAN* していきましょう。
ビルドが途中で失敗し終了してしまう場合、設定が間違っているか、
npm installの何かで失敗しているか、~~masterが壊れているか~~:thinking:
エラーメッセージに従って確認してください。

多少のエラーが出ていても動くときは動くので、
`Finished 'build'`で終わっているときは動かしてみて様子をみます。

#起動テスト
```bash
$ NODE_ENV=production npm start
```
>Now listening on port 8080
http://example1.co.jp
Now processing jobs. 
 
と表示される箇所まで動けば、とりあえずは起動できています。
動かない場合はエラーを見て都度対応しましょう。
このままだとコンソールを返してくれないので、`Ctrl-C`で終了しましょう。

#Systemdのservice化
WIP...

```:/etc/sysconfig/misskey
NVM_DIR="$HOME/.nvm"
PATH=/home/misskey/.nvm/versions/node/v9.11.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
_EOF_
```

```:/etc/systemd/system/misskey.service
[Unit]
Description=Beautiful Twitter like SNS
After=network.target

[Service]
Type=simple
User=misskey
Group=misskey
EnvironmentFile=/etc/sysconfig/misskey
Environment="NODE_ENV=production"
WorkingDirectory=/home/misskey/misskey
ExecStart=/home/misskey/.nvm/versions/node/v9.11.1/bin/npm run start
TimeoutStopSec=15
Restart=no

[Install]
WantedBy=multi-user.target
```

#まとめ
UIが素敵なこと、日本人開発者であること、service workerが使われているなどなど、面白いSNSだと思います。
AP対応はごく最近のことで、まだMisskeyサーバ同士で接続できなかったりと課題はありますが…素直に成長が楽しみです。
発展の一助になれば幸いです。