RocketChatをCentOS(EC2)にInstallする　Install編


# 前段
・私が所属する会社は無償版でSlackを使用している
・有償版に切り替えたい（個人的な考え・願望）
・但しSlackの利用方法や利用率から考えると有償版に切り替える具体的な説得材料に欠ける
・比較対象として[Rocket.Chat](https://rocket.chat/)が上がった

# 作業前提
・AWS環境に作ります
・ドメインを保持してRoute53でホストゾーンを管理しています
・ほんとはコンテナでやりたかったんだけどガチャガチャ触れる自信なしなのでOSに直Install

# 記載粒度
・VPCやEC2の作成にはあまりにも触れません

# 作業開始
## インスタンス選定
[minimum-requirements](https://rocket.chat/docs/installation/minimum-requirements/#vps-minimal)

```
Single core (2 GHz)
1 GB RAM
30 GB of SSD
```
考えた結果：
・t3.micro(バースト無制限は無効化)
・これで足りなかったらあとでインスタンスタイプ変える
・作業用にEIPはつけておく
・サービスとして待ち受けるのはALB想定
 
### 事前準備

```bash

sudo su -
# パッケージ周りは最新に
yum update -y
# timeZoneは変えておく
timedatectl set-timezone Asia/Tokyo
# 検証だから一切悩まない(#2019/07/22 リンクを編集していたため実体に修正）
sed -i "s/SELINUX=enforcing/SELINUX=disable/g" /etc/selinux/config
reboot
```

ここからは基本的に[centosへのinstall手順](https://rocket.chat/docs/installation/manual-installation/centos/)に従って進めます。

```bash
sudo su -
# mongoのrepoを追加する
cat << EOF | sudo tee -a /etc/yum.repos.d/mongodb-org-4.0.repo
[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
EOF
# Node.jsのinstall準備ぽい
curl -sL https://rpm.nodesource.com/setup_8.x | bash
# コンパイラとmongoとNode.jsのinstall
yum install -y gcc-c++ mongodb-org nodejs
# epelのrepo追加とGraphicsMagickというものをinstallする
yum install -y epel-release && sudo yum install -y GraphicsMagick
# nodeのパケージマネージャ使ってinheritsとnというものを入れておるが全然わかんないな。
npm install -g inherits n && n 8.11.4
```
### RocketChat本体の投入

```bash

sudo su -
# 多分install用であると思われるtargzの取得
curl -L https://releases.rocket.chat/latest/download -o /tmp/rocket.chat.tgz
# /tmpに展開
tar -xzf /tmp/rocket.chat.tgz -C /tmp
# ようやくinstall。ぎょうさんWARNIGが出るが見てないふり（ERRORじゃなきゃ焦らないしERRORでも諦めるから大丈夫）
cd /tmp/bundle/programs/server && npm install
# 多分Buildしたものをopt下に配置してるんだと思う
mv /tmp/bundle /opt/Rocket.Chat
# 実行ユーザの整理とかプロダクトのディレクトリの権限整理とか
useradd -M rocketchat && usermod -L rocketchat
chown -R rocketchat:rocketchat /opt/Rocket.Chat
# 自動起動スクリプト配置
# ここ自分だと/usr/libの方に置くんだけど、こういうものなのかとか少し悩む
cat << EOF | tee -a /lib/systemd/system/rocketchat.service
[Unit]
Description=The Rocket.Chat server
After=network.target remote-fs.target nss-lookup.target nginx.target mongod.target
[Service]
ExecStart=/usr/local/bin/node /opt/Rocket.Chat/main.js
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=rocketchat
User=rocketchat
Environment=MONGO_URL=mongodb://localhost:27017/rocketchat?replicaSet=rs01 MONGO_OPLOG_URL=mongodb://localhost:27017/local?replicaSet=rs01 ROOT_URL=http://localhost:3000/ PORT=3000
[Install]
WantedBy=multi-user.target
EOF

# サービス全般設定
# 何番でmongoがlistenするかは知らないけど、多分DefaultPortなのだろう。
# ROOT_URLは直で受けないから、とりあえずそのままでもいいだろう。
# この辺はサービスあげてから再度見直し。
vi /usr/lib/systemd/system/rocketchat.service
====
MONGO_URL=mongodb://localhost:27017/rocketchat?replicaSet=rs01
MONGO_OPLOG_URL=mongodb://localhost:27017/local?replicaSet=rs01
ROOT_URL=http://your-host-name.com-as-accessed-from-internet:3000
PORT=3000
====

# mongoの設定ぽいけど何かはわからん。いやなんとなくはわかるよ、なんとなくは。
sed -i "s/^#  engine:/  engine: mmapv1/"  /etc/mongod.conf
sed -i "s/^#replication:/replication:\n  replSetName: rs01/" /etc/mongod.conf

```

### ようやく起動

```bash

sudo su -
# monogの自動起動有効化と起動
systemctl enable mongod && systemctl start mongod
# 一応ポート確認
netstat -anp | grep mongo
# まじでわからん。調べてもない。だから成長しない。
mongo --eval "printjson(rs.initiate())"
# ようやく本体起動
systemctl enable rocketchat &&  systemctl start rocketchat
netstat -anp | grep node
```

###　繋いでみよう
上がっている。
管理者情報をなどなどを入力。

![上がった.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90505/d918e90d-1494-f084-7ec3-bc66ee474a07.png)

色々入力して、最後は「Keep　Satndalone」を選択

![死ぬときは一人.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90505/abfd9d88-96e3-060f-347d-54eecf2bdd4a.png)

表示

![Slackぽい.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90505/990989ae-e37f-73fa-e6c6-747c645252ae.png)

## ALBへの組み込みとDNS登録とTLS化
・レジストラでNSをRoute53に向けている
・CertificateManagerでサーバ証明書を発行（DNS認証）
・ALBからTCP:3000を受けられうようにEC2のSGに穴あけ
・ALBを作成、ACMから証明書を選択、ターゲットグループのポートは3000
・ALBのDNS名をRoute53に登録（A/エイリアスレコードを選択）
・ちなみにずっとMyIP（自分のPCが外に出る時のIP）をSGで開けてここまで作業してます、今更ですが。

**TLS化できました！**

![TLS!TLS!.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90505/b7ed9b18-f9d4-805f-08bb-0466e5e58374.png)

## 気になること

### サインアップ時のドメイン制限は？
・設定した記憶がない。
・どんなアドレスを使っても登録できてしまう気がする。

![これなんでもいけちゃう？.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90505/b373dbf2-e4c7-181b-b995-1850da402745.png)

### そもそもサインアップやパスワード忘れのメールはどこから飛ぶの？
・OutBound25Block外していない
・PostfixからSESへのRelayも何もしてない

### Anyで開けなきゃだよね、そこの対策は？
・Cognitoを挟む？ユーザビリティ落ちる？
・AWS WAFを手前におく？

といった気になるところを[次回](https://qiita.com/yonex_memo/items/a9869fea439f1d93dfca)に解消していこうと思います。