Vagrant+Dockerを使ってVM上にMattermostを立てる

## はじめに

みなさん、社内でチャットしてますか？
IT企業であれば、チャットの導入がされているのは当たり前じゃないでしょうか。

しかしながら、世にはチャットを導入していない企業もあります。
この記事はそんな~~悩ましい~~企業に勤めている方々へ、Vagrantを使ってVM環境にチャットサーバ(mattermost)を立てるVagrantfileを作成してみました。
簡単に、かつPCの環境をできるだけ汚さずチャットができるようになります。
https://github.com/ryoutoku/vagrant

私の勉強も踏まえ、Vagrantfileで作成した環境で重要か？と思う部分をやはりざっくり説明したいと思います。

注意：

* Vagrant初心者なので間違いがあればご指摘下さい。
* この方法をした結果、社内ITインフラ担当に怒られても責任は持ちません[^1]。

## 想定読者

* 簡易的にチャットサーバ導入を検討している
* 社内ITインフラギリギリを攻めれる

## 結論

解説は良いからさっさと実行したい、という方はこちら手順でできる(はず)。

1. `VirtualBox`をインストールする
2. `Vagrant`をインストールする
3. `vagrant-proxyconf`をインストールする
4. [こちら](https://github.com/ryoutoku/vagrant/blob/master/Vagrantfile)を任意のフォルダにダウンロードする
5. 必要に応じて`Vagrantfile`の`proxy`と`proxy_port`を設定する
6. 4.でダウンロードしたフォルダで以下コマンドを実行する 
`vagrant up`
7. VMが起動するので、`http://{ホストPCのIPアドレス}:8065/` にアクセスし、Mattermostにアクセスできることを確認する
8. 必要に応じてホストOSのポート8065を開放するなど、アクセス関係を設定すると同じネットワーク上のPCからVM環境にアクセス可能になる

## 構築する環境

構築する環境や必要なツールは以下のようになっています。

ホストOS：

* VirtualBox
* Vagrant
    * vagrant-proxyconf (VM内でプロキシ設定を行うプラグイン)

ゲストOS(VM環境)：

* Ubuntu Server 14.04
* Docker
    * Mattermost (slackクローンチャットアプリ)

## Vagrantfile解説

### 構築内容

Vagrantfileで構築するにあたり、以下環境を作成します。

* VM環境にDockerを使用してMattermostを立ち上げる
* ホストOSから立ち上げたMattermostにアクセス可能にする

ここで考慮すべき設定は以下になります。

* ホストOSからVM環境にアクセス可能にする
    * ホストオンリーアダプタを使用し、VM環境のIPアドレスを指定する
* VM環境のMattermostにホストPC以外からアクセス可能にする
    * ポートフォワーディングにより、VM環境のMattermostのポート番号とホストOSのポート番号とを関連付ける

### ホストOSからVM環境にアクセス可能にする

ホストOSからVM環境にアクセス可能にするためには、ホストオンリーアダプタを設定する必要があります。
また、IPを指定してVM環境にアクセスできるようにしています(以下ではIPを192.168.56.101にしています)。

```rb
  # ホストオンリーアダプタをipアドレス固定で追加
  config.vm.network "private_network", ip: "192.168.56.101"
```

### VM環境のMattermostにホストPC以外からアクセス可能にする

VM環境のMattermostに他PCからアクセスするためには、ホストPCのアクセスをVM環境に転送する(=ポートフォワーディング)する必要があります。
今回、Mattermostはポート番号8065で起動するので、ホストPCも同じく8065にしておきます。
こうすることで、`http://{ホストPCのIP}:8065`のアクセスが`http://{VM環境のIP}:8065`にポートフォワーディングされ、Mattermostにアクセスすることができます。

```rb
 # ポート
  config.vm.network "forwarded_port", guest: 8065, host: 8065
```

### その他 1：proxy, proxy_portの設定

悩ましい企業に勤めている方の多くは、プロキシサーバ経由で外部のネットワークにアクセスしていると思います。
VM環境でも、DockerやMattermostなど外部ネットワークから取得するものもあるため、
先に挙げた`vagrant-proxyconf`を使って、プロキシの設定を行っています。

```rb
  if Vagrant.has_plugin?("vagrant-proxyconf")
    config.proxy.http     = "http://#{proxy_ip}:#{proxy_port}"
    config.proxy.https    = "http://#{proxy_ip}:#{proxy_port}"
    config.proxy.no_proxy = "localhost,127.0.0.1"
  end
```

### その他 2：Docker, Mattermostのインストール

VM環境にDocker, Mattermostをインストールしている部分は以下になります。
以下は`vagrant up`した際など、VM環境でroot権限で実行するコマンドを記載しています。
中身はDockerインストール&DockerでのMattermost起動なので、割愛します。

```rb
  config.vm.provision "shell", inline: <<-SHELL
    apt-get update
    apt-get remove docker docker-engine docker.io

    apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
    apt-get install apt-transport-https ca-certificates curl software-properties-common aptitude
    curl -O https://download.docker.com/linux/ubuntu/dists/trusty/pool/stable/amd64/docker-ce_18.03.1~ce-0~ubuntu_amd64.deb
    dpkg -i docker-ce_18.03.1~ce-0~ubuntu_amd64.deb
	
	# 依存関係が壊れるらしいので必要
	apt-get -f -y install
    docker run --restart=always --name mattermost-preview -d --publish 8065:8065 mattermost/mattermost-preview
  SHELL
```

## 最後に

過去の私と同じ環境に身を置く方へ、ということで、色々と調べながら初めてVagrantfileを作成してみました。
やってみればVagrantもあまり難しくないのかなーと思います(間違ってるかもしれませんが)。
ので、悩ましい企業にいる方も、今回のMattermostと同じようにVM環境にツールを導入して技術の幅を広げてみてはいかがでしょうか？

[^1]: VirtualBox,Vagrant,Dockerにアクセス&ダウンロードできるのであれば問題無いような気がしますが。。。