Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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
200
Stop writing settings files
brutasse
21
2.7k
Class-based Views: patterns and anti-patterns
brutasse
9
1.7k
Packager son projet Django
brutasse
4
610
Staticfiles : tout ce qu'il faut savoir, rien que ce qu'il faut savoir
brutasse
4
600
Introduction to Django
brutasse
3
470
Other Decks in Programming
See All in Programming
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.5k
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
21
21k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
510
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
190
mrbgem 三角測量 開発
ogom
0
220
すこし踏み込む CancellationToken
htkym
2
1.7k
個人開発者よ、Honoを使え(おじさんver)
tanahiro2010
2
160
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
470
難しいけど、読めた。- OSSの入口に立った話。
sts11142
0
140
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
5.8k
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
450
dotNET_vulnclicker_intro.pdf
deka_morita
0
130
Featured
See All Featured
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.8k
The SEO identity crisis: Don't let AI make you average
varn
0
580
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
2
350
Color Theory Basics | Prateek | Gurzu
gurzu
1
480
Test your architecture with Archunit
thirion
2
2.4k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Paper Plane
katiecoart
PRO
4
54k
sira's awesome portfolio website redesign presentation
elsirapls
0
450
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Accessibility Awareness
sabderemane
1
240
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
400
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]
?