CentOS7.6でGROWIを動かしたときの手順メモ

# 背景

下記みたいな面倒を減らしたいという動機がありました。

* その彼が困ってるやつ、10秒でやれる方法あるから教えたいけど時間がない。誰か教えてあげて。
* 調べるのが面倒で質問してきたんだろうけど、回答するときに改めて調べ直すからこっちの手も止まるんだよ。
* 議事録はあのNASのあのディレクトリ掘りまくったところに・・・
* 仕様書はあのsvnのあの辺の配下に・・・

と、必要な情報があったり無かったり、特定の人に依存していたり、よくない状況が続いていました。
みんなが気軽に情報を発信できて、検索できると上手くいきそうなイメージがあったので、GROWIを試してみることにしました。やるならしっかり運用に載せたいので、とりあえず動かして、機能を確認します。上手く使って楽になれると嬉しい。

# 書くこと
CentOS7.6でGROWIをインストールして、最初のアカウント作成画面まで確認したので、その手順を残します。
今回は、GROWIに必要なものを1つずつインストールしていきます。
docker-composeを使うと楽らしいので、今度使ってみます。

# Growiを選んだ理由

* オンプレで動かせるので、弊社が持つクラウドへの謎の警戒心に阻まれない。
* Markdownで書けるから[ネ申Excel](https://oku.edu.mie-u.ac.jp/~okumura/SSS2013slide.pdf)を量産しなくて済む。
* オープンソース
* 分かりやすい情報がたくさんある。
* なんとなくCrowiより活発そう

GROWIについては以下の情報が詳しい。

[GROWI.org - Markdown で書けるオープンソースの Wiki システム](https://growi.org/)
[最強のWiki「Crowi」のフォーク、「GROWI(旧crowi-plus)」を公開した話](https://qiita.com/yuki-takei/items/5df9601039ccfc1df01f)

# 環境

VirtualBox上のCentOS7.6
WEBサーバとしてインストール後、SSHで接続できる状態。
あと、firewallとSELinuxも無効にした。この辺ちゃんとやらねば・・。
→firewallはちゃんと設定できた

実際に運用するときは適当なマシンを探してきて使います。



# インストール

[GROWI DocsのUbuntuへのインストール](https://docs.growi.org/ja/guide/getting-started/ubuntu-server.html)を参考にします。
今回は全部rootでやりました。練習です。実際は適切なユーザでやるべきです。

## GROWIを動かすためにインストールしたものリスト

[GROWI Docs](https://docs.growi.org/ja/)にもリストあります。
基本的にこれらをインストールしていく作業です。

* node.js 8.15.0
* npm 5.6.0
* yarn 1.13.0
* MongoDB 3.6
* OpenJDK 1.8.0_191
* Elasticsearch 5.6
* git 1.8.3.1 ←growiをgithubからcloneする時に。無かったので。
* growi 3.3.8


## node.js

node.jsのバージョン8.x（DO NOT USE 9.x、だそうです）
やりかたはここを参照しました。
https://github.com/nodesource/distributions#installation-instructions-1

curlでインストール用のスクリプトを取ってきて実行（スクリプトの中身はあんまり見ていない）。

```shell-session
# curl -sL https://rpm.nodesource.com/setup_8.x | bash -
```

するとインストール？には成功しつつ、↓のようなことを言われる。

```bash
## Run `sudo yum install -y nodejs` to install Node.js 8.x LTS Carbon and npm.
## You may also need development tools to build native addons:
     sudo yum install gcc-c++ make
## To install the Yarn package manager, run:
     curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
     sudo yum install yarn
```
言われた通りに、yumでインストール

```shell-session
# yum install -y nodejs
```

```shell-session
# node -v
v8.15.0
```
良し。

## npm

nodeをインストールしたのでnpmもいけるはず。

```shell-session
# npm -v
6.4.1
```

指定された5.xじゃない。このままいけるかもしれないけど、気になるので5.6をインストール。

```shell-session
# npm install -g npm@5.6.0
~
# npm -v
5.6.0
```

良し。

## yarn
nodeインストール時、スクリプトに言われた通りに。

```shell-session
# curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | tee /etc/yum.repos.d/yarn.repo
# yum install yarn
# yarn -v
1.13.0
```

良し。

## MongoDB

MongoDBは3.x系。インストール方法は下記を参照した。
https://docs.mongodb.com/v3.6/tutorial/install-mongodb-on-red-hat/

yumでインストールするためにリポジトリを追加。

```shell-session
# vi /etc/yum.repos.d/mongodb-org-3.6.repo
```

↑で開いたファイルに↓の内容を記載する。

```/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/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc
```

インストールとバージョン確認

```shell-session
# yum install -y mongodb-org
# systemctl start mongod.service
# mongo
MongoDB shell version v3.6.10
```

良し。

## OpenJDK

yumのリポジトリを探してインストール後、バージョン確認。

```shell-session
# yum search java-1.8.0-openjdk
# yum install java-1.8.0-openjdk-devel

# java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
# javac -version
javac 1.8.0_191
```

良し。

## Elasticsearch

Elasticsearchのインストール方法はこちらを参照した。
https://www.elastic.co/guide/en/elasticsearch/reference/5.6/rpm.html

公開鍵のインストール。

```shell-session
# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
```

リポジトリ追加→インストール

```shell-session
# vi /etc/yum.repos.d/elasticsearch.repo
```

リポジトリ追加。ファイルに↓の内容を書き込む。

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

インストール。

```shell-session
# yum install elasticsearch
```

個人用の場合、ElasticsearchのJavaヒープ最小・最大は256MBで十分らしいので設定。
初期値は2gだった。

```/etc/elasticsearch/jvm.options

-Xms256m
-Xmx256m
```


systemctlリロード後、自動起動の設定と起動。さらにプラグイン2つ追加。

```shell-session
# /bin/systemctl daemon-reload
# /bin/systemctl enable elasticsearch.service

# [root@growi ~]# systemctl start elasticsearch.service 
# [root@growi ~]# systemctl status elasticsearch.service 

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

## git

普通にインストールできた。

```shell-session
# yum install git
# git --version
git version 1.8.3.1
```

よしよし。

## GROWI

ついにGROWIをインストール。

githubから、 /opt/growi にcloneしてくる。

```shell-session
# git clone https://github.com/weseek/growi /opt/growi
```

タグからバージョンを選んでブランチをチェックアウトして使う。

```shell-session
# cd /opt/growi
# git tag -l
v3.3.6
v3.3.7
v3.3.8

# git checkout -b v3.3.8 refs/tags/v3.3.8
# git branch
  master
* v3.3.8
```

yarnでインストール
[WEBサイト](https://yarnpkg.com/lang/ja/)がちょっとかっこいいyarn。

```shell-session
# cd /opt/growi
# yarn

[5/5] Building fresh packages...
Done in 151.78s.
```

良し。


# 起動確認

## インストールした内容の確認
ここまででインストールができたので、起動して確認。
↓のコマンドでひとまず起動。

```shell-session
# cd /opt/growi
# MONGO_URI=mongodb://localhost:27017/growi ELASTICSEARCH_URI=http://localhost:9200/growi npm start
```

ブラウザでアクセスして確認。

```http
/* xxxにサーバのIPアドレス */
http://xxx.xxx.xxx.xxx:3000/
```

どうやら動いてる！
<img width="512" alt="スクリーンショット 2019-02-11 0.37.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/264709/893a6bd1-bc1d-6467-f8c7-71f56b8cb146.png">

## systemctlで起動させる設定

systemctlから起動/停止するように。

```shell-session
# vi /etc/systemd/system/growi.service
```

書き込む。WorkingDirectoryはインストール（=git clone）した場所を指定するところ。

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

[Service]
WorkingDirectory=/opt/growi
EnvironmentFile=/etc/sysconfig/growi
ExecStart=/usr/bin/npm start

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

MongoDBのIPなどをメンテナンス。

```shell-session
# vi /etc/sysconfig/growi
```

以下の内容を環境に応じて記載する

```/etc/sysconfig/growi
PORT=3000
NODE_ENV=production
PASSWORD_SEED="`openssl rand -base64 128 | head -1`"
MONGO_URI="mongodb://localhost/growi"
ELASTICSEARCH_URI="http://localhost/growi"
FILE_UPLOAD=local
```

systemctlから起動。再びブラウザで見れたら成功！

```shell-session
# systemctl start growi.service 
```

## 自動起動の確認。

rebootして自動起動できるかを確認。

```shell-session
# reboot
```

reboot後、ブラウザでGROWI開けない。
<img width="394" alt="スクリーンショット 2019-02-11 21.19.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/264709/4c6d55db-a0ed-414c-14ee-77d73212d659.png">


自動起動してるかどうか確認。

```shell-session
# systemctl status growi
● growi.service - Growi
   Loaded: loaded (/etc/systemd/system/growi.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
```

起動してなかった。
設定を確認。

```shell-session
# systemctl is-enabled growi.service 
disabled
```

設定し忘れてた。
自動起動を設定と確認。

```shell-session
# systemctl enable growi.service 
Created symlink from /etc/systemd/system/multi-user.target.wants/growi.service to /etc/systemd/system/growi.service.
# systemctl is-enabled growi.service 
enabled
```

今度こそ。reboot後に自動起動確認。

```shell-session
# systemctl status growi.service 
● growi.service - Growi
   Loaded: loaded (/etc/systemd/system/growi.service; enabled; vendor preset: disabled)
   Active: active (running) since 月 2019-02-11 22:05:31 JST; 3min 26s ago
 Main PID: 3566 (npm)
   CGroup: /system.slice/growi.service
           ├─3566 npm
           ├─3740 npm
           ├─3781 node /opt/growi/node_modules/.bin/env-cmd config/env.prod.js node src/server/app.js
           └─3787 node src/server/app.js
```
良し。

でもまだブラウザで開ない。接続が拒否されました。
firewall止めると動いた。

```shell-session
# systemctl stop firewalld.service
```

せっかくなのでfirewallのほうも設定しておく。
ここ参考というか真似させていただきました。
https://qiita.com/yuki476/items/122bd5cc10355ce02b68
だいたい同じ内容を書いてしまっていたことに気がつく・・・自分用メモだからまあ良いです。

```shell-session
$ firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources: 
  services: ssh dhcpv6-client growi
```

ブラウザからのアクセスもOK.
再reboot後も大丈夫。

できた！


# 最後に

さあ使うぞ。
docker-composeのほうも、時間を見つけて使ってみたい。