前段

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

作業前提

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

記載粒度

・VPCやEC2の作成にはあまりにも触れません

作業開始

インスタンス選定

minimum-requirements

Single core (2 GHz)
1 GB RAM
30 GB of SSD

考えた結果:
・t3.micro(バースト無制限は無効化)
・これで足りなかったらあとでインスタンスタイプ変える
・作業用にEIPはつけておく
・サービスとして待ち受けるのはALB想定

事前準備

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手順に従って進めます。

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本体の投入

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

ようやく起動

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

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

死ぬときは一人.png

表示

Slackぽい.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

気になること

サインアップ時のドメイン制限は?

・設定した記憶がない。
・どんなアドレスを使っても登録できてしまう気がする。

これなんでもいけちゃう?.png

そもそもサインアップやパスワード忘れのメールはどこから飛ぶの?

・OutBound25Block外していない
・PostfixからSESへのRelayも何もしてない

Anyで開けなきゃだよね、そこの対策は?

・Cognitoを挟む?ユーザビリティ落ちる?
・AWS WAFを手前におく?

といった気になるところを次回に解消していこうと思います。

TOP