From 10446740740bae9845d71481a2c91f314d342ed2 Mon Sep 17 00:00:00 2001
From: Patrick Jentsch <p.jentsch@uni-bielefeld.de>
Date: Thu, 5 Sep 2019 16:39:50 +0200
Subject: [PATCH] Dockerize the App!

---
 .flaskenv                          |  2 --
 .gitignore                         |  6 ++----
 Dockerfile                         |  9 +++++++--
 config.py                          | 29 +++++++++++++++--------------
 docker-entrypoint.sh               |  6 ++++--
 opaque.py                          |  5 +++++
 opaque_database_env_example        |  3 +++
 .env_example => opaque_env_example |  3 ---
 requirements.txt                   |  1 +
 9 files changed, 37 insertions(+), 27 deletions(-)
 delete mode 100644 .flaskenv
 create mode 100644 opaque_database_env_example
 rename .env_example => opaque_env_example (84%)

diff --git a/.flaskenv b/.flaskenv
deleted file mode 100644
index 47093cda..00000000
--- a/.flaskenv
+++ /dev/null
@@ -1,2 +0,0 @@
-### Flask ###
-FLASK_APP=opaque.py
diff --git a/.gitignore b/.gitignore
index fc9b731c..682148e7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,4 @@
-data_dev.sqlite
 migrations
-venv
-.env
-.env_database
+opaque_database_env
+opaque_env
 __pycache__
diff --git a/Dockerfile b/Dockerfile
index e588a372..b474e068 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,7 +1,9 @@
 FROM python:3.6-alpine
 
 
-RUN apk add build-base
+RUN apk add \
+    build-base \
+    postgresql-dev
 
 
 RUN adduser -D opaque
@@ -13,10 +15,13 @@ WORKDIR /home/opaque
 
 COPY app app
 COPY migrations migrations
-COPY opaque.py config.py ./
+COPY config.py opaque.py ./
 COPY requirements.txt requirements.txt
 
 
+ENV FLASK_APP=opaque.py
+
+
 RUN python -m venv venv && \
     venv/bin/pip install -r requirements.txt
 
diff --git a/config.py b/config.py
index fb7ff521..ed0dadbf 100644
--- a/config.py
+++ b/config.py
@@ -28,32 +28,33 @@ class Config:
 class DevelopmentConfig(Config):
     ''' ### Flask ### '''
     DEBUG = True
-    # SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir,
-    #                                                       'data_dev.sqlite')
-    SQLALCHEMY_DATABASE_URI = \
-        'postgresql+psycopg2://{user}:{passwd}@{host}:{port}/{db}'.format(
-            user=os.environ.get('POSTGRES_USER'),
-            passwd=os.environ.get('POSTGRES_PASSWORD'),
-            host=os.environ.get('POSTGRES_HOST'),
-            port=os.environ.get('POSTGRES_PORT'),
-            db=os.environ.get('POSTGRES_DB_NAME'))
-    print(SQLALCHEMY_DATABASE_URI)
 
     ''' ### Flask-SQLAlchemy ### '''
-    SQLALCHEMY_DATABASE_URI = 'sqlite:///{}'.format(
-        os.path.join(os.path.dirname(os.path.abspath(__file__)),
-                     'data_dev.sqlite')
+    SQLALCHEMY_DATABASE_URI = 'postgresql://{}:{}@opaque_database/{}'.format(
+        os.environ.get('POSTGRES_USER'),
+        os.environ.get('POSTGRES_PASSWORD'),
+        os.environ.get('POSTGRES_DB_NAME')
     )
 
 
 class TestingConfig(Config):
+    ''' ### Flask ### '''
+    TESTING = True
+
     ''' ### Flask-SQLAlchemy ### '''
     SQLALCHEMY_DATABASE_URI = 'sqlite://'
 
+    ''' ### Flask-WTF ### '''
+    WTF_CSRF_ENABLED = False
+
 
 class ProductionConfig(Config):
     ''' ### Flask-SQLAlchemy ### '''
-    SQLALCHEMY_DATABASE_URI = os.environ.get('SQLALCHEMY_DATABASE_URI')
+    SQLALCHEMY_DATABASE_URI = 'postgresql://{}:{}@opaque_database/{}'.format(
+        os.environ.get('POSTGRES_USER'),
+        os.environ.get('POSTGRES_PASSWORD'),
+        os.environ.get('POSTGRES_DB_NAME')
+    )
 
 
 config = {
diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh
index 535d86a0..b317cda4 100755
--- a/docker-entrypoint.sh
+++ b/docker-entrypoint.sh
@@ -1,13 +1,15 @@
-#!/bin/bash
+#!/bin/sh
 
-# If no argument is given, start Opaque
 if [ $# -eq 0 ]
 then
+  # If no argument is given, start Opaque
   venv/bin/python opaque.py
 else
   if [[ $1 == "--create-db" ]]
   then
+    source venv/bin/activate
     flask db init
     flask db upgrade
+    flask foo
   fi
 fi
diff --git a/opaque.py b/opaque.py
index 8d4b0101..f0f2fc8d 100644
--- a/opaque.py
+++ b/opaque.py
@@ -28,5 +28,10 @@ def test():
     unittest.TextTestRunner(verbosity=2).run(tests)
 
 
+@app.cli.command()
+def foo():
+    Role.insert_roles()
+
+
 if __name__ == '__main__':
     socketio.run(app, host='0.0.0.0')
diff --git a/opaque_database_env_example b/opaque_database_env_example
new file mode 100644
index 00000000..5ad5b2b6
--- /dev/null
+++ b/opaque_database_env_example
@@ -0,0 +1,3 @@
+POSTGRES_DB_NAME=opaque
+POSTGRES_USER=opaque
+POSTGRES_PASSWORD=opaque
diff --git a/.env_example b/opaque_env_example
similarity index 84%
rename from .env_example
rename to opaque_env_example
index f328a3ed..274698b7 100644
--- a/.env_example
+++ b/opaque_env_example
@@ -12,6 +12,3 @@ MAIL_DEFAULT_SENDER=username@example.com
 
 ### Opaque ###
 OPAQUE_ADMIN=admin.opaque@example.com
-
-### Flask-SQLAlchemy ###
-# SQLALCHEMY_DATABASE_URI=
diff --git a/requirements.txt b/requirements.txt
index 19d3e6ed..f68e78f9 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -8,4 +8,5 @@ Flask-SQLAlchemy
 Flask-Table
 Flask-WTF
 jsonpatch
+psycopg2
 redis
-- 
GitLab