Dockerを使ってOSM Tasking Manager 3を利用する
みんなで一斉にOpenStreetMapの地図を書く時、それぞれの作業がぶつからないようコーディネートするためのツールに「Tasking Manager」というものがあります。
Tasking ManagerはWebシステムで、デプロイには結構面倒な作業が必要になりますが、dockerも用意されていて簡単に試すことができ…るはずだったのですが簡単に起動しなかったのでメモしておきます。 (全部、ぞあさんに教えていただいたので自分では何も解決していないのですが、忘れないように)
設定ファイルを作る
ここは、README.mdに書いてあることそのままです。
$ git clone https://github.com/hotosm/tasking-manager.git
$ cd tasking-manager/
$ cp example.env tasking-manager.env
Tasking Managerの認証にOpenStreetMapアカウントを利用するので、 _https://www.openstreetmap.org/user/
tasking-manager.envを編集して、取得したTM_CONSUMER_KEYとTM_CONSUMER_SECRETを書き込みます。
# OpenStreetMap OAuth consumer key and secret (required)
#
TM_CONSUMER_KEY=foo
TM_CONSUMER_SECRET=s0m3l0ngr4nd0mstr1ng-b3cr34tiv3&h4v3fun
dockerのTasking Managerを起動する
これで docker-compose up -d で起動して、ブラウザから http://127.0.0.1:5000/ にアクセスするとTasking Managerが使える…と思っていましたが「Not Found」になります。ログを見てもファイルが無い状態。
$ docker-compose logs app
Attaching to taskingmanager_app_1
app_1 | manage.py:34: UserWarning: Homepage counters not initialized.
app_1 | warnings.warn('Homepage counters not initialized.')
app_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
app_1 | 172.18.0.1 - - [04/Apr/2019 05:22:00] "GET / HTTP/1.1" 404 -
app_1 | 172.18.0.1 - - [04/Apr/2019 05:22:00] "GET /favicon.ico HTTP/1.1" 404 -
これは、ぞあさんによると「client/ で gulp build が実行されていないため server/web/static/dist にフロントエンドが存在せず Not Found になっているよう」とのこと。
taskingmanager_app_1に入って、npmのインストールとgulpの実行をします。
$ docker exec -it taskingmanager_app_1 bash
container:/usr/src/app# cd client && npm install && gulp build
これで改めて http://127.0.0.1:5000/ にアクセスすると画面が出ます。
続いてブラウザ画面右上の「ログイン」からログインをしますが、ここも罠があってログインできません。 ログを見るとSQLでコケてます。
ぞあさんによると「データベースの初期化がうまくできてない」ようなので、もう一度、taskingmanager_app_1に入って、データベースの初期化をします。
$ docker exec -it taskingmanager_app_1 bash
container:/usr/src/app# python manage.py db upgrade
これでログインもできて、tasking managerのユーザーとしては利用できるはず。 動くことが確認できたら、この状態をコミットしておきます。
$ docker commit taskingmanager_app_1
これでもうまくいかない場合はデータベース・ボリュームを削除して作り直す
自分の場合、なぜかこれでログインできませんでした。この場合、データベース・ボリュームを削除して、もう一度作り直してからデータベースの初期化をするとうまく動きました。
//Tasking Manager と PostgreSQL のコンテナを停止して待機状態のコンテナを削除します
$ docker-compose down
//PostgreSQL コンテナ用に保持されているデータを削除します
$ docker volume rm tasking-manager_pgdata
//Tasking Manager と PostgreSQL のコンテナを立ち上げます
$ docker-compose up -d
//Tasking Manager コンテナで bash を起動して標準入出力に接続します
$ docker exec -it tasking-manager_app_1 bash
//コンテナでデータベースの初期化を行います
container# python manage.py db upgrade
//exit で bash プロセスを抜けられます
container# exit
Tasking Managerの管理者になる
これで使えるようになりましたが、ユーザーなのでプロジェクトの登録ができません。 README.mdを見るとTasking Managerのユーザーレベルは、データベースを書き換えて権限を付与をすると変更できるとのこと。
データベースの変更は、taskingmanager_postgresql_1に入って、README.mdに書いてある権限を付与するSQLを実行します。データベース名やユーザー名は、tasking-manager.envに書いてあるように指定します。
$ docker exec -it taskingmanager_postgresql_1 bash
container:/# psql -U tm -d tasking-manager -c "UPDATE users set role = 1 where username = '<your_osm_username>'"
これでログインをし直せばTasking Managerの管理者になっています。
まとめ
dockerって一発で動くはずと思っていたのに…。おひとりさまTasking Managerがあると、自分が書いてる場所の管理ができて便利なので使ってみてください。