出来るだけコピペでCrowiの環境を作りたい<CentOS7minimal>

[出来るだけコピペでCentOS7minimalの環境を作りたい - Qiita](https://qiita.com/mm_sys/items/c4f7ae2872d59c464557)

と

[出来るだけコピペでウィルスチェックをしたい<CentOS7minimal> - Qiita](https://qiita.com/mm_sys/items/8cbe7019183c26fcd228)

の続きなので、上記の記事の設定でCrowiを設置してみる。

## こんな感じに設定

- DockerではなくLinuxネイティブで。
- 「Crowi」アカウントを作ってCrowiを制御
- nvmでnode.jsの管理
- Crowiの環境変数をいじって移植性向上
- SSH接続で出来るだけコピペ

## ベースとなる使用するOS

別途記載した「出来るだけコピペでCentOS7minimalの環境を作りたい」がベース。

- 仮想OS（VMware）か直接インストール。
- OS : CentOS7 minimal
- 使用ユーザ名 : user
- Firewallは使う(ゾーンはpublic)
- SELinuxはpermissive(設定終わってから戻しておいても良いかも)
- SSH接続で各種設定可能な状態。
- SUDOの設定済み(rootから直接行うならsudoと記載している所を消す)。

## yumやwgetとか上手く動作しない場合

- **仮想OSで動作させている場合、ホスト側のセキュリティソフトでyumとかがうまく動作しない場合がある**ので、設定適宜変更。
  - 特に証明書関係のエラーが出た場合はホスト側のセキュリティソフトの影響が考えられる

## javaインストール

- ホスト側で下記URLにアクセス。

> http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

- `Accept License Agreement`を選択。
- 「jdk-8u144-linux-x64.rpm」を右クリックしてアドレスをコピー
- 下記コマンドを入力。その際に「ペースト」という所に先程コピーしたURLをペースト。

<img width="545" alt="bu5xt1u8xmxcg14i.png" src="https://qiita-image-store.s3.amazonaws.com/0/76058/b29d7352-37aa-c62e-2476-97de2c7a2e1b.png">

```commandline
# sudo curl -LO -H "Cookie: oraclelicense=accept-securebackup-cookie" "ペースト"
# sudo rpm -Uvh ダウンロードしたファイル名.rpm
# rm ダウンロードしたファイル名.rpm # ダウンロードしたファイルを消す
# 例えば
sudo curl -LO -H "Cookie: oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u144-b01/090f390dda5b47b9b721c7dfaa008135/jdk-8u144-linux-x64.rpm"
sudo rpm -Uvh jdk-8u144-linux-x64.rpm
rm jdk-8u144-linux-x64.rpm
# インストールしたら、正しくインストールされているか試しにバージョンを確認
java -version
```

## インストール

> http://qiita.com/bezeklik/items/48fe054c2df05f03f3d1

### MongoDBのインストール

```commandline
sudo cat << '_EOF_' | sudo tee -a /etc/yum.repos.d/mongodb.repo
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
_EOF_
sudo yum -y install mongodb-org && sudo systemctl start mongod && sudo systemctl enable $_

# Firewall
sudo firewall-cmd --zone=public --add-port=27017/tcp --permanent
sudo firewall-cmd --reload
```

### Redis設定

```commandline
sudo yum -y install epel-release && sudo yum -y install redis && sudo systemctl start $_ && systemctl enable $_

# Firewall
sudo firewall-cmd --add-port=6379/tcp --permanent
sudo firewall-cmd --reload
```

### Elasticsearch設定

```commandline
sudo cat << '_EOF_' | sudo tee -a /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
_EOF_
sudo yum -y install elasticsearch && sudo systemctl start $_ && sudo systemctl enable $_
# Elasticsearchのプラグイン
# これがないと検索に問題が生じる
sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji

# Firewall
sudo firewall-cmd --zone=public --permanent --add-port=9200/tcp
sudo firewall-cmd --zone=public --permanent --add-port=9300/tcp
sudo firewall-cmd --reload
```

## パッケージの更新と終了してバックアップを作成しておく。

```commandline
sudo yum clean all && sudo yum -y update && sudo shutdown -h now
```

仮想OSで設定している場合、ここまでやったら、失敗した時のために一旦仮想OSのバックアップをとって、再度起動してSSH接続する。

## crowiのインストール

CrowiとCrowiPlusのインストール方法は違う。
CrowiPlusで実行しようとしたけど、今回の条件で安定してビルドする方法が見つからなかった。(npm installが使えない。)

yum関係は、まとめて行わず1行ずつ確実にインストールしていくこと。

|行|記載内容|変更例|補足|
|---|---|---|---|
|7|...user: "crowi", pwd: "P@ssw0rd", ...|...user: "crowi", pwd: "ikQCEcbRv6P4pk4n", ...|必要に応じてパスワード変更|

```commandline
# Gitとかコンパイラ等をインストール
sudo yum -y install git gcc-c++ krb5-devel
# crowi用にユーザを作成
sudo useradd crowi
# mondojsにcrowiデータベースを追加
echo 'use crowi' | mongo
mongo crowi --eval 'db.createUser({user: "crowi", pwd: "P@ssw0rd", roles: [{role: "readWrite", db: "crowi"}]})'
mongo admin --eval "db.system.users.find()"
```

### 環境変数の登録。

[公式ページ](https://github.com/crowi/crowi/) にあるEnvironmentの内容を記載する。

|行|記載内容|変更例|補足|
|---|---|---|---|
|6|MONGO_URI="mongodb://crowi:<br>P%40ssw0rd@localhost/crowi"|MONGO_URI="mongodb://crowi:<br>ikQCEcbRv6P4pk4n@localhost/crowi"|前項で設定したパスワード|
|12|SECRET_TOKEN="qcobtYcbI...|SECRET_TOKEN="FKQ3zgDAM...|ランダムな文字列に変更。バックアップを使用する場合、この値は一致させておく必要があるので一度決めたら変更しない。|
|15|PASSWORD_SEED="gsp+6ao...|SECRET_TOKEN="ESKkas4...|ランダムな文字列に変更。バックアップを使用する場合、この値は一致させておく必要があるので一度決めたら変更しない。|

```
sudo cat << '_EOF_' | sudo tee -a /etc/sysconfig/crowi
PORT=3000
NODE_ENV=production
# データベース
# @マークは%40に置き換える。
MONGO_URI="mongodb://crowi:P%40ssw0rd@localhost/crowi"
REDIS_URL="redis://localhost:6379"
# 検索
ELASTICSEARCH_URI="http://localhost:9200"
# Cookieの鍵
# - 適当に内容を変えて下さい
SECRET_TOKEN="c579a7e6-eded-45d6-bb91-9ae3eaf1cf99"
# パスワードシードを指定
# - 適当に内容を変えて下さい
PASSWORD_SEED="8c3b7906-fb31-49b7-baf5-9d82e8cb090d"
# パスワードシードを指定させない方法
# PASSWORD_SEED="`openssl rand -base64 128 | head -1`"
# ファイルをローカルに保存。
# - ファイルのアップロード先は /home/crowi/crowi/public/uploads/
FILE_UPLOAD=local
# 数式をサポート(ベータ版らしい)。必要な場合はコメントアウト。
# MATHJAX=1
# チャートを生成する機能。（ベータ版らしい）。Mavenサーバをうまく動作させられればここを修正して使用可能に出来る。
# PLANTUML_URI=http://localhost:18080
_EOF_
```

### 「crowi」ユーザの環境内にcrowiをインストール

> http://kikuchy.hatenablog.com/entry/2013/02/14/005418

```
# ログイン
sudo su - crowi
# NVMのインストール(crowiアカウント内に設定)
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.4/install.sh | bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
# インストールしているか確認
nvm --version

# 最新版にトライしてみたい方はstableを指定
# nvm install stable
nvm install v6.11.3
# nvm alias default stable
nvm alias default v6.11.3
# npmをアップデート（なお、パッケージを全てアップデートすると、crowiが動作しない場合も有り）
npm install npm@latest -g
# ここまでnode.jsのインストール

# Crowiをインストール
git clone https://github.com/crowi/crowi.git && cd crowi
git checkout $(git tag | tail -n 1)
npm install
# Crowiインストール後にアクセスしてレイアウトが崩れる場合は、こちらも実行（実行時はcrowiアカウントであることと、作業ディレクトリに注意）。
# npm run build
exit
```

### パスを通す

```
# 一応userにもパスを通してみる
cat << "_EOF_" >> ~/.bash_profile 
export NVM_DIR="/home/crowi/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
_EOF_
```

## crowiの機能拡張用（フローチャートとか作るのに）にMavenをインストール(動作が安定しないのでコードを削除しました。)

> http://qiita.com/digdagdag/items/87fef7ce7c97be10bee1
> http://qiita.com/tukiyo3/items/67182edee4f937e7f707
> https://www.server-world.info/query?os=CentOS_7&p=initial_conf&f=3

### ユニットの設定ファイルにcrowiの登録。

```commandline
sudo cat << '_EOF_' | sudo tee /etc/systemd/system/crowi.service
[Unit]
Description=Crowi
After=network.target mongod.service

[Service]

WorkingDirectory=/home/crowi/crowi

EnvironmentFile=/etc/sysconfig/crowi
# ※バージョンによってパスが変わります
ExecStart=/home/crowi/.nvm/versions/node/v6.11.3/bin/node app.js

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

### 実行と永続化

```
sudo systemctl start crowi && sudo systemctl enable crowi

# Firewall
sudo firewall-cmd --zone=public --add-port=3000/tcp --permanent
sudo firewall-cmd --reload
## node.js用
sudo firewall-cmd --add-service=http --zone=public --permanent
## SELinux用
sudo setenforce 0
sudo firewall-cmd --reload
```

## 他に設定しておくと良いこと

### Virus対策

#### 別で記載した記事の内容が設定されている場合のみ。

[出来るだけコピペでウィルスチェックをしたい<CentOS7minimal> - Qiita](https://qiita.com/mm_sys/items/8cbe7019183c26fcd228)
で設定した`OnAccessIncludePath /home/user/`の部分を`OnAccessIncludePath /home/crowi/crowi/public/uploads/`にしてアップロードファイルを監視。
検証中だが、もしCrowiの検索がうまく出来ない場合はウィルスチェック部分に問題があるかもしれない。

```
# Clamのリアルタイムスキャンする場所の変更
sudo sed -ri 's/^OnAccessIncludePath \/home\/user\//OnAccessIncludePath \/home\/crowi\/crowi\/public\/uploads\//' /etc/clamd.d/scan.conf
# 後から作ったリアルタイムスキャンのサービスを変更
sudo sed -ri 's/^DOSSIER=\/home\/user\//DOSSIER=\/home\/crowi\/crowi\/public\/uploads\//' /root/clamavTR.sh
sudo systemctl restart clamd@realtime.service

# スキャン場所をアップロード場所に変更
sudo sed -ri 's/^SCANDIR=\/home\/user\//SCANDIR=\/home\/crowi\/crowi\/public\/uploads\//' /root/virus_scan.sh
sudo sed -ri 's/\/home\/user/\/home\/crowi\/crowi\/public\/uploads\//' /usr/lib/systemd/system/maldet.service
sudo systemctl daemon-reload
sudo systemctl restart maldet
```

### WAF

アップロードファイルの監視をするなら、WAFの設定もしてみると良いかも。

> https://www.server-world.info/query?os=CentOS_7&p=httpd2&f=8

## 動作確認・初期設定

`192.168.XX.XX:3000`のように`サーバのIPアドレス:3000`でアクセスして初期設定画面に移ればOK。

## インストール、初期設定後に必ず行うこと

インストール後はadminなユーザを作成して、**検索管理->Build Now**ボタンを押して検索を開始出来るようにすること。

## 起動に失敗したら

起動に時間がかかりすぎるとnode.jsのTimeoutが働いて、crowiがいつまでたっても起動しないことがあります。
その場合は、手動でstartをすれば動作するはずです。（別の設定をしたほうが良いかも）

```
# crowiの起動
sudo systemctl start crowi
# 動作しているかどうかチェック
sudo systemctl status crowi
```