aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitchell Riedstra <mitch@riedstra.dev>2021-10-14 17:01:23 -0400
committerMitchell Riedstra <mitch@riedstra.dev>2021-10-14 17:01:23 -0400
commit067f8f92b568527e94e2a04fa495f86f1820a4bc (patch)
treee641dd94a99ab433f9a2a245c85d9b16a7aa0fed
parent5369537388a3239f3f19080053fcdab6ad9b95eb (diff)
downloaddispatch-tracker-067f8f92b568527e94e2a04fa495f86f1820a4bc.tar.gz
dispatch-tracker-067f8f92b568527e94e2a04fa495f86f1820a4bc.tar.xz
Move to environment vars. Create a container that sets up a demo.
Instead of the old method with scripts, docker-compose file, everything is pulled into the main container with various configuration options allowed from environment variables. Also move settings.py away from the old yaml setup and pull directly from the environment instead.
-rw-r--r--.gitignore1
-rw-r--r--Dockerfile20
-rw-r--r--app/.ash_history8
-rw-r--r--app/app/settings.py141
-rw-r--r--app/config-compose.yml89
-rw-r--r--app/config-example.yml76
-rwxr-xr-xapp/demo.sh14
-rw-r--r--app/requirements.txt2
-rw-r--r--app/uwsgi.ini15
-rw-r--r--docker-compose.yml43
-rwxr-xr-xdocker-scripts/setup.sh23
-rwxr-xr-xdocker-scripts/shell.sh12
-rw-r--r--docker-scripts/uwsgi.sh17
-rwxr-xr-xentrypoint.sh225
-rw-r--r--nginx.conf55
-rw-r--r--static/.keep0
16 files changed, 343 insertions, 398 deletions
diff --git a/.gitignore b/.gitignore
index f9c64ce..42e57ee 100644
--- a/.gitignore
+++ b/.gitignore
@@ -63,3 +63,4 @@ static
pg_data
pg_log
+db/*
diff --git a/Dockerfile b/Dockerfile
index 476dccd..35ad256 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,6 +1,8 @@
-FROM alpine:latest
+FROM docker.io/alpine:3.14
-RUN apk update && apk add python3 py3-setuptools py3-virtualenv postgresql-client
+RUN apk update
+RUN apk add nginx python3 py3-pip py3-setuptools py3-virtualenv \
+ postgresql-client py3-psycopg2 postgresql
RUN apk add linux-headers postgresql-dev gcc python3-dev libc-dev
COPY app/requirements.txt /requirements.txt
@@ -8,17 +10,17 @@ RUN pip3 install --no-cache-dir -r /requirements.txt
RUN rm /requirements.txt
RUN pip3 install --no-cache-dir uwsgi
-
RUN apk del linux-headers postgresql-dev gcc python3-dev libc-dev
-# Feel free to change the UID if necessary
-RUN adduser -D -H -u 1000 app
+RUN mkdir /app /static
-# RUN apk add uwsgi-python3
+COPY app /app
+WORKDIR /app
-RUN mkdir /app /static && chown app /app /static
+ENV STATIC_ROOT=/static
-USER app
+RUN python3 manage.py collectstatic
-CMD [ "uwsgi", "--ini", "/app/uwsgi.ini" ]
+COPY entrypoint.sh /
+ENTRYPOINT /entrypoint.sh
diff --git a/app/.ash_history b/app/.ash_history
deleted file mode 100644
index 315e6ea..0000000
--- a/app/.ash_history
+++ /dev/null
@@ -1,8 +0,0 @@
-ls
-pwd
-cd
-ls -la
-pwd
-vi manage.py
-woami
-whoami
diff --git a/app/app/settings.py b/app/app/settings.py
index d3dca5d..78cd7db 100644
--- a/app/app/settings.py
+++ b/app/app/settings.py
@@ -11,71 +11,98 @@ https://docs.djangoproject.com/en/1.11/ref/settings/
"""
import os
-import yaml
-
-try:
- from yaml import CLoader as Loader, CDumper as Dumper
-except ImportError:
- from yaml import Loader, Dumper
-
-# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
-BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
-def get_default_config():
- if os.path.exists(BASE_DIR + '/config.yml'):
- return yaml.load(open(BASE_DIR + '/config.yml').read(), Loader=Loader)
- else:
- print("Warning: loading example config! Create config.yml Soon!")
- return yaml.load(open(BASE_DIR + '/config-example.yml').read(), \
- Loader=Loader)
+def getenv(param):
+ return os.environ.get(param)
-CONFIG = {}
-
-if os.environ.get('CUSTOM_CONFIG'):
- try:
- fn = "{}/{}".format(BASE_DIR, os.environ.get('CUSTOM_CONFIG'))
- CONFIG = yaml.load(open(fn))
- except Exception as e:
- print("WARNING: Loading default configuration. \n{}".format(e))
- CONFIG = get_default_config()
-else:
- CONFIG = get_default_config()
-
+# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
+BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
-SECRET_KEY = CONFIG['SECRET_KEY']
+if os.environ.get("SECRET_KEY"):
+ SECRET_KEY = os.environ.get("SECRET_KEY")
+else:
+ # DO *NOT* use this in production
+ SECRET_KEY = 'h$r_bwlp@#h#y#%&qhw-n=gb2%wva1d_h65+o94u&!a#%iv&lo'
# SECURITY WARNING: don't run with debug turned on in production!
-DEBUG = CONFIG['debug']
-
-ALLOWED_HOSTS = CONFIG['allowed_hosts']
-
-ADMINS = CONFIG['admins']
+DEBUG = True if getenv("DEBUG") == "yes" else False
-WEBSITE_URI = CONFIG['website_uri']
-WEB_APP_NAME =CONFIG['application_name']
+try:
+ ALLOWED_HOSTS = getenv("ALLOWED_HOSTS").split(",")
+except Exception:
+ ALLOWED_HOSTS = ["127.0.0.1", "localhost"]
-if CONFIG.get('SET_EMAIL'):
- EMAIL_HOST = CONFIG['EMAIL_HOST']
- EMAIL_HOST_PASSWORD = CONFIG['EMAIL_HOST_PASSWORD']
- EMAIL_HOST_USER = CONFIG['EMAIL_HOST_USER']
- EMAIL_PORT = CONFIG['EMAIL_PORT']
- EMAIL_USE_TLS = CONFIG['EMAIL_USE_TLS']
- DEFAULT_FROM_EMAIL = CONFIG['DEFAULT_FROM_EMAIL']
+try:
+ ADMINS = []
+ adm = getenv("ADMINS").split(",")
+ for person in adm:
+ ADMINS.append(person.split(":"))
+except Exception:
+ ADMINS = [("bob", "bob@example.com")]
+
+WEBSITE_URI = getenv("WEBSITE_URI") if getenv("WEBSITE_URI") \
+ else "http://localhost:8080"
+WEB_APP_NAME = getenv("WEBSITE_APP_NAME") if getenv("WEBSITE_APP_NAME") \
+ else "Example dispatch tracker"
+
+if getenv('USE_EMAIL') == "yes":
+ EMAIL_HOST = getenv("EMAIL_HOST")
+ EMAIL_HOST_PASSWORD = getenv("EMAIL_HOST_PASSWORD")
+ EMAIL_HOST_USER = getenv("EMAIL_HOST_USER")
+ EMAIL_PORT = getenv("EMAIL_PORT")
+ EMAIL_USE_TLS = True if getenv("EMAIL_USE_TLS") != "no" else False
+ DEFAULT_FROM_EMAIL = getenv("DEFAULT_FROM_EMAIL")
else:
print("WARNING EMAIL SETTINGS NOT APPLIED. CHECK CONFIG")
TEMPLATE_VARS = {}
-if CONFIG.get('TEMPLATE_VARS'):
- TEMPLATE_VARS = CONFIG['TEMPLATE_VARS']
+TEMPLATE_VARS['app_name'] = "Subcontractor Invoicing system Demo"
+if getenv('TEMPLATE_VARS'):
+ templateEnvVars = getenv("TEMPLATE_VARS").split(",")
+ for suffix in templateEnvVars:
+ TEMPLATE_VARS[suffix] = getenv("TEMPLATE_VARS_"+suffix)
+else:
+ TEMPLATE_VARS['login_info'] = """
+ <p class="flow-text">
+ Welcome to a demo Subcontractor Invoicing system.
+ </p>
+ <p class="flow-text">
+ We can design a system that customized specifically for your
+ use case.
+ </p>
+ <p class="flow-text">
+ <a href="https://mitchriedstra.com/resume">Please contact me</a>
+ if you would like more information. This version has been
+ specifically designed for a trucking company that continues to
+ use it more than two years after implementation.
+ </p>
+ </p>
+ <script>
+ /* Shh, it's a little bit of a hack */
+ window.onload = function () {
+ document.querySelector("#id_username").value="admin@example.com";
+ document.querySelector("#id_password").value="password";
+ document.querySelector("#id_username").parentElement.parentElement.hidden=true
+ document.querySelector("#login_register").hidden=true
+ document.querySelector('.card-title').innerText="Click below to start discovering";
+ document.querySelector('#login_submit').parentElement.classList = [ 'center-align' ];
+ document.querySelector('#login_submit').parentElement.style = "padding-top: 20px;";
+ document.querySelector('#login_submit').value="LOGIN NOW!";
+ }
+ </script>
+ """
-ACCOUNT_ACTIVATION_DAYS = CONFIG['ACCOUNT_ACTIVATION_DAYS']
+try:
+ ACCOUNT_ACTIVATION_DAYS = int(getenv("ACCOUNT_ACTIVATION_DAYS"))
+except Exception:
+ ACCOUNT_ACTIVATION_DAYS = 7
AUTH_USER_MODEL = 'dispatchAuth.User'
@@ -92,7 +119,6 @@ INSTALLED_APPS = [
'django.contrib.staticfiles',
'dispatch.apps.DispatchConfig',
'dispatchAuth.apps.DispatchauthConfig',
- # 'auditlog',
]
MIDDLEWARE = [
@@ -104,7 +130,6 @@ MIDDLEWARE = [
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'dispatch.middleware.LoginRequiredMiddleware',
- # 'auditlog.middleware.AuditlogMiddleware',
]
ROOT_URLCONF = 'app.urls'
@@ -128,12 +153,28 @@ TEMPLATES = [
WSGI_APPLICATION = 'app.wsgi.application'
+APP_DB_CONF = {}
+if getenv('APP_DB_CONF'):
+ envVars = getenv("APP_DB_CONF").split(",")
+ for suffix in envVars:
+ APP_DB_CONF[suffix] = getenv("APP_DB_CONF_"+suffix)
+else:
+ APP_DB_CONF["ENGINE"] = 'django.db.backends.postgresql'
+ APP_DB_CONF["NAME"] = 'dispatch'
+ APP_DB_CONF["USER"] = 'postgres'
+ APP_DB_CONF["PASSWORD"] = ''
+ APP_DB_CONF["PORT"] = '5432'
+
+try:
+ APP_DB_CONF["PORT"] = int(APP_DB_CONF["PORT"])
+except Exception:
+ APP_DB_CONF["PORT"] = 5432
# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
DATABASES = {
- 'default': CONFIG['db_default']
+ 'default': APP_DB_CONF
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
@@ -187,7 +228,7 @@ USE_TZ = True
# https://docs.djangoproject.com/en/1.11/howto/static-files/
STATIC_URL = '/static/'
-STATIC_ROOT = CONFIG['static_root']
+STATIC_ROOT = getenv("STATIC_ROOT") if getenv("STATIC_ROOT") else "/static"
LOGIN_URL = '/login/'
LOGIN_REDIRECT_URL = '/'
diff --git a/app/config-compose.yml b/app/config-compose.yml
deleted file mode 100644
index f93b76e..0000000
--- a/app/config-compose.yml
+++ /dev/null
@@ -1,89 +0,0 @@
----
-# Postgres Example
-db_default:
- ENGINE: django.db.backends.postgresql
- NAME: dispatch
- USER: postgres
- PASSWORD:
- HOST: postgres
- PORT: 5432
-# MySQL Example
-# db_default:
-# ENGINE: django.db.backends.mysql
-# NAME: dispatch_test
-# USER: dispatch
-# PASSWORD: ahB2lee5
-# HOST: 127.0.0.1
-# PORT: 3306
-# Sqlite example. Full path is recommended
-# db_default:
-# ENGINE: django.db.backends.sqlite3
-# NAME: /home/mitch/scm/dispatch-tracker/app/db.sqlite3
-
-allowed_hosts:
- - localhost
- - 127.0.0.1
- - 172.21.23.2
-
-static_root: '/static'
-
-debug: True
-
-# CHANGE THIS BEFORE USING IN PRODUCTION
-SECRET_KEY: 'h$r_bwlp@#h#y#%&qhw-n=gb2%wva1d_h65+o94u&!a#%iv&lo'
-
-# These people will be emailed if debug = false
-admins:
- - 'bob@example.com'
-
-application_name: "Yo Momma's Dispatch Tracker"
-website_uri: 'http://172.21.23.2:8080'
-
-ACCOUNT_ACTIVATION_DAYS: 7
-
-# Email settings won't be loaded from this file if this is false
-SET_EMAIL: False
-# Email settings, edit for your needs
-EMAIL_HOST: smtp.example.com
-EMAIL_HOST_PASSWORD: p@$$w0rd9876543210
-EMAIL_HOST_USER: django@example.com
-EMAIL_PORT: 2525
-EMAIL_USE_TLS: True
-DEFAULT_FROM_EMAIL: webmaster@localhost
-
-TEMPLATE_VARS:
- app_name: Subcontractor Invoicing System Demo
- # login_blurb: Login with "admin@example.com", "password"
- login_info: |
- <p class="flow-text">
- Welcome to a demo Subcontractor Invoicing system.
- </p>
- <p class="flow-text">
- We can design a system that customized specifically for your
- use case.
- </p>
- <p class="flow-text">
- <a href="https://mitchriedstra.com/resume">Please contact me</a>
- if you would like more information. This version has been
- specifically designed for a trucking company that continues to
- use it more than two years after implementation.
- </p>
- </p>
- <script>
- /* Shh, it's a little bit of a hack */
- window.onload = function () {
- document.querySelector("#id_username").value="admin@example.com";
- document.querySelector("#id_password").value="password";
- document.querySelector("#id_username").parentElement.parentElement.hidden=true
- document.querySelector("#login_register").hidden=true
- document.querySelector('.card-title').innerText="Click below to start discovering";
- document.querySelector('#login_submit').parentElement.classList = [ 'center-align' ];
- document.querySelector('#login_submit').parentElement.style = "padding-top: 20px;";
- document.querySelector('#login_submit').value="LOGIN NOW!";
- }
- </script>
-
-
-
-
-
diff --git a/app/config-example.yml b/app/config-example.yml
deleted file mode 100644
index dfc0872..0000000
--- a/app/config-example.yml
+++ /dev/null
@@ -1,76 +0,0 @@
----
-# Postgres Example
-db_default:
- ENGINE: django.db.backends.postgresql
- NAME: dispatch
- USER: postgres
- PASSWORD:
- HOST: 127.0.0.1
- PORT: 5432
-# MySQL Example
-# db_default:
-# ENGINE: django.db.backends.mysql
-# NAME: dispatch_test
-# USER: dispatch
-# PASSWORD: ahB2lee5
-# HOST: 127.0.0.1
-# PORT: 3306
-# Sqlite example. Full path is recommended
-# db_default:
-# ENGINE: django.db.backends.sqlite3
-# NAME: /home/mitch/scm/dispatch-tracker/app/db.sqlite3
-
-allowed_hosts:
- - localhost
- - 127.0.0.1
-
-static_root: '/full/path/to/static/root'
-
-debug: True
-
-# CHANGE THIS BEFORE USING IN PRODUCTION
-SECRET_KEY: 'h$r_bwlp@#h#y#%&qhw-n=gb2%wva1d_h65+o94u&!a#%iv&lo'
-
-# These people will be emailed if debug = false
-admins:
- - 'bob@example.com'
-
-application_name: "Yo Momma's Dispatch Tracker"
-website_uri: 'http://localhost:8080'
-
-ACCOUNT_ACTIVATION_DAYS: 7
-
-# Email settings won't be loaded from this file if this is false
-SET_EMAIL: False
-# Email settings, edit for your needs
-EMAIL_HOST: smtp.example.com
-EMAIL_HOST_PASSWORD: p@$$w0rd9876543210
-EMAIL_HOST_USER: django@example.com
-EMAIL_PORT: 2525
-EMAIL_USE_TLS: True
-DEFAULT_FROM_EMAIL: webmaster@localhost
-
-TEMPLATE_VARS:
- app_name: Subcontractor Invoicing System Demo
- login_blurb: Here's an example blurb above the sign-in box. This can be changed according to your needs.
- login_info: '
- <p class="flow-text">
- Welcome to a demo Subcontractor Invoicing system.
- </p>
- <p class="flow-text">
- We can design a system that works specifically for your
- use case.
- </p>
- <p class="flow-text">
- <a href="https://mitchriedstra.com/resume">Please contact me</a>
- if you would like more information. This version has been
- specifically designed for a trucking company that continues to
- use it more than two years after implementation.
- </p>
- </p>
- '
-
-
-
-
-
diff --git a/app/demo.sh b/app/demo.sh
new file mode 100755
index 0000000..79d1815
--- /dev/null
+++ b/app/demo.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+set -e
+set -x
+#shellcheck disable=SC2046
+python="$(find $(echo "$PATH" | tr : '\n') -type f -executable -iname 'python*' | sed 1q)"
+manage() {
+$python manage.py "$@"
+}
+
+manage migrate
+manage setup
+manage setup_identity
+manage insert_fake_data --companies 20 --users 20 --loads 600 \
+ --attachments=True --invoices=True --start-date='-6w' --end-date='+6w'
diff --git a/app/requirements.txt b/app/requirements.txt
index ac816f3..8cf4ce5 100644
--- a/app/requirements.txt
+++ b/app/requirements.txt
@@ -8,6 +8,6 @@ Faker==9.2.0
python-dateutil==2.6.0
pytz==2021.3
PyYAML==5.4.1
-six==1.16.0
+# six==1.16.0
sqlparse==0.4.2
text-unidecode==1.3
diff --git a/app/uwsgi.ini b/app/uwsgi.ini
deleted file mode 100644
index 2dae309..0000000
--- a/app/uwsgi.ini
+++ /dev/null
@@ -1,15 +0,0 @@
-[uwsgi]
-processes = 1
-threads = 4
-
-env = CUSTOM_CONFIG=config-compose.yml
-
-# use 127.0.0.1 instead of 0.0.0.0 if possible
-# this is for a containerized deployment
-socket = 0.0.0.0:9200
-
-module = wsgi:application
-
-# uid = uwsgi
-
-# home = env
diff --git a/docker-compose.yml b/docker-compose.yml
deleted file mode 100644
index 5ec2862..0000000
--- a/docker-compose.yml
+++ /dev/null
@@ -1,43 +0,0 @@
-version: "3"
-services:
- nginx:
- image: nginx:mainline-alpine
- networks:
- backend:
- ipv4_address: 172.21.23.2
- ports:
- - "36200:80"
- volumes:
- - ./static:/var/www
- - ./nginx.conf:/etc/nginx/nginx.conf
-
- app:
- build: .
- image: dispatch-app:latest
- networks:
- backend:
- ipv4_address: 172.21.23.3
- working_dir: /app
- volumes:
- - ./app:/app
- - ./static:/var/www
-
- postgres:
- image: postgres:11-alpine
- networks:
- backend:
- ipv4_address: 172.21.23.4
- volumes:
- - db-data:/var/lib/postgresql/data
-
-volumes:
- db-data:
-
-networks:
- backend:
- driver: bridge
- ipam:
- driver: default
- config:
- - subnet: 172.21.23.0/24
-
diff --git a/docker-scripts/setup.sh b/docker-scripts/setup.sh
deleted file mode 100755
index 6e4ff18..0000000
--- a/docker-scripts/setup.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/sh
-
-# Dumps you to a shell inside of the app container
-
-docker run --rm -it \
- --network dispatch-tracker_backend \
- -v $(pwd)/static:/static \
- -v $(pwd)/app:/app \
- dispatch-app \
- sh -x -e -c '
- cd /app;
- export CUSTOM_CONFIG=config-compose.yml
- echo "create database dispatch;" | psql -U postgres -h postgres
- python3 ./manage.py collectstatic --no-input
- python3 ./manage.py migrate
- # python3 ./manage.py createsuperuser
- python3 ./manage.py setup
- python3 ./manage.py setup_identity
-
- python3 ./manage.py insert_fake_data --companies 10 --users 10 \
- --loads 400 --start-date='"'"'-16w'"'"' --end-date='"'"'+16w'"'"' \
- --attachments=true \
- --invoices=true'
diff --git a/docker-scripts/shell.sh b/docker-scripts/shell.sh
deleted file mode 100755
index c9ae91f..0000000
--- a/docker-scripts/shell.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-# Dumps you to a shell inside of the app container
-
-docker run --rm -it \
- --network dispatch-tracker_backend \
- -e CUSTOM_CONFIG=config-compose.yml \
- -v $(pwd)/static:/static \
- -v $(pwd)/app:/app \
- --user 0 \
- dispatch-app \
- ash
diff --git a/docker-scripts/uwsgi.sh b/docker-scripts/uwsgi.sh
deleted file mode 100644
index 26c57fe..0000000
--- a/docker-scripts/uwsgi.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/sh
-set -e
-set -x
-cd /app
-
-uwsgi \
- --socket 0.0.0.0:9200 \
- --env CUSTOM_CONFIG=/app/config.yml \
- --processes 1 \
- --threads 4 \
- --uid uwsgi \
- wsgi:application
-
-ls -la
-
-
-echo "MOTHERFUCKER"
diff --git a/entrypoint.sh b/entrypoint.sh
new file mode 100755
index 0000000..96380af
--- /dev/null
+++ b/entrypoint.sh
@@ -0,0 +1,225 @@
+#!/bin/sh
+printf "\033[1;31m"
+set -e
+set -x
+
+# The entrypoint script here takes care of basic setup for the application
+# writing out the Nginx config, Uwsgi, and optionally running a local
+# postgres instance for the application.
+#
+# The default configuration is to run postgres locally and start in demo mode.
+#
+# If you actually want to use this application you'll want to of course
+# disable that, which can be done by tweaking the environment variables below.
+#
+# You can use volumes if you want to persist any of the data. The data directory
+# for postgres is `/var/postgres`
+#
+# Uploaded attachments are stored in `/app/media`
+#
+# Carefully read the vars below. If you needs help understanding the application
+# specific ones check out `app/settigns.py` Though it's pretty much just
+# passing things into Django
+
+FULL_NAME="${FULL_NAME:-Default App User}"
+APP_SHELL="${APP_SHELL:-/bin/ash}"
+# UID and GID used by the `git` user inside of the container
+APP_UID="${APP_UID:-3500}"
+APP_GID="${APP_GID:-3500}"
+APP_NAME=dispatch
+
+# If this is anything other than "yes" local postgres will *NOT* be used
+LOCAL_POSTGRES="${LOCAL_POSTGRES:-yes}"
+
+# uwsgi conf
+UWSGI_PROCESSES="${UWSGI_PROCESSES:-1}"
+UWSGI_THREADS="${UWSGI_THREADS:-4}"
+UWSGI_SOCKET="${UWSGI_SOCKET:-0.0.0.0:9200}"
+
+# nginx conf
+NGINX_PORT="${NGINX_PORT:-8080}"
+NGINX_WORKER_PROCESSES="${NGINX_WORKER_PROCESSES:-1}"
+NGINX_WORKER_CONNECTIONS="${NGINX_WORKER_CONNECTIONS:-1024}"
+NGINX_UWSGI_PASS="${NGINX_UWSGI_PASS:-127.0.0.1:9200}"
+NGINX_MAX_BODY_SIZE="${NGINX_MAX_BODY_SIZE:-20m}"
+NGINX_BODY_TIMEOUT="${NGINX_BODY_TIMEOUT:-300s}"
+
+# application specific
+INIT_DEMO="${INIT_DEMO:-yes}" # Create demo user, data, etc?
+
+# TEMPLATE_VARS= # Comma seperated list of suffixes to extract into vars
+# TEMPLATE_VARS_login_info="bla" # for instance is extracted into:
+# # TEMPLATE_VARS["login_info"] = "bla"
+
+# If you need an example, the same thing is done for APP_DB_CONF below:
+APP_DB_CONF="${APP_DB_CONF:-ENGINE,NAME,USER,PASSWORD,PORT}"
+APP_DB_CONF_ENGINE="${APP_DB_CONF_ENGINE:-django.db.backends.postgresql}"
+APP_DB_CONF_NAME="${APP_DB_CONF_NAME:-dispatch}"
+APP_DB_CONF_USER="${APP_DB_CONF_USER:-postgres}"
+APP_DB_CONF_PASSWORD="${APP_DB_CONF_PASSWORD:-}"
+APP_DB_CONF_PORT="${APP_DB_CONF_PORT:-5432}"
+
+# Sqlite example
+# APP_DB_CONF=ENGINE,NAME
+# APP_DB_CONF_ENGINE=django.db.backends.sqlite3
+# APP_DB_CONF_NAME=/app/database.sqlite3
+
+# MySQL Example
+# APP_DB_CONF=ENGINE,NAME,USER,PASSWORD,HOST,PORT
+# APP_DB_CONF_ENGINE=django.db.backends.mysql
+# APP_DB_CONF_NAME=dispatch_test
+# APP_DB_CONF_USER=dispatch
+# APP_DB_CONF_PASSWORD=changeme
+# APP_DB_CONF_HOST=127.0.0.1
+# APP_DB_CONF_PORT=3306
+
+# More normal environment variables
+WEBSITE_URI="${WEBSITE_URI:-http://example.com}"
+WEBSITE_APP_NAME="${WEBSITE_APP_NAME:-Example dispatch tracker}"
+USE_EMAIL="${USE_EMAIL:-no}"
+STATIC_ROOT="${STATIC_ROOT:-/static}"
+EMAIL_USE_TLS="${EMAIL_USE_TLS:-yes}"
+EMAIL_PORT="${EMAIL_PORT:-465}"
+EMAIL_HOST_USER="${EMAIL_HOST_USER:-example}"
+EMAIL_HOST_PASSWORD="${EMAIL_HOST_PASSWORD:-changeme}"
+EMAIL_HOST="${EMAIL_HOST:-mail.example.com}"
+DEFAULT_FROM_EMAIL="${DEFAULT_FROM_EMAIL:-app@example.com}"
+DEBUG="${DEBUG:-no}"
+ALLOWED_HOSTS="${ALLOWED_HOSTS:-}" # Defaults to 127.0.0.1 and localhost
+ADMINS="${ADMINS:-Bob\'s Name:bobs.email@example.com,other:other@example.com}"
+ACCOUNT_ACTIVATION_DAYS="${ACCOUNT_ACTIVATION_DAYS:-7}"
+
+set +x
+if [ -z "$SECRET_KEY" ] ; then
+ _l="##################################################"
+ printf "\n%s\nSET THE SECRET KEY IF YOU'RE IN PRODUCTION\n%s\n" \
+ $_l $_l
+fi
+set -x
+
+printf "\033[0m"
+
+# This is only run once in the container's lifetime unless /setup is removed
+setup() {
+if [ -e /setup ] ; then return ; fi
+
+addgroup -g "${APP_GID}" $APP_NAME
+adduser -h /var/$APP_NAME --gecos "$FULL_NAME" -D -s "${APP_SHELL}" \
+ -u "${APP_UID}" -G $APP_NAME $APP_NAME
+passwd -u $APP_NAME
+addgroup nginx $APP_NAME
+
+chown -R $APP_NAME:$APP_NAME /app /static
+
+touch /setup
+}
+
+run_nginx() {
+cat > /etc/nginx/nginx.conf <<NGINX
+worker_processes $NGINX_WORKER_PROCESSES;
+error_log /dev/fd/2;
+events {
+ worker_connections $NGINX_WORKER_CONNECTIONS;
+}
+http {
+ access_log /dev/fd/1;
+ include mime.types;
+ default_type application/octet-stream;
+ sendfile on;
+ keepalive_timeout 65;
+ gzip on;
+ server_tokens off;
+ server {
+ listen $NGINX_PORT; listen [::]:$NGINX_PORT;
+ root /var/www;
+
+ location / {
+ include uwsgi_params;
+ client_max_body_size ${NGINX_MAX_BODY_SIZE};
+ client_body_timeout ${NGINX_BODY_TIMEOUT};
+ uwsgi_pass ${NGINX_UWSGI_PASS};
+ }
+
+ # Pass through the static directory
+ # This should match whatever is in your config file
+ location /static {
+ alias /static;
+ }
+ location /robots.txt {
+ alias /static/robots.txt;
+ }
+ }
+}
+NGINX
+
+mkdir -p /run/nginx
+nginx -g 'daemon off;' &
+}
+
+run_uwsgi() {
+cat > /app/uwsgi.ini <<UWSGI
+[uwsgi]
+processes = ${UWSGI_PROCESSES}
+threads = ${UWSGI_THREADS}
+
+socket = ${UWSGI_SOCKET}
+module = wsgi:application
+UWSGI
+
+su $APP_NAME -c sh -c "cd /app; exec uwsgi --ini /app/uwsgi.ini" &
+}
+
+run_postgres() {
+pgdir=/var/postgres
+if ! [ -d $pgdir ] ; then
+ mkdir $pgdir
+ chown postgres:postgres /var/postgres
+ su -l -s /bin/sh postgres /bin/sh -c "pg_ctl -D $pgdir initdb"
+fi
+chown -R postgres:postgres /var/postgres
+
+su -l -s /bin/sh postgres /bin/sh -c "exec postgres -k /tmp -D $pgdir" &
+
+sleep 2
+if ! echo "\\l" | psql -U postgres | grep -q dispatch ; then
+ echo "create database dispatch" | psql -U postgres
+fi
+
+}
+
+init_demo() {
+[ -e /init_demo ] && return
+su $APP_NAME -c "./demo.sh"
+touch /init_demo
+}
+
+watchServices() {
+interval="$1"; shift
+while true ; do
+ services="nginx uwsgi"
+ if [ "$LOCAL_POSTGRES" = "yes" ] ; then
+ services="$services postgres"
+ fi
+
+ for service in $services; do
+ if ! pgrep "$service" >/dev/null ; then
+ echo "Service $service has stopped... quitting!"
+ exit 1
+ fi
+ done
+ sleep "$interval"
+done
+}
+
+setup
+chown -R $APP_NAME:$APP_NAME /app
+[ "$LOCAL_POSTGRES" = "yes" ] && run_postgres
+[ "$INIT_DEMO" = "yes" ] && init_demo
+run_uwsgi
+run_nginx
+
+set +x
+# Bail out if a service stops, poll it every 30 seconds
+watchServices 30
+# or if you comment out the above, drop into a shell
+# exec /bin/ash "$@"
diff --git a/nginx.conf b/nginx.conf
deleted file mode 100644
index 38b31df..0000000
--- a/nginx.conf
+++ /dev/null
@@ -1,55 +0,0 @@
-worker_processes 1;
-
-events {
- worker_connections 1024;
-}
-
-
-http {
- include mime.types;
- default_type application/octet-stream;
-
- sendfile on;
- #tcp_nopush on;
-
- #keepalive_timeout 0;
- keepalive_timeout 65;
-
- gzip on;
-
- server_tokens off;
-
- server {
- listen 80;
- listen [::]:80;
- listen 8000;
- listen [::]:8000;
- server_name localhost;
-
- location / {
- include uwsgi_params;
- client_max_body_size 20m;
- client_body_timeout 300s;
- uwsgi_pass app:9200;
- }
-
- # Pass through the static directory
- # This should match whatever is in your config file
- location /static {
- alias /var/www;
- }
- location /robots.txt {
- alias /var/www/static/robots.txt;
- }
-
-
- # Optionally change the log path.
- # access_log /var/log/nginx/dispatch.example.com/access.log;
- # error_log /var/log/nginx/dispatch.example.com/error.log;
-
- }
-
- include conf.d/*.conf;
-
-}
-
diff --git a/static/.keep b/static/.keep
deleted file mode 100644
index e69de29..0000000
--- a/static/.keep
+++ /dev/null