bratサーバをEC2に立てて複数人でアノテーションできるようにした
アノテーション作業の効率化のため、bratサーバを立てることにしました。
EC2上にdockerを使って構築しました。
これでウェブ経由で複数人でアノテーションを行えます。
目次
Dockerfile解説
さてbratサーバのDockerfileですがありがたいことに先駆者がいます。
今回はそちらのDockerfileを使いました。
要素の解説。
brat
bratはアノテーションツールです。詳しくはこちら。
バージョンはv 1.3を使います。
Githubで管理されていますが、後述するようにMasterリポジトリはエラーが出ます(2018/12/22現在)。
Githubではなく、公式のサイト経由でダウンロードして展開したものを利用します。
Python
2系が推奨みたいなので従います。
The brat server is implemented in Python, and requires version 2.5 (or higher in the 2.x series) of python to run. If you do not currently have python installed, we recommend installing the most recent version of python in the 2.x series from python.org.
GithubのMasterブランチは3系で開発されているっぽくて「3でいけるやん」と思ったらエラーが出ました。
ModuleNotFoundError: No module named 'filelock'
解消法がわからなかったので公式サイトからv 1.3をダウンロードして素直にPython2系を使います。
Apache
bratはチュートリアル通りstandalone.pyを起動した場合、Python標準ライブラリのBaseHTTPServerを利用してサーバを立てます。簡単な動作確認や個人的な作業にはこれで十分です。
しかし本番環境ではセキュリティを考えてApacheなどのウェブサーバを使いましょうとのこと。今回は多数の人間にアクセスしてもらうbratサーバを作ることを目的としているのでApacheを入れます。
However, the standalone server is not currently security-hardened or as comprehensively tested as the rest of brat. For these reason, we strongly recommend serving brat via a full web server such as Apache in production environments, projects involving sensitive data, and on systems accessible from the internet.
Dockerfile
肝心のDockerfileはこちら。
残念なことに既にメンテナンスを放棄されたようですが、2018年12月22日現在問題なく稼動しました。
フォークしてREADMEを日本語化しました。他のコードの部分も日本語コメントに置き換える予定です。
AWS EC2を立てる
むちゃんこ久しぶり。
- インスタン: AWS EC2 t2.small
- OS: CentOS 7
過去の自分の投稿を見ながらやる。頼りになる男だぜ。
ちゃかちゃか作ってSSH接続。こっからはEC2インスタンス内で作業。
インスタンスタイプはt2.microにしました。十分十分。
Elastic IP設定して、80番ポートを開けておきます。
dockerコマンドもインストール。
$ sudo apt install docker.io
$ sudo systemctl start docker
Dockerコンテナを起動
とりあえずgit、dockerをEC2上にインストール。
gitコマンドで先ほどのリポジトリをclone。
$ git clone https://github.com/roy29fuku/brat-docker.git
docker volumeを作成。ここにデータや設定ファイルを置きます。
$ sudo docker volume create --name brat-data
$ sudo docker volume create --name brat-cfg
volumeができたか確認します。
$ sudo docker volume ls
DRIVER VOLUME NAME
local brat-cfg
local brat-data
volumeのホスト上の場所は以下のコマンドで確認します。
$ sudo docker volume inspect brat-cfg
[
{
"CreatedAt": "2019-08-01T07:35:48Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/brat-cfg/_data",
"Name": "brat-cfg",
"Options": {},
"Scope": "local"
}
]
bratに複数アカウントを作成したい場合は、このタイミングでusers.jsonファイルを作成します(アカウントが一つでよければスキップ)。
users.jsonはbrat-cfg/ ディレクトリ下。
デフォルトでは以下の位置にusers.jsonを作成します。
$ sudo vi /var/lib/docker/volumes/brat-cfg/_data/users.json
jsonファイルの中身は以下の形でユーザ名とパスワードを記述します(もちろん複数可能)。
{
"user1": "pass1",
"user2": "pass2"
}
Dockerfileに基づいてイメージを構築します。
$ cd brat-docker/
$ sudo docker build . -t roy29fuku/brat
-tでタグ名を指定します。
しばらくイメージの構築に時間がかかります。
イメージが作成されたか確認します。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
roy29fuku/brat latest b1e79c2926bc 25 hours ago 413MB
各種引数を渡してdockerコンテナを起動します。
ここでbrat初期設定時に必要なユーザ、パスワード、emailを指定します(user.jsonで定義していた場合も別途必要です)。
$ sudo docker run --name=brat -d -p 80:80 -v brat-data:/bratdata -v brat-cfg:/bratcfg -e BRAT_USERNAME=brat -e BRAT_PASSWORD=brat -e BRAT_EMAIL=brat@example.com roy29fuku/brat
–nameはコンテナ名、-dはデタッチドモード、-pはポート、-vはボリューム、-eは環境変数を指定します。
ホスト(EC2)の80番ポートがbratサーバを動かしているDockerの80番ポートにつながりました。
EC2のIPアドレスなりを叩いてアクセスしてみましょう。
bratサーバが表示されればOK!
右上のログインボタンから設定したアカウントでログインできるか確認してください。
Dockerコンテナの作り直し
users.jsonはdocker build時に参照されます。
つまり後から書き換えても反映されないのでユーザを追加したい場合はコンテナの停止・削除を行い、
$ sudo docker stop brat
$ sudo docker rm brat
users.jsonに追記した上で先述のdocker buildコマンドを実行します。
もしくはdockerコンテナ内に入って、直接49行目のUSER_PASSWORDの位置に追記すればアカウントを登録できます。
$ sudp docker exec -it brat bash
(docker内)$ vi /var/www/brat/brat-v1.3_Crunchy_Frog/config.py
ただし、この場合dockerコンテナを再起動すると変更が消えてしまうのでオススメしません。
ftpでファイルを置けるようにする
AWSコンソールでEC2開きます。セキュリティグループのインバウンドに21番ポートを追加します。
あとはFTPソフトで接続すればローカルのデータを簡単にアップできます。
アップロード先は以下のコマンドで調べられます。
$ sudo docker volume inspect brat-data
デフォルトでは/var/lib/docker/volumes/brat-data/_dataです。
ここにディレクトリを作成しファイルを置けばbrat側から確認できます。このファイルもdockerを停止した後も残ります。
bratで利用するにはアノテーション対象のファイルだけでなく設定ファイルが必要になる点に注意。詳細は以前まとめました。