らくがきちょう

なんとなく

AWS 上の CentOS7 に Growi をインストールする

Markdown で書ける高機能な Wiki である Crowi-Plus ですが、Growi として生まれ変わりました。 メジャーバージョンも 3.x 系へアップデートされていますので、改めてインストール手順をメモしておきます。 今回は CentOS7 上にインストールしました。

今回のゴール

今回、構築した環境は最終的に以下のバージョンになりました。

項目 バージョン
CentOS CentOS Linux release 7.4.1708 (Core)
ElasticSearch elasticsearch-5.6.8-1.noarch
Growi Growi-3.0.3-RC
Java java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64
MongoDB mongodb-org-3.6.3-1.el7.x86_64
Node.js nodejs-8.11.1-1nodesource.x86_64
Redis redis-3.2.10-2.el7.x86_64
Yarn yarn-1.5.1-1.noarch

AWS 上に構築する際の注意点

このメモの手順に沿って AWS 上に Growi を構築する場合は以下に留意する必要があります。

  1. SELinux による ElasticSearch のサービス起動失敗
  2. Java のメモリ不足

SELinux による ElasticSearch のサービス起動失敗

AWS の Markplace から CentOS7 をインストールすると、デフォルトで SELinux が有効化されています。 SELinux を有効化したまま今回の手順でインストールを進めると ElasticSearch が起動しませんでした。 今回は SELinux/etc/sysconfig/selinux を以下のように変更しから OS を再起動することで SELinux を無効化し、対処しました。

SELINUX=disabled

Java のメモリ不足

AWS の EC2 のモデルのうち、t2 モデルは現時点で以下のスペックで提供されています。

モデル vCPU メモリ (GiB)
t2.nano 1 0.5
t2.micro 1 1
t2.small 1 2
t2.medium 2 4
t2.large 2 8
t2.xlarge 4 16
t2.2xlarge 8 32

t2.micro を今回の手順で構築した場合、ElasticSearch が以下のエラーで起動しませんでした。

# systemctl status elasticsearch.service
● elasticsearch.service - Elasticsearch
   Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Sun 2018-04-08 01:26:54 JST; 2min 1s ago
     Docs: http://www.elastic.co
  Process: 993 ExecStart=/usr/share/elasticsearch/bin/elasticsearch -p ${PID_DIR}/elasticsearch.pid --quiet (code=exited, status=1/FAILURE)
 Main PID: 993 (code=exited, status=1/FAILURE)

Apr 08 01:26:54 growi.example.com elasticsearch[993]: OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, t...hreads=N
Apr 08 01:26:54 growi.example.com elasticsearch[993]: OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c5330000, 986513408, 0) faile...rrno=12)
Apr 08 01:26:54 growi.example.com elasticsearch[993]: #
Apr 08 01:26:54 growi.example.com elasticsearch[993]: # There is insufficient memory for the Java Runtime Environment to continue.
Apr 08 01:26:54 growi.example.com elasticsearch[993]: # Native memory allocation (mmap) failed to map 986513408 bytes for committing reserved memory.
Apr 08 01:26:54 growi.example.com elasticsearch[993]: # An error report file with more information is saved as:
Apr 08 01:26:54 growi.example.com elasticsearch[993]: # /tmp/hs_err_pid993.log
Apr 08 01:26:54 growi.example.com systemd[1]: elasticsearch.service: main process exited, code=exited, status=1/FAILURE
Apr 08 01:26:54 growi.example.com systemd[1]: Unit elasticsearch.service entered failed state.
Apr 08 01:26:54 growi.example.com systemd[1]: elasticsearch.service failed.
Hint: Some lines were ellipsized, use -l to show in full.

デフォルトでは /etc/elasticsearch/jvm.options に以下のように定義されていました。

-Xms1g
-Xmx1g

t2.micro のままでも下記のように修正すれば ElasticSearch が起動しました。 しかし、Swap が頻発してパフォーマンスが極端に低下した為、今回は t2.small へスペックを向上させることにより回避しました (t2.small に変更すればエラーが出ずに、ElasticSearch を起動出来るようになりました)。

-Xms512m
-Xmx512m

Growi が依存しているソフトウェア

