The twelve-factor app is a methodology for building
software-as-a-service apps that:
Slide 3
Slide 3 text
Use declarative formats for setup automation, to minimize
time and cost for new developers joining the project.
Slide 4
Slide 4 text
Have a clean contract with the underlying operating
system, offering maximum portability between execution
environments.
Slide 5
Slide 5 text
Are suitable for deployment on modern cloud platforms,
obviating the need for servers and systems administration.
Slide 6
Slide 6 text
Minimize divergence between development and
production, enabling continuous deployment for maximum
agility.
Slide 7
Slide 7 text
And can scale up without significant changes to tooling,
architecture, or development practices.
Slide 8
Slide 8 text
No content
Slide 9
Slide 9 text
I. Codebase
• One codebase tracked in revision control,
many deploys.
• If there are multiple codebases, it’s not an
app – it’s a distributed system.
Slide 10
Slide 10 text
II. Dependencies
• Explicitly declare and isolate dependencies.
• A twelve-factor app never relies on implicit
existence of system-wide packages.
• Do not rely on the implicit existence of any
system tools.
• pip + virtualenv + requirements.txt
Slide 11
Slide 11 text
III. Config
• Store config in the environment.
• Resource handles to the database,
Memcached, and other backing services.
• Per-deploy values such as the canonical
hostname for the deploy.
• Django & Flask make this simple.
Slide 12
Slide 12 text
IV. Backing Services
• Treat backing services as attached
resources.
• Make no distinction between local and
third party services.
Slide 13
Slide 13 text
No content
Slide 14
Slide 14 text
V. Build, release, run.
• Strictly separate build and run stages.
• It is impossible to make changes to the
code at runtime.
• This allows for rollbacks and other release
management suites.
Slide 15
Slide 15 text
VI. Processes
• Execute the app as one or more stateless
processes.
• $ python app.py
• A production deploy of a sophisticated app
may use many process types, instantiated
into zero or more running processes.
Slide 16
Slide 16 text
VII. Port binding
• Export services via port binding.
• The web app exports HTTP as a service by
binding to a port, and listening to requests
coming in on that port.
• Gunicorn, Gevent, Eventlet.
Slide 17
Slide 17 text
VIII. Concurrency
• Scale out via the process model.
• Using this model, the developer can
architect their app to handle diverse
workloads by assigning each type of work
to a process type.
• Rely on the operating system's process
manager.
Slide 18
Slide 18 text
No content
Slide 19
Slide 19 text
IX. Disposability
• Maximize robustness with fast startup and
graceful shutdown.
• They can be started or stopped a moment’s
notice.
Slide 20
Slide 20 text
X. Dev/prod parity
• Keep development, staging, and production
as similar as possible.
• Failing to do so increases: the time gap,
personnel gap, and the tools gap.
Slide 21
Slide 21 text
Traditional app Twelve-factor app
Time between deploys Weeks Hours
Code authors vs code
deployers
Different people Same people
Dev vs production
environments
Divergent
As similar as
possible
Slide 22
Slide 22 text
XI. Logs
• Treat logs as event streams.
• Apps never concern themselves with
routing or storage of the output stream.
Slide 23
Slide 23 text
XII. Admin processes
• Run admin/management tasks as one-off
processes in an identical environment.
• Run against a release, using the same code
and config as any process run against that
release.
• $ manage.py syncdb