The Twelve-Factor App

Codebase

One codebase tracked in revision control, many deploys

  • Always use a VCS
  • x codebases = x apps
  • “Multiple apps sharing the same code is a violation of twelve-factor.” Create modules and use those instead.
  • A deploy is a running instance of the app.
  • “There is only one codebase per app, but there will be many deploys of the app.”

Dependencies

Explicitly declare and isolate dependencies

  • Never rely on implicit existence of system-wide packages or system tools. If necessary, vendor the tool in question into the app.
  • Explicitly declare dependencies via a dependency declaration manifest.
  • Use a dependency isolation tool.

Config

Store config in the environment

An app’s config is everything that is likely to vary between deploys (staging, production, developer environments, etc).

  • Twelve-factor requires strict separation of config from code.
  • The twelve-factor app stores config in environment variables.
  • Grouping config into named groups is not recommended since it does not scale well.

In a twelve-factor app, env vars are granular controls, each fully orthogonal to other env vars. They are never grouped together as “environments”, but instead are independently managed for each deploy. This is a model that scales up smoothly […].

Backing services

Treat backing services as attached resources

A backing service is any service the app consumes over the network as part of its normal operation.

Examples:

  • Databases
  • SMTP services
  • Logging services
  • Caching systems
  • API-accessible consumer services

Keep in mind that:

  • The code for a twelve-factor app makes no distinction between local and third party services.
  • Each backing services is a resource. These attached services are loosely coupled with the deploy they are associated with.
  • It should be possible to attach and detach resources from deploys at will.

Build, release, run

Strictly separate build and run stages

Processes

Execute the app as one or more stateless processes

Port binding

Export services via port binding

Concurrency

Scale out via the process model

Disposability

Maximize robustness with fast startup and graceful shutdown

Dev/prod parity

Keep development, staging, and production as similar as possible

Logs

Treat logs as event streams

Admin processes

Run admin/management tasks as one-off processes