WindowsServer2019でDockerComposeを使ってmetabaseを構築する方法

Azure使うならAppService使った方が良さそうなのですが、
今回はAzureVMを使って構築していこうと思います。

## 環境
AzureVM
OS: WindowsServer 2019-Datacenter
サイズ: Standard E2s v3

## 構成図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107518/b3ade3c6-6fd5-d285-da3f-47095bc2e7a2.png)


## DockerDesctop for Windows をインストール

https://www.docker.com/get-started

インストール後起動しておきます。

## hyper-vの設定
初期から入っていたのでパスします。
もし設定がされていなかったら下記の通りに設定を行います。

https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v


## 作業フォルダ作成
作業用フォルダを作成する。
今回はデスクトップにおいてます。

```
C:\Users\username\Desktop\metabase
```

```text:フォルダ構成
/metabase
 ├ /db
 ├ /metabase-data
 ├ docker-compose.yml
 └ dockerfile-nginx
```

## Docker-Compose.ymlを記載


```yaml:docker-compose.yml
version: "3.7"

services:
    postgres:
        image: postgres:13
        container_name: postgres
        ports:
          - "5432:5432"
        volumes:
          - ./db/postgres/init.d:/docker-entrypoint-initdb.d
          - db-data:/var/lib/postgresql/data
        environment:
          POSTGRES_USER: root       # DB USER
          POSTGRES_PASSWORD: root   # DB Password
          POSTGRES_INITDB_ARGS: "--encoding=UTF-8"
        hostname: postgres
        user: root
        restart: always

    pgadmin4:
        image: dpage/pgadmin4:5
        container_name: pgadmin4
        ports:
            - "8000:80"
        volumes:
            - ./db/pgadmin4:/var/lib/pgadmin
        environment:
            PGADMIN_DEFAULT_EMAIL: test@test.com     # pgAdmin Address
            PGADMIN_DEFAULT_PASSWORD: test  # pgAdmin Password
        hostname: pgadmin4
        links:
            - postgres
        restart: always

    metabase:
        image: metabase/metabase:latest
        container_name: metabase
        ports:
            - 3000:3000
        volumes:
            - ./metabase-data:/metabase-data
        environment:
            MB_DB_FILE: ./metabase-data/metabase.db
        links:
            - postgres
        restart: always

    nginx:
        image: nginx-tls
        container_name: nginx
        links: 
            - metabase
        volumes:
            - /Certbot/archive/sandboxmm.japaneast.cloudapp.azure.com:/etc/cert
        ports: 
            - 443:443
        restart: always

volumes:
    db-data:
        external: true
```
作業フォルダ直下に配置します。

## volume作成

```:cmd
docker volume create --name db-data
```

## dockerfileを作成しビルドする

```dockerfile:dockerfile-nginx
FROM nginx:latest
EXPOSE 443/tcp
ADD https.conf /etc/nginx/conf.d/default.conf
```
作業フォルダ直下に配置します。

```:cmd
docker build -t nginx-tls -f dockerfile-nginx .
```
作業フォルダに移動してビルドします。

## ドメイン取得
AzureVMの場合は基本に表示されているDNS名のところから取得できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107518/5cd0ff2a-5127-04d1-4de2-8c72753e82d3.png)

ここで設定したものは次の証明書の設定で使用するので覚えておきましょう。


## 証明書の設定

管理者としてcmdを起動

https://certbot.eff.org/lets-encrypt/windows-nginx

こちらに記載している方法に従います。
1.https://dl.eff.org/certbot-beta-installer-win32.exeでWindows用のCertbotインストーラーの最新バージョンをダウンロードします。
2.下記を実行して質問に答えていきます。
1つの目質問でドメインを聞かれるはずです。先ほどのDNS名を書きます。

メールアドレスを設定したい方は`-m yourmail@mail.com`のオプションを追加して実行してください。

```
certbot certonly --standalone
```


## Windows Defenderファイアウォールの設定
サーバーマネージャー >> ツール >> セキュリティが強化されたWindowsDefenderファイアーウォール　を開きます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107518/45251e1e-3d1e-478d-3a5d-87a1dbf943fc.png)
左側の受信の規則をクリックして、右側の新しい規則をクリック

規則の種類：ポート
プロトコルおよびポート：TCPの443と80
操作：接続を許可する
プロファイル：ドメイン、プライベート、パブリックすべてにチェック
名前：適当な名前を付けてください

## スタートアップの設定

### DockerDesktopの設定

Start Docker Desktop when you log in にチェックが入ってることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107518/7da65a35-6543-57c6-8fe7-1bc7e81f46ec.png)

### 自動サインイン設定
ファイル目を指定して実行から netplwiz　を実行
ユーザーがこのコンピューターを使うにはの部分のチェックを外す
パスワードを求められるので入力
最後にOKで終了

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107518/e364289d-98c8-8246-84f0-f3d2ac722240.png)

ただこの方法だとDockerの起動にこけたらそのままになってしまうので他にいい方法がないか
模索してます。

## シャットダウンの設定

たぶんシャットダウン時にDockerDesktopがいい感じにしてくれるとは思うのですが
念のためbatファイルを仕込みます。

```bat:shatdown.bat
cd C:\Users\<username>\Desktop\metabase
docker-compose stop
```

ファイル名を指定して実行からgpedit.mscを実行

コンピューターの構成 >> Windowsの設定 >> スクリプト(スタートアップ/シャットダウン) を開きます。
シャットダウンをクリックします。

ここで先ほど作成したbatファイルを設定します。