snapを使ったRocket.Chatの簡単インストール

対象OS : Ubuntu Server 16.04.1 LTS, Ubuntu Server 18.04.1 LTS

WebチャットアプリのRocket.Chatはバージョン0.40くらいからsnap[^1]というパッケージシステムでインストールすることができるようになりました。
これにより、DockerやMongoDBの準備なども不要で非常に簡単にインストールができます。
参考：https://rocket.chat/docs/installation/manual-installation/ubuntu/snaps

**2018/08/15追記**
2018/07/26 に Ubuntu Server 18.04.1 LTS(ubuntu-18.04.1-live-server-amd64.iso) がリリースされたので、こちらにもインストールしてみました。
結論から言うと、なんとOSインストール時に初期インストールできるようになっていました。
ただし、日本語インストールができなくなり、Englishでインストールすると、タイムゾーンがUTCになっているので、インストール後、`sudo timedatectl set-timezone Asia/Tokyo` したりする必要があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/154744/9133b6a7-9f2c-2d23-def7-2cf82218d408.png)
Rocket.Chatの他にもnextcloudやwekan, dockerなどもありました。

## 事前準備
### OSのインストール
以下からUbuntu Server 16.04.1 LTSをダウンロードし、インストールします。
https://www.ubuntu.com/download/server
私はstandard system utilitiesとOpenSSH serverにチェックを入れてインストールしましたが、両方なくてもRocket.Chatはインストール可能です。

### 最新化
```
sudo apt-get update && sudo apt-get dist-upgrade -y
```

### その他
ファイアウォールや時刻など必要に応じて導入設定します。

## Rocket.Chatのインストール
```
sudo snap install rocketchat-server
```
これだけです。
インストール完了後は以下のコマンドでサービスが正常に起動しているか確認します。

```sh
# Rocket.Chatのサービス確認
systemctl status snap.rocketchat-server.rocketchat-server.service
# MongoDBのサービス確認
systemctl status snap.rocketchat-server.rocketchat-mongo.service
```
また、`http://<サーバーのIPアドレス>:3000`にアクセスし、ログイン画面が表示されることを確認します。

## アップデート
snapは自動アップデート機能があり、現在無効にすることはできません。
新しいバージョンがリリースされると6時間以内に自動アップデートされます。
手動でアップデートする場合は以下のコマンドを実行します。

```sh
sudo snap refresh rocketchat-server
```

snapd 2.31からアップデートの時間指定(refresh.timer)ができるようになったようです。
https://snapdocs.labix.org/configuration-options/87

自動アップデートの無効化については、議論が上がってます。
どうしても自動アップデートを無効にしたい場合、ネットワークレベルでブロックできるかも。（未確認）
https://forum.snapcraft.io/t/disabling-automatic-refresh-for-snap-from-store/707

ロードマップに上がってる Parallel snap installs でバージョン固定機能とか入るといいなぁ。
https://forum.snapcraft.io/t/the-snapd-roadmap/1973

※余談ですが、go の snapのチャンネル構成を見たら(`snap info go`)、以下のようになっていました。

```sh
channels:                                    
  stable:         1.10.3        (2130) 66MB  classic
  candidate:      ↑                          
  beta:           1.11beta2     (2355) 99MB  classic
  edge:           devel-c882f4b (2496) 111MB classic
  1.10/stable:    1.10.3        (2130) 66MB  classic
  1.10/candidate: ↑                          
  1.10/beta:      ↑                          
  1.10/edge:      ↑                          
  1.11/stable:    –                          
  1.11/candidate: –                          
  1.11/beta:      1.11beta2     (2355) 99MB  classic
  1.11/edge:      ↑                          
  1.6/stable:     1.6.4         (122)  49MB  classic
  1.6/candidate:  ↑                          
  1.6/beta:       ↑                          
  1.6/edge:       ↑                          
  1.7/stable:     1.7.6         (324)  48MB  classic
  1.7/candidate:  ↑                          
  1.7/beta:       ↑                          
  1.7/edge:       ↑                          
  1.8/stable:     1.8.7         (1407) 51MB  classic
  1.8/candidate:  ↑                          
  1.8/beta:       ↑                          
  1.8/edge:       ↑                          
  1.9/stable:     1.9.7         (2117) 58MB  classic
  1.9/candidate:  ↑                          
  1.9/beta:       ↑                          
  1.9/edge:       ↑  
```

このような構成であれば、auto-updateもありがたいかもしれませんが、Rocket.Chatは `snap info rocketchat-server` で見たら現在こんな感じ。

```sh
channels:                        
  stable:    0.68.3 (1317) 213MB -
  candidate: 0.68.3 (1317) 213MB -
  beta:      ↑                   
  edge:      0.68.3 (1317) 213MB -
```

今のところ、snapへのバージョンアップは慎重に行ってくれているようですし、snapに変えて1年以上運用していて大きな問題は今のところ遭遇していませんが、たまに BREAKING CHANGES が入ってくるので、ちょっと心配・・・

**2020/03/03追記**
現在まで特に問題なく安定稼働中。
snapのchannelにtrackが追加されたようです。
https://forums.rocket.chat/t/introducing-snap-tracks/5890

`snap info rocketchat-server` で見たら現在は以下のように変わってました。

```sh
channels:
  stable:        2.4.11 2020-02-28 (1427) 267MB -
  candidate:     2.4.11 2020-02-27 (1427) 267MB -
  beta:          2.1.1  2019-10-21 (1414) 251MB -
  edge:          2.4.11 2020-02-27 (1427) 267MB -
  3.x/stable:    3.0.2  2020-02-28 (1428) 272MB -
  3.x/candidate: ↑                              
  3.x/beta:      ↑                              
  3.x/edge:      ↑                              
  2.x/stable:    2.4.11 2020-02-28 (1427) 267MB -
  2.x/candidate: 2.4.11 2020-02-28 (1427) 267MB -
  2.x/beta:      ↑                              
  2.x/edge:      ↑
```

