EC2上のAmazon Linux 2へgrowiインストール

## １．GROWI環境構築目標
- AWS EC2環境へインストールします
    - OS : Amazon Linux 2
    - インスタンス : micro
    - 必須：ElasticSearch, Mongo
    - 別途：PlantUML
- 利用想定
    - 最大３名以下のクローズドな使い方
- インストール方法
    - Dockerを使わずに、インストールしていきます
    - `レガシーですが、それじゃ面白くないので...`
    - インストール中は、スペックを上げて作業しています(`small`)
        - ビルドとかメモリ使いそうだし

## １－１．インストール時のバージョン
| name     | version        |
| -------- | -------------- |
| OS       | Amazon Linux 2 |
| GROWI    | 3.6.3          |
| node.js  | 12.14.0        |
| openjdk  | 1.8.0_222      |
| MongoDB  | 3.6.16         |
| PlantUML | 1.2019.13      |
| Graphviz | 2.42.2         |

## ２．まずはGROWI Docsを見ながら流れを確認
- CentOS 7環境へのインストール手順があるので、基本はそれを踏襲します
    - [CentOS \| GROWI Docs](https://docs.growi.org/ja/admin-guide/getting-started/centos.html#centos)
- バージョンは、同じく公開されてる`docker-compose`のバージョンを踏襲していきます
- このマニュアルでは、PlantUMLはインストールせずに外部のサーバーを指しているので、別途自前でインストールします
    - この内容は公式マニュアルに記載されていない内容ですので、動作保証はしません

## ３．node.js, npm, yarnのインストール
- NodeJS 12.xのインストール
    - 公式マニュアルの手順をそって入れます
    - [GitHub \- nodesource/distributions: NodeSource Node\.js Binary Distributions](https://github.com/nodesource/distributions#installation-instructions-1)
- 事前準備
    - `yum install gcc-c++ make`
- node.jsのインストール
    - `curl -sl https://rpm.nodesource.com/setup_12.x | sudo bash -`
    - `sudo yum install nodejs`
- yarnのインストール
    - `curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo`
    - ` sudo yum install -y yarn`


## ４．Elasticsearchのインストール
- OpenJDKのインストール
    - `sudo yum install java-1.8.0-openjdk`
- Elasticsearch 6.xのインストール
    - [Install Elasticsearch with RPM \| Elasticsearch Reference \[6\.8\] \| Elastic](https://www.elastic.co/guide/en/elasticsearch/reference/6.8/rpm.html)
- 事前準備
    - `sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch`
    - `sudo vi /etc/yum.repos.d/elasticsearch.repo`
        - レポジトリ先の設定
        - [Install Elasticsearch with RPM \| Elasticsearch Reference \[6\.8\] \| Elastic](https://www.elastic.co/guide/en/elasticsearch/reference/6.8/rpm.html#rpm-repo)
- インストール
    - `sudo yum install elasticsearch`
- 割り当てメモリの設定
    - `sudo vim /etc/elasticsearch/jvm.options`
- サービス化と自動起動
    - `sudo systemctl start elasticsearch`
    - `sudo systemctl enable elasticsearch`
    - `sudo systemctl status elasticsearch`
- プラグインのインストール
    - `sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji`
    - `sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-icu`

## ５．MongoDBのインストール
- 事前準備
    - `sudo vi /etc/yum.repos.d/mongodb-org-3.6.repo`
        - レポジトリ先の設定
        - [Install MongoDB Community Edition on Red Hat Enterprise or CentOS Linux — MongoDB Manual](https://docs.mongodb.com/v3.6/tutorial/install-mongodb-on-red-hat/#configure-the-package-management-system-yum)
- インストール
    -  `sudo yum install -y mongodb-org`
- サービス化と自動起動
    - `sudo systemctl start mongod`
    - `sudo systemctl enable mongod`
    - `sudo systemctl status mongod`
- MongoDBへの認証設定とユーザーの作成、パスワードの設定
    - 長いので先駆者記事を参照
    - [GCPにGrowiを構築する 06 MongoDBのユーザ設定 \| Qrunch（クランチ）](https://qrunch.net/@yakoi/entries/PbvEAsXuPth6lpfJ)
    - 設定したユーザー・パスワードは、growi起動時のオプションで利用します

## ６．PlantUMLのインストール
- JREのインストール
    - `sudo yum install java-1.8.0-openjdk-devel`
- graphvizのインストール
    - 事前情報
        - `2.30`以後のバージョンがcentos向けにパッケージされていない
        - 調べる限り、2018年ごろに消えている？
        - ソースからmakeする必要
        - `2.39`, `2.40`はPlantUMLとの相性が良くないのでそれ以外
            - フォーラムによれば、`2.40.1`は直っている
    - 事前準備
        - `sudo yum install expat-devel autoconf make automake libtool libtool-ltdl yacc byacc flex bison libtool-ltdl-devel`
    - インストール（再現チェックしてません）
        - `git clone https://gitlab.com/graphviz/graphviz.git`
        - `git checkout -b 2.42.2 refs/tags/2.42.2`
        - `cd ./graphviz`
        - `./autogen.sh`
        - `./configure --prefix=/opt/graphviz`
        - `sudo make`
        - `sudo make install`
            - この対応により、PlantUMLに必要なDOTが下記に配置されます
            - `/opt/graphviz/bin/dot`
- PlantUmlのインストール
    - 事前準備
        - `sudo yum install tomcat maven`
    - インストール
        - `cd /opt/`
        - `git clone https://github.com/plantuml/plantuml-server.git`
        - `git checkout -b v1.2019.13 refs/tags/v1.2019.13`
    - コマンド実行
        - `mvn jetty:run -DGRAPHVIZ_DOT=/opt/graphviz/bin/dot`
    - サービス化
        - `sudo vi /etc/systemd/system/plantuml.service`
            ```
            [Unit]
            Description=plantuml

            [Service]
            WorkingDirectory=/opt/plantuml-server
            ExecStart=/usr/bin/mvn jetty:run -DGRAPHVIZ_DOT=/opt/graphviz/bin/dot

            [Install]
            WantedBy=multi-user.target
            ```
       - この対応によりPlantUML-serverが`localhost:8080`で立ち上がっています

## ７．GROWIの実行
- コマンド実行
    - `sudo MONGO_URI=mongodb://growiuser:password@localhost:27017/growi ELASTICSEARCH_URI=http://localhost:9200/growi PLANTUML_URI=http://localhost:8080 PASSWORD_SEED=passwordseed FILE_UPLOAD=mongodb npm start`
        - オプションとして下記を含めています
            - MongoDBの接続先(ID/PWを含む)
            - ElasticSearchの接続先
            - PLANTUML_URIの接続先
            - PASSWORD_SEEDは適当なランダム値がよい
            - FILE_UPLOADはGROWIにファイルを上げる時の保存先、S3やローカルへの設定が可
- サービス化
    - [systemd による自動起動 \| GROWI Docs](https://docs.growi.org/ja/admin-guide/admin-cookbook/launch-with-systemd.html#systemd-%E3%81%AB%E3%82%88%E3%82%8B%E8%87%AA%E5%8B%95%E8%B5%B7%E5%8B%95)
    - 接続先情報や追加のオプションは適時変更

## ８．リバースプロキシとHTTPS対応
- GROWIは`localhost:3000`, PlantUMLは`localhost:8080/plantuml`で実行しています
- これらを443で応答できるようにリバースプロキシの設定をし、証明書を適応することでHTTPS対応が行えます
- また、異なるサーバーへ一部サービスを逃がす場合はそれらもHTTPS対応しておいた方がよいかもしれません