The Twelve factor app
Guidelines for web apps / -services
12factor.net
Codebase
- VCS: git, svn, etc.
- Må ikke dele kode på tværs af apps
- Hver kørende instans af app'en; prod, staging, development; kalde vi et deploy
Dependencies
Declare and isolate
Må ikke afhænge af pakker på system-niveau (PEAR).
Brug Dep. declaration manifest og Dep. isolation
Python
pip og virtualenv
1
2
3
4
5
6
7
8
9
10
11
12
# requirements.txt
# ===
# Flask=0.9
# Flask-RESTFul=0.7
# github.com/homburg/pyjade.git
# Isolate in virtualenv
$ source venv/bin/activate
# Use Dep. declaration manifest
$ pip install -r requirements.txt
PHP
composer og (virtualenv?)
1
2
3
4
5
6
7
// composer.json
{
require: {
"smarty/smarty": "@stable",
"laravel/laravel": "~4"
}
}
Go ?
Static linking
Absolutte imports
1
import "github.com/homburg/amber
Config
- Database/memcached connection
- Credentials to external services (unilogin, facebook)
- ...
- Config files
- Environment variables (anbefalet)
- Ikke environments
1
2
3
4
5
6
// ...
Config::create(AppEnv::getEnvironment());
//...
Backing services
Treat backing services as attached resources
Build, release, run
- code + dependencies + compilation / "transpilation" => build
- build + config => release
- release => runtime
Processes
- Stateless
- Share-nothing
- Persist data
- Compile assets at build (smarty, sass, etc.)
Port binding
Håndter egne routes
Concurrent
Web workers - quick response
Background workers organiseret i kø-system (php-resque)
Eksempel
Eksterne services med lang svartid
Tung arbejde
Disposability
Fast startup / graceful shutdown
Behold baggrundsopgaver i køen
Dev/prod parity
Hold dev, stating og prod så ens så muligt
Continuous deployment
Anbefaling: brug samme services som på prod
Logs
Hæld output ud til stdout og benyt dedikerede værktøjer til at analysere output (Splunk)
Admin processes
Kør scripts i app'ens miljø
- Database migrations (alembic, doctrine)