FedoraにGrowiをインストールする方法

最近Fedoraがマイブームなので、これまでCentOSで立てていたGrowiをFedoraで立てることにしました。

## 環境
* [Fedora](https://getfedora.org/ja/) 30 Server
* [Growi](https://growi.org/) v3.5.0

## Fedora Serverのセットアップ
インストーラーの指示に従い、普通にインストールします。
特別なことは何もしていないため割愛。


## MongoDBのインストール
Growi 3.5.0 はMongoDB 3系が必要であるためインストールして起動しておきます。
[参考: MongoDB公式ドキュメント](https://docs.mongodb.com/manual/installation/)

```
# vi /etc/yum.repos.d/mongodb-org-3.6.repo
# dnf install mongodb-org
# systemctl start mongod.service
# systemctl enable mongod.service
```
`$releasever`部分を、Fedoraの場合だと修正しないとうまく動かない模様。とりあえず7にしてみました。

```:/etc/yum.repos.d/mongodb-org-3.6.repo
[mongodb-org-3.6]
name=MongoDB Repository
#baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/
baseurl=https://repo.mongodb.org/yum/redhat/7/mongodb-org/3.6/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc
```

## Node.jsとnpmのインストール
Growi 3.5.0 はNode.js 10系とnpm 6系が必要であるためインストールします。
[参考: Node.js公式インストール手順](https://nodejs.org/ja/download/package-manager/)

```
# curl -sL https://rpm.nodesource.com/setup_10.x | bash -
# dnf install nodejs
# npm info npm versions | grep -F "6." | tail -5   ※npm6系の最新版の確認
# npm install -g npm@6.9.2
```

## yarnのインストール
Growi 3.5.0ではyarnが必要であるためインストールします。なお、バージョン指定がなかったので最新のものを入れました。
[参考: yarn公式インストール手順](https://yarnpkg.com/en/docs/install)

```
# curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
# dnf install yarn
```

## Growiのセットアップ
Growi本体をGitHubから取得して、サービスとして起動できるようになるまで作業します。今回は`/root`直下に置きましたが、ここでなきゃダメという意味ではありません。
途中でパスワード暗号化に使用するシード値を生成していますが、**バックアップからの復元に必要になるので厳重に保管しておくことを推奨します。**

```
# dnf install git
# pwd
/root
# git clone https://github.com/weseek/growi.git
# cd growi
# git ls-remote --tags | grep -F "v3.5"     ※Growi 3.5系の最新版をチェック
# git checkout refs/tags/v3.5.0
# yarn
# vi /etc/systemd/system/growi.service
# openssl rand -base64 128 | head -1        ※パスワードのためのシード値生成
ランダムな文字列
# vi /etc/sysconfig/growi
# systemctl daemon-reload
```

```:/etc/systemd/system/growi.service
[Unit]
Description=Growi
After=network.target mongod.service

[Service]
WorkingDirectory=/root/growi          ※Growiをgit cloneした場所
EnvironmentFile=/etc/sysconfig/growi
ExecStart=/usr/bin/npm start

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

生成しておいたシード値をここで使用します。

```:/etc/sysconfig/growi
PORT=3000
NODE_ENV=production
PASSWORD_SEED="ランダムな文字列"
MONGO_URI="mongodb://localhost/growi"
FILE_UPLOAD=local
```

## ファイアウォールにてポートを許可する
firewalldが有効の場合、もれなくブロックされてしまいますのでGrowiのサービスポートであるTCP:3000を許可します。

```
# firewall-cmd --add-port=3000/tcp --permanent
# firewall-cmd --reload
```

## Growiの起動
ようやく準備が整ったので早速起動します！起動には結構時間がかかるので気長に待ちます。2-3分くらい。

```
# systemctl start growi
```

問題なく起動していれば、`http://サーバIP or FQDN:3000/`にアクセスすると以下のような画面が表示されます。
管理者ユーザーを作成してログインします。
![growi-initlogin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97774/c9792808-6e4c-5f82-c954-0d815a7dae05.png)

ログインすると設定画面が表示されますので、いい感じ(適当)に設定します。
![growi-settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97774/f214587e-91b1-f9a9-8a16-945910b48fcd.png)


## Growiに全文検索機能を付ける
検索機能がなぜかデフォルトではついていない(重くなるから？)ので導入します。
Growi 3.5.0 は[Elasticsearch](https://www.elastic.co/jp/products/elasticsearch) 6系を用いて全文検索を実装している模様です。
[参考: Elasticsearch公式インストール手順](https://www.elastic.co/guide/en/elasticsearch/reference/7.2/rpm.html)

```
# systemctl stop growi
# vi /etc/yum.repos.d/elasticsearch-6.x.repo
# dnf install java-1.8.0-openjdk     ※Elasticsearchの動作にはJDKが必要です
# dnf install elasticsearch
# cd /usr/share/elasticsearch
# bin/elasticsearch-plugin install analysis-kuromoji
# bin/elasticsearch-plugin install analysis-icu
# cp -p /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
# vi /etc/elasticsearch/elasticsearch.yml
# systemctl start elasticsearch
# systemctl enable elasticsearch
# vi /etc/sysconfig/growi
# systemctl start growi
```

```/etc/yum.repos.d/elasticsearch-6.x.repo
[elasticsearch-6.x]
name=Elasticsearch repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
```

自分の環境では、Elasticsearchが起動して少し経った後に落ちてしまいました。[→ 参考ページ](https://discuss.elastic.co/t/x-pack-breaks-es-several-errors-such-as-java-io-filenotfoundexception-pipe-controller-log-8340-and-unknown-source-errors/91368/3)
X-Pack MLなる機能を無効にしたら動いたので参考として載せておきます。

```:/etc/elasticsearch/elasticsearch.yml
※最終行に追記
xpack.ml.enabled: false
```

```:/etc/sysconfig/growi
※追記
ELASTICSEARCH_URI="http://localhost:9200"
```

Growi起動後にも少し作業がありますので忘れずに実施します。
Growiの設定画面に入り、「全文検索管理」の中にある「Build Now」をクリックしてエラー表示がなければ完了です。
![growi-elasticsearch-enable.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97774/42d9ceb8-c124-66d2-3c7a-610fb9c930ed.png)


画面左上にある検索窓に検索文字を入力し、検索できることを確認します。
![growi-search.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97774/8b2b786f-fd26-424e-214b-def99640fca7.png)
検索できました。
![growi-search-result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97774/0a89c4ea-eaa9-42f0-c68a-b60e2243aac7.png)

## Growiにプラグインを導入する
ノーマル状態でも素晴らしいWikiシステムなのですが、プラグインを導入することでさらに使い勝手が良くなります。
とりあえず自分的に必須なlsx(ツリー表示)、pukiwiki-like-linker(PukiWikiのようなリンク挿入)プラグインを導入します。

```
# systemctl stop growi
# cd /root/growi   ※Growiをgit cloneした場所
# yarn add growi-plugin-lsx
# yarn add growi-plugin-pukiwiki-like-linker
# systemctl start growi
```

さっそく適当なページで試してみます。goodですね。

![growi-plugin-test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97774/470f40bd-d57d-2c3d-34c9-03d00b4e83be.png)

## バックアップとリカバリを検証する
コツコツ貯めたナレッジは非常に価値のあるものです。以下のページなどを参考にバックアップとリカバリ手順を必ず確認しておきましょう。
https://qiita.com/SkyLaptor/items/d02b702764428a08e3f5