Ubuntu Server 20.04 LTSにGROWIをインストール 

# はじめに

[公式のドキュメント](https://docs.growi.org/ja/admin-guide/getting-started/ubuntu-server.html)が古いバージョンで書かれていたため，最新版で作成．

2022/05/26
- 全文検索機能が動いていないことが発覚
[原因] 調査したところ，ElasticSearchのバージョンとGROWIのバージョンが合っていなかった
[対処] GROWIのバージョンをv5.0.5に変更
[修正箇所] 4.を修正
[参照] バージョンアップの参考サイト: [GROWI v5.0.x へのアップグレード](https://docs.growi.org/ja/admin-guide/upgrading/50x.html)
- 数式が入力できない
[対処] 起動コマンドにMATHJAX=1を追加
[修正箇所] 4.を修正

# TL;DR

Ubuntu Server 20.04 LTSにオープンソースのwikiツールである[GROWI](https://growi.org/ja/)をインストールする．
必要最低限の設定であり，ローカルネットワーク内での利用を想定している．
[Ubuntu18.04にGrowiをインストール](https://qiita.com/hawk777/items/0916024c1bd7b24904ae)を参考にして環境構築を行った.


1. Node.js 14.x, yarnをインストール
2. Elasticsearch 7.xをインストール
3. MongoDB 4.xをインストール
4. GROWIをインストール

# 1. Node.jsとnpm，yarnのインストール

[Ubuntu 20.04にNode.jsをインストールする方法 | DigitalOcean](https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-ubuntu-20-04-ja)を参考にしてインストール
```
$ cd ~
$ curl -sL https://deb.nodesource.com/setup_14.x -o nodesource_setup.sh
$ sudo bash nodesource_setup.sh
$ sudo apt install nodejs

// CHECK
$ node -v
$ npm -v
```
npmを使ってyarnをインストール
```
$ sudo npm install -g yarn

// CHECK
$ yarn -v
```

# 2. Elasticsearchのインストール

[Install Elasticsearch with Debian Package | Elasticsearch Guide [7.17] | Elastic](https://www.elastic.co/guide/en/elasticsearch/reference/7.17/deb.html)を参考にインストール

```
$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
$ sudo apt-get install apt-transport-https
$ echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list
$ sudo apt-get update && sudo apt-get install elasticsearch

// CHECK
$ dpkg -l | grep elasticsearch
```

Elasticsearch に割り当てるメモリを調整
```
$ sudo vim /etc/elasticsearch/jvm.options
// -Xms256m
// -Xmx256m
// ↑の2行を追加
```

Elasticsearchの自動起動の有効化および動作確認
```
$ sudo systemctl start elasticsearch
$ sudo systemctl enable elasticsearch

// CHECK
$ sudo systemctl status elasticsearch
```

GROWI に必要な Elasticsearch プラグインのインストール
```
// CHECK PATH OF elasticsearch-plugin
$ dpkg -L elasticsearch | grep bin | grep plugin

$ sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji
$ sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-icu
```

# 3. MongoDBのインストール

[MongoDB](https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/)を参考にインストール

```
$ wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
$ echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
$ sudo apt update
$ sudo apt install -y mongodb-org=4.4.13 mongodb-org-server=4.4.13 mongodb-org-shell=4.4.13 mongodb-org-mongos=4.4.13 mongodb-org-tools=4.4.13
```

バージョンの固定
```
$ echo "mongodb-org hold" | sudo dpkg --set-selections
$ echo "mongodb-org-server hold" | sudo dpkg --set-selections
$ echo "mongodb-org-shell hold" | sudo dpkg --set-selections
$ echo "mongodb-org-mongos hold" | sudo dpkg --set-selections
$ echo "mongodb-org-tools hold" | sudo dpkg --set-selections
```

# 4. GROWIのインストール

最新版のインストール ~~(2022/03/23時点の最新版はv4.5.15)~~ (2022/05/26時点の最新版は4系がv4.5.21, v5.0.5)
```
$ sudo git clone https://github.com/weseek/growi /opt/growi
$ cd /opt/growi

// CHECK VERSION
$ sudo git tag -l

$ sudo git checkout -b v5.0.5 refs/tags/v5.0.5
$ sudo yarn
```

# 5. 起動確認

```
$ sudo MONGO_URI=mongodb://localhost:27017/growi ELASTICSEARCH_URI=http://localhost:9200/growi \
MATHJAX=1 PASSWORD_SEED=(任意の文字列) npm start
```
数分待つと以下のように表示される．
```
> growi@5.0.5 start /opt/growi
> yarn app:server
```
http://(IP address):3000に接続して起動確認ができたら終了

# 最後に

今回はこの記事を作成するためにdockerやherokuを利用しない環境構築を行った．
それらを利用した方が楽にできると思われる．

# おまけ

別のwikiツールに移植するときなどのために，以下を参考にしてGROWIの記事をMarkdownで出力するコードを作成したいと考えている．
[Growi Pathに従ってMarkdownファイルをエクスポートする方法](https://tyablog.net/2021/03/22/growi-how-to-export-markdown-files/)