Misskey入れてみる備忘録(+α)【~v10】

# ⚠ 注意！
この記事は**Misskey v10(nighthike)**向けの記事です。

v11以降の記事やっと書きました（汗）： https://qiita.com/YuzuRyo61/items/aecdc6ddf2de40679c89

---
syuiloさんが開発している分散型SNS、Misskeyを入れるための備忘録兼ガイド。
公式にも載ってるけど、うち流の導入方法です。ご参考程度までに。

※環境はUbuntu Server 18.04 LTSです。*前にCentOS使ってたけどもうほぼ忘れた((*

# Step 0. 既存パッケージのアップグレード

最初にこれやっとかないとね。インストールホヤホヤのときはaptのリポジトリミラー変更を忘れずに。

```bash
sudo apt update
sudo apt upgrade -y
```

アップグレードが終わったら一回再起動するのが望ましいよ。

# Step 1. 必要パッケージのインストール

MisskeyにはNode.js、MongoDBが必須、Redisも実質必要です。Elasticsearchはスペックに余裕があれば。
ただしElasticsearchの導入はこの記事では割愛。他を当たってくださいませ。
リバースプロキシとしてnginxを使います。

## Node.js
最新バージョンのNode.jsだったら多分安定すると思うよ。NodeSourceでリポジトリを追加っ

> ```bash
> curl -sL https://deb.nodesource.com/setup_11.x | sudo -E bash -
> sudo apt-get install -y nodejs
> ```
> https://github.com/nodesource/distributions#installation-instructions

## MongoDB
4世代でも問題なっしん。このままmongodb公式リポジトリからインストールしましょう。

> ```bash
> sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4
> echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list
> sudo apt-get update
> sudo apt-get install mongodb-org
> ```
> https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/

## Redis
これはこのままUbuntuのリポジトリから引っ張っておｋ。

```bash
sudo apt install redis-server
```

## nginx
nginx公式のリポジトリから。特にこだわりはないので安定版を入れます。

> ```bash
> sudo apt install curl gnupg2 ca-certificates lsb-release
> echo "deb http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
> curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -
> sudo apt-key fingerprint ABF5BD827BD9BF62 #これは確認用。
> sudo apt update
> sudo apt install nginx
> ```
> http://nginx.org/en/linux_packages.html#Ubuntu

## その他
これらの他に必要なものとか。

```bash
sudo apt install build-essential git
```

## 仕上げ
一通り入れ終わったらサービス起動しておきます。

```bash
sudo systemctl start nginx mongod redis-server
sudo systemctl enable nginx mongod redis-server
```

# Step 2. 運用ユーザーの作成

ここは公式通りに。

```bash
sudo adduser --disabled-password --disabled-login misskey
sudo su - misskey
```

# Step 3. リポジトリクローン

misskeyのユーザーに切り替わったら次のコマンドを入力し、リポジトリをクローンして最新リリースにチェックアウトするよ。

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

# Step 4. nodeパッケージをインストール

```bash:~/misskey
npm install
```

そして気長に待つっ

# Step 5. データベースの設定

```bash
mongo
```

でmongoDBのコンソールに入るよ。入った直後なんか出てるけどあまりキニシナーイ。

んで、以下のコマンドを１行づつ。pwdとかuserとかデータベース名は適宜変えておｋ。

```
use misskey
db.users.save({dummy: "dummy"})
db.createUser({ user: "misskey", pwd: "aiChanIsMisskeyCharacter!", roles: [ { role: "readWrite", db: "misskey" } ] })
```

終わったら```exit```で抜けまーす。

# Step 6. 設定ファイル
以下のコマンドを打って編集するよ

```bash:~/misskey
cp .config/example.yml .config/default.yml
nano .config/default.yml
```

## url
運用するアドレスを入力。自分の持ってるドメインでね。

```yml:Example
url: https://yuzulia.xyz/
```

## port
nginx経由でmisskeyにアクセスする、portは3000あたりで。

```yml:Example
port: 3000
```

## mongodb
MongoDBの設定。さっき作ったユーザーとデータベース名をいれればおｋ

```yml:Example
mongodb:
  host: localhost
  port: 27017
  db: misskey
  user: misskey
  pass: aiChanIsMisskeyCharacter!
```

## redis
redisの設定。何も弄ってないのでpassはなしで問題ないはず

```yml:Example
redis:
  host: localhost
  port: 6379
  pass: null
```

設定が終わったら保存してエディタを終わらせます。

# Step 7. Build Time!
ついにビルドです。他のステップの中で一番負荷がかかる作業ですのでご注意を。

```bash:~/misskey
NODE_ENV=production npm run build
```

お茶でものんで気長に待ちましょう。スペックによりますが。

# Step 8. 起動チェック
Misskeyの動作チェックをします。

```bash:~/misskey
npm start 
```

うまく起動すればアドレスが表示されます。問題なさそうであればCtrl-Cで一回止めます。そしてsudoが使えるユーザーに戻しておきます。

# Step 9. nginxのリバースプロキシ設定
misskeyに接続するためのnginx設定をします。今回はmisskey公式リポジトリの設定を引用。変更箇所があるので適宜変えてくださいね。

```plaintext:/etc/nginx/conf.d/misskey.conf
# Sample nginx configuration for Misskey
#
# 1. Replace example.tld to your domain
# 2. Copy to /etc/nginx/sites-available/ and then symlink from /etc/nginx/sites-enabled/
#    or copy to /etc/nginx/conf.d/

# For WebSocket
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=cache1:16m max_size=1g inactive=720m use_temp_path=off;

server {
    listen 80;
    listen [::]:80;
    server_name example.tld;

    # For SSL domain validation
    root /var/www/html;
    location /.well-known/acme-challenge/ { allow all; }
    location /.well-known/pki-validation/ { allow all; }
    location / { return 301 https://$server_name$request_uri; }
}

server {
    listen 443 http2;
    listen [::]:443 http2;
    server_name example.tld;
    ssl on;
    ssl_session_cache shared:ssl_session_cache:10m;

    # To use Let's Encrypt certificate
    ssl_certificate     /etc/letsencrypt/live/example.tld/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.tld/privkey.pem;

    # To use Debian/Ubuntu's self-signed certificate (For testing or before issuing a certificate)
    #ssl_certificate     /etc/ssl/certs/ssl-cert-snakeoil.pem;
    #ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;

    # SSL protocol settings
    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;

    # Change to your upload limit
    client_max_body_size 80m;

    # Proxy to Node
    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_http_version 1.1;
        proxy_redirect off;

        # For WebSocket
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        # Cache settings
        proxy_cache cache1;
        proxy_cache_lock on;
        proxy_cache_use_stale updating;
        add_header X-Cache $upstream_cache_status;
    }
}
```

設定したら```nginx -t```で設定チェックして問題なければnginxをリロードします。

# Step 10. systemdに登録

Misskeyが自動起動するようにsystemdに登録します。

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

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

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

```sudo systemctl daemon-reload```を忘れずにっ

# Step 11. 起動

```bash
sudo systemctl start misskey
sudo systemctl enable misskey
```

# Step 12. アカウント登録・インスタンス設定
ウェブにアクセスしてアカウントを登録します。そうすると管理者権限が付与されているはずです。
あとは管理画面で適宜設定してください。

# Step 13. 仕上げ
mongoコンソールにアクセスし、以下のコマンドを入れます。Misskeyのデータベース名を入れてくださいね。

```
use misskey
db.users.find({dummy: "dummy"})
```

```db.users.find``` で先ほど設定したダミーを探します。あったら以下のコマンドを入力して削除しておきます。

```
db.users.remove({dummy: "dummy"})
exit
```

ちなみにこれをしていないと管理画面のユーザーリストの最後尾にundefinedという謎のユーザーが残ったままになるので、それを削除するためのものです。

これで終わりです🎉

# アップグレードするには？
Misskeyは不定期でリリースが入ります。その際は以下のコマンドを打てば最新版にアップグレードできます。

```bash:misskey@~/misskey
git fetch
git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)
npm install
NODE_ENV=production npm run build
```

アップグレードが終わったら```sudo systemctl restart misskey```でmisskeyを再起動します。

# +α : 藍ちゃんを入れてみよう
オマケとしてMisskey公式キャラクター、うちの子藍ちゃんを導入してみましょう。

## Step 0. MeCab導入(任意)
キーワードを覚える機能を使う場合は導入します。

予めファイルをダウンロードしておきます。

### MeCab本体
> ```bash
> tar zxfv mecab-X.X.tar.gz
> cd mecab-X.X
> ./configure
> make
> make check
> sudo make install
> ```
> http://taku910.github.io/mecab/#download

### MeCab用辞書(IPA)
> ```bash
> tar zxfv mecab-ipadic-2.7.0-XXXX.tar.gz
> mecab-ipadic-2.7.0-XXXX
> ./configure
> make
> sudo make install
> ```

インストールが終わったら```which mecab```でコマンドのフルパスを控えておきます。

## Step 1. アカウント作成
アカウントを作成します。ユーザーIDは特に問いませんが、```@ai```が望ましいです。

## Step 2. リポジトリクローン
リポジトリをクローンします。

```bash:misskey@~
git clone https://github.com/syuilo/ai
```

## Step 3. 設定
設定を行います。適宜変更してくださいね。

```json:config.json
{
	"host": "https://example.com",
	"i": "!********",
	"keywordEnabled": true,
	"reversiEnabled": true,
	"serverMonitoring": true,
	"mecab": "/usr/local/bin/mecab"
}
```

iはAPIキーを入力するのですが、これは先程作成したアカウントの設定からAPIにあるTokenをコピーすることにします。
*本来ならば望ましくありませんが・・・*

## Step 4. ビルド・起動チェック
以下のコマンドで依存パッケージのダウンロードとビルドを行います。

```bash:~/ai
npm install
npm run build
```
ビルドが終わったら起動チェックをします。

```bash:~/ai
npm start
```

Misskeyのトークから「ping」って送り「PONG!」が返ってくれれば成功です！Ctrl-Cで一回止めます。

## Step 5. 仕上げ
これもSystemdに登録します。

```plaintext:/etc/systemd/system/aimisskey.service
[Unit]
Description=Misskey ai-chan daemon

[Service]
Type=simple
User=misskey
Environment="NODE_ENV=production"
ExecStart=/usr/bin/npm start
WorkingDirectory=/home/misskey/ai
TimeoutSec=60
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=misskey
Restart=always

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

```sudo systemctl daemon-reload```からの```sudo systemctl start aimisskey```して、```sudo systemctl enable aimisskey```とすればおｋです。

これで藍ちゃんの導入は完了です🎉

# 最後に
Misskeyの機能は様々です。APIも実装されていますからアプリを作ることだってできますし、リバーシで遊んだりすることだってできちゃいます。自分好みのインスタンスを作っていってくださいね。
**GLHF!**

# 2019/04/15 追記
ついにMisskey v11がリリースされました🎉
~~この記事書き換える予定です。~~**新しく記事を作り直しますっ。**