Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Deployability of Python Web Applications
Search
Bruno Renié
July 02, 2013
Programming
2.4k
17
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Deployability of Python Web Applications
Bruno Renié
July 02, 2013
More Decks by Bruno Renié
See All by Bruno Renié
Visibility for web developers
brutasse
3
490
Decentralization & real-time with PubSubHubbub
brutasse
1
190
Stop writing settings files
brutasse
21
2.6k
Class-based Views: patterns and anti-patterns
brutasse
9
1.7k
Packager son projet Django
brutasse
4
600
Staticfiles : tout ce qu'il faut savoir, rien que ce qu'il faut savoir
brutasse
4
600
Introduction to Django
brutasse
3
460
Other Decks in Programming
See All in Programming
What's New in Android 2026
veronikapj
0
270
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
2k
Building a Meta Ray-Ban display app
akkeylab
0
170
freeeにおけるEvalsの実践例の紹介
freee
PRO
0
130
レビュー履歴をAIに食わせて、 Compose移行を加速するs
shihochan
0
150
FastAPI の並行処理モデルを完全に理解する
hoto17296
1
290
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
710
全PRの83%がAIレビューだけでマージできるようになった開発組織はその後どうなったか
athug
1
1.9k
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
490
AI Readyの正体はデータマネジメントだ メダリオン2.0の最前線
freee
PRO
0
330
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
0
1.9k
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
2
340
Featured
See All Featured
So, you think you're a good person
axbom
PRO
2
2.1k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
170
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Designing Powerful Visuals for Engaging Learning
tmiket
1
500
My Coaching Mixtape
mlcsv
0
250
Producing Creativity
orderedlist
PRO
348
40k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
210
Agile that works and the tools we love
rasmusluckow
331
22k
Mind Mapping
helmedeiros
PRO
1
320
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
540
Transcript
Bruno Renié — EuroPython 2013 Deployability of Python web applications
Deployability, n The extent to which something is deployable
Disclaimer Most of this isn't python-specific or even web-specific Oriented
at custom infrastructures Some things still apply if you're on PaaS
How easy it is to install, configure and operate your
software?
Mostly about devs and ops working together
12factor.net
installation configuration operation
Installation
Installing postgres sudo apt-get install postgresql
Installing a python webapp sudo apt-get install build-essential python-virtualenv git
clone https://
[email protected]
/corp/repo cd repo virtualenv env env/bin/pip install -r requirements.txt # Figure out PYTHONPATH
Installing a python webapp sudo apt-get install build-essential python-virtualenv git
clone https://
[email protected]
/corp/repo cd repo virtualenv env env/bin/pip install -r requirements.txt # Figure out PYTHONPATH
Installing software is a solved problem Just use packaging Yep,
python packaging
Why python packaging? Release process Dependency management Trivial rollbacks Easy
system packaging
Packaging in 30 seconds # setup.py from distutils.core import setup
from setuptools import find_packages with open('requirements.txt') as reqs: install_requires = reqs.read().split('\n') setup( name='project', version=__import__('project').__version__, packages=find_packages(), include_package_data=True, zip_safe=False, install_requires=install_requires, ) # MANIFEST.in include requirements.txt recursive-include project *
Private package hosting Local filesystem Network-based, ala pypi.python.org python setup.py
sdist pip install --download dist -r requirements.txt rsync -avz -e ssh dist/ host.corp.com:/srv/pypi pip install --no-index --find-links=/srv/pypi myproject HTML directory index (apache / nginx / SimpleHTTPServer) pip install --no-index --find-links=http://host myproject
System packages fpm -s python -t deb setup.py awk -F=
'{printf "fpm -s python -t deb -v %s %s\n", $3, $1}' \ requirements.txt | sh https://github.com/rcrowley/freight https://github.com/jordansissel/fpm Sign, upload to your private repository sudo apt-get install python-myproject sudo apt-get install python-myproject=1.2.3
Pin your dependencies Bad Good Django Django>=1.4,<1.5 Django==1.4.5 http://nvie.com/posts/pin-your-packages/ This
is for end products, not libraries
Configuration
Configuring postgres $EDITOR /etc/postgresql/9.2/main/postgresql.conf service postgresql restart
Does your app have a config file? settings.py, production_settings.py are
not config files Configuration != code
Problems with configuration as code Incompatible with packaging Environment-specific code
Production-specific code will break production. Code shouldn't be tied to environments Code shouldn't be generated (salt / puppet / fabric)
Define your configuration What changes between environments? Database Secret key
Host / port Credentials to external services (AWS, Sentry…) Read configuration from your code .ini files yaml environment variables …
Code changes ↓ release, deploy app Infrastructure changes ↓ write
config, reload app
Config as environment variables Trivial to set with $PROCESS_MANAGER Native
to every programming language De-facto standard (PaaS). Interoperability! Shared hosting Apache Pros Cons
Case study: Django settings Before After DATABASES = {'default': {'HOST':
'localhost', …}} settings_local.py DATABASES = {'default': {'HOST': 'prod', …}} settings_prod.py DATABASES = {'default': {'HOST': 'staging', …}} settings_staging.py DATABASES = {'default': dj_database_url.config()} settings.py DATABASE_URL="postgres://host:5432/db" env
Config patterns SECRET_KEY = os.environ['SECRET_KEY'] KeyError: 'SECRET_KEY' PORT = int(os.environ.get('PORT',
8000)) Sane defaults when possible Prevent the app from booting if something critical is missing Use *_URL and parsers to reduce the number of variables EMAIL_URL DATABASE_URL REDIS_URL
In development django-dotenv virtualenvwrapper postactivate hooks custom manage.py envdir …
Operation
WSGI Have a WSGI entry point gunicorn myapp.wsgi -b 0.0.0.0:$PORT
Stateless processes Persistence via external services Database Caching Storage …
Scale out with processes More traffic? Spawn more processes. Caveat:
backend services rarely scale horizontally
Maximize dev/prod parity Same software Same people Same versions If
you use postgres in production, use postgres in development PostgreSQL 9.1 and 9.2 do not perform equally Developers should know about infrastructure
Continuous integration/deployment CI != green badge on your github page
CD != always running master in production Having shippable code Deploying it whenever your want CI CD tested packaged installable
Example workflow Commit Run tests Package Staging Production
Example workflow Staging Production Run tests Commit Package manual or
automated Jenkins, SaltStack, IRC bots are your automation friends
use packaging to manage software clearly define the configuration contract
automate as much as possible to minimize deployment friction
@brutasse
[email protected]
?