Misskey構築手順メモ

公式ページに親切丁寧にインストール手順が書かれていますが、主にそれ以外の部分についての補足的なメモです。


# 前提条件

* DNSが設定済みであること
* サーバがインターネットに接続できること
* 自分以外の第三者にも解放する場合、電気事業者の届け出が済んでいること
* Fedora Server 33 x64、Misskey v12.65.7 (検証時点のMaster) にて動作確認

# はじめに

**必ず公式マニュアルを読むこと！**

[Misskey構築の手引き](https://github.com/syuilo/misskey/blob/develop/docs/setup.ja.md)


このドキュメントでは、公式手順の推奨通り、Misskey専用ユーザを作成し、ホームディレクトリに構築することとする。
また、リバースプロキシ経由でサービスを公開するものとする。


# サーバの初期設定

諸々最新化したり、Misskey専用ユーザを作成したりしておく

```bash:一般ユーザ作業
$ sudo dnf update
$ sudo useradd misskey
$ sudo reboot
```


# PostgreSQLのインストールと初期設定

PostgreSQL は v10.x以降をインストールする。

```bash:一般ユーザ作業
$ sudo dnf install -y postgresql-server
$ sudo postgresql-setup --initdb
```
PostgreSQLをインストールし、初期化する


```bash:一般ユーザ作業
$ sudo vim /var/lib/pgsql/data/postgresql.conf
```
pgTune( http://pgtune.leopard.in.ua/ )を参考に、サーバのスペックに合ったパラメータを設定する。
バージョンよって設定値に多少差があるので、導入したバージョンを確認すること。

```bash:一般ユーザ作業
$ sudo vim /var/lib/pgsql/data/pg_hba.conf
```
必要に応じて、アクセス権限の設定を行う。

(Unix Socket経由での接続の仕方が現時点で不明のため、127.0.0.1/32に対してTCP/IPで接続できるようセットアップする)


```bash:一般ユーザ作業
$ sudo systemctl enable postgresql
$ sudo systemctl start postgresql
```
サービスの自動起動設定と起動


```bash:postgresユーザ作業
$ createuser -d misskey
$ createdb -O misskey misskey
$ exit
```
postgres(PostgreSQL管理者ユーザ)でMisskey用ユーザーを作成し、Misskey用ユーザ専用データベースを作る。
(Misskeyの初期マイグレーションにおいては`create database`が行われない？ため、データベース作成権限を与えていてもコケる)



# リバースプロキシ(Nginx)のインストールと設定

## ファイアウォールの開放

HTTP(80)およびHTTPS(443)を開放する。
以下は `firewalld` がインストールされている環境での手順
ゾーン名等は適宜読み替えてください

現在のファイアウォールの状態を表示

```bash
$ sudo firewall-cmd --list-all

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources: 
  services: ssh mdns dhcpv6-client
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
```

上記例では、`public` ゾーンがアクティブになっており、`ssh mdns dhcpv6-client` が許可されている。

HTTPとHTTPSを許可する

```bash
$ sudo firewall-cmd --add-service=http --zone=public --permanent
success

$ sudo firewall-cmd --add-service=https --zone=public --permanent
success

$ sudo firewall-cmd --reload
success


$ sudo firewall-cmd --list-all

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources: 
  services: ssh mdns dhcpv6-client http https
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
```

`public` ゾーンにて、`http https` が追加で許可された。


## SSL証明書の取得

Webサーバ用SSL証明書を取得しておく。無料のものであれば`Let's Encrypt`がおすすめです。

手順については割愛


## Nginxのインストールと動作確認

```bash
sudo dnf install -y nginx
sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.old
```
Nginxをインストールし、セキュリティのためデフォルトの設定ファイルを無効化する
（デフォルトの設定ファイルは無い場合もあるし、違う名前のこともある）

```bash
sudo vim /etc/nginx/conf.d/nginx.conf
```

公式リポジトリにあるNginx用サンプル設定ファイルを書き込む
https://github.com/syuilo/misskey/blob/develop/docs/examples/misskey.nginx

vim等で `example.tld` を 使用するドメインに置換

```text
:%s/example.tld/yourdomain.tld/g
```

SSL証明書へのパスも、正しいものに書き換える。


## Nginxの起動と自動起動設定
```bash
$ sudo systemctl start nginx
$ sudo systemctl enable nginx
```

この状態で、ブラウザから `http://yourdomain.tld` にアクセスしてみて、
`https://yourdomain.tld` に転送された上で `502 Bad Gateway` 表示になれば、ここまで問題なく構築できている。



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

Git, ffmpeg, node.js, yarn, redis 等々…

## RPM Fusion リポジトリの導入

公式サイトのインストールコマンドを使用する。
**「free」** を使用する。

https://rpmfusion.org/Configuration


## Node.js リポジトリの導入

（デフォルトで新しめのNode.jsがインストールできる環境であれば不要かもしれない）

[NodeSource Node.js Binary Distributions - Enterprise Linux based distributions](https://github.com/nodesource/distributions/blob/master/README.md#rpm)

Node.js v12.x もしくは v14.x を導入する。

```bash
curl -sL https://rpm.nodesource.com/setup_14.x | sudo bash -
```


## yarn リポジトリの導入

https://yarnpkg.com/en/docs/install#linux-tab

```bash
sudo curl -sL https://dl.yarnpkg.com/rpm/yarn.repo -o /etc/yum.repos.d/yarn.repo
```


## 各種パッケージのインストール

```bash
$ sudo yum install -y redis nodejs yarn ffmpeg make gcc-c++ git 
```


## Redisのスタートアップ起動設定と手動起動

```bash
$ sudo systemctl start redis
$ sudo systemctl enable redis
```

# Misskey本体のインストール、サービス化

公式手順の3～7 を実行してください。


# あとがき

* 自分用にメモした手順です。必要に応じて読み替えてください。
* こうしたほうがいいよ的なアドバイスを頂けると大変助かります
* 疑問点： PostgreSQL、RedisのUNIX Socket経由での接続方法
* わたしはこのあたりに生息しています： https://nagoyadon.jp/@kumasun

以上