簡単にopenstfの環境をMac上にゼロから構築する方法

# はじめに
前回の[openstfの環境をdockerを使ってLinux上にゼロから構築する方法](http://qiita.com/k_keisuke/items/3ae15f2e2fc057dc5062)では、Linux環境上に構築はできるが、同一マシンからしかアクセスできないという課題があった。

そこで今回は社内サーバーとして公開するための方法をゼロからやっていく。

**ここでの記載より[もーっと簡単にopenstfの環境をMac上にゼロから構築する方法](http://qiita.com/k_keisuke/items/5df787c1b76ee5e3e5fe)を作ったのでそちらも合わせてご確認ください**

2017/2/28 追記
fleetctlで割り当てられたIPアドレスが変わる現象への対応方法をトラブルシューティングに追記

2017/3/2 追記
IPアドレス変わる問題のトラブルシューティングの記載を一部削除(別の問題が発生するようになるため)。対処方法が見つかり次第、再度修正します。

2017/3/6 追記
上記の問題に対応した、「[もーっと簡単にopenstfの環境をMac上にゼロから構築する方法](http://qiita.com/k_keisuke/items/5df787c1b76ee5e3e5fe)」を公開しました。

2017/3/8 追記
トラブルシューティングに「[新しい端末を追加したい！](http://qiita.com/k_keisuke/items/77144fc47951a6adf697#%E6%96%B0%E3%81%97%E3%81%84%E7%AB%AF%E6%9C%AB%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%9F%E3%81%84)」を追加

2017/7/3 追記
トラブルシューティングに「[端末接続しても「Filtered out device "＜serial Id＞"」とかログに出て端末が認識されない](http://qiita.com/k_keisuke/items/77144fc47951a6adf697#%E7%AB%AF%E6%9C%AB%E6%8E%A5%E7%B6%9A%E3%81%97%E3%81%A6%E3%82%82filtered-out-device-serial-id%E3%81%A8%E3%81%8B%E3%83%AD%E3%82%B0%E3%81%AB%E5%87%BA%E3%81%A6%E7%AB%AF%E6%9C%AB%E3%81%8C%E8%AA%8D%E8%AD%98%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84)」を追加

# 構築環境
OS: Max OS X El Capitan
※実際に構築したのがMac上というだけで、Linux環境上でも問題なく動く、はず。。

# setup-examplesをGit cloneする
以下のGithubに行きクローンする。
https://github.com/openstf/setup-examples

上記のGithubで公開されているのは、VagrantとFleetを使ってVirtualBox上にサーバーを立てるためのサンプルセット。もともとこれらの環境構築方法についてはopenstfの[DEPLOYMENT.md](https://github.com/openstf/stf/blob/master/doc/DEPLOYMENT.md)に全部書いてある。
が、ドキュメント自体がそこそこ長く(当然英語)、さらにVagrant,fleet,nginxあたりの知識がないと途中で挫折してしまう。
そのために用意されてる？のがsetup-examplesとなる。今回はこれを利用していく。

# VirtualBox,VirtualBox Extension Pack,Vagrant,fleetをインストールする
## VirtualBox をインストール
https://www.virtualbox.org/
公式のページに行き、「Download VirtualBox」ボタンをクリック→「VirtualBox X.XX.XX platform packages」から、自身の環境にあったパッケージをDLする
あとは各OSに合わせてインストールする

## VirtualBox Extension Pack をインストール
https://www.virtualbox.org/
公式のページに行き、「Download VirtualBox」ボタンをクリック→**「VirtualBox X.X.XX Oracle VM VirtualBox Extension Pack→ All Supported Platform」**をクリックしてDL
その後、VirtualBoxを起動→VirtualBoxメニューの中の環境設定→機能拡張タブと進み、追加ボタンをクリック→DLしたExtension Packを選択。正常に追加できていれば、有効にチェックが入っている

<img width="543" alt="スクリーンショット 2017-02-27 17.38.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/76726/cc129cc2-8d40-4c34-e318-9ebcc1883929.png">

## Vagrantをインストール
https://www.vagrantup.com/
公式ページに行き、「Download」ボタンをクリック
環境に合わせてインストールパッケージをDLし、インストールする
なお、UbuntuはCentOS系を利用すればOKだったはず（未確認）
「vagrant -v」でバージョンが表示されればOK

```text:cmd
$ vagrant -v
Vagrant 1.9.1
```

VagrantはVirtualBoxの環境をファイルベースで構築してくれるやつ。

## fleet をインストール
MacユーザーはBrewでインストールできる

```text:brew
$ brew install fleetctl
```

Linuxの場合は、Git cloneしてからローカルでビルドする必要がある(未確認)
コマンドは以下のとおり([参考ページ](https://leoengine.org/fleetctl-on-ubuntudebian-system/))

```text:cmd
$ git clone https://github.com/coreos/fleet.git
$ cd fleet
$ ./build // GO 1.3以上のバージョンが入っている場合はこちら
$ ./build-docker //  Docker の環境が入っている場合はこちら
```

正しくインストールできていれば「fleetctl -version」でバージョンが出る

```text:cmd
$ fleetctl -version
fleetctl version 0.11.7
```

fleetはサービスの構築をファイルベースでやってくれるやつ。

# RethinkDBを構築する
ここからの手順は「setup-examples」ページの[README.md](https://github.com/openstf/setup-examples)を元にやっていく。
## Vagrantfileを修正する
2017/2/27現在、上記の環境で行った場合、Rethinkdbサービスの起動が正しく動かないケースがある(はまった)
そのためVagrantfileを一部修正する必要がある

修正するファイルは「stf-setup-examples/db/Vagrantfile」になる
修正箇所は以下のとおり(- が削除、+が追加)

```text:Vagrantfile(40行目付近)
      # Start rethinkdb
-     service rethinkdb start;
+     /etc/init.d/rethinkdb start;
```

修正したら保存

## vagrant upを実行する
Git cloneしてきた「stf-setup-examples」ディレクトリに移動する

```text:cmd
$ cd stf-setup-examples
```

さらにその中のdbディレクトリに移動し、「vagrant up」コマンドを実行

```text:cmd
$ cd ./db
$ vagrant up
```

出力ログにエラーっぽい赤字の表記が混じることがあるが、以下の起動確認で動作が確認できていればOK

## 起動確認(任意)
VirtualBoxを起動し、「rethinkdb_ubuntu」イメージが追加されていることを確認する。
その後、「rethinkdb_ubuntu」を選択→表示を選択。
LoginIDとPasswordに「vagrant」で入る。
入ったら、以下のコマンドを実行し、28015と29015ポートがLISTEN状態かを確認する

```text:cmd
$ sudo lsof -i:28015
$ sudo lsof -i:29015
```

正常に動いていれば以下のように表示される(28015ポート確認時の例)

<img width="618" alt="スクリーンショット 2017-02-27 18.08.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/76726/2fc48912-a36b-4e8c-04d5-3452db555a1a.png">

もしここでポートが１つも見つからなければ、rethinkdbサービスが起動していないことになる。その場合は以下のコマンドを叩けば良い、はず。

```text:cmd
$ sudo /etc/init.d/rethinkdb start
```

# STF Clusterを構築する
ここからの手順はsetup-examplesの[coreos-fleet](https://github.com/openstf/setup-examples/blob/master/docs/coreos_fleet.md)を元にやっていく

## Vagrantfileを修正する
ここで修正するのは、「setup-examples/coreos」以下のVagrantfileになる

### 接続予定のデバイスを登録する
1: PCに端末を接続し、```adb devices```で正しく端末が認識されていることを確認する
2: ```VBoxManage list usbhost```コマンドを実行する。すると以下のような表示がされるのを確認する

```text:output
UUID:               e7757772-3030-44a3-ac14-00e53e9e32f8
VendorId:           0x0fce (0FCE)
ProductId:          0x519e (519E)
Revision:           2.50 (0250)
Port:               2
USB version/speed:  0/High
Manufacturer:       Sony
Product:            SOL23
SerialNumber:       CB5125LBYM
Address:            p=0x519e;v=0x0fce;s=0x0001f3695ada4522;l=0x14200000
Current State:      Busy
```
3: coreos/Vagrantfileを開く。
4: 57行目付近の記載を参考に、以下の行を追加する

```text:Vagrantfile(元記載)
v.customize ['usbfilter', 'add', '0', '--target', :id, '--name', $ANY_NAME, '--vendorid', $VENDOR_ID, '--productid', $PRODUCT_ID]
```

```text:Vagrantfile(追加例)
v.customize ['usbfilter', 'add', '0', '--target', :id, '--name', 'Sony SOL23', '--vendorid', '0x0fce', '--productid', '0x519e'] 
```

5: 上記の追加作業を、登録予定のある端末全てに行う

### coreOSのメモリを増やす(任意)
必須ではないが、たまにメモリ不足のエラーが出たので環境に余裕があれば増やしておくと良いかも。
同じcoreos/Vagrantfileを開き、以下を修正。メモリ量は任意で。

```text:Vagrant(14行目付近)
- vm_memory = 512
+ vm_memory = 1024
```

Vagrantfileを保存して閉じる。

## vagrant up を実行する
以下のコマンドを実行

```text:cmd
$ cd coreos/
$ vagrant up
```

## fleetの設定と確認
これ以降、IPアドレスとして「172.17.8.101」という値が何度か出てくるが、これが最終的なopenstfのアクセス先になる。

### fleetctlのエンドポイントを追加する
以下のコマンドを実行。

```text:cmd
$ export FLEETCTL_ENDPOINT=http://172.17.8.101:2379
```

なお、PCを再起動すると設定が飛ぶ（飛んだよね・・・？）ので面倒な場合は.bash_profileなどに記載することをお勧めする。

### fleetctlで使える仮想マシンが認識しているかを確認する
以下のコマンドを叩いて結果が出力されるか確認する

```text:cmd
$ fleetctl list-machines
MACHINE     IP           METADATA
0f666d32... 172.17.8.103 role=devside
3dfaef6c... 172.17.8.102 role=appside
dc387247... 172.17.8.101 role=nginx
```

## STF関連のサービスをデプロイする
これ以降は「setup-examples/coreos」以下で作業していることを想定する。
### 各サービスをサブミットする
以下のコマンドを叩き、units_fileディレクトリ以下のサービスがサブミットされることを確認。

```text:cmd
$ fleetctl submit ./unit_files/*
Unit adbd.service
Unit nginx.service inactive
Unit rethinkdb-proxy-28015.service
Unit stf-api@.service inactive
Unit stf-app@.service inactive
Unit stf-auth@.service inactive
Unit stf-migrate.service inactive
Unit stf-processor@.service inactive
Unit stf-provider@.service inactive
Unit stf-reaper.service inactive
Unit stf-storage-plugin-apk@.service inactive
Unit stf-storage-plugin-image@.service inactive
Unit stf-storage-temp@.service inactive
Unit stf-triproxy-app.service inactive
Unit stf-triproxy-dev.service inactive
Unit stf-websocket@.service inactive
```

### adbdとrethinkdb-proxy-28015サービスを起動する
以下のコマンドを叩く。

```text:cmd
$ fleetctl start adbd rethinkdb-proxy-28015
```

コマンド自体は２、3秒くらいで制御が戻ってくるが、内部では非同期でopen-stf関連のDLを行っている。
そのため、**```fleetctl list-units```コマンドでadbdとrethinkdb-proxy-28015のSUBステータスがrunningになるまで待つこと**
**これを待たずに次のコマンドを実行すると最悪データが破損し、「vagrant up」からやり直しになる**

以下のようにrunningになっていればOK(nginxもrunningになっているが、現時点ではinactiveになっているはず)
<img width="583" alt="スクリーンショット 2017-02-27 18.53.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/76726/d21bf7b3-3d5a-9738-68fa-20b4add32887.png">

### rethinkDBにデータを追加する
以下のコマンドを叩く。
**この作業は必ずadbdとrethinkdb-proxy-28015がrunnningになってから実行すること。**

```text:cmd
$ fleetctl start stf-migrate
```

このコマンドでrethinkDBにstf関連のテーブルを作ったりする。
その後、```fleetctl list-units```コマンドでSUBステータスが```dead```になるまで待つ。

SUBステータスが```fail```になってしまった場合は、rethinkdbとの接続がうまくいってない可能性が高い。トラブルシューティングを参照。

SUBステータスが```dead```になったらこのサービスは不要なのでfleetの管理から解除する。

```text:cmd
$ fleetctl unload stf-migrate
```

```fleetctl list-units```コマンドで一覧に「stf-migrate.service」が無ければOK

### nginx以外のサービスを起動する
以下のコマンドを叩く。長いのでコピペ推奨。
例のごとく直前のfleetctlコマンドが完了していないとバグる

```text:cmd
fleetctl start stf-app@3100 stf-auth@3200 stf-storage-plugin-apk@3300 stf-storage-plugin-image@3400 stf-storage-temp@3500 stf-websocket@3600 stf-api@3700 stf-provider@{1..3} stf-processor@{1..3} stf-triproxy-dev stf-triproxy-app stf-reaper
```

これもサービス起動に時間がかかる（通信環境にもよる）ので```fleetctl list-units```コマンドで状態を確認し、該当サービス全てがRunningになるまで待つ。

### nginx.confを修正する
サービスが正しく起動できていれば各サービスに対してIPアドレスが割り当てられている。それを元にnginx.confを修正する必要がある。

ただ、トラブルシューティングに記載した、「fleetctlで割り当てられたIPアドレスが勝手に変わるのでどうにかしたい」の章に記載したnginx.confの設定の方が、**IPアドレスが変わった際に再度nginx.confの修正が不要なのでオススメです**。

まず```fleetctl list-units```でサービス一覧を確認する。この後、各サービスのIPアドレスが必要になるので、メモ帳にでも貼り付けておく。

```text:cmd
$ fleetctl list-units
UNIT					MACHINE				ACTIVE		SUB
adbd.service				1a67c080.../172.17.8.101	active		running
adbd.service				57d289f7.../172.17.8.102	active		running
adbd.service				5f076c8d.../172.17.8.103	active		running
nginx.service				1a67c080.../172.17.8.101	inactive		dead
rethinkdb-proxy-28015.service		1a67c080.../172.17.8.101	active		running
rethinkdb-proxy-28015.service		57d289f7.../172.17.8.102	active		running
rethinkdb-proxy-28015.service		5f076c8d.../172.17.8.103	active		running
stf-api@3700.service			5f076c8d.../172.17.8.103	active		running
stf-app@3100.service			5f076c8d.../172.17.8.103	active		running
stf-auth@3200.service			5f076c8d.../172.17.8.103	active		running
stf-processor@1.service			1a67c080.../172.17.8.101	active		running
stf-processor@2.service			5f076c8d.../172.17.8.103	active		running
stf-processor@3.service			57d289f7.../172.17.8.102	active		running
stf-provider@1.service			57d289f7.../172.17.8.102	active		running
stf-provider@2.service			1a67c080.../172.17.8.101	active		running
stf-provider@3.service			5f076c8d.../172.17.8.103	active		running
stf-reaper.service			5f076c8d.../172.17.8.103	active		running
stf-storage-plugin-apk@3300.service	5f076c8d.../172.17.8.103	active		running
stf-storage-plugin-image@3400.service	5f076c8d.../172.17.8.103	active		running
stf-storage-temp@3500.service		5f076c8d.../172.17.8.103	active		running
stf-triproxy-app.service		57d289f7.../172.17.8.102	active		running
stf-triproxy-dev.service		5f076c8d.../172.17.8.103	active		running
stf-websocket@3600.service		5f076c8d.../172.17.8.103	active		running
```

以下のコマンドで「core-01」に対しSSH接続する

```text:cmd
$ vagrant ssh core-01
```

nginx.confを開く

```text:cmd
$ sudo vim /srv/nginx/nginx.conf
```

上記で確認したIPを元に、各サービスのIPアドレスを割り当てていく。以下はstf-appサービスの例とprovider **2** の例

```nginx:nginx.conf(編集前)
  upstream stf_app {
    # PLEASE UPDATE IP ADDRESS WITH APPROPRIATE ONE
    server 172.17.8.10{1|2|3}:3100 max_fails=0;
  }
```

stf-appは```stf-app@3100.service            5f076c8d.../172.17.8.103    active      running```なので、

```nginx:nginx.conf(編集後)
  upstream stf_app {
    # PLEASE UPDATE IP ADDRESS WITH APPROPRIATE ONE
    server 172.17.8.103:3100 max_fails=0;
  }
```

```nginx:nginx.conf(編集前)
    location ~ "^/d/2/([^/]+)/(?<port>[0-9]{5})/$" {
      # PLEASE UPDATE IP ADDRESS WITH APPROPRIATE ONE
      proxy_pass http://172.17.8.10{1|2|3}:$port/;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
      proxy_set_header X-Forwarded-For $remote_addr;
      proxy_set_header X-Real-IP $remote_addr;
    }
```

１行目の正規表現の/d/＜**ここの値が２**＞/略・・・が目印。
provider２のIPアドレスは```stf-processor@2.service         5f076c8d.../172.17.8.103    active      running```なので

```nginx:nginx.conf(編集前)
    location ~ "^/d/2/([^/]+)/(?<port>[0-9]{5})/$" {
      # PLEASE UPDATE IP ADDRESS WITH APPROPRIATE ONE
      proxy_pass http://172.17.8.103:$port/;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
      proxy_set_header X-Forwarded-For $remote_addr;
      proxy_set_header X-Real-IP $remote_addr;
    }
```

となる。以上の作業を、```stf-app、stf-auth、stf-storage-plugin-apk、stf-storage-plugin-image、stf-storage-temp、stf-websocket、stf-api、provider@1、provider@2、provider@3```全てに対して行う。
なお、nginx.confのupstreamの名前と、サービス名が微妙の異なるケースもあるが、よく見れば一意に定まるので注意すれば問題ない、はず。

全てを修正し終えたら保存する。
その後exitでssh接続を終了する。

### nginxを起動する
以下のコマンドを叩く

```text:cmd
$ fleetctl start nginx
```

```fleetctl list-units```コマンドで状態を確認し、nginxがrunnningになればOK

## openstfのページを開く
http://172.17.8.101 に接続し、正しく動いていればopenstfのページのログインページが開かれる

これであとは該当マシンとIPに社内からアクセスできるようにすればOK（この辺は各インフラに依存するので管理者にコンタクトとるなりでがんばる）。

### IPアドレスからホスト名に切り替える（動作未確認）
まず```/etc/hosts```ファイルを開き、以下を追加する。ホスト名は任意で。

```text:hosts
172.17.8.101  stf.example.org
```

その後、```coreos/unit_files/```以下の.service系の **すべてのファイルに対し** 、```--storage-url, --app-url , --auth-url``` となっている箇所全てをホスト名に変える。

```text:stf-auth.service
  stf auth-mock --port 3000 \
-    --app-url http://172.17.8.101/
+    --app-url http://stf.example.org    
```

すべて修正し終わったら、```fleetctl stop ＜該当サービス名>```->```fleetctl start ＜該当サービス名>```でサービスを再起動する。
その後、```fleetctl stop nginx```->```fleetctl start nginx```でnginxを再起動する

# Slack連携の方法
**注意：Slack連携するとかなり通知が飛んでくるようになるので、専用のチャネルを用意することを推奨します**（ぶっちゃけ通知が多すぎていらない気もする・・・）

やり方の大元は[ここ](https://github.com/openstf/stf/blob/master/doc/DEPLOYMENT.md#stf-notify-slackservice)にかいてある。
まず、Slackの[API Token](https://api.slack.com/docs/oauth-test-tokens)に行き、追加したいチームのトークンを発行する。それっぽいボタンをぽちぽち押せばOK

その後、公式のserviceの中身をコピーして、「stf-notify-slack.service」ファイルを作る。場所は他のと合わせて「coreos/unit-files」辺りで。ぶっちゃけ任意。
その後、以下の```YOUR_SLACK_TOKEN_HERE```と```YOUR_SLACK_CHANNEL_HERE```を書き換える。
書く内容はそのまんま、発行したトークンと、通知を流したいチャネル名

```text:stf-notify-slack.service
[Unit]
Description=STF Slack notifier
After=docker.service
BindsTo=docker.service

[Service]
EnvironmentFile=/etc/environment
TimeoutStartSec=0
Restart=always
ExecStartPre=/usr/bin/docker pull openstf/stf:latest
ExecStartPre=-/usr/bin/docker kill %p
ExecStartPre=-/usr/bin/docker rm %p
ExecStart=/usr/bin/docker run --rm \
  --name %p \
  -e "SLACK_TOKEN=YOUR_SLACK_TOKEN_HERE" \ #ここ
  -e "SLACK_CHANNEL=YOUR_SLACK_CHANNEL_HERE" \ #ここ
  openstf/stf:latest \
  stf notify-slack \
    --connect-sub tcp://appside.stf.example.org:7150
ExecStop=-/usr/bin/docker stop -t 10 %p
```

なお、上記の例で```appside.stf.example.org```となっている部分は、```fleetctl list-machines```コマンドで確認出来るマシンのroleがappsideになっているIPを記載すればOK

全ての修正が終わったら保存する。
次にサービスを登録し、スタートさせる

```text:cmd
$ fleetctl submit stf-notify-slack.service
$ fleetctl start stf-notify-slack
```

runningになったのを確認したら最後にcore-01のnginx.confにサービスの記載を追加する。
以下、記載例。IPアドレスは例のごとく、```fleet list-units```で確認。

```nginx:nginx.conf
  upstream stf_notify_slack {
    # PLEASE UPDATE IP ADDRESS WITH APPROPRIATE ONE
    server 172.17.8.102:3800 max_fails=0;
  }
```

ポート番号は他とかぶらないように３８００番を割り当てる。

最後に```fleetctl stop nginx```->```fleetctl start nginx```でnginxを再起動すればOK。


# トラブルシューティング
## fleetctlコマンドを叩いたら処理が帰ってこなくなった、あるいはどのコマンドでも毎回同じエラーが帰ってくるようになった。
fleetctlで管理してる状態と、実際の状態が食い違ってしまったために発生している、多分。おおよそSUBステータスがrunningになる前に次のコマンドを叩いている場合に発生する。

対処としては、VirtualBoxを開き、core-01~03までを完全削除して、Macを再起動し、その後、再度coreosの「vagrant up」から実行すると確実。

※エラーログをメモし忘れました。。

## ログインページは表示されたけど、ログインしたら502が出た
原因は大きく２つある（経験上）。

### rethinkDBサービスが動いていないパターン
rethinkDBの「起動確認」の章を参考に、rethinkDBが動いているかを確認する。
動いていなければ```sudo /etc/init.d/rethinkdb start```で動かす。
その後、```fleetctl stop nginx```->```fleetctl start nginx```でnginxを再起動すればOK

### 割り当てのIPアドレスが変わっているパターン
「nginx.confを修正する」の章を参考に、実際に割り当てられているIPとnginx.confに記載しているIPが一致しているかを確認し、違っていれば修正する。
その後、```fleetctl stop nginx```->```fleetctl start nginx```でnginxを再起動すればOK

一時は繋がってたのにいきなり繋がらなくなったぞ、という場合はこのパターンが多い、かもしれない。

nginx.confの設定を修正することでこれに対応できる、はず。
方法は「fleetctlで割り当てられたIPアドレスが勝手に変わるのでどうにかしたい」の章を参照

## ログインページは表示されたけど、ログインしたらDBエラーっぽいのがでた
以下のようなエラー
```ReqlOpFailedError:Database `stf` dose not exist in:```云々
![error_log.png](https://qiita-image-store.s3.amazonaws.com/0/76726/f536c7e9-f8a7-da5e-813c-9289e5f5aae1.png)

これはstf-migrateが正しく実行できておらず、rethinkdbにstf関連のテーブルやらが作られなかったのが原因。
再度「rethinkDBにデータを追加する」の章を参考に再度データ登録を行うことで解消される。

## fleetctlで割り当てられたIPアドレスが勝手に変わるのでどうにかしたい
nginx.confのupstreamをロードバランサとして使うことで上記の問題に対処する。

まず```stf_app,stf_auth,stf_storage_apk,stf_storage_image,stf_storage,stf_websocket,stf_api```の各upstreamの記載を以下のように変更する

```nginx:nginx.conf(修正前)
  upstream stf_app {
    # PLEASE UPDATE IP ADDRESS WITH APPROPRIATE ONE
    server 172.17.8.10{1|2|3}:3100 max_fails=0;
  }
```

```nginx:nginx.conf(修正後)
  upstream stf_app {
    # PLEASE UPDATE IP ADDRESS WITH APPROPRIATE ONE
    server 172.17.8.101:3100 max_fails=1;
    server 172.17.8.102:3100 max_fails=1;
    server 172.17.8.103:3100 max_fails=1;
  }
```

max_failsを0から1にしているが、これはヘルスチェックをONにしているだけで、0のままでも良い、たぶん。

2017/3/2 修正
provider1~3系について、上記と同様にupstreamを使用した場合、ブラウザでのプレビューが表示されない問題を確認したので一旦削除(対処方法が見つかり次第、再掲します)

2017/3/6 追記
「[もーっと簡単にopenstfの環境をMac上にゼロから構築する方法](http://qiita.com/k_keisuke/items/5df787c1b76ee5e3e5fe)」にて、原因とその対処方法、およびこの問題をそもそも無くす方法を公開しましたので、そちらをご確認ください。

これらの修正を保存して、```fleetctl stop nginx```->```fleetctl start nginx```でnginxを再起動すればOK

## 新しい端末を追加したい！
[接続予定のデバイスを登録する](http://qiita.com/k_keisuke/items/77144fc47951a6adf697#%E6%8E%A5%E7%B6%9A%E4%BA%88%E5%AE%9A%E3%81%AE%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B)の手順でVagrantfileに端末を追加する
その後、```vagrant reload```を実行すればOK

## 端末接続しても「Filtered out device "＜serial Id＞"」とかログに出て端末が認識されない

PCを再起動したり、リモート接続中に予期しない切断が挟まった場合に発生する。
公式にはリモート接続が動かない、と書いてあるがおそらく同じ原因。[公式の記載はココ](https://github.com/openstf/stf#remote-debugging-ie-adb-connect-disconnects-while-im-working)。

復旧手順は`stf local ＜serial Id＞`でserialIdの再登録？みたいなのが行われる。そうすれば接続されるようになる。
念のため一旦stfを落としてやった方が吉。
また、localで立てているなら、`stf local <serial Id> -R --public <your public IP>`とすると、同時に立ち上げもいける。こっちの方がベター？