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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
470
Other Decks in Programming
See All in Programming
From 6 People Classroom Meetup to 100 People Regional Conference / FOSS4G Hiroshima 2026
furukawayasuto
0
140
AI に Inclusive UI を書かせよう — Design Rules Skill で Compose UI を作り直す
theoriatec2024
1
470
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
230
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
400
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
100
Webの地図
yosuke_furukawa
PRO
6
4.2k
AIエージェント時代のコードレビューを設計する
nogu66
6
2.6k
Snowflakeで業務アプリを作ろう。 Snowflakeのアプリ機能解説&実践ガイド
ayumu_yamaguchi
1
250
LoopHub - ローカルで動く GitHub で、AI と共同開発
jugyo
1
520
フロントエンドUIフレームワークのこれまでとこれから
ssssota
5
2.5k
Omarchy Tokyo やると聞いて UMPC 買ってセットアップしてきた
mtsmfm
0
140
Swift愛好会100回記念 第1回を振り返る
jollyjoester
0
120
Featured
See All Featured
Site-Speed That Sticks
csswizardry
13
1.5k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
350
The Language of Interfaces
destraynor
162
27k
Into the Great Unknown - MozCon
thekraken
41
2.7k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
370
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.5k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
WCS-LA-2024
lcolladotor
0
830
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
590
Ethics towards AI in product and experience design
skipperchong
2
370
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]
?