はじめに
前回の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を選択。正常に追加できていれば、有効にチェックが入っている
Vagrantをインストール
https://www.vagrantup.com/
公式ページに行き、「Download」ボタンをクリック
環境に合わせてインストールパッケージをDLし、インストールする
なお、UbuntuはCentOS系を利用すればOKだったはず(未確認)
「vagrant -v」でバージョンが表示されればOK
$ vagrant -v
Vagrant 1.9.1
VagrantはVirtualBoxの環境をファイルベースで構築してくれるやつ。
fleet をインストール
MacユーザーはBrewでインストールできる
$ brew install fleetctl
Linuxの場合は、Git cloneしてからローカルでビルドする必要がある(未確認)
コマンドは以下のとおり(参考ページ)
$ git clone https://github.com/coreos/fleet.git
$ cd fleet
$ ./build // GO 1.3以上のバージョンが入っている場合はこちら
$ ./build-docker // Docker の環境が入っている場合はこちら
正しくインストールできていれば「fleetctl -version」でバージョンが出る
$ fleetctl -version
fleetctl version 0.11.7
fleetはサービスの構築をファイルベースでやってくれるやつ。
RethinkDBを構築する
ここからの手順は「setup-examples」ページのREADME.mdを元にやっていく。
Vagrantfileを修正する
2017/2/27現在、上記の環境で行った場合、Rethinkdbサービスの起動が正しく動かないケースがある(はまった)
そのためVagrantfileを一部修正する必要がある
修正するファイルは「stf-setup-examples/db/Vagrantfile」になる
修正箇所は以下のとおり(- が削除、+が追加)
# Start rethinkdb
- service rethinkdb start;
+ /etc/init.d/rethinkdb start;
修正したら保存
vagrant upを実行する
Git cloneしてきた「stf-setup-examples」ディレクトリに移動する
$ cd stf-setup-examples
さらにその中のdbディレクトリに移動し、「vagrant up」コマンドを実行
$ cd ./db
$ vagrant up
出力ログにエラーっぽい赤字の表記が混じることがあるが、以下の起動確認で動作が確認できていればOK
起動確認(任意)
VirtualBoxを起動し、「rethinkdb_ubuntu」イメージが追加されていることを確認する。
その後、「rethinkdb_ubuntu」を選択→表示を選択。
LoginIDとPasswordに「vagrant」で入る。
入ったら、以下のコマンドを実行し、28015と29015ポートがLISTEN状態かを確認する
$ sudo lsof -i:28015
$ sudo lsof -i:29015
正常に動いていれば以下のように表示される(28015ポート確認時の例)
もしここでポートが1つも見つからなければ、rethinkdbサービスが起動していないことになる。その場合は以下のコマンドを叩けば良い、はず。
$ 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
コマンドを実行する。すると以下のような表示がされるのを確認する
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行目付近の記載を参考に、以下の行を追加する
v.customize ['usbfilter', 'add', '0', '--target', :id, '--name', $ANY_NAME, '--vendorid', $VENDOR_ID, '--productid', $PRODUCT_ID]
v.customize ['usbfilter', 'add', '0', '--target', :id, '--name', 'Sony SOL23', '--vendorid', '0x0fce', '--productid', '0x519e']
5: 上記の追加作業を、登録予定のある端末全てに行う
coreOSのメモリを増やす(任意)
必須ではないが、たまにメモリ不足のエラーが出たので環境に余裕があれば増やしておくと良いかも。
同じcoreos/Vagrantfileを開き、以下を修正。メモリ量は任意で。
- vm_memory = 512
+ vm_memory = 1024
Vagrantfileを保存して閉じる。
vagrant up を実行する
以下のコマンドを実行
$ cd coreos/
$ vagrant up
fleetの設定と確認
これ以降、IPアドレスとして「172.17.8.101」という値が何度か出てくるが、これが最終的なopenstfのアクセス先になる。
fleetctlのエンドポイントを追加する
以下のコマンドを実行。
$ export FLEETCTL_ENDPOINT=http://172.17.8.101:2379
なお、PCを再起動すると設定が飛ぶ(飛んだよね・・・?)ので面倒な場合は.bash_profileなどに記載することをお勧めする。
fleetctlで使える仮想マシンが認識しているかを確認する
以下のコマンドを叩いて結果が出力されるか確認する
$ 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ディレクトリ以下のサービスがサブミットされることを確認。
$ 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サービスを起動する
以下のコマンドを叩く。
$ 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になっているはず)
rethinkDBにデータを追加する
以下のコマンドを叩く。
この作業は必ずadbdとrethinkdb-proxy-28015がrunnningになってから実行すること。
$ fleetctl start stf-migrate
このコマンドでrethinkDBにstf関連のテーブルを作ったりする。
その後、fleetctl list-units
コマンドでSUBステータスがdead
になるまで待つ。
SUBステータスがfail
になってしまった場合は、rethinkdbとの接続がうまくいってない可能性が高い。トラブルシューティングを参照。
SUBステータスがdead
になったらこのサービスは不要なのでfleetの管理から解除する。
$ fleetctl unload stf-migrate
fleetctl list-units
コマンドで一覧に「stf-migrate.service」が無ければOK
nginx以外のサービスを起動する
以下のコマンドを叩く。長いのでコピペ推奨。
例のごとく直前のfleetctlコマンドが完了していないとバグる
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アドレスが必要になるので、メモ帳にでも貼り付けておく。
$ 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接続する
$ vagrant ssh core-01
nginx.confを開く
$ sudo vim /srv/nginx/nginx.conf
上記で確認したIPを元に、各サービスのIPアドレスを割り当てていく。以下はstf-appサービスの例とprovider 2 の例
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
なので、
upstream stf_app {
# PLEASE UPDATE IP ADDRESS WITH APPROPRIATE ONE
server 172.17.8.103:3100 max_fails=0;
}
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
なので
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を起動する
以下のコマンドを叩く
$ fleetctl start nginx
fleetctl list-units
コマンドで状態を確認し、nginxがrunnningになればOK
openstfのページを開く
http://172.17.8.101 に接続し、正しく動いていればopenstfのページのログインページが開かれる
これであとは該当マシンとIPに社内からアクセスできるようにすればOK(この辺は各インフラに依存するので管理者にコンタクトとるなりでがんばる)。
IPアドレスからホスト名に切り替える(動作未確認)
まず/etc/hosts
ファイルを開き、以下を追加する。ホスト名は任意で。
172.17.8.101 stf.example.org
その後、coreos/unit_files/
以下の.service系の すべてのファイルに対し 、--storage-url, --app-url , --auth-url
となっている箇所全てをホスト名に変える。
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_HERE
とYOUR_SLACK_CHANNEL_HERE
を書き換える。
書く内容はそのまんま、発行したトークンと、通知を流したいチャネル名
[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
全ての修正が終わったら保存する。
次にサービスを登録し、スタートさせる
$ fleetctl submit stf-notify-slack.service
$ fleetctl start stf-notify-slack
runningになったのを確認したら最後にcore-01のnginx.confにサービスの記載を追加する。
以下、記載例。IPアドレスは例のごとく、fleet list-units
で確認。
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:
云々
これは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の記載を以下のように変更する
upstream stf_app {
# PLEASE UPDATE IP ADDRESS WITH APPROPRIATE ONE
server 172.17.8.10{1|2|3}:3100 max_fails=0;
}
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>
とすると、同時に立ち上げもいける。こっちの方がベター?