現時点で Growi は以下のソフトウェアに依存しているそうです。 Growi 2.4 系では node 6.x ベースでしたが、Growi 3.x 系になって node 8.x でも動作するようになりました。 尚、ElasticSearch は現時点で 6.3 系がリリースされていますが、Growi としては 5.x 系をサポートしています。 ElasticSearch 6.x 系を使うと「インデックスが作られず、全文検索が出来ない」という不具合があるそうです。 その為、今回は ElasticSearch 5.x 系をインストールしました。

  • Dependencies
    • node 8.x (DON'T USE 9.x)
    • npm 5.x
    • yarn
    • MongoDB 3.x
  • Optional Dependencies
    • Redis 3.x
    • ElasticSearch 5.x (needed when using Full-text search)

Node.js 8.x 系のインストール

Node.js をインストールします。

curl --silent --location https://rpm.nodesource.com/setup_8.x | bash -
yum -y install nodejs

MongoDB のインストール

MongoDB をインストールします。 MongoDB の公式リポジトリを追加します。 現状で最新の MongoDB は 3.6 系でした。

cat << "_EOF_" > /etc/yum.repos.d/mongodb.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
_EOF_

追加したリポジトリから yum でインストールします。

yum -y install mongodb-org

MongoDB のインストールが完了したら起動&自動起動設定を実施しておきます。

systemctl start mongod
systemctl enable mongod

Redis のインストール

EPEL から Redis をインストールします。

yum -y install epel-release
yum -y install redis

Redis のインストールが完了したら起動&自動起動設定を実施しておきます。

systemctl start redis
systemctl enable redis

Java のインストール

Growi で全文検索機能を利用するには ElasticSearch を使います。 ElasticSearch を動作させる上で必要なので Java をインストールしておきます。

yum -y install java-1.8.0-openjdk

Elasticsearch のインストール

ElasticSearch をインストールします。 まず、GPG 鍵をインストールします。

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

ElasticSearch の公式リポジトリを追加します。

cat << "_EOF_" > /etc/yum.repos.d/elasticsearch5.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
_EOF_

追加したリポジトリから yum で ElasticSearch をインストールします。

yum -y install elasticsearch

ElasticSearch を動作させる上で以下のプラグインも必要です。

elasticsearch-plugin でインストールしておきます。

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

ElasticSearch のインストールが完了したら起動&自動起動設定を実施しておきます。

systemctl start elasticsearch
systemctl enable elasticsearch

yarn のインストール

Growi は JavaScript のパッケージ管理に yarn を使っているようです。 yarn をインストールします。

wget https://dl.yarnpkg.com/rpm/yarn.repo -O /etc/yum.repos.d/yarn.repo
yum -y install yarn

Growi のインストール

これで Growi を動作させる環境が整いました。 いよいよ Growi をインストールします。 今回は /opt/growi ディレクトリにインストールします。

cd /opt
git clone https://github.com/weseek/growi.git
cd growi
yarn

環境変数の定義

Growi が起動時に参照する環境変数/etc/sysconfig/growi に定義しておきます。

cat << _EOF_ > /etc/sysconfig/growi
PORT=3000
NODE_ENV=production
MONGO_URI="mongodb://localhost:27017/growi"
REDIS_URL="redis://localhost:6379"
ELASTICSEARCH_URI="http://localhost:9200"
#SECRET_TOKEN=
PASSWORD_SEED="`openssl rand -base64 128 | head -1`"
FILE_UPLOAD=local
_EOF_

自動起動スクリプト

今回は CentOS7 上に Growi をインストールしている為、systemd 用の設定ファイルを用意しておきます。

cat << "_EOF_" > /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
_EOF_

systemd の設定ファイルを追加した為、daemon-reload して設定ファイルを読み込み直しておきます。

systemctl daemon-reload

Growi を起動する

最後に Growi を起動&自動起動設定します。

systemctl start growi
systemctl enable growi

(/etc/sysconfig/growi でも定義していますが) デフォルトでは TCP/3000 で Listen します。 ブラウザで「http://xxx.xxx.xxx.xxx:3000」にアクセスすると Growi のログイン画面が表示されるはずです。