Lightsail導入完成版2024 | SlackのオープンソースクローンMattermostをAWS Lightsailに導入して爆安で使う

Mattermost公式で用意されているDockerでAWS Lightsailで稼働させた手順書です。

- Lightsailインスタンスで Mattermost/Nginx/PostgreSQL すべてを稼働させます
- $10プランで動作させているので爆安で使えます

## Lightsail インスタンス作成

### Lightsail > Create Instance
https://lightsail.aws.amazon.com/ls/webapp/home/instances

### 設定
Select a platform: **LINUX**
Select a blueprint: **OS Only** & **Ubuntu 22.04 LTS**
Enable Automatic Snapshots: **Yes**
Choose a time of day when you'd like us to attempt your snapshot: **03:00** + **JST(GMT+9)**
Select networking type: **Dual Stack**
Select a size: **$5 USD per month**(1 GB Memory, 2 vCPUs Processing, 40 GB SSD Storage, 2 TB Transfer)
Identify your instance: ***適当な名前を***

### Pending -> Running になるのを待機してください

### Networking設定 > StaticIPの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/8931600b-c7ff-96af-af02-250d273fb2e9.png)
**Attach static IP** を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/92292c0d-4bc3-ba26-0560-272d5521d362.png)

**適当なIP名** をつけて **Create and attach**

### Networking設定 > Firewall に https追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/f2cb7b6f-fd82-79b2-6a12-a00bd058e48d.png)

## DNSの設定

**Route53**にMattermost用のAレコードを作成して先ほどのStaticIPを設定してください

## インスタンスの設定

参考ドキュメント: 
- https://docs.mattermost.com/install/install-docker.html


### Docker環境構築

```
sudo apt update
sudo apt upgrade -y
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/de029793-6dbf-5b3d-97a6-7a14431499b6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/27e89e6f-1e4b-a39d-8c36-badfb14ff6a7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/3b6e07aa-fe16-61ee-c2d0-7476cd40ff78.png)

```
sudo reboot
```

```
sudo apt install docker.io -y
sudo systemctl start docker
```

### docker-compose導入

aptでは**v2**がインストールできないので手作業でインストールします
```
dubuntu@ip-172-26-14-228:~$ docker-compose
Command 'docker-compose' not found, but can be installed with:
sudo snap install docker          # version 24.0.5, or
sudo apt  install docker-compose  # version 1.29.2-1
See 'snap info docker' for additional versions.
```

参考資料: https://github.com/docker/compose/releases

```
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.7/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
```

## Mattermost導入

```
cd ~
git clone https://github.com/mattermost/docker
cd docker
```

設定ファイルの作成
```
cp env.example .env
vi .env
```

```diff:.env
# Domain of service
- DOMAIN=mm.example.com
+ DOMAIN=mm.tech4u.dev

