From c02d55090f57e74426b1b2c66890abe09c8a9c3a Mon Sep 17 00:00:00 2001
From: Allen Gilliland <agilliland@gmail.com>
Date: Tue, 24 Nov 2015 15:56:01 -0800
Subject: [PATCH] make our scripts for packaging docker images and aws-eb
 version files a bit more generic so they are more reusable.

---
 .../.ebextensions/01_metabase.config          |  50 +++++++
 .../metabase_config/metabase-setup.sh         | 103 ++++++++++++++
 .../metabase_config/nginx/default_server      |  19 +++
 .../metabase_config/nginx/log_x_real_ip.conf  |   4 +
 .../metabase_config/papertrail/log_files.yml  |   9 ++
 .../metabase_config/papertrail/remote_syslog  | 127 ++++++++++++++++++
 bin/aws-eb-docker/Dockerrun.aws.json.template |  13 ++
 bin/aws-eb-docker/build-eb-version.sh         |  19 +++
 bin/aws-eb-docker/deploy-eb-version.sh        |  33 +++++
 bin/aws-eb-docker/functions                   |  94 +++++++++++++
 bin/docker/Dockerfile                         |  19 +++
 bin/docker/build_image.sh                     | 102 ++++++++++++++
 bin/docker/run_metabase.sh                    |  29 ++++
 13 files changed, 621 insertions(+)
 create mode 100644 bin/aws-eb-docker/.ebextensions/01_metabase.config
 create mode 100755 bin/aws-eb-docker/.ebextensions/metabase_config/metabase-setup.sh
 create mode 100644 bin/aws-eb-docker/.ebextensions/metabase_config/nginx/default_server
 create mode 100644 bin/aws-eb-docker/.ebextensions/metabase_config/nginx/log_x_real_ip.conf
 create mode 100644 bin/aws-eb-docker/.ebextensions/metabase_config/papertrail/log_files.yml
 create mode 100644 bin/aws-eb-docker/.ebextensions/metabase_config/papertrail/remote_syslog
 create mode 100644 bin/aws-eb-docker/Dockerrun.aws.json.template
 create mode 100755 bin/aws-eb-docker/build-eb-version.sh
 create mode 100644 bin/aws-eb-docker/deploy-eb-version.sh
 create mode 100644 bin/aws-eb-docker/functions
 create mode 100644 bin/docker/Dockerfile
 create mode 100755 bin/docker/build_image.sh
 create mode 100755 bin/docker/run_metabase.sh

