######################################################################
Build dependencies within docker container for DBMI-Annotator
######################################################################

Description: This repository holds all Dockerfile as dependencies of dbmi-annotator to built 

Author: Yifan Ning, University of Pittsburgh

Environment: Ubuntu 14.04/15.10, docker > 1.9 

----------------------------------------------------------------------
Install docker and docker-compose
----------------------------------------------------------------------

(1) Install docker 
sudo apt-get install docker

(2) Install specific version of docker-compose:
$ cd
$ curl -L https://github.com/docker/compose/releases/download/1.6.2/docker-compose-`uname -s`-`uname -m` > ~/docker-compose
$ sudo mv docker-compose /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
Reference: http://www.dynomitedb.com/docs/dynomite/v0.5.7/install-docker-ubuntu-14-04/ 

Install default version of docker-compose based on Ubuntu kernel version
sudo pip install docker-compose

----------------------------------------------------------------------
Build Postgres
----------------------------------------------------------------------

Build:

(1) Install postgres 9.3
(2) Create user 'dbmiannotator' and database 'dbmiannotator'
(3) Execute script rdb-postgres-schema.sql to create table schema
(4) Execute script rdb-postgres-initial.sql to initialize plugins information
(5) build docker image <dockerhub>/postgres-9.3:latest

$ cd postgres-9.3
$ docker build -t <dockerhub>/postgres-9.3:latest .

Optional: run independently on localhost and port 5432 after built:
$ docker run -p 0.0.0.0:5432:5432 -d --name postgres <dockerhub>/postgres-9.3

Reference: 
https://docs.docker.com/engine/examples/postgresql_service/

----------------------------------------------------------------------
Build Elasticsearch
----------------------------------------------------------------------

Build:

(1) Install Java JDK 8 (Oracle) and set JAVA_HOME environment variable
(2) Install elasticsearch 1.7.3
(3) Install plugin head and build docker images <dockerhub>/elasticsearch-1.7:1.7.3
(4) Build docker image <dockerhub>/elasticsearch-1.7:1.7.3

$ cd elasticsearch-1.7
$ docker build -t <dockerhub>/elasticsearch-1.7:1.7.3 .

Optional: run independently on localhost and port 9200 after built:
$ docker run -p 9200:9200 -d --name elastic <dockerhub>/elasticsearch-1.7:1.7.3

----------------------------------------------------------------------
Build Annotator-store
----------------------------------------------------------------------
Dependency:
Elasticsearch 1.7.3 running on port 9200

Build:

(1) Download annotator store repository

$ git clone https://github.com/ningyifan/annotator-store.git

(2) Setup python virtual environment and build docker image 

$ cd annotator-store
$ docker --no-cache build -t <dockerhub>/annotator-store:latest .

Optional: run annotator store independently on localhost and port 5000:
 
$ docker run -p 0.0.0.0:5000:5000 -d --name annotator-store <dockerhub>/annotator-store python /<path to repo>/annotator-store/run.py -link <dockerhub>/elasticsearch-1.7 -e ELASTICSEARCH_HOST=elasticsearch

----------------------------------------------------------------------
Build Apache server 2.4
----------------------------------------------------------------------

Build:

(1) Download and install apache2 2.4
(2) Replace default server configuration at /etc/apache2/sites-enabled/ 
(3) Copy and configure 
(4) Start apache2 server
(5) build docker image

$ docker build -t <dockerhub>/apache2:2.4 .

Optional: run independently on localhost and port 80

$ docker run -d -p 80:80  --name=apache2 <dockerhub>/apache2:2.4

----------------------------------------------------------------------
Build nodejs server DBMI-Annotator
----------------------------------------------------------------------
Dependency:
Postgres db 9.3 running on port 5432

Built:
(1) Download dbmi-annotator

$ git clone https://github.com/dbmi-pitt/dbmi-annotator.git

(2) Install node modules

$ npm install

(3) Create config.js and modify

$ cp config/config.sample.js config/config.js
$ browserify app.js -o public/dbmiannotator/js/app.bundle.js

(4) Build docker image dbmi-annotator

$ docker build -t <dockerhub>/dbmi-annotator:latest .

(5) Push images to docker hub

$ docker push <dockerhub>/dbmi-annotator:latest

Optional: run dbmi-annotator on localhost:3000

$ docker run -p 0.0.0.0:3000:3000 -d --name dbmi-annotator <dockerhub>/dbmi-annotator node server.js  --link postgres --link elastic -e DATABASE_URL=postgre://postgres:<pin>@0.0.0.0:5432/dbmiannotator 

----------------------------------------------------------------------
Docker Administration
----------------------------------------------------------------------

Get bash shell within container (ex. apache2):

$ docker exec -it apache2 bash

Clean docker containers:

$ docker stop $(docker ps -a -q)
$ docker rm $(docker ps -a -q)

######################################################################
Deploy DBMI-Annotator on production mode
######################################################################

(1) Install docker and docker-compose
(2) Run dbmi-annotator with all dependencies in docker container

$ cd dbmi-annotator
$ docker-compose up