【v11~】Misskey入れてみる備忘録

# 前書き

以前、Misskey v10までのバージョンのものを書いていましたが、v11以降からPostgresqlを使用する関係で、インストール手順が変更となりました。v11以降のインストール方法を説明します。

v10以前のものはこちら： https://qiita.com/YuzuRyo61/items/7105d16ac75c78899f1c

なお、この記事はUbuntu及びDebian系列をベースに解説しています。

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

これはもうお決まり手順。

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

アップグレード後は再起動推奨で。

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

Misskeyは、Node.js(v12以降。**LTS版を推奨**)、PostgreSQL(v10以上)、Redisが必須。オプションとしてElasticsearchもありますが、今回は割愛。yarnが推奨されているため、yarnも導入します。

あとはリバースプロキシとして、nginxを使用します。

※Misskeyのバージョンによって対応するNode.jsなどが異なる場合がありますので、[公式のセットアップガイド](https://github.com/misskey-dev/misskey/blob/develop/docs/setup.ja.md)をご覧ください。

## Node.js

Node.jsのインストール方法はお好きな方法でインストールしてください。
自分は"n"を勧めています。（バージョン変更が容易なため）

### n (おすすめの方法)

Linuxで手軽にNode.jsのバージョン管理ができる"n"をインストールします。

```bash
sudo apt install nodejs npm
sudo npm i -g n
sudo n lts
node -v # バージョン確認のためのコマンド。最新のLTSのバージョンになっていればOKです。
```

### Nodesource

Nodesource経由でNode.jsをインストールします。CentOSなど、別のパッケージ管理システムのLinuxの場合は[こちらのリポジトリのREADMEを参照してみてください。](https://github.com/nodesource/distributions#readme)

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

## yarn

npmでインストールします。

> ```bash
> npm install -g yarn
> ```
> https://yarnpkg.com/getting-started/install

※権限エラーでうまく行かないときは`sudo npm install -g yarn`とやるとうまくいくかもしれません。

## PostgreSQL

デフォルトのリポジトリから。特に事情がなければ最新のバージョンをお勧めします。

```bash
sudo apt install postgresql-12 postgresql-server-dev-12
```

## Redis

これもこのままデフォルトのリポジトリから引っ張っておｋ。

```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


## その他

build-essentialを導入します。

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

## 仕上げ

サービスを起動しておきます。Misskeyの準備が整ってからでも問題ありません。

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

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

起動用のユーザーを指定しておきます。ユーザー名は任意です。

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

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

リポジトリをクローンして最新のリリースにチェックアウトします。

**※従来のリポジトリURLから変更になっているのでご注意ください。**

```bash
git clone -b master https://github.com/misskey-dev/misskey.git
cd misskey
# バージョンは https://github.com/misskey-dev/misskey/releases/latest を参照してください
git checkout <12.x.x>
```

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

yarnでパッケージをインストールします。yarn.lockが置き換わらないようにしておきます。

```bash
yarn install --pure-lockfile
```

# Step 5. 設定ファイル作成

example.ymlをコピーしてdefault.ymlを作成します。

```bash
cp .config/example.yml .config/default.yml
```

中身のコメントに従ってdefault.ymlを設定します。

# Step 6. ビルド

Misskeyをビルドします。これには時間がかかる場合があります。

```bash
NODE_ENV=production yarn build
```

# Step 7. データベース初期化

データベースにテーブルをセットアップします。

```bash
yarn run init # yarn run migrate でも構いません
```

# Step 8. 起動チェックとsystemdに登録

以下のコマンドで起動確認ができます。確認できたら`Ctrl-C`でサーバーを停止します。

```bash
NODE_ENV=production yarn start
```

## systemdに登録

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

[Service]
Type=simple
User=misskey # ユーザー名が違う場合は変更してください
ExecStart=/usr/local/bin/npm start # 環境に合わせて変更することがあります
WorkingDirectory=/home/misskey/misskey # 環境に合わせて変更してください
Environment="NODE_ENV=production"
TimeoutSec=60
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=misskey
Restart=always

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

設定したら`systemctl daemon-reload`を実行して、サービスリストを更新してください。

`systemctl enable misskey`でサーバー起動時にmisskeyが稼働します。

`systemctl start misskey`で起動しておきます。

# Step 9. nginxリバースプロキシ設定

最後にnginxのリバースプロキシを設定します。

nginxの設定で読める場所であれば、ファイル名は任意です。
以下の内容をコピーして、変更が必要な部分をしてください。

```nginx:/etc/nginx/conf.d/misskey.conf
# 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; # 本番用FQDNに変更(default.ymlで設定したものと同様のもの)

    # For SSL domain validation (Let's EncryptのHTTPによる検証で必要であれば入れておいてください。)
    root /var/www/html;
    location /.well-known/acme-challenge/ { allow all; }
    location /.well-known/pki-validation/ { allow all; }

    # HTTPからHTTPSへ変更するためのリダイレクト
    location / { return 301 https://$server_name$request_uri; }
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.tld; # 本番用FQDNに変更(default.ymlで設定したものと同様のもの)
    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; # 変更

    # SSL protocol settings
    ssl_protocols TLSv1.2 TLSv1.3; # 特に事情がなければ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 / {
        # Misskeyが作動しているローカルのアドレスに変更（ポートなどを弄ってなければそのままで可）
        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;
    }
}
```

> 元ファイル: https://github.com/misskey-dev/misskey/blob/develop/docs/examples/misskey.nginx

設定したら`systemctl restart nginx`で変更を適用します。
(`sudo nginx -t`で設定に問題がないかを検証することを推奨します)

---

これで設定は完了です :tada: 

# Ex. アップデートするには

Misskeyのアップデートがリリースされたら、まずはMisskeyを設置しているディレクトリまで移動します。そして以下のコマンドを上から順に入力します。

```bash
git fetch
# 最新のバージョンのタグを入力。最新バージョンは https://github.com/misskey-dev/misskey/releases/latest を参照してください
git checkout <12.x.x> 
yarn install --pure-lockfile
NODE_ENV=production yarn build
yarn migrate
```

以上のコマンドを入力し、エラーがでなければMisskeyのサービスを再起動(`sudo systemctl restart misskey`)します。これでアップデートは完了です。