**2020/05/13追記**
mongodbが起動エラーになる事象発生。
https://open.rocket.chat/channel/ubuntu-snap あたりで情報収集。
https://github.com/RocketChat/Rocket.Chat/issues/17628
`snap info rocketchat-server` を確認したところ、2.4.12がinstalledになっていた。
2.4.12 が問題あったようで、latest/stable のバージョンが 2.4.11に巻き戻っている。
[これ](https://github.com/RocketChat/Rocket.Chat/issues/17628#issuecomment-627618096)を参考に `sudo snap refresh rocketchat-server` して2.4.11になっていることを確認。

## 運用で気を付けていること

### バックアップを取る
毎日バックアップを取っています。
参考：https://qiita.com/bibimarujp/items/3c27b697144d08ec8cef

### リリース情報を監視する
以下をRSSに登録してリリース情報を確認しています。
https://github.com/RocketChat/Rocket.Chat/releases.atom
最近のRocket.Chatは月1回メジャーバージョンが上がっています。
snapには翌週以降に上がってきています。
安定しないと上がってこないので、マイナーバージョンが上がってからリリースされたり、メジャーバージョン自体がスキップされることもあります。

### open.rocket.chatの情報を確認する
なかなかsnapに上がってこないなー、というときはここを見に行ってみます。
https://open.rocket.chat/channel/ubuntu-snap

### サービスが上がってこない場合がある
再起動、バージョンアップ後などにサービスが上がってこない場合があります。
その場合は手動でサービスを上げます。
＃mongoが上がらなかった経験は今のところ無いです。

```sh
# サービス状態確認
systemctl status snap.rocketchat-server.rocketchat-server.service

# サービス起動
sudo systemctl start snap.rocketchat-server.rocketchat-server.service

# 起動状況確認
journalctl -u snap.rocketchat-server.rocketchat-server.service -f
```

**2018/04/11追記**
#### 事象の詳細
ログを確認したところ、以下のような事象でした。
snapアップデート時、まずmongoが再起動開始。
1秒後、serverがサービス停止。ここまで2秒。
その後、serverが6回起動リトライするが、mongoに接続できず。
最後は以下で終了。

```
snap.rocketchat-server.rocketchat-server.service: Start request repeated too quickly.
Failed to start Service for snap application rocketchat-server.rocketchat-server.
```

その間22秒。

mobgoは停止開始から停止完了まで6秒、
開始から開始完了まで19秒かかっていた。

#### 対応策1
snap.rocketchat-server.rocketchat-server.service に設定を加えようとしたが、 `# Auto-generated, DO NOT EDIT` と書かれていたので、仕方なく、外側から対応。
以下のサービスを追加して様子見。
mongoの起動完了から30秒後にserverを起動させる。

```text:delayed-start-rocketchat-server.service
[Unit]
Description=start server 30sec after mongo started
Requires=snap.rocketchat-server.rocketchat-mongo.service
After=snap.rocketchat-server.rocketchat-mongo.service
BindsTo=snap.rocketchat-server.rocketchat-mongo.service

[Service]
Type=oneshot
ExecStartPre=/bin/sleep 30
ExecStart=/bin/systemctl start snap.rocketchat-server.rocketchat-server.service

[Install]
WantedBy=multi-user.target
WantedBy=snap.rocketchat-server.rocketchat-mongo.service
```

参考：サービスの追加手順は以下。

```sh
cd /etc/systemd/system
sudo vi delayed-start-rocketchat-server.service

# 中身記載

sudo systemctl daemon-reload
sudo systemctl enable delayed-start-rocketchat-server.service
```

**2018/06/14追記**
#### 対応策2
対応策1でも動作していたが、結構ぎりぎりだったので、mongoが上がってくるまで待つように変更して様子見中。
今のところ、問題なく起動している。

```text:delayed-start-rocketchat-server.service
[Unit]
Description=start server after mongo started
Requires=snap.rocketchat-server.rocketchat-mongo.service
After=snap.rocketchat-server.rocketchat-mongo.service
BindsTo=snap.rocketchat-server.rocketchat-mongo.service

[Service]
Type=oneshot
ExecStartPre=/bin/sh -c 'while ! /snap/rocketchat-server/current/bin/mongo --eval "db.version()" > /dev/null 2>&1; do echo "wait...";sleep 1; done'
ExecStart=/bin/systemctl start snap.rocketchat-server.rocketchat-server.service

[Install]
WantedBy=multi-user.target
WantedBy=snap.rocketchat-server.rocketchat-mongo.service
```

**2019/08/13追記**
1年経つが、問題なく起動している。

### ubuntuサーバーメンテ
/bootの領域が狭い場合、放っておくとディスクフルになってアップデートが面倒になるので、定期的に掃除が必要です。

```sh
# 使用量確認
df -h /boot

# linux-image確認
dpkg --get-selections | grep linux-image

# 掃除
sudo apt-get autoremove

```

使用率が100%になって autoremove ができなくなってしまった場合、
最終手段として、/boot内のファイルを以下のような感じで古いものを手動削除して領域を空けてから autoremove します。

```sh
sudo rm linux-image-4.4.0-57-generic
```

## 留意事項
- MongoDBのポート番号は27017
- DB名はparties



[^1]: Ubuntu 16.04より新たに導入されたパッケージシステム