LoginSignup
6
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-02-27

はじめに

前回のopenstfの環境をdockerを使ってLinux上にゼロから構築する方法では、Linux環境上に構築はできるが、同一マシンからしかアクセスできないという課題があった。

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

ここでの記載よりもーっと簡単にopenstfの環境をMac上にゼロから構築する方法を作ったのでそちらも合わせてご確認ください

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

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

2017/3/6 追記
上記の問題に対応した、「もーっと簡単にopenstfの環境をMac上にゼロから構築する方法」を公開しました。

2017/3/8 追記
トラブルシューティングに「新しい端末を追加したい!」を追加

2017/7/3 追記
トラブルシューティングに「端末接続しても「Filtered out device "<serial Id>"」とかログに出て端末が認識されない」を追加

構築環境

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に全部書いてある。
が、ドキュメント自体がそこそこ長く(当然英語)、さらに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を選択。正常に追加できていれば、有効にチェックが入っている

スクリーンショット 2017-02-27 17.38.27.png

Vagrantをインストール

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

cmd
$ vagrant -v
Vagrant 1.9.1

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

fleet をインストール

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

brew
$ brew install fleetctl

Linuxの場合は、Git cloneしてからローカルでビルドする必要がある(未確認)
コマンドは以下のとおり(参考ページ)

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

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

cmd
$ fleetctl -version
fleetctl version 0.11.7

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

RethinkDBを構築する

ここからの手順は「setup-examples」ページのREADME.mdを元にやっていく。

Vagrantfileを修正する

2017/2/27現在、上記の環境で行った場合、Rethinkdbサービスの起動が正しく動かないケースがある(はまった)
そのためVagrantfileを一部修正する必要がある

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

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

修正したら保存

vagrant upを実行する

Git cloneしてきた「stf-setup-examples」ディレクトリに移動する

cmd
$ cd stf-setup-examples

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

cmd
$ cd ./db
$ vagrant up

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

起動確認(任意)

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

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

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

スクリーンショット 2017-02-27 18.08.01.png

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

cmd
$ sudo /etc/init.d/rethinkdb start

STF Clusterを構築する

ここからの手順はsetup-examplesのcoreos-fleetを元にやっていく

Vagrantfileを修正する

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

接続予定のデバイスを登録する

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

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行目付近の記載を参考に、以下の行を追加する

Vagrantfile(元記載)
v.customize ['usbfilter', 'add', '0', '--target', :id, '--name', $ANY_NAME, '--vendorid', $VENDOR_ID, '--productid', $PRODUCT_ID]
Vagrantfile(追加例)
v.customize ['usbfilter', 'add', '0', '--target', :id, '--name', 'Sony SOL23', '--vendorid', '0x0fce', '--productid', '0x519e'] 

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

coreOSのメモリを増やす(任意)

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

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

Vagrantfileを保存して閉じる。

vagrant up を実行する

以下のコマンドを実行

cmd
$ cd coreos/
$ vagrant up

fleetの設定と確認

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

fleetctlのエンドポイントを追加する

以下のコマンドを実行。

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

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

fleetctlで使える仮想マシンが認識しているかを確認する

以下のコマンドを叩いて結果が出力されるか確認する

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ディレクトリ以下のサービスがサブミットされることを確認。

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サービスを起動する

以下のコマンドを叩く。

cmd
$ fleetctl start adbd rethinkdb-proxy-28015

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

以下のようにrunningになっていればOK(nginxもrunningになっているが、現時点ではinactiveになっているはず)
スクリーンショット 2017-02-27 18.53.17.png

rethinkDBにデータを追加する

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

cmd
$ fleetctl start stf-migrate

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

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

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

cmd
$ fleetctl unload stf-migrate

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

nginx以外のサービスを起動する

以下のコマンドを叩く。長いのでコピペ推奨。
例のごとく直前のfleetctlコマンドが完了していないとバグる

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アドレスが必要になるので、メモ帳にでも貼り付けておく。

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接続する

cmd
$ vagrant ssh core-01

nginx.confを開く

cmd
$ sudo vim /srv/nginx/nginx.conf

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

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.conf(編集後)
  upstream stf_app {
    # PLEASE UPDATE IP ADDRESS WITH APPROPRIATE ONE
    server 172.17.8.103:3100 max_fails=0;
  }
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;
    }

1行目の正規表現の/d/<ここの値が2>/略・・・が目印。
provider2のIPアドレスはstf-processor@2.service 5f076c8d.../172.17.8.103 active runningなので

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を起動する

以下のコマンドを叩く

cmd
$ fleetctl start nginx

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

openstfのページを開く

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

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

IPアドレスからホスト名に切り替える(動作未確認)

まず/etc/hostsファイルを開き、以下を追加する。ホスト名は任意で。

hosts
172.17.8.101  stf.example.org

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

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連携するとかなり通知が飛んでくるようになるので、専用のチャネルを用意することを推奨します(ぶっちゃけ通知が多すぎていらない気もする・・・)

やり方の大元はここにかいてある。
まず、SlackのAPI Tokenに行き、追加したいチームのトークンを発行する。それっぽいボタンをぽちぽち押せばOK

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

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

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

cmd
$ fleetctl submit stf-notify-slack.service
$ fleetctl start stf-notify-slack

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

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

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

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

トラブルシューティング

fleetctlコマンドを叩いたら処理が帰ってこなくなった、あるいはどのコマンドでも毎回同じエラーが帰ってくるようになった。

fleetctlで管理してる状態と、実際の状態が食い違ってしまったために発生している、多分。おおよそSUBステータスがrunningになる前に次のコマンドを叩いている場合に発生する。

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

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

ログインページは表示されたけど、ログインしたら502が出た

原因は大きく2つある(経験上)。

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

これは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.conf(修正前)
  upstream stf_app {
    # PLEASE UPDATE IP ADDRESS WITH APPROPRIATE ONE
    server 172.17.8.10{1|2|3}:3100 max_fails=0;
  }
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上にゼロから構築する方法」にて、原因とその対処方法、およびこの問題をそもそも無くす方法を公開しましたので、そちらをご確認ください。

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

新しい端末を追加したい!

接続予定のデバイスを登録するの手順でVagrantfileに端末を追加する
その後、vagrant reloadを実行すればOK

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

PCを再起動したり、リモート接続中に予期しない切断が挟まった場合に発生する。
公式にはリモート接続が動かない、と書いてあるがおそらく同じ原因。公式の記載はココ

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

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6