ゼロからの技術ブログ

初学者がゼロの状態から理解するまでの軌跡を書いていくブログ

Vagrant環境に複数のDockerのコンテナを構築して複数のプッシュ通知(gauran)する

VagrantでDocker上にプッシュ通知(gauran)を複数立てる方法をメモ。
gauranとはメルカリさんが公開しているgo言語で書かれているプッシュ通知システムです。


今回は前提としてgauranで使用するiOS用のpemファイルやAndroiのAPIkeyは事前に取得済みということにします。
取得方法が難解なので下記URLから取得してから本編へ!
d.hatena.ne.jp


gauranの詳細は下へ。
tech.mercari.com
GitHub - mercari/gaurun: General push notification server in Go



```
環境
Vagrant 1.9.1 (CentOS7)
Docker 1.12.6
gauran

前提知識
Vagrant,Dockerの仮想環境
```

Vagrant環境の構築

VagrantのBox(CentOS7)のインストー

今回はCentOS7を使うので、Vagrantbox.es (http://www.vagrantbox.es/)からBoxをインストールします。

$ mkdir vagrant
$ cd vagrant/
$ vagrant box add centos7.1 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.1/vagrant-centos-7.1.box
$ vagrant init CentOS7.1

Vagrantfileの編集

今回は複数のpush通知システムを構築するので、複数のポートを設定します。
http://localhost:10080にアクセスするとVagrantの1056に転送されるように設定をします。
二つ目も同じく。

Vagrant.configure("2") do |config|
  config.vm.network "forwarded_port", guest: 1056, host: 10080
  config.vm.network "forwarded_port", guest: 1059, host: 10090
end

Vagrantの実行

設定は以上なのでvagrantを立ち上げ、sshで実際にvagrant上にdockerをインストールしていきます。
ちなみに作成したディレクトリにpemファイルとかを置いておくとvagrantのホーム直下に自動的に反映されるので
ディレクトリ上にpemファイルを置いておきます。

$ cp cert.pem  vagrant/cert.pem
$ cp key-nopass.pem vagrant/key-nopass.pem
$ vagrant up
$ vagrant ssh

Goのインストー

ここからは全てVagrant上で行っていきます。gaurunはgo言語なのでgoをインストールします。

$ wget https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz
$ sudo tar -C /usr/local -xzf go1.8.3.linux-amd64.tar.gz
#go 起動確認
#環境変数を設定する
$ export GOPATH=$HOME/go
$ export GOROOT=/usr/local/go
$ export PATH=$PATH:/usr/local/go/bin:$GOROOT/bin:$GOPATH/bin
$ mkdir $HOME/go
$ go version
go version go1.8.3 linux/amd64

Dockerのインストー

DockerのインストールはドキュメントのCentOS7に従う。
CentOSのバージョンによってインストール方法が違うので、バージョンが違う人は注意が必要です。

# Docker インストール
$ sudo yum install -y docker
# Docker 起動
$ sudo systemctl start docker
# Docker サービス有効化
$ sudo systemctl enable docker

gaurunのインストー

お次はgaurunのgitからcloneしてきます。
go1.8よりバージョンが上の場合はglideが必要なようなので、それもインストールをしてからmakeします。

#gitが入っていない場合はインストール
$ sudo yum install git

#gaurunのインストール
$ go get -u github.com/mercari/gaurun/...

#glideのインストール
$ go get -u github.com/Masterminds/glide
 
#ソースディレクトリへ移動
$ /home/vagrant/go/src/github.com/mercari/gaurun
 
#make
$ make bundle
$ make


confの編集

取得したiOSのpemファイルやAndroidAPIkeyを登録しておきます。
気をつけたいのはファイルパスはDocker上のファイルパスを記載します。

$ vi conf/gaurun.toml
[core]
port = "1056"  #ポートの設定1056
#port = "unix:/tmp/gaurun.sock"
workers = 8
queues = 8192
notification_max = 100
shutdown_timeout = 30

[android]
apikey = "[AndroidKey]" #ここにAndroidKeyを記載
enabled = true
timeout = 5 # sec
keepalive_timeout = 30
keepalive_conns = 4
retry_max = 1
use_fcm = false

[ios]
pem_cert_path = "/root/src/cert.pem"                 #ここはDocker上でのiOSpemファイルのパスを記載
pem_key_path = "/root/src/key-nopass.pem"     #ここも
sandbox = true
enabled = true
timeout = 5
keepalive_timeout = 30
keepalive_conns = 6
retry_max = 1

[log]
access_log = "stdout"
error_log = "stderr"
level = "error" 


今回は二つのポートでプッシュ通知を作成するのでgaurunのソースディレクトリをcpして、
もう一つのconf/gaurun.tomlのポート番号を1059にしてあげます。

$ cp -r /home/vagrant/go/src/github.com/mercari/gaurun /home/vagrant/go/src/github.com/mercari/gaurun2
$ vi  /home/vagrant/go/src/github.com/mercari/gaurun2/conf/gaurun.toml
$ vi conf/gaurun.toml
[core]
port = "1059"  #ポートの設定1059
#port = "unix:/tmp/gaurun.sock"
workers = 8
queues = 8192
notification_max = 100
shutdown_timeout = 30

[android]
apikey = "[AndroidKey]" #ここにAndroidKeyを記載
enabled = true
timeout = 5 # sec
keepalive_timeout = 30
keepalive_conns = 4
retry_max = 1
use_fcm = false

[ios]
pem_cert_path = "/root/src/cert.pem"                 #ここはDocker上でのiOSpemファイルのパスを記載
pem_key_path = "/root/src/key-nopass.pem"     #ここも
sandbox = true
enabled = true
timeout = 5
keepalive_timeout = 30
keepalive_conns = 6
retry_max = 1

[log]
access_log = "stdout"
error_log = "stderr"
level = "error" 

これで二つのgaurunが出来ましたので、Docker上に構築をしていきます。

Dockerのコンテナ上でgaurunを動かす

gaurunを実行するDocker上のディレクトリは/root/srcの上にするので、
docker実行時にホストOS(Vagrant CentOS7)のgaurunディレクトリをコンテナに提供します。

実行コマンドは

$ sudo docker run --name gaurun1 -p 1056:1056 -v /home/vagrant/go/src/github.com/mercari/gaurun:/root/src -i -t centos /root/src/bin/gaurun -c /root/src/conf/gaurun.toml&
$ sudo docker run --name gaurun2 -p 1056:1056 -v /home/vagrant/go/src/github.com/mercari/gaurun2:/root/src -i -t centos /root/src/bin/gaurun -c /root/src/conf/gaurun.toml&

# sudo docker run --name gaurun1 # gauru1という名前のコンテナで実行
# -p 1056:1056  #ポートをマッピング(Vagrant 80 => Docker 80)
#  -v /home/vagrant/go/src/github.com/mercari/gaurun:/root/src    #VagrantのディレクトリをDockerコンテナの/root/srcの上に
# /root/src/bin/gaurun -c /root/src/conf/gaurun.toml&     #gaurunの実行コマンド

$ sudo docker ps
#Dokcerが起動していることを確認します。


Push通知をcurlから実行!

curlVagrantに投げて、ポートフォワーディングしたDockerに接続し、通知が帰ってくることを確認します。

$ curl -X POST http://localhost:10090/push \
    -H "Accept: application/json" \
    -H "Content-Type: application/json" \
    -d '{"notifications" : [
           {
               "token" : ["[token情報を入れる]"],
               "platform" : 1,
               "message" : "hogehoge",
               "title" : "titlehoge",
               "subtitle" : "sub title hoge",
               "badge" : 99,
               "sound" : "default",
               "content_available" : true,
               "mutable_content" : true,
               "expiry" : 10,
           }
       ]
   }'

$ curl -X POST http://localhost:10080/push \
    -H "Accept: application/json" \
    -H "Content-Type: application/json" \
    -d '{"notifications" : [
           {
               "token" : ["[token情報を入れる]"],
               "platform" : 1,
               "message" : "hogehoge",
               "title" : "titlehoge",
               "subtitle" : "sub title hoge",
               "badge" : 99,
               "sound" : "default",
               "content_available" : true,
               "mutable_content" : true,
               "expiry" : 10,
           }
       ]
   }'

うまく送信出来たらmessage ok!と帰ってきます。
以上、メモメモ。