Rocket.ChatをSnapでデプロイ、本番運用してみた

## 概要

- 筆者は研究室の情報システム担当である
- Slackを使っていたが、3ヶ月で消える仕様をどうにかしなくてはならなくなった
- MattermostとRocket.Chatを比較し、後者を採用したので引き継ぎを兼ねて記録する

## Mattermostとの比較

採用の決め手となったのは、モバイルアプリへのPUSH通知のサポートだった。Mattermostでは本番に耐えうるPUSH通知をサポートしておらず、面倒な設定がある。

インストールはどちらも簡単で、一つのコマンドでインストールからサーバー立ち上げができる。Mattermostでは困った時にフォーラムの方が助けてくれたので、運用の手間は同じくらいだと思う。

## LightSail整備

### インスタンス起動

今回はLightsailを採用した。予算枠が明朗なのと、将来的にEC2にグレードアップできるみたいなのでとりあえずはLightsailで運用していく。

OSはUbuntu22.04を選択した。
![Ubuntu22.04を選択しているインスタンス起動画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1623593/2114bead-7063-5467-2c1e-86102bcb4888.png)

プランは10$のインスタンスを選択。
RocketChatは頑張ればラズベリーパイでも動くらしいので、とりあえずこれを使ってみる。
これ以下だとSSH接続の際に固まってたりして少し不安だった。

![10$のインスタンスを選択している様子](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1623593/f3af6249-0428-4911-1bb5-da8805152f2f.png)

SSHキーを登録して、`~/.ssh/`に登録しておく。必要なら`~/.ssh/config`も書き換える。

### 設定

**最初にSSH接続をする前に**IPアドレスの固定化を行う。最初に割り振られているIPアドレスは公開されているけど、そのままではHTTPでアクセスができない。

NetworkingタブからAttach static IPを押して、固定IPを手に入れる。
ちなみに固定IPはアタッチされている間は無料。

![IPアドレスの設定画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1623593/2ac3de80-72fe-4996-6f35-3f5ff8cfce31.png)

最初の設定ではポート443が空いていないため、同じくNetworkingタブからAdd ruleを選択してTCP443を追加する。

![IPアドレスの設定画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1623593/8e4b9ad0-dea1-17c1-9d2b-c6028d557fff.png)

## DNS設定

後述するTLS設定にドメインが必要になるので、ドメインの登録をしておく。
どのレジストラを使っているかや、サブドメインを使用するかなどでやり方は異なると思う。
そのドメインがRocket.Chat専用であれば、LightsailのDNSに任せても良い。
今回は`chat.example.com`のようにサブドメインを使用したため、Aレコードを登録した。

## Rocket.Chatをデプロイ

### 公式ページ通りにデプロイ

公式ページではDockerかsnapによるデプロイが推奨されている。
今回はSnapを使ってデプロイしていく。[^snap]

```sh
sudo snap install rocketchat-server
snap get rocketchat-server
```

これだけで立ち上がっている。試しに`LightsailのIP:3000`にアクセスすると、Rocket.Chatが立ち上がっているのがわかる。

### TLS設定

HTTPSの設定もコマンドで設定できる。[^ssl]

```sh
sudo snap set rocketchat-server siteurl=https://<your domain>
sudo systemctl enable --now snap.rocketchat-server.rocketchat-caddy 
sudo snap restart rocketchat-server
```

少し待つと再起動され、`https:chat.example.com`でRocket.Chatにアクセスできる。

## Rocket.Chatのバックアップ設定

とてもありがたいことに、Rocket.Chatはバックアップも簡単なコマンドで行うことができる。

```sh
sudo service snap.rocketchat-server.rocketchat-server stop
sudo snap run rocketchat-server.backupdb
sudo service snap.rocketchat-server.rocketchat-server start
```

これを自動化し、毎日3時に自動でバックアップができるようにしたいと思う。
バックアップ先はS3を選択した。何かの拍子でLightsailのインスタンスを削除しそうで怖いからである。

下記スクリプトを適当なディレクトリに保存する。

```sh:backup.sh
# backup rocketchat
sudo service snap.rocketchat-server.rocketchat-server stop
sudo snap run rocketchat-server.backupdb
sudo service snap.rocketchat-server.rocketchat-server start

# find the latest backup file
backupFile=`find /var/snap/rocketchat-server/common/backup/ -mtime -1 -regex "/var/snap/rocketchat-server/common/backup/rocketchat.*" | head -1`
if [ -z "$backupFile" ]; then
    echo "No backup file found"
    exit 1
fi

# send backup file to AWS S3
aws s3 cp $backupFile s3://your-S3/rocketchat-`date +%Y-%m-%d`.tar.gz
```

Rocket.Chatの停止時間はおよそ30秒である。
これが毎日３時に動くように、Cronを設定する。

```sh:シェル
crontab -e
```

```:立ち上がったエディタ
0 18 * * * bash path/to/backup.sh
```

UTCで計算しているので、18時になっている。本当はJSTにした方がいいんだと思う。

## その他

### SSHのポート変更

さまざまな記事で書いてあるため、やり方はここでは書かない。
今回は大学のネットワークが22番以外を許可していなかったため、設定を見送った。

### Rocket.Chatの設定諸々

通知設定はRocket.Chatサーバーを[Rocket.Chat](https://cloud.rocket.chat/)に登録すると使える。

## まとめ

だいぶ端折ったため、追記できたら追記する。

何か間違っていたら編集リクエストやコメントお待ちしています。


[^snap]: https://docs.rocket.chat/deploy/prepare-for-your-deployment/rapid-deployment-methods/snaps
[^ssl]: https://docs.rocket.chat/deploy/prepare-for-your-deployment/rapid-deployment-methods/snaps/auto-ssl-with-snaps