twelve-factor
- Codebase
- Git repo per application
- An app should have its own git repo and should not share this repo with any other apps
- Dependencies
- App should always explicitly declare all its dependencies (using tool like maven), it doesn't suppose that the dependencies will be available at system level
- Configurations
- App should externalize all such configurations that vary between deployments
- Storage of configuration in environment
- Backing services
- Treat all such backing services as attached resources
- No code change is needed when the service change
- Build, Release, Run
- Separate the process of converting the codebase into running application
- Build: compile the code and create docker image
- Release: push the image to registry
- Run: pull the image and run it in the container
- Process - Stateless Apps
- Any data needs to persist must be ub backing services like database in order to allow the scaling out of the application
- Port binding
- Concurrency
- Disposability
- Maximize robustness with fast startup and graceful shutdown
- If the application is under increasing load we should be able to start and stop the application rapidly to scale up and scale down
- Dev / Prod parity
- Keep the gap between environments as minimal as possible
- A containerized application is expected to behave the same, no matter where we run it (Use docker)
- Logs
- Publish logs as event streams
- Admin process
- Keep admin scripts together with app codebase