Ubuntu
misskey

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

なにこれ

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

いいところ

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

まだまだなところ

  • 圧倒的!人手不足!
  • Misskeyサーバ同士で相互接続できない :cry:
  • 開発途上のため、メンテナンスが行き届いていない/動かない機能あり(elasticsearchとか)
  • たまに動かない(ほんとぉ? :thinking:)

⇒ 君もインストールして開発者になってよ!!あとカンパもしよう!(ダイマ)

本記事は
公式ビルドガイド
Misskeyインスタンスを開設したかった
を参考にして作成しました。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系なので、現状は古くてダメです。

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

node.js環境

続いてnvmを利用してnode.jsとnpmを一気にインストールします。
パッケージ管理外で入ってくるので、インストール後は.bashrc等でPATHを読ませる必要あり。

$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
$ source ~/.bashrc
$ nvm --version

バージョンが表示されれば、正しくインストールされています。

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

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

きっとここまでは楽勝。

imagemagickのビルド

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

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

ソースコードのダウンロード

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

$ 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の順で
それぞれのディレクトリに移動し、以下のコマンドを実行。
何かエラーが出ていないか、最終行当たりを確認しておきましょう。

$ ./configure
$ make
$ sudo make install

imagemagickのインストール

最後は親玉のImageMagickです。

$ ./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である場合、ライブラリを読み込めていません。
うまくいってないフォルダにて

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

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

$ ./configure
$ grep -e "--with-png" -e "--with-jpeg" config.log

と実行し、結果を確認しましょう。
jpeg,pngが有効になっていることを確認次第、installしていきます。

$ make clean all
$ sudo make install
$ 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 *でキーを確認できます。
今は何も登録していないので、中身が空というメッセージが出てくれば正常です。

$ redis-cli
127.0.0.1:6379 >

mongoDB

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

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

misskey用DB名:misskeydb

とします。

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

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

/etc/mongodb.conf
auth = true

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

sudo systemctl restart mongodb
sudo systemctl status mongodb

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

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

Misskey本体のインストール

ソースコードのダウンロード

$ cd path/to/install/misskeybinary
$ git clone https://github.com/syuilo/misskey.git
$ cd ./misskey

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

$ npm install

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

設定

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

$ cp .config/example.yml .config/default.yml

あとはvimなりnanoなりemacsなりでdefault.ymlを編集していきましょう。

APIキーまわり

reCAPTCHA

こちらのサイトを参考にキーを入手し、default.ymlに記載しましょう。
ドメイン名を正しく入れてあげないとreCAPTCHAが機能しないので要注意。

ServiceWorker

$ 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 -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
  }
}

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

.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本体のビルドです。

$ NODE_ENV=production npm run build

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

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

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

起動テスト

$ 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サーバ同士で接続できなかったりと課題はありますが…素直に成長が楽しみです。
発展の一助になれば幸いです。