Twelve-Factor App | Store Config in the Environment

The third factor of the Twelve-Factor App methodology emphasizes storing configurations in the environment, rather than in the 3code.

Why Store Config in the Environment?

Storing config in the environment means keeping all the settings that vary between deployments (e.g., database credentials, API keys) separate from the code.

Benefits:
  • Security: Keeps sensitive information out of the codebase.
  • Flexibility: Allows for easy adjustment of configurations for different environments (e.g., development, staging, production).
  • Maintainability: Simplifies code updates without affecting configurations.

How to Store Config in the Environment

Environment Variables

Environment variables are a universal method for managing configuration across different systems.

Example:

Setting environment variables in a Unix-based system:

export DATABASE_URL="postgresql://user:pass@localhost:5432/mydb"

In the application, read the variable:

 
import os
database_url = os.environ['DATABASE_URL']
Configuration Management Tools

Tools like Ansible, Puppet, or Kubernetes ConfigMaps can manage environment-specific configurations.

Example: Kubernetes ConfigMap
 
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  DATABASE_URL: "postgresql://user:pass@localhost:5432/mydb"

Deployment Strategies with Config

Configurations must be handled separately for each environment.

Example:
  • Development Environment: Use local configurations.
  • Staging Environment: Apply configurations that mirror production.
  • Production Environment: Apply production-specific configurations.

This approach aligns with the principles of continuous deployment and facilitates the management of applications across various environments.