diff --git a/bin/aws-eb-docker/.ebextensions/01_metabase.config b/bin/aws-eb-docker/.ebextensions/01_metabase.config
new file mode 100644
index 00000000000..01b1b7dad05
--- /dev/null
+++ b/bin/aws-eb-docker/.ebextensions/01_metabase.config
@@ -0,0 +1,50 @@
+######
+# Metabase Report server Elastic Beanstalk configuration
+# Modify the environmental variables below to customize your installation
+# Comment out a variable to disable a feature
+#####
+container_commands:
+    #customize_env: 
+        #env:
+            #NGINX_SERVER_NAME: metabase.example.com
+            #NGINX_FORCE_SSL: 1
+            #PAPERTRAIL_HOSTNAME: $HOSTNAME
+            #PAPERTRAIL_HOST: foobar.papertrailapp.com
+            #PAPERTRAIL_PORT: 12345
+            #PAPERTRAIL_FILES: /var/log/nginx/access.log /var/log/nginx/error.log
+        #command: true
+        #ignoreErrors: false
+
+    01_server-name:
+        command: ".ebextensions/metabase_config/metabase-setup.sh server_name"
+        test: test $NGINX_SERVER_NAME
+        ignoreErrors: true
+
+    02_server_https:
+        command: ".ebextensions/metabase_config/metabase-setup.sh server_https"
+        test: test $NGINX_FORCE_SSL
+        ignoreErrors: true
+
+    03_log_x_real_ip:
+        command: ".ebextensions/metabase_config/metabase-setup.sh log_x_real_ip"
+        ignoreErrors: true
+
+    04_install_papertrail:
+        command: ".ebextensions/metabase_config/metabase-setup.sh install_papertrail"
+        test: test $PAPERTRAIL_HOST
+        ignoreErrors: true
+
+    05_try_papertrail:
+        command: "/sbin/service remote_syslog restart"
+        test: test -e /etc/log_files.yml
+        ignoreErrors: true
+
+    06_try_nginx:
+        command: "/sbin/service nginx restart"
+        test: nginx -t
+        ignoreErrors: false
+
+option_settings:
+  - namespace: aws:elasticbeanstalk:command
+    option_name: Timeout
+    value: 600
diff --git a/bin/aws-eb-docker/.ebextensions/metabase_config/metabase-setup.sh b/bin/aws-eb-docker/.ebextensions/metabase_config/metabase-setup.sh
new file mode 100755
index 00000000000..2f6a9eb1f14
--- /dev/null
+++ b/bin/aws-eb-docker/.ebextensions/metabase_config/metabase-setup.sh
@@ -0,0 +1,103 @@
+#!/bin/bash
+####
+# Metabase Report server Elastic Beanstalk metabase-setup.sh
+# Modify the environmental variables to customize your installation
+# Unset a variable to disable a feature
+####
+
+# add files to papertrail
+pt_files () {
+    sed -i '/  - .*/d' /etc/log_files.yml
+    set -f
+    for file in $PAPERTRAIL_FILES; do
+        sed -i 's|files:|files:\n  - '$file'|' /etc/log_files.yml
+    done
+    set +f
+}
+
+# papertail remote host
+pt_remote_host () {
+    sed -i "s/.*host:.*/  host: $PAPERTRAIL_HOST/" /etc/log_files.yml
+}
+
+# papertail remote port
+pt_port () {
+    sed -i "s/.*port:.*/  port: $PAPERTRAIL_PORT/" /etc/log_files.yml
+}
+
+# papertail local host
+pt_local_host () {
+    eval export PAPERTRAIL_HOSTNAME=$PAPERTRAIL_HOSTNAME # expand vars like $HOSTNAME
+    sed -i "s/.*hostname:.*/hostname: $PAPERTRAIL_HOSTNAME/" /etc/log_files.yml
+}
+
+# nginx server name
+server_name () {
+    [[ "$NGINX_SERVER_NAME" ]] && cp_default_server
+    cd /etc/nginx/sites-available/
+    if [[ "$NGINX_SERVER_NAME" ]] ; then
+        if ! grep -q server_name elasticbeanstalk-nginx-docker-proxy.conf ; then
+            sed -i "s|listen 80\;|listen 80\;\n        server_name $NGINX_SERVER_NAME \*\.$NGINX_SERVER_NAME\;\n|" elasticbeanstalk-nginx-docker-proxy.conf
+        fi
+    else
+        # no hostname passed, disable default_server
+        sed -i '/server_name/d' elasticbeanstalk-nginx-docker-proxy.conf
+        [[ -e /etc/nginx/sites-enabled/default_server ]] && rm /etc/nginx/sites-enabled/default_server
+    fi
+}
+
+# enable https redirect
+server_https () {
+    cd /etc/nginx/sites-available/
+    if [[ "$NGINX_FORCE_SSL" ]] && ! grep -q https elasticbeanstalk-nginx-docker-proxy.conf ; then
+        sed -i 's|location \/ {|location \/ {\n\n        if ($http_x_forwarded_proto != "https") {\n                rewrite ^ https:\/\/$host$request_uri? permanent;\n        }\n|' elasticbeanstalk-nginx-docker-proxy.conf
+    fi
+}
+
+# download, install and configure papertrail
+install_papertrail () {
+    cp .ebextensions/metabase_config/papertrail/log_files.yml /etc/log_files.yml && chmod 644 /etc/log_files.yml
+    cp .ebextensions/metabase_config/papertrail/remote_syslog /etc/init.d/remote_syslog && chmod 555 /etc/init.d/remote_syslog
+    cd /tmp/
+    wget -q "https://github.com/papertrail/remote_syslog2/releases/download/v0.14/remote_syslog_linux_amd64.tar.gz" &&
+        tar xzf remote_syslog_linux_amd64.tar.gz
+    /sbin/service remote_syslog stop
+    mv /tmp/remote_syslog/remote_syslog /usr/local/bin/
+    rm -rf remote_syslog_linux_amd64.tar.gz remote_syslog
+    # Setup Papertrail
+    [[ "$PAPERTRAIL_HOST" ]] && pt_remote_host
+    [[ "$PAPERTRAIL_PORT" ]] && pt_port
+    [[ "$PAPERTRAIL_FILES" ]] && pt_files
+    [[ "$PAPERTRAIL_HOSTNAME" ]] && pt_local_host
+}
+
+# enable default_server to drop DNS poisoning
+cp_default_server () {
+    cp .ebextensions/metabase_config/nginx/default_server /etc/nginx/sites-available/default_server
+    [[ ! -e /etc/nginx/sites-enabled/default_server ]] &&
+        ln -s /etc/nginx/sites-available/default_server /etc/nginx/sites-enabled/default_server
+}
+
+# update nginx logging to include x_real_ip
+log_x_real_ip () {
+    cp .ebextensions/metabase_config/nginx/log_x_real_ip.conf /etc/nginx/conf.d/log_x_real_ip.conf
+    cd  /etc/nginx/sites-available
+    if ! grep -q access_log *-proxy.conf ; then 
+        sed -i 's|location \/ {|location \/ {\n\n        access_log \/var\/log\/nginx\/access.log log_x_real_ip;\n|' *-proxy.conf
+    fi
+}
+
+case $1 in
+server_name)
+    server_name
+    ;;
+server_https)
+    server_https
+    ;;
+install_papertrail)
+    install_papertrail
+    ;;
+log_x_real_ip)
+    log_x_real_ip
+    ;;
+esac
diff --git a/bin/aws-eb-docker/.ebextensions/metabase_config/nginx/default_server b/bin/aws-eb-docker/.ebextensions/metabase_config/nginx/default_server
new file mode 100644
index 00000000000..49d14b428c4
--- /dev/null
+++ b/bin/aws-eb-docker/.ebextensions/metabase_config/nginx/default_server
@@ -0,0 +1,19 @@
+# /etc/nginx/sites-available/default_server
+server {
+    listen 80 default_server;
+
+    location /api/health {
+        access_log off;
+        proxy_pass            http://docker;
+        proxy_http_version    1.1;
+        proxy_set_header    Connection            $connection_upgrade;
+        proxy_set_header    Upgrade               $http_upgrade;
+        proxy_set_header    Host                  $host;
+        proxy_set_header    X-Real-IP             $remote_addr;
+        proxy_set_header    X-Forwarded-For       $proxy_add_x_forwarded_for;
+    }
+
+    location / {
+        return 444;
+    }
+}
diff --git a/bin/aws-eb-docker/.ebextensions/metabase_config/nginx/log_x_real_ip.conf b/bin/aws-eb-docker/.ebextensions/metabase_config/nginx/log_x_real_ip.conf
new file mode 100644
index 00000000000..a6cbe070a52
--- /dev/null
+++ b/bin/aws-eb-docker/.ebextensions/metabase_config/nginx/log_x_real_ip.conf
@@ -0,0 +1,4 @@
+# /etc/nginx/conf.d/log_x_real_ip.conf
+log_format log_x_real_ip '$proxy_add_x_forwarded_for - [$time_local] '
+                      '$request $status $body_bytes_sent '
+                      '$http_referer $http_user_agent';
diff --git a/bin/aws-eb-docker/.ebextensions/metabase_config/papertrail/log_files.yml b/bin/aws-eb-docker/.ebextensions/metabase_config/papertrail/log_files.yml
new file mode 100644
index 00000000000..519dbaa5255
--- /dev/null
+++ b/bin/aws-eb-docker/.ebextensions/metabase_config/papertrail/log_files.yml
@@ -0,0 +1,9 @@
+# /etc/log_files.yml - Papertrail
+files:
+  - /var/log/nginx/access.log
+hostname:
+destination:
+  host:
+  port:
+  protocol: tls
+new_file_check_interval: "10" # Check every 10 seconds
diff --git a/bin/aws-eb-docker/.ebextensions/metabase_config/papertrail/remote_syslog b/bin/aws-eb-docker/.ebextensions/metabase_config/papertrail/remote_syslog
new file mode 100644
index 00000000000..e5ec6aa5ba7
--- /dev/null
+++ b/bin/aws-eb-docker/.ebextensions/metabase_config/papertrail/remote_syslog
@@ -0,0 +1,127 @@
+#!/bin/bash
+# /etc/init.d/remote_syslog
+#
+# remote_syslog This shell script takes care of starting and stopping
+#               remote_syslog daemon
+#
+# chkconfig: - 58 74
+# description: papertrail/remote_syslog \
+#              https://github.com/papertrail/remote_syslog2/blob/master/examples/remote_syslog.init.d
+
+### BEGIN INIT INFO
+# Provides: remote_syslog
+# Required-Start: $network $local_fs $remote_fs
+# Required-Stop: $network $local_fs $remote_fs
+# Should-Start: $syslog $named ntpdate
+# Should-Stop: $syslog $named
+# Short-Description: start and stop remote_errolog
+# Description: papertrail/remote_syslog2
+#              https://github.com/papertrail/remote_syslog2/blob/master/examples/remote_syslog.init.d
+### END INIT INFO
+
+# Source function library.
+. /etc/init.d/functions
+
+# Source networking configuration.
+. /etc/sysconfig/network
+ 
+prog="/usr/local/bin/remote_syslog"   
+config="/etc/log_files.yml"
+pid_dir="/var/run"
+
+EXTRAOPTIONS=""
+
+pid_file="$pid_dir/remote_syslog.pid"
+
+PATH=/sbin:/bin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
+
+RETVAL=0
+
+is_running(){
+    # Do we have PID-file?
+    if [ -f "$pid_file" ]; then
+        # Check if proc is running
+        pid=`cat "$pid_file" 2> /dev/null`
+        if [[ $pid != "" ]]; then
+            exepath=`readlink /proc/"$pid"/exe 2> /dev/null`
+            exe=`basename "$exepath"`
+            if [[ $exe == "remote_syslog" ]]; then
+                # Process is running
+                return 0
+            fi
+        fi
+    fi
+    return 1
+}
+
+start(){
+    echo -n $"Starting $prog: "
+    unset HOME MAIL USER USERNAME
+    $prog -c $config --pid-file=$pid_file $EXTRAOPTIONS
+    RETVAL=$?
+    echo
+    return $RETVAL
+}
+
+stop(){
+    echo -n $"Stopping $prog: "
+    if (is_running); then
+      kill `cat $pid_file`
+      RETVAL=$?
+      echo
+      return $RETVAL
+    else
+      echo "$pid_file not found"
+    fi
+}
+
+status(){
+    echo -n $"Checking for $pid_file: "
+
+    if (is_running); then
+      echo "found"
+    else
+      echo "not found"
+    fi
+}
+
+reload(){
+    restart
+}
+
+restart(){
+    stop
+    start
+}
+
+condrestart(){
+    is_running && restart
+    return 0
+}
+
+# See how we were called.
+case "$1" in
+    start)
+  start
+  ;;
+    stop)
+  stop
+  ;;
+    status)
+  status
+  ;;
+    restart)
+  restart
+  ;;
+    reload)
+  reload
+  ;;
+    condrestart)
+  condrestart
+  ;;
+    *)
+  echo $"Usage: $0 {start|stop|status|restart|condrestart|reload}"
+  RETVAL=1
+esac
+
+exit $RETVAL
diff --git a/bin/aws-eb-docker/Dockerrun.aws.json.template b/bin/aws-eb-docker/Dockerrun.aws.json.template
new file mode 100644
index 00000000000..37a8ac0bf37
--- /dev/null
+++ b/bin/aws-eb-docker/Dockerrun.aws.json.template
@@ -0,0 +1,13 @@
+{
+  "AWSEBDockerrunVersion": "1",
+  "Image": {
+    "Name": "metabase/@@MB_REPOSITORY@@:@@MB_TAG@@",
+    "Update": "true"
+  },
+  "Ports": [
+    {
+      "ContainerPort": "3000"
+    }
+  ],
+  "Logging": "/var/log/metabase"
+}
diff --git a/bin/aws-eb-docker/build-eb-version.sh b/bin/aws-eb-docker/build-eb-version.sh
new file mode 100755
index 00000000000..39747d79a61
--- /dev/null
+++ b/bin/aws-eb-docker/build-eb-version.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+BASEDIR=$(dirname $0)
+source "$BASEDIR/functions"
+
+MB_TAG=$1
+if [ -z $MB_TAG ]; then
+    echo "usage: $0 <release-name> <docker-repository>"
+    exit 1
+fi
+
+MB_DOCKER_REPOSITORY=$2
+if [ -z $MB_DOCKER_REPOSITORY ]; then
+    echo "usage: $0 <release-name> <docker-repository>"
+    exit 1
+fi
+
+
+make_eb_version ${MB_TAG} ${MB_DOCKER_REPOSITORY}
diff --git a/bin/aws-eb-docker/deploy-eb-version.sh b/bin/aws-eb-docker/deploy-eb-version.sh
new file mode 100644
index 00000000000..f8b5b2b81aa
--- /dev/null
+++ b/bin/aws-eb-docker/deploy-eb-version.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+
+BASEDIR=$(dirname $0)
+source "$BASEDIR/functions"
+
+MB_TAG=$1
+if [ -z $MB_TAG ]; then
+    echo "usage: $0 <release-name> <docker-repository> <eb-environment>"
+    exit 1
+fi
+
+MB_DOCKER_REPOSITORY=$2
+if [ -z $MB_DOCKER_REPOSITORY ]; then
+    echo "usage: $0 <release-name> <docker-repository> <eb-environment>"
+    exit 1
+fi
+
+EB_ENVIRONMENT=$3
+if [ -z $EB_ENVIRONMENT ]; then
+    echo "usage: $0 <release-name> <docker-repository> <eb-environment>"
+    exit 1
+fi
+
+if [ -z "$AWS_DEFAULT_PROFILE" ]; then
+    echo "You must set the AWS_DEFAULT_PROFILE environment variable in order to deploy to AWS!"
+    exit 1
+fi
+
+
+make_eb_version ${MB_TAG} ${MB_DOCKER_REPOSITORY}
+upload_eb_version ${MB_TAG}
+create_eb_version ${MB_TAG}
+deploy_version ${MB_TAG} ${EB_ENVIRONMENT}
diff --git a/bin/aws-eb-docker/functions b/bin/aws-eb-docker/functions
new file mode 100644
index 00000000000..70e77649508
--- /dev/null
+++ b/bin/aws-eb-docker/functions
@@ -0,0 +1,94 @@
+#!/bin/bash
+set -eo pipefail
+
+BASEDIR=$(dirname $0)
+CURRENTDIR=$PWD
+PROJECT_ROOT=$(cd ${BASEDIR}/..; pwd)
+
+ARTIFACTS_S3BUCKET=${S3BUCKET:=metabase-artifacts}
+
+
+export LANG=en_US.UTF-8
+export LANGUAGE=$LANG
+export LC_ALL=$LANG
+
+
+make_eb_version() {
+    MB_TAG=$1
+    MB_DOCKER_REPOSITORY=$2
+
+    $(which locale) | $(which sort) || true
+
+    if [[ -z $MB_TAG ]]; then
+        echo "release name not provided!"
+        exit 1
+    fi
+
+    if [[ -z $MB_DOCKER_REPOSITORY ]]; then
+        echo "docker repository name not provided!"
+        exit 1
+    fi
+
+    RELEASE_FILE="/tmp/${MB_TAG}.zip"
+
+    echo "Building Elastic Beanstalk app version for Metabase using Docker Image: metabase/${MB_DOCKER_REPOSITORY}:${MB_TAG}"
+
+    # dynamically insert our MB version into the EB config file
+    sed "s/@@MB_REPOSITORY@@/${MB_DOCKER_REPOSITORY}/" < ${BASEDIR}/Dockerrun.aws.json.template > ${BASEDIR}/Dockerrun.aws.json.tmp
+    sed "s/@@MB_TAG@@/${MB_TAG}/" < ${BASEDIR}/Dockerrun.aws.json.tmp > ${BASEDIR}/Dockerrun.aws.json
+
+    # create our EB zip file
+    cd $BASEDIR; zip -r ${RELEASE_FILE} .ebextensions Dockerrun.aws.json; cd $CURRENTDIR
+
+    # clean up the temporary Dockerrun.aws.json file we created
+    rm ${BASEDIR}/Dockerrun.aws.json.tmp
+    rm ${BASEDIR}/Dockerrun.aws.json
+}
+
+upload_eb_version() {
+    MB_TAG=$1
+
+    $(which locale) | $(which sort) || true
+
+    if [[ -z $MB_TAG ]]; then
+        echo "release name not provided!"
+        exit 1
+    fi
+
+    echo "uploading /tmp/${MB_TAG}.zip -> $ARTIFACTS_S3BUCKET/eb/"
+    aws s3 cp /tmp/${MB_TAG}.zip s3://$ARTIFACTS_S3BUCKET/eb/${MB_TAG}.zip
+}
+
+create_eb_version() {
+    EB_APPLICATION=Metabase
+    MB_TAG=$1
+
+    $(which locale) | $(which sort) || true
+
+    if [[ -z $MB_TAG ]]; then
+        echo "release name not provided!"
+        exit 1
+    fi
+
+    echo "Creating app version in EB"
+    aws elasticbeanstalk create-application-version --no-auto-create-application --region us-east-1 --application-name ${EB_APPLICATION} --version-label ${MB_TAG} --source-bundle S3Bucket="${ARTIFACTS_S3BUCKET}",S3Key="eb/${MB_TAG}.zip"
+}
+
+deploy_version() {
+    MB_TAG=$1
+    EB_ENVIRONMENT=$2
+
+    $(which locale) | $(which sort) || true
+
+    if [[ -z $MB_TAG ]]; then
+        echo "release name not provided!"
+        exit 1
+    fi
+
+    if [[ -z $EB_ENVIRONMENT ]]; then
+        echo "beanstalk environment not provided!"
+        exit 1
+    fi
+
+    aws elasticbeanstalk update-environment --region us-east-1 --environment-name ${EB_ENVIRONMENT} --version-label ${MB_TAG}
+}
diff --git a/bin/docker/Dockerfile b/bin/docker/Dockerfile
new file mode 100644
index 00000000000..55863f5705c
--- /dev/null
+++ b/bin/docker/Dockerfile
@@ -0,0 +1,19 @@
+FROM java:openjdk-7-jre
+
+ENV LC_ALL C
+ENV LANG C.UTF-8
+ENV DEBIAN_FRONTEND noninteractive
+ENV DEBCONF_NONINTERACTIVE_SEEN true
+
+# add Metabase jar
+COPY ./metabase.jar /app/
+
+# add our run script to the image
+COPY ./run_metabase.sh /app/
+RUN chmod 755 /app/run_metabase.sh
+
+# expose our default runtime port
+EXPOSE 3000
+
+# run it
+ENTRYPOINT ["/app/run_metabase.sh"]
diff --git a/bin/docker/build_image.sh b/bin/docker/build_image.sh
new file mode 100755
index 00000000000..83cb7b72900
--- /dev/null
+++ b/bin/docker/build_image.sh
@@ -0,0 +1,102 @@
+#!/bin/bash
+
+BASEDIR=$(dirname $0)
+PROJECT_ROOT="$BASEDIR/../.."
+
+DOCKERHUB_NAMESPACE=metabase
+
+
+BUILD_TYPE=$1
+if [ -z $BUILD_TYPE ]; then
+    echo "usage: $0 <source|release> <release-name> [--publish]"
+    exit 1
+fi
+
+MB_TAG=$2
+if [ -z $MB_TAG ]; then
+    echo "usage: $0 <source|release> <release-name> [--publish] [--latest]"
+    exit 1
+fi
+
+if [ "$3" == "--publish" ]; then
+    PUBLISH="YES"
+fi
+
+if [ "$4" == "--latest" ]; then
+    LATEST="YES"
+fi
+
+if [ "$PUBLISH" == "YES" ] && [ -z "$DOCKERHUB_EMAIL" -o -z "$DOCKERHUB_USERNAME" -o -z "$DOCKERHUB_PASSWORD" ]; then
+    echo "In order to publish an image to Dockerhub you must set \$DOCKERHUB_EMAIL, \$DOCKERHUB_USERNAME and \$DOCKERHUB_PASSWORD before running."
+    exit 1
+fi
+
+# TODO: verify we have access to docker cmd and minimum version?
+
+
+if [ "$BUILD_TYPE" == "release" ]; then
+    DOCKERHUB_REPOSITORY=metabase
+    DOCKER_IMAGE="${DOCKERHUB_NAMESPACE}/${DOCKERHUB_REPOSITORY}:${MB_TAG}"
+
+    echo "Building Docker image ${DOCKER_IMAGE} from official Metabase release ${MB_TAG}"
+
+    # download the official version of Metabase which matches our tag
+    curl -f -o ${BASEDIR}/metabase.jar http://downloads.metabase.com/${MB_TAG}/metabase.jar
+
+    if [[ $? -ne 0 ]]; then
+        echo "Download failed!"
+        exit 1
+    fi
+else
+    DOCKERHUB_REPOSITORY=metabase-head
+    DOCKER_IMAGE="${DOCKERHUB_NAMESPACE}/${DOCKERHUB_REPOSITORY}:${MB_TAG}"
+
+    echo "Building Docker image ${DOCKER_IMAGE} from local source"
+
+    # trigger a full build
+    ${PROJECT_ROOT}/bin/build
+
+    if [ $? -eq 1 ]; then
+        echo "Build failed!"
+        exit 1
+    fi
+
+    # copy our built uberjar so that we can add it to our image
+    cp ${PROJECT_ROOT}/target/uberjar/metabase.jar ${BASEDIR}/metabase.jar
+fi
+
+
+# now tell docker to build our image
+# TODO: —-no-cache=true
+docker build -t ${DOCKER_IMAGE} $BASEDIR
+
+# TODO: validate our built docker image
+
+
+if [ "$PUBLISH" == "YES" ]; then
+    echo "Publishing image ${DOCKER_IMAGE} to Dockerhub"
+
+    # make sure that we are logged into dockerhub
+    docker login --email="${DOCKERHUB_EMAIL}" --username="${DOCKERHUB_USERNAME}" --password="${DOCKERHUB_PASSWORD}"
+
+    # push the built image to dockerhub
+    docker push ${DOCKER_IMAGE}
+
+    # TODO: quick check against dockerhub to see that our new image made it
+
+    if [ "$LATEST" == "YES" ]; then
+        # tag our recent versioned image as "latest"
+        docker tag -f ${DOCKER_IMAGE} ${DOCKERHUB_NAMESPACE}/${DOCKERHUB_REPOSITORY}:latest
+
+        # then push it as well
+        docker push ${DOCKERHUB_NAMESPACE}/${DOCKERHUB_REPOSITORY}:latest
+
+        # TODO: validate push succeeded
+    fi
+fi
+
+# TODO: cleanup after ourselves and remove the Metabase binary we downloaded
+rm -f ${BASEDIR}/metabase.jar
+
+echo "Done"
+
diff --git a/bin/docker/run_metabase.sh b/bin/docker/run_metabase.sh
new file mode 100755
index 00000000000..89f4c491757
--- /dev/null
+++ b/bin/docker/run_metabase.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+# if nobody manually set a host to list on then go with $HOSTNAME
+if [ -z "$MB_JETTY_HOST" ]; then
+    export MB_JETTY_HOST=$HOSTNAME
+fi
+
+
+# Metabase Database Info - this is just about what db the Metabase application uses for internal storage
+
+# AWS Elastic Beanstalk w/ RDS
+if [ ! -z "$RDS_HOSTNAME" ]; then
+    # EEK: this is a bit fragile.  if user picks a non-standard port for their db we are screwed :(
+    if [ "$MB_DB_PORT" == "3306" ]; then
+        export MB_DB_TYPE=mysql
+    else
+        export MB_DB_TYPE=postgres
+    fi
+
+    export MB_DB_DBNAME=$RDS_DB_NAME
+    export MB_DB_USER=$RDS_USERNAME
+    export MB_DB_PASS=$RDS_PASSWORD
+    export MB_DB_HOST=$RDS_HOSTNAME
+    export MB_DB_PORT=$RDS_PORT
+fi
+
+
+# Launch the application
+java -Dlogfile.path=target/log -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -jar /app/metabase.jar
-- 
GitLab