# Container settings
## Timezone inside the containers. The value needs to be in the form 'Europe/Berlin'.
## A list of these tz database names can be looked up at Wikipedia
## https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
- TZ=UTC
+ TZ=Asia/Tokyo
RESTART_POLICY=unless-stopped
```

必要なディレクトリの作成とパーミッションの付与
```
mkdir -p ./volumes/app/mattermost/{config,data,logs,plugins,client/plugins,bleve-indexes}
sudo chown -R 2000:2000 ./volumes/app/mattermost
```

新しい証明書とキーを作成します
```
bash scripts/issue-certificate.sh -d <YOUR_MM_DOMAIN> -o ${PWD}/certs
```
- `<YOUR_MM_DOMAIN>`を`.env`の`DOMAIN`に書き換えてください。
- メールアドレスが聞かれるので入力
- 利用規約等に同意してください

証明書が作成されていることを確認してください

```
$ sudo ls ./certs/etc/letsencrypt/live/
README <YOUR_MM_DOMAIN>
```
- もし`<YOUR_MM_DOMAIN>`が`<YOUR_MM_DOMAIN>-00001`のようになっていたらリネームしてください


証明書とキーを含めるために、.env ファイル内の次の行のコメントアウト／コメント解除してください

```diff:.env
- CERT_PATH=./volumes/web/cert/cert.pem
+ #CERT_PATH=./volumes/web/cert/cert.pem
- KEY_PATH=./volumes/web/cert/key-no-password.pem
+ #KEY_PATH=./volumes/web/cert/key-no-password.pem
#GITLAB_PKI_CHAIN_PATH=<path_to_your_gitlab_pki>/pki_chain.pem
- #CERT_PATH=./certs/etc/letsencrypt/live/${DOMAIN}/fullchain.pem
+ CERT_PATH=./certs/etc/letsencrypt/live/${DOMAIN}/fullchain.pem
- KEY_PATH=./certs/etc/letsencrypt/live/${DOMAIN}/privkey.pem
+ KEY_PATH=./certs/etc/letsencrypt/live/${DOMAIN}/privkey.pem
```

## 起動

```
sudo docker-compose -f docker-compose.yml -f docker-compose.nginx.yml up -d
```

`sudo docker compose`となっていますが`sudo docker-compose`で

## 日本語に切り替え
ここからは WebUIでの作業です

システムコンソールにアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/9fd9c1b7-c0f5-c424-62e0-d75578e486b0.png)

言語を変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/6a3c00b4-8255-728b-5726-b6e0811b382d.png)

## SMTP機能の設定
参考記事: https://docs.mattermost.com/configure/smtp-email.html

AWS SESを準備する

- **AWS SES**へアクセス
- メニューから**SMTP設定**選択
- **SMTP 認証情報の作成** ボタン
- **SMTP のユーザーを作成**して以下をメモ
    - IAM ユーザー名
    - SMTP ユーザー名
    - SMTP パスワード
- **SESコンソール**に戻り以下をメモ
    - SMTP エンドポイント
    - TLS ラッパーポート
- Amazon SES > 設定: ID から IDの作成
    - ID タイプ: ドメイン
    - ドメイン名に適切なドメインを入力する

Mattermostを設定する

- Send Email Notifications: true
- Notification Display Name:　お好きな名前を
- Notification Email Address: AWS SESで設定したドメインのアドレスを

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/022b6e1e-f7a9-10d7-c7a9-4b8869403bd0.png)

先ほどAWS SESで設定した情報をすべて入力してください。
- SMTPサーバー: SESのSMTPサーバー
- サーバーポート: TLS ラッパーポートから選択(たぶん465 または 2465)
- SMTP認証を有効: 有効
- SMTPサーバーユーザー名: 先ほどSESで作成したSMTPユーザ名(IAM名ではありません)
- SMTPサーバーパスワード: 先ほど作成したもの
- 接続のセキュリティー: TLS
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/8e827ff7-a466-2394-0074-b6b832e4e724.png)

保存してください

次にテストをしてください。以下で完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/666e3ed5-3c73-49e4-7eb7-72c0bc436340.png)

## モバイルアプリへの通知の設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302078/ff1ea106-7cca-5f17-9f70-a0fb63b812e9.png)

**プッシュ通知を有効にする**で、**iOSとAndroidアプリに通知を送信するには、TPNS接続を使用してください**を設定してください

## ファイルストレージの設定: ローカルから**AWS S3**へ移行する

**AWS S3** にてバケットを作成する
- **リージョン:**  `ap-northeast-1`
- バケットタイプ: **(まま)** 汎用
- **バケット名:**  `tech4u-mattermost`
- オブジェクト所有者: **(まま)** ACL 無効 
- このバケットのブロックパブリックアクセス設定: **(まま)** パブリックアクセスをすべて ブロック
- バケットのバージョニング: **(まま)** 無効にする
- 暗号化タイプ: **(まま)** Amazon S3 マネージドキーを使用したサーバー側の暗号化 (SSE-S3)
- バケットキー: **(まま)** 有効にする

**AWS IAM**ユーザの作成してアクセスキーを作成する
- **ユーザ名:**  `tech4u-mattermost-s3-iam`
- **ポリシーを直接アタッチする:** `AmazonS3FullAccess`

作成した**AWS IAM**ユーザのアクセスキーを作成する
- **ユースケース:** `AWS コンピューティングサービスで実行されるアプリケーション`
- アクセスキーとシークレットアクセスキーをメモる

Mattermostのシステムコンソールの**ファイルストレージ**を設定変更する

| 設定キー                                   | 設定値                | 備考                                       |
|-------------------------------------------|----------------------|----------------------------------------------|
| ファイルストレージシステム                       | **Amazon S3**            |                            |
| ローカルストレージディレクトリー                   | ./data/              | 変更しない                                |
| 最大ファイルサイズ                         | 100                   | 変更しない                                   |
|内容によるドキュメント検索を有効にする|有効|変更しない|
|ZIPファイル内の文書の内容を検索可能にする|**有効**||
| Amazon S3バケット名                         | **作成したS3のバケット名**   |                                    |
|Amazon S3 Pathプリフィックス||変更しない|
| Amazon S3リージョン                          | **ap-northeast-1**       | S3作成時のリージョン                                    |
| Amazon S3アクセスキーID                   | ***********       | IAMユーザ作成時のアクセスキー    |
| Amazon S3 エンドポイント                       | s3.amazonaws.com     | 変更しない                                   |
| Amazon S3 Secret Access Key               | ***********       | IAMユーザ作成時のシークレットアクセスキー     |
| Amazon S3シークレットアクセスキー       | 有効                 | 変更しない                                  |
| Amazon S3のデバッグを有効にする               | 無効                | 変更しない                                  |

保存して接続テストする

再起動する