#!/bin/bash # This script uses these environment variables: # # APP_MODULE: Python dotted path to your WSGI application. # If not provided, tries to find the Python path to a 'wsgi.py' file # in the source tree. # That file is present in Django projects by default. # APP_CONFIG: Optional configuration file for gunicorn. # APP_FILE: Optional path to Python script to run your application. # Defaults to 'app.py' if it exists. # # DISABLE_MIGRATE: if not empty, inhibits execution of 'manage.py migrate'. BIND_ADDR="0.0.0.0:8080" function run() { # For SCL enablement source .bashrc set -e # Try to run application with the strategies below, in precedence order. # The first successful strategy takes over this script's process via exec. # If no strategy succeed, report an error message and terminate. run_django run_gunicorn "$APP_MODULE" run_python_script "${APP_FILE:-app.py}" echo "ERROR: don't know how to run your application." echo "Please set either APP_MODULE or APP_FILE environment variables," echo "or create a file 'app.py' to launch your application." return 1 } function run_django() { ! pip show -q django && return # Find shallowest manage.py script, either ./manage.py or /manage.py local MANAGE_FILE=$(find . -maxdepth 2 -type f -name 'manage.py' -printf '%d\t%P\n' | sort -nk1 | cut -f2 | head -1) django_migrate "$MANAGE_FILE" # try to use gunicorn run_gunicorn "$APP_MODULE" # or fallback to Django's development server django_runserver "$MANAGE_FILE" } function django_migrate() { [ -n "$DISABLE_MIGRATE" ] && return echo "---> Migrating database ..." django_manage_cmd "$1" migrate --noinput } function django_runserver() { echo "---> Serving application with 'manage.py runserver' ..." echo "---> WARNING: this is NOT a recommended way to run you application in production!" django_manage_cmd "$1" runserver "$BIND_ADDR" } function django_manage_cmd() { local MANAGE_FILE="$1" local CMD="${@:2}" if [ ! -f "$MANAGE_FILE" ]; then echo "WARNING: seems that you're using Django, but we could not find a 'manage.py' file." echo "'manage.py $CMD' ignored." return fi if [[ "$CMD" =~ ^runserver ]]; then exec python "$MANAGE_FILE" $CMD else python "$MANAGE_FILE" $CMD fi } function run_gunicorn() { ! pip show -q gunicorn && return local APP_MODULE="$1" if [ -z "$APP_MODULE" ]; then # Find shallowest wsgi.py file, one of ./wsgi.py, /wsgi.py or //wsgi.py, # replace "/" with "." and remove ".py" suffix APP_MODULE=$(find . -maxdepth 3 -type f -name 'wsgi.py' -printf '%d\t%P\n' | sort -nk1 | cut -f2 | head -1 | sed 's:/:.:;s:.py$::') fi if [ -z "$APP_MODULE" ]; then echo "WARNING: seems that you're trying to use gunicorn, but no WSGI application module was specified." return fi echo "---> Serving application with gunicorn ..." exec gunicorn "$APP_MODULE" --bind="$BIND_ADDR" --access-logfile=- --config "$APP_CONFIG" } function run_python_script() { local APP_FILE="$1" [ ! -f "$APP_FILE" ] && return echo "---> Running application from Python script ..." exec python -u "$APP_FILE" } run