🚢A recipe for building 12-factor Python / Django web apps with multi-container Docker and deploying to Amazon AWS using Elastic Beanstalk.
The aim of Dockdj is to provide an example of how to quickly create a Django web application following the Twelve Factor App principals.
The Twelve Factors
One codebase tracked in revision control, many deploys
Explicitly declare and isolate dependencies
✅Yup, uses requirements.txt
Store config in the environment
✅Yup, uses .env files
- Backing Services
Treat backing services as attached resources
- Build, release, run
Strictly separate build and run stages
✅gulp, bin/image, bin/stevedore, bin/deploy
Execute the app as one or more stateless processes
- Port binding
Export services via port binding
✅80 & 8010
Scale out via the process model
✅Keep your sessions in Redis or DB
Maximize robustness with fast startup and graceful shutdown
- Dev/Prod parity
Keep development, staging, and production as similar as possible
Treat logs as event streams
- Admin Processes
Run admin/management tasks as one-off processes
🚫Does not Apply
This repo contains a simple Python Django 1.8 web app as well as the configuration for both Django and NGINX Docker images. There are also some Bash scripts to help automate the build, release and deploy process.
- Python 3.4
- Django 1.8
- Gunicorn app server
- Nginx web server
- Sass css preprocessor
- Bootstrap 4-alpha CSS framework
- Gulp build system
This document assumes you are running OS X. These are the requirements
needed by the
- XCode & command line utilities
- Homebrew 0.9+
Additionally these requirements are installed:
These steps will get you running locally:
./bin/installwill provision your local development machine for the first time. It will
- install all requirements (if they don't exist)
- creates and starts a Docker virtual machine
environments/dev/.envand edit the values. Please make sure to change the following keys:
ENV_SECRET_KEYcreate your own Django secret key
ENV_CDNto your Docker host IP:
docker-machine ip docker-vm
ENV_AWS_EB_ENVIRONMENT_NAMEto your Amazon AWS Elastic Beanstalk environment name
ENV_DOCKER_HUB_REPO_PATHto your Docker repo (Create one if you plan to publish images to Docker Hub.)
- Create a dev python environment:
./bin/image dev buildwill create "dev" Docker images with all dependencies installed.
./bin/stevedore dev startwill run the dev Docker containers, open the browser, and tail the logs. At this point you're viewing running source code!
ctrl+cstops the logs
./bin/stevedore dev stopwill stop the Docker containers.
./bin/stevedore dev logsresumes log tailing.
- Optionally, to build frontend assets (CSS, images, etc):
./bin/stevedore dev build:dev
You can typically connect to your web application at: http://192.168.99.100/xyzzy.
You should now be up and running. Welcome.
Read more about deploying with Amazon AWS Elastic Beanstalk, version numbering, running deployments, hotfix / patch deployments, Docker Hub, and more on the Deployments wiki page.
Testing & Code Quality Tooling
Read more about the set of tools for managing, testing and deploying.