osm-analytic-tracker を設定してみる

OpenStreetMapの変更セットをビジュアルで確認できる osm-analytic-tracker を手動設定したときの記録です。
docker でサクッと動くように Dockerfile が用意されていますが、脳が貧弱なので自分でセットしてみないとわからんのです。
内容は1つのコンテナで各種サービスを動かすための Dockerfile-all-in-one を見ながらコマンドを打っていったものです。

まずは動作させる環境の docker コンテナを起動してスタートです。

$ docker run -it -p 80:80 debian:latest /bin/bash

以下コンテナの中で操作します。

動かしているコンテナの debian バージョン

# cat /etc/debian_version
9.1

Dockerfile では各種ディレクトリを/に作成していますがここでは/opt以下に作成することにします。 主なディレクトリは次のようなものです。

  • /opt/osm-analytic-tracker
  • /opt/osm-regions
  • /opt/html
  • /opt/osmtracker
  • /opt/osmtracker-config

パッケージ類を最新にした後で必要なものをインストールします。vimは無くてもOKですが、とりあえず確認用に。

# apt-get update && apt-get upgrade -y
# apt-get install -y supervisor git python python-pip python-shapely python-tz python-dev mongodb nginx wget vim

格納ディレクトリに移ってリポジトリをクローンします。

# cd /opt
# git clone https://github.com/MichaelVL/osm-analytic-tracker.git

Tracker で監視する範囲を示すリージョンファイルをダウンロードします。
特に「この地域だけ見るんだ」っていうのが決まっていれば必要なリージョンを示すファイルだけをダウンロードしても問題ないはず。

# mkdir osm-regions
# cd osm-regions
# wget --no-verbose -i ../osm-analytic-tracker/docker/regions.txt
# cd ../

ブラウザから確認するためのインターフェイス関係をセットします。
リポジトリのクローンからコピーしたりします。JavaScriptCSSCDNからダウンロードしてくるのはデフォルトの動作です。各ファイルから直接CDNを見に行く様にすればいいような気もしますがとりあえずそのまま。

# mkdir -p /opt/html/dynamic
# cd html
# cp -r ../osm-analytic-tracker/html/* ./
# mkdir /opt/html/jquery-2.1.3
# wget https://code.jquery.com/jquery-2.1.3.min.js -O /opt/html/jquery-2.1.3/jquery.min.js
# mkdir /opt/html/leaflet-0.7.7
# wget http://cdn.leafletjs.com/leaflet/v0.7.7/leaflet.css -O /opt/html/leaflet-0.7.7/leaflet.css
# wget http://cdn.leafletjs.com/leaflet/v0.7.7/leaflet.js -O /opt/html/leaflet-0.7.7/leaflet.js
# cd ../
# chown -R www-data:www-data /opt/html

nginx の設定をします。
とはいえリポジトリに設定ファイルも入っているのでちょっとディレクトリのパスを変更すれば完了です。

# cp osm-analytic-tracker/docker/config/nginx.conf /etc/nginx/nginx.conf
# cp osm-analytic-tracker/docker/config/nginx-osmtracker.conf /etc/nginx/sites-enabled/default
# sed -i -e 's/\/html/\/opt\/html/' /etc/nginx/sites-enabled/default

Tracker の本体をコピーして Tracker が使う python のパッケージを用意します。
Dockerfile から直接 docker build しようとすると setuptools のバージョンが古いせいで pip インストールが止まるため途中で setuptools のバージョンを上げています。

# mkdir osmtracker
# cd osmtracker
# cp ../osm-analytic-tracker/requirements.txt ./
# pip install -U pip setuptools
# pip install -r /opt/osmtracker/requirements.txt
# cd ../
# mkdir /opt/osmtracker/osm-analytic-tracker
# cd /opt/osmtracker/osm-analytic-tracker
# cp ../../osm-analytic-tracker/*.py /opt/osmtracker/osm-analytic-tracker
# cp ../../osm-analytic-tracker/logging.conf /opt/osmtracker/osm-analytic-tracker
# cp -r ../../osm-analytic-tracker/osm /opt/osmtracker/osm-analytic-tracker/osm
# cd ../
# cp -r ../osm-analytic-tracker/templates /opt/osmtracker/templates

Tracker の設定ファイルを用意します。
いくつかパスが記述されているのでそれらを全部書き換えます。
監視するリージョンの設定があるので今回は日本のリージョンを監視するようにセットします。日本の領域は離島なども含んでいて結構広いので最初に表示されるスケールも広い領域が表示されるように6から3に変更しました。

# mkdir /opt/osmtracker-config
# cd osmtracker-config
# cp ../osm-analytic-tracker/config.json ./
# sed -i -e 's/denmark.poly/japan.poly/g' config.json
# sed -i -e 's/\/osm-regions\//\/opt\/osm-regions\//g' config.json
# sed -i -e 's/"map_scale": "6"/"map_scale": "3"/' config.json
# sed -i -e 's/"path": "html"/"path": "\/opt\/html"/' config.json
# sed -i -e 's/path": "templates"/path": "\/opt\/osmtracker\/templates"/' config.json

最後に各種プログラムをデーモン化して動かすための supervisor を設定します。
ここでもパスの設定を変更しなければなりません。

# cp ../osm-analytic-tracker/docker/supervisord.conf /opt/osmtracker
# sed -i -e 's/\/osmtracker\//\/opt\/osmtracker\//' supervisord.conf
# sed -i -e 's/\/osmtracker-config/\/opt\/osmtracker-config/' supervisord.conf

試しに動かしてみます。
MongoDB 用のディレクトリを用意しないといけなかったですね。

# mkdir -p /data/db
# /usr/bin/supervisord -c /opt/osmtracker/supervisord.conf

表示されるメッセージに「gave up」とかいうのが無ければ成功しているはずです。ブラウザで表示を確認します。
ブラウザでの表示もできたなら Ctrl + C で supervisor を止めて完全にデーモン化させます。

# sed -i -e 's/nodaemon=true/nodaemon=false/' supervisord.conf
# cp supervisord.conf /etc/supervisor/conf.d/osmtracker.conf
# service supervisor start

これで変更セットを確認できるようになります。
さて、どっかの VPS で動かすか SBC で動かして公開するか…。worker がいくつか動くのでスレッド数の多い CPU で動かした方がスムースに動きそうな気がします。