Windowsで(VMの中に)RocketChatを立てたい

# WindowsでRocketChatを立てたい
お仕事の都合、サクッとチャット環境を構築することになったときのbash_historyを綺麗にしたやつです。

次使う誰かのために。

# 公式の手順があります。
CentOSが立った後は、以下の公式の手順も使えると思います。(この記事を書いてるときに見つけた…)
https://github.com/RocketChat/docs/tree/master/installation/manual-installation/centos
# 前提環境
* OS(物理PC): Windows10
* VirtualBox: 5.2.6
* Vagrant: 2.0.2

# 完成する環境
* CentOS(VM): 7.6 (実際に構築したときのversion。)
* RocketChat: 1.2.1 (実際に構築したときのversion。記事執筆時点では1.3.0がある模様)

(以下RocketChatのために一緒に構築する環境)

* MongoDB: 3.6
* Node.js: 8.11.4

※この２つは"特に"特定のバージョンであることが必要です。
（ちょっとずれても大丈夫だろーと思って進めるとしっかりエラーが出て時間を無駄にしました。。）
インストールするRocketChatのversionと、必要な上記のversionをしっかり確認してください。

https://github.com/RocketChat/Rocket.Chat/releases

# 手順
## 注意事項
基本的にコマンドの部分を全てコピペすればOKです。
２点だけ書き換え・確認してください。
* `***TODO_CHANGE_HOST_NAME***` (RocketChatを公開したいURLに書き換えてください。 **※必須**)
* RocketChat・Node.js・MongoDBのバージョン

## まずはVMを立てる
Windowsでの作業です。Virtualbox, Vagrantはインストール済みの前提です。
`Vagrantfile` を作成して、 `vagrant up` しましょう。

```:Vagrantfile
Vagrant.configure("2") do |config|
# Proxy
  config.proxy.http     = "http://proxy:port"
  config.proxy.https    = "http://proxy:port"
  config.proxy.no_proxy = "localhost,127.0.0.1"
# OS
  config.vm.box = "centos/7"
  config.vm.synced_folder ".", "/vagrant", type: "virtualbox"
  config.vm.network "private_network", ip: "192.168.250.250"
  config.ssh.insert_key = false
# Port forwarding
  config.vm.network "forwarded_port", guest: 3000, host: 3000
# Spec
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048"
    vb.cpus = "1"
  end
# Username
  config.ssh.username = "vagrant"
end
```

