Ubuntu18.04にGrowiをインストール

# 概要
Ubuntu(18.04)にGrowiをインストールした手順のメモです。

基本的には[公式手順](https://docs.growi.org/getting-started/ubuntu-server)に従います。
LAN内での使用を前提に、リバースプロキシやファイアウォールは設定していません。
あとnode.jsは単一バージョンしか入れていないので、nvm等を使用する場合はPathの設定とか必要と思います。
上から順にコピペしていけば、最低限Growiが動作する状態にできると思います。

# 必要環境
必要な環境は、[Github](https://github.com/weseek/growi)をみると以下となっている。

- node.js 8.x (DO NOT USE 9.x)
- npm 5.x
- yarn
- MongoDB 3.x
- Redis 3.x (Optional)
- Elasticsearch 5.x (Optional)
    - Japanese (kuromoji) Analysis plugin
    - ICU Analysis Plugin

# インストール
## Node.js
Node.js ver8.xを入れる。npmも同時に入る。

```
$ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
$ sudo apt install -y nodejs
$ node -v
v8.11.4
$ npm -v
v5.6.0
```
## yarn
デフォルトだとcmdtestが入っている。エラーが出る場合は削除してからインストールする。
[公式ドキュメント](https://yarnpkg.com/ja/docs/install#debian-stable)

```
$ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
$ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
$ sudo apt-get update && sudo apt-get install yarn
$ yarn -v
1.9.4
```
## MongoDB
普通にインストール可能。

```
$ sudo apt update
$ sudo apt install -y mongodb mongodb-server mongo-tools
```
サービス起動し、確認。

```
$ sudo systemctl start mongodb
$ sudo systemctl status mongodb
```
Active: active (running)となっていればOK。
自動起動を設定する。

```
$ sudo systemctl enable mongodb
```
バージョンの確認(exitで抜ける)

```
$ mongo
MongoDB shell version v3.6.3
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.3
Server has startup warnings:
  :
> exit
bye
```
## Elasticsearch
[公式ドキュメントはこちら](https://www.elastic.co/guide/en/elasticsearch/reference/5.6/_installation.html)。
aptでインストールできるようにする。
まず、java8が必要なので、入っているか確認。

```
$ java --version
Command 'java' not found, but can be installed with:

sudo apt install default-jre
sudo apt install openjdk-11-jre-headless
sudo apt install openjdk-8-jre-headless
```
入っていないといわれるので、記載されている通り入れる。

```
$ sudo apt install -y default-jre openjdk-11-jre-headless openjdk-8-jre-headless
$ java --version
openjdk version "10.0.2" 2018-07-17
OpenJDK Runtime Environment (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.1)
OpenJDK 64-Bit Server VM (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.1, mixed mode)
```
インストール先を確認し、JAVA_HOMEにjava8を設定する。

```
$ update-alternatives --list java
/usr/lib/jvm/java-11-openjdk-amd64/bin/java
/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java

$ cd /etc/profile.d/
$ sudo vi java.sh
JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
```
一度ログアウトし、JAVA_HOMEを確認する。

```
$ echo $JAVA_HOME
/usr/lib/jvm/java-8-openjdk-amd64
```

Elasticsearchのリポジトリを設定し、インストールする。

```
$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
$ echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-5.x.list
$ sudo apt update
$ sudo apt install -y elasticsearch
```
必要なプラグインを入れる。

```
$ sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji
$ sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-icu
```
起動・確認

```
$ sudo systemctl start elasticsearch
$ sudo systemctl status elasticsearch
```
※エラーになる場合は、メモリが足りていないことがある。メモリ使用量を設定する(下記は256MBの場合)

```
$ sudo vi /etc/elasticsearch/jvm.options
    -Xms256m
    -Xmx256m
```

自動起動の設定

```
$ sudo systemctl enable elasticsearch
```

動作確認

```
$ curl localhost:9200
```

## Redis
RedisとはREmote DIctionary Serverの略語で、Key-Value型のNoSQLのこと。
Elasticsearchで使用されている。詳細は[公式ドキュメント](https://www.elastic.co/jp/blog/just_enough_redis_for_logstash)を参照。

リポジトリを追加し、バージョンを確認。

```
$ sudo add-apt-repository ppa:chris-lea/redis-server
$ sudo apt update
$ sudo apt show redis-server
```

インストール

```
$ sudo apt install -y redis-server
$ redis-cli --version
$ redis-server --version
```

サービス起動し、確認。

```
$ sudo systemctl start redis-server
$ sudo systemctl status redis-server
```
自動起動を設定する。

```
$ sudo systemctl enable redis-server
```

## Growi
公式に従い、/opt/groiwにインストールする。
タグを確認し最新版のブランチを作成し、(ver3.2.1が最新でした)
yarnでインストールする。

```
$ cd /opt
$ sudo git clone https://github.com/weseek/growi
$ cd growi
$ sudo git tag -l
$ sudo git checkout -b v3.2.1 refs/tags/v3.2.1
$ sudo yarn
```

以下のようにして、起動確認を行う。

```
sudo \
NODE_ENV=production \
MONGO_URI=mongodb://localhost:27017/growi \
ELASTICSEARCH_URI=http://localhost:9200/growi \
REDIS_URI=redis://localhost:6379 \
PASSWORD_SEED=xxxx (MAX64文字のランダム文字列) \
FILE_UPLOAD=local \
npm start
```
PCの性能によるが1分程度で```[production] Express server listening on port 3000```の表示が出たら起動OK。
ブラウザで、http://serverIP:3000/ を表示し、初期ページが出ることを確認する。
※ファイアウォールが有効な場合は、Portの開放が必要です。
確認したら、Ctrl+Cで終了する。
※PASSWORD_SEEDは、パスワードの暗号化に使用されるため、変更するとログインできなくなる。一度決めたら変えないこと。

(参考) MONGO_URIの設定は、mongoを起動し表示されるログから確認可能。

```
$ mongo
MongoDB shell version v3.6.3
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.3
```
2行目の"mongodb://127.0.0.1:27017"がほしい情報。127.0.0.1はlocalhostとしても同じ。
ELASTICSEARCH_URIはわからない(^^;

### Growiの自動起動の設定
/etc/systemd/systemにxxx.serviceを作成すると自動起動サービスとして登録できる。
ファイル名(xxx)は何でもよい。

```
$ sudo vi /etc/systemd/system/growi.service

[Unit]
Description = growi
After=network-online.target mongod.service
ConditionPathExists=/opt/growi

[Service]
ExecStart=/opt/growi/growi-start.sh
Restart=no
Type=simple

[Install]
WantedBy=multi-user.target
```
Description ： 説明文、何を書いてもよい
After ： 起動順の指定。networkとmongodの起動後にスタートするよう設定
ConditionPathExists ： インストールディレクトリ
ExecStart ： 起動スクリプト
他は特に触る必要はない。

作成したファイルの権限を変更する。

```
$ sudo chown root:root /etc/systemd/system/growi.service
$ sudo chmod 644 /etc/systemd/system/growi.service
```

起動スクリプトを作成する。
growi.serviceのExecStartに設定したパスに作る。
サービスはroot権限で実行されるのでsudoは不要。

```
$ sudo vi /opt/growi/growi-start.sh

#!/bin/sh
cd /opt/growi
NODE_ENV=production \
MONGO_URI=mongodb://localhost:27017/growi \
ELASTICSEARCH_URI=http://localhost:9200/growi \
REDIS_URI=redis://localhost:6379 \
PASSWORD_SEED=xxxx (MAX64文字のランダム文字列) \
FILE_UPLOAD=local \
npm start
```
実行権限を付与する。

```
$ sudo chmod +x /opt/growi/growi-start.sh
```

デーモンを再起動しGrowiサービスの起動・確認

```
$ sudo systemctl daemon-reload
$ sudo systemctl start growi.service
$ sudo systemctl status growi.service
```
startしてから、Growiが立ち上がるのに少しかかるので、しばらくしてからstatusを確認する。
末尾に```[production] Express server listening on port 3000```の表示があればOK。

(参考)systemctlのログを見る方法

```
$ sudo journalctl -u growi -b
```

自動起動を設定する。

```
$ sudo systemctl enable growi.service
```

# メモ
データのありかなど。

- 本文  
mongodb内にある(はず)。  
バックアップやリストアは、mongoの手順通りにやればできる。

```
$ mongo
> use growi
> db.getCollectionNames()
> db.pages.find()
   ：
```

- アップロードしたファイル  
投稿した記事を開くと、ページ上部に`http://xxx.xxx.xxx.xxx:3000/5b9a12e799eea20ca1c79bdd`のようなリンクが表示されている。  
`/opt/growi/public/uploads/attachment`にリンクと同じ文字列のディレクトリが生成され、その中に保存されている。

# 参考にしたサイト
- [GROWI Docs](https://docs.growi.org/getting-started/ubuntu-server)
- [Growi(github)](https://github.com/weseek/growi)
- [CentOS7.5にGrowiをインストール](https://qiita.com/yuki476/items/122bd5cc10355ce02b68)
- [How To Install MongoDB on Ubuntu 18.04 LTS](https://www.itzgeek.com/how-tos/linux/ubuntu-how-tos/how-to-install-mongodb-on-ubuntu-18-04-lts-bionic-beaver.html)
- [systemdを用いたプログラムの自動起動](https://qiita.com/tkato/items/6a227e7c2c2bde19521c)
- [UbuntuにElasticsearchをインストールして使えるようにするまで](http://thr3a.hatenablog.com/entry/20171226/1514264253)