[※MacOSXではこのVagrantfileではインターネットに出れませんでした。。(別記事リンク)](https://qiita.com/yamatok/items/11a85b051dc3c7fa60a1)

## VMで作業
VMに入ります。( `vagrant ssh` )

### RocketChatに必要なもろもろのインストール
下記コマンドは、 `MongoDB:3.6` , `Node.js:8.11.4` のインストールコマンドです。別versionをインストールする場合は注意してください。

```
echo -e "[mongodb-org-3.6]\nname=MongoDB Repository\nbaseurl=https://repo.mongodb.org/yum/redhat/7/mongodb-org/3.6/x86_64/\ngpgcheck=1\nenabled=1\ngpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc" | sudo tee /etc/yum.repos.d/mongodb-org-3.6.repo
sudo yum -y install epel-release
sudo yum -y update
sudo yum install -y nodejs curl GraphicsMagick npm mongodb-org-server mongodb-org gcc-c++
sudo npm install -g inherits n
sudo n 8.11.4
```

### RocketChatのインストール
RocketChatを `/opt/Rocket.Chat/` 配下にインストールします。

下記コマンドは、 `RocketChat:1.2.1` のインストールコマンドです。以下同文。

```
cd /opt
sudo curl -L https://releases.rocket.chat/1.2.1/download -o rocket.chat.tgz
sudo tar zxvf rocket.chat.tgz
sudo mv bundle Rocket.Chat
cd Rocket.Chat/programs/server
sudo npm install
```

### もう少し
まだ起動できません。ここを飛ばして起動しようとすると
`Error: /lib64/libstdc++.so.6: version 'GLIBCXX_3.4.20' not found (required by /opt/Rocket.Chat/programs/server/node_modules/fibers/bin/linux-x64-57/fibers.node)` とか `OPLOG / REPLICASET IS REQUIRED TO RUN ROCKET.CHAT, MORE ...` とか出てくると思います。

```
sudo npm install -g node-gyp
cd /opt/Rocket.Chat/programs/server/node_modules/fibers/
sudo node-gyp rebuild --target=v8.11.4
sudo cp bin/linux-x64-57/fibers.node{,_bk} #念の為ファイルをバックアップ
sudo cp -f build/Release/fibers.node bin/linux-x64-57/fibers.node #上書き

echo -e "replication:\n  replSetName: \"rs01\"" | sudo tee -a /etc/mongod.conf
```

### 起動確認
その前にRocketChatをサービス化します。
他PCからアクセスする際のURL（Windows(物理PC)のIP等）を事前に確認して、以下のコマンドの `***TODO_CHANGE_HOST_NAME***` の部分を置き換えて実行してください。

```
echo -e "[Unit]\nDescription=The Rocket.Chat server\nAfter=network.target remote-fs.target nss-lookup.target nginx.target mongod.target\n[Service]\nExecStart=/usr/local/bin/node /opt/Rocket.Chat/main.js\nStandardOutput=syslog\nStandardError=syslog\nSyslogIdentifier=rocketchat\nUser=rocketchat\nEnvironment=LD_PRELOAD=/opt/Rocket.Chat/programs/server/npm/node_modules/sharp/vendor/lib/libz.so NODE_ENV=production MONGO_URL=mongodb://localhost:27017/rocketchat ROOT_URL=http://***TODO_CHANGE_HOST_NAME***:3000/ PORT=3000 MONGO_OPLOG_URL=mongodb://localhost:27017/local?replSet=rs01\n[Install]\nWantedBy=multi-user.target" | sudo tee /usr/lib/systemd/system/rocketchat.service
```
必要なOSユーザ（CentOS)を作成します。作成したらsudo権限をあげてください。

```
sudo useradd -M rocketchat && sudo usermod -L rocketchat
sudo chown -R rocketchat: /opt/Rocket.Chat
sudo visudo
```

rootユーザに権限付与してる行が下の方にあるので、真似て `rocketchat` ユーザにも付与します。

```:visudoで行追加
rocketchat ALL=(ALL) ALL
```

まずはDBを起動します。

```
sudo systemctl start mongod
systemctl status mongod
sudo systemctl enable mongod
mongo --eval "printjson(rs.initiate())"
```
`mongo` コマンドで `"ok": "1"` と出たことを確認してください。
次にRocketChatを起動します。

```
sudo systemctl start rocketchat
systemctl status rocketchat
sudo systemctl enable rocketchat
```
起動確認

```
curl localhost:3000
```

それっぽいのが返って来ればOKです。ただし、まだCentOS内からしかアクセスできません。

### 他のPCからアクセスできるようにする。（ファイアウォール設定）
まだCentOSでの作業です。

```
sudo systemctl start firewalld
systemctl status firewalld
sudo systemctl enable firewalld
sudo firewall-cmd --add-port=3000/tcp --zone=public --permanent
sudo firewall-cmd --reload
```

## Windowsに戻って動作確認
ようやくWindowsに帰ってきて動作確認です。

ブラウザで、 `http://***TODO_CHANGE_HOST_NAME***:3000` にアクセスして、初期設定を行ってください。

# 初期設定が終わったら

お疲れ様でした！

もし、チャットの運用・運営方法をお探しでしたら、こちらも併せて読んでいただけると嬉しいです。
[仕事でチャットを使うときにまず作るチャンネルN選](https://qiita.com/yamatok/items/753b1e9f9eea6ba19fdb)

良いチャットライフを！！