Outsourcing your webapp maintenance to Debian

Preview:

DESCRIPTION

Today's web applications often have a lot of external dependencies. Start off with a basic framework, sprinkle a couple of handy modules and finish with a generous serving of JavaScript front-end libraries. What you end up is a gigantic mess of code from different sources which follow very different release schedules and policies. Language-specific package managers can automate much of the dependency resolution and package installation, but you're on your own in terms of integration and quality assurance. Also, the minute you start distributing someone else's code with your project, you become responsible for the security of that third-party code. We moved away from statically-linked C/C++ programs a long time ago and now (mostly) live in a nicely-packaged shared library world. Can we leverage the power of Debian (i.e. the great work of the package maintainers and security team) to similarly reduce the burden of those who end up having to maintain our webapps? This talk will examine the decision that the Libravatar project made to outsource much of its maintenance burden to Debian by using system packages for almost everything. https://summit.debconf.org/debconf14/meeting/16/outsourcing-your-webapp-maintenance-to-debian/

Citation preview

#!/bin/sh###### by Francois Marier <francois@debian.org>#

apt-get updateapt-get -y upgrade

Outsourcing your webappmaintenance to Debian

dependenciesin webapps

dependenciesin webapps

case study

dependenciesin webapps

case study

approach

dependenciesin webapps

case study

approach results

dependenciesin webapps

case studydiscussion

approach results

external depencies inweb applications

$ ls vendor/packages/

amqplibanyjsonBeautifulSoupbeautifulsoup4bleachcelerydecoratordistributeDjangodjango-assetsdjango-authopeniddjango-celerydjango-debug-toolbardjango-extensionsdjango-inplaceeditdjango-invitationdjango-kombudjango-model-utilsdjango-picklefielddjango-registrationdjango-reversiondjango-tastypiedjango-votingdjango-webtestdj-database-urldocutilsfeedparsergdataghettoqhtml2text

html5libimportlibJinja2jsminkombumarkupsafemechanizemimeparsemockodictordereddictpygeoipPygmentspython-dateutilpython-memcachedpython-mimeparsepython-openidpython-otppython-patchpytzPyYamlrequestsscrapysessionprofilesixsouthsphinxsqlparsestaticgeneratortwilltwistedtypecheck

unicodecsvunittest-xml-reportingwebobwebtestwhooshzope.interface

browserid@1.0.0-b2 ├── async@0.2.9 ├─┬ awsbox@0.7.1

│ ├─┬ awssum@1.1.0 │ │ ├── underscore@1.4.4 │ │ └─┬ xml2js@0.2.8 │ │ └── sax@0.5.8 │ ├─┬ awssum-amazon@1.1.0 │ │ ├── dateformat@1.0.4-1.2.3 │ │ └── underscore@1.4.4 │ ├─┬ awssum-amazon-ec2@1.5.0 │ │ ├── data2xml@0.8.1 │ │ ├── dateformat@1.0.4-1.2.3 │ │ └── underscore@1.4.4 │ ├─┬ awssum-amazon-route53@1.2.0 │ │ ├── data2xml@0.8.1 │ │ ├── dateformat@1.0.4-1.2.3 │ │ ├── fmt@0.4.0 │ │ └── underscore@1.4.4 │ ├── colors@0.6.2 │ ├─┬ nice-route53@0.3.4 │ │ └─┬ awssum-amazon-route53@1.0.3 │ │ ├── data2xml@0.8.1 │ │ ├── dateformat@1.0.4-1.2.3 │ │ ├── fmt@0.4.0 │ │ └── underscore@1.4.4 │ ├─┬ optimist@0.3.1 │ │ └── wordwrap@0.0.2 │ ├─┬ read-package-json@1.1.9 │ │ ├─┬ glob@3.2.11 │ │ │ ├── inherits@2.0.1 │ │ │ └─┬ minimatch@0.3.0 │ │ │ └── sigmund@1.0.0 │ │ ├── graceful-fs@2.0.3 │ │ ├── lru-cache@2.5.0 │ │ └─┬ normalize-package-data@0.2.13 │ │ ├── github-url-from-git@1.1.1 │ │ └── github-url-from-...@0.1.0 │ ├── relative-date@1.1.1 │ ├── temp@0.4.0 │ └─┬ xml2js@0.1.13 │ └── sax@0.6.0

├─┬ bcrypt@0.7.7 │ └── bindings@1.0.0

├─┬ cef@0.3.3 │ └── dateformat@1.0.2-1.2.3

├── cjson@0.2.1 ├─┬ client-sessions@0.6.0

│ │ ├── esprima@1.0.3 │ │ ├── estraverse@1.1.2-1 │ │ ├─┬ jade@0.30.0 │ │ │ ├── character-parser@1.0.2 │ │ │ ├─┬ commander@1.1.1 │ │ │ │ └── keypress@0.1.0 │ │ │ ├─┬ monocle@0.1.50 │ │ │ │ └─┬ readdirp@0.2.5 │ │ │ │ └─┬ minimatch@1.0.0 │ │ │ │ ├── lru-cache@2.5.0 │ │ │ │ └── sigmund@1.0.0 │ │ │ └─┬ transformers@2.0.1 │ │ │ ├─┬ css@1.0.8 │ │ │ │ ├── css-parse@1.0.4 │ │ │ │ └── css-stringify@1.0.5 │ │ │ ├─┬ promise@2.0.0 │ │ │ │ └── is-promise@1.0.1 │ │ │ └─┬ uglify-js@2.2.5 │ │ │ ├─┬ optimist@0.3.7 │ │ │ │ └── wordwrap@0.0.2 │ │ │ └─┬ source-map@0.1.38 │ │ │ └── amdefine@0.1.0 │ │ └─┬ nomnom@1.5.2 │ │ ├── colors@0.5.1 │ │ └── underscore@1.1.7 │ ├─┬ optimist@0.3.4 │ │ └── wordwrap@0.0.2 │ └─┬ plist@0.4.3 │ ├── xmlbuilder@0.4.3 │ └── xmldom@0.1.19

├── irc@0.3.6 ├─┬ jshint@2.1.11

│ ├─┬ cli@0.4.5 │ │ └─┬ glob@4.0.5 │ │ ├── graceful-fs@3.0.2 │ │ ├── inherits@2.0.1 │ │ ├─┬ minimatch@1.0.0 │ │ │ ├── lru-cache@2.5.0 │ │ │ └── sigmund@1.0.0 │ │ └── once@1.3.0 │ ├── console-browserify@0.1.6 │ ├─┬ minimatch@0.4.0 │ │ ├── lru-cache@2.5.0 │ │ └── sigmund@1.0.0 │ ├── shelljs @0.1.4

├─┬ nodemailer@0.5.3 │ ├─┬ mailcomposer@0.2.12 │ │ ├─┬ dkim-signer@0.1.2

│ │ │ └── punycode@1.2.4 │ │ ├── follow-redirects@0.0.3 │ │ ├── he@0.3.6 │ │ ├── mime@1.2.11 │ │ └─┬ mimelib@0.2.17 │ │ ├── addressparser@0.2.1 │ │ └─┬ encoding@0.1.8 │ │ └── iconv-lite@0.4.4 │ └─┬ simplesmtp@0.3.32 │ ├── rai@0.1.11 │ └── xoauth2@0.1.8

├─┬ optimist@0.6.0 │ ├── minimist@0.0.10 │ └── wordwrap@0.0.2

├── postprocess@0.2.4 ├─┬ rimraf@2.2.2

│ └── graceful-fs@2.0.3 ├── semver@2.1.0 ├─┬ temp@0.6.0

│ ├── osenv@0.0.3 │ └─┬ rimraf@2.1.4 │ └── graceful-fs@1.2.3

├─┬ toobusy@0.2.4 │ └── bindings@1.1.0

├── uglify-js@1.0.6 ├── uglifycss@0.0.5 ├── underscore@1.5.2 ├── urlparse@0.0.1 ├─┬ useragent@2.0.7

│ └── lru-cache@2.2.4 ├── validator@1.5.1 ├─┬ vows@0.7.0

│ ├── diff@1.0.8 │ ├── eyes@0.1.8 │ └─┬ glob@3.1.21 │ ├── graceful-fs@1.2.3 │ ├── inherits@1.0.0 │ └─┬ minimatch@0.2.14 │ ├── lru-cache@2.5.0 │ └── sigmund@1.0.0

├── which@1.0.5 └─┬ winston@0.7.2

├── colors@0.6.2 ├── cycle@1.0.3 ├── eyes@0.1.8 ├── pkginfo@0.3.0 ├─┬ request@2.16.6 │ ├── aws-sign@0.2.0

│ └── cookies@0.3.8 ├─┬ compute-cluster@0.0.6

│ └─┬ vows@0.6.0 │ └── eyes@0.1.8

├─┬ connect@1.7.2 │ ├── mime@1.2.11 │ └── qs@1.2.2

├── connect-cachify@0.0.15 ├─┬ connect-fonts@0.0.11

│ ├── filed@0.1.0 │ ├── mime@1.2.9 │ ├─┬ node-font-face-...@0.1.1 │ │ └─┬ ua-parser@0.2.4 │ │ └── yamlparser@0.0.2 │ ├─┬ oppressor@0.0.1 │ │ ├── negotiator@0.2.8 │ │ ├── response-stream@0.0.0 │ │ └── through@0.1.4 │ └── tmp@0.0.16

├── connect-fonts-feurasans@0.0.3 ├── connect-fonts-opensans@0.0.5 ├── connect-logger-statsd@0.0.1 ├─┬ convict@0.4.1

│ ├── moment@1.7.2 │ ├─┬ optimist@0.5.0 │ │ └── wordwrap@0.0.2 │ └── validator@0.4.24

├─┬ cover@0.2.9 │ ├─┬ cli-table@0.0.2 │ │ └── colors@0.3.0 │ ├── underscore@1.2.4 │ └── underscore.string@2.0.0

├── ejs@0.8.4 ├── etagify@0.0.2 ├─┬ express@2.5.0

│ ├── mime@1.2.11 │ ├── mkdirp@0.0.7 │ └── qs@1.2.2

├── gobbledygook@0.0.3 ├── hood@0.2.1 ├── htmlparser@1.7.6 ├─┬ i18n-abide@0.0.14

│ ├── async@0.1.22 │ ├─┬ jsxgettext@0.1.7 │ │ ├─┬ escodegen@0.0.23 │ │ │ ├── estraverse@0.0.4 │ │ │ └─┬ source-map@0.1.38 │ │ │ └── amdefine@0.1.0

browserid@1.0.0-b2 ├── async@0.2.9 ├─┬ awsbox@0.7.1

│ ├─┬ awssum@1.1.0 │ │ ├── underscore@1.4.4 │ │ └─┬ xml2js@0.2.8 │ │ └── sax@0.5.8 │ ├─┬ awssum-amazon@1.1.0 │ │ ├── dateformat@1.0.4-1.2.3 │ │ └── underscore@1.4.4 │ ├─┬ awssum-amazon-ec2@1.5.0 │ │ ├── data2xml@0.8.1 │ │ ├── dateformat@1.0.4-1.2.3 │ │ └── underscore@1.4.4 │ ├─┬ awssum-amazon-route53@1.2.0 │ │ ├── data2xml@0.8.1 │ │ ├── dateformat@1.0.4-1.2.3 │ │ ├── fmt@0.4.0 │ │ └── underscore@1.4.4 │ ├── colors@0.6.2 │ ├─┬ nice-route53@0.3.4 │ │ └─┬ awssum-amazon-route53@1.0.3 │ │ ├── data2xml@0.8.1 │ │ ├── dateformat@1.0.4-1.2.3 │ │ ├── fmt@0.4.0 │ │ └── underscore@1.4.4 │ ├─┬ optimist@0.3.1 │ │ └── wordwrap@0.0.2 │ ├─┬ read-package-json@1.1.9 │ │ ├─┬ glob@3.2.11 │ │ │ ├── inherits@2.0.1 │ │ │ └─┬ minimatch@0.3.0 │ │ │ └── sigmund@1.0.0 │ │ ├── graceful-fs@2.0.3 │ │ ├── lru-cache@2.5.0 │ │ └─┬ normalize-package-data@0.2.13 │ │ ├── github-url-from-git@1.1.1 │ │ └── github-url-from-...@0.1.0 │ ├── relative-date@1.1.1 │ ├── temp@0.4.0 │ └─┬ xml2js@0.1.13 │ └── sax@0.6.0

├─┬ bcrypt@0.7.7 │ └── bindings@1.0.0

├─┬ cef@0.3.3 │ └── dateformat@1.0.2-1.2.3

├── cjson@0.2.1 ├─┬ client-sessions@0.6.0

│ │ ├── esprima@1.0.3 │ │ ├── estraverse@1.1.2-1 │ │ ├─┬ jade@0.30.0 │ │ │ ├── character-parser@1.0.2 │ │ │ ├─┬ commander@1.1.1 │ │ │ │ └── keypress@0.1.0 │ │ │ ├─┬ monocle@0.1.50 │ │ │ │ └─┬ readdirp@0.2.5 │ │ │ │ └─┬ minimatch@1.0.0 │ │ │ │ ├── lru-cache@2.5.0 │ │ │ │ └── sigmund@1.0.0 │ │ │ └─┬ transformers@2.0.1 │ │ │ ├─┬ css@1.0.8 │ │ │ │ ├── css-parse@1.0.4 │ │ │ │ └── css-stringify@1.0.5 │ │ │ ├─┬ promise@2.0.0 │ │ │ │ └── is-promise@1.0.1 │ │ │ └─┬ uglify-js@2.2.5 │ │ │ ├─┬ optimist@0.3.7 │ │ │ │ └── wordwrap@0.0.2 │ │ │ └─┬ source-map@0.1.38 │ │ │ └── amdefine@0.1.0 │ │ └─┬ nomnom@1.5.2 │ │ ├── colors@0.5.1 │ │ └── underscore@1.1.7 │ ├─┬ optimist@0.3.4 │ │ └── wordwrap@0.0.2 │ └─┬ plist@0.4.3 │ ├── xmlbuilder@0.4.3 │ └── xmldom@0.1.19

├── irc@0.3.6 ├─┬ jshint@2.1.11

│ ├─┬ cli@0.4.5 │ │ └─┬ glob@4.0.5 │ │ ├── graceful-fs@3.0.2 │ │ ├── inherits@2.0.1 │ │ ├─┬ minimatch@1.0.0 │ │ │ ├── lru-cache@2.5.0 │ │ │ └── sigmund@1.0.0 │ │ └── once@1.3.0 │ ├── console-browserify@0.1.6 │ ├─┬ minimatch@0.4.0 │ │ ├── lru-cache@2.5.0 │ │ └── sigmund@1.0.0 │ ├── shelljs @0.1.4

├─┬ nodemailer@0.5.3 │ ├─┬ mailcomposer@0.2.12 │ │ ├─┬ dkim-signer@0.1.2

│ │ │ └── punycode@1.2.4 │ │ ├── follow-redirects@0.0.3 │ │ ├── he@0.3.6 │ │ ├── mime@1.2.11 │ │ └─┬ mimelib@0.2.17 │ │ ├── addressparser@0.2.1 │ │ └─┬ encoding@0.1.8 │ │ └── iconv-lite@0.4.4 │ └─┬ simplesmtp@0.3.32 │ ├── rai@0.1.11 │ └── xoauth2@0.1.8

├─┬ optimist@0.6.0 │ ├── minimist@0.0.10 │ └── wordwrap@0.0.2

├── postprocess@0.2.4 ├─┬ rimraf@2.2.2

│ └── graceful-fs@2.0.3 ├── semver@2.1.0 ├─┬ temp@0.6.0

│ ├── osenv@0.0.3 │ └─┬ rimraf@2.1.4 │ └── graceful-fs@1.2.3

├─┬ toobusy@0.2.4 │ └── bindings@1.1.0

├── uglify-js@1.0.6 ├── uglifycss@0.0.5 ├── underscore@1.5.2 ├── urlparse@0.0.1 ├─┬ useragent@2.0.7

│ └── lru-cache@2.2.4 ├── validator@1.5.1 ├─┬ vows@0.7.0

│ ├── diff@1.0.8 │ ├── eyes@0.1.8 │ └─┬ glob@3.1.21 │ ├── graceful-fs@1.2.3 │ ├── inherits@1.0.0 │ └─┬ minimatch@0.2.14 │ ├── lru-cache@2.5.0 │ └── sigmund@1.0.0

├── which@1.0.5 └─┬ winston@0.7.2

├── colors@0.6.2 ├── cycle@1.0.3 ├── eyes@0.1.8 ├── pkginfo@0.3.0 ├─┬ request@2.16.6 │ ├── aws-sign@0.2.0

│ └── cookies@0.3.8 ├─┬ compute-cluster@0.0.6

│ └─┬ vows@0.6.0 │ └── eyes@0.1.8

├─┬ connect@1.7.2 │ ├── mime@1.2.11 │ └── qs@1.2.2

├── connect-cachify@0.0.15 ├─┬ connect-fonts@0.0.11

│ ├── filed@0.1.0 │ ├── mime@1.2.9 │ ├─┬ node-font-face-...@0.1.1 │ │ └─┬ ua-parser@0.2.4 │ │ └── yamlparser@0.0.2 │ ├─┬ oppressor@0.0.1 │ │ ├── negotiator@0.2.8 │ │ ├── response-stream@0.0.0 │ │ └── through@0.1.4 │ └── tmp@0.0.16

├── connect-fonts-feurasans@0.0.3 ├── connect-fonts-opensans@0.0.5 ├── connect-logger-statsd@0.0.1 ├─┬ convict@0.4.1

│ ├── moment@1.7.2 │ ├─┬ optimist@0.5.0 │ │ └── wordwrap@0.0.2 │ └── validator@0.4.24

├─┬ cover@0.2.9 │ ├─┬ cli-table@0.0.2 │ │ └── colors@0.3.0 │ ├── underscore@1.2.4 │ └── underscore.string@2.0.0

├── ejs@0.8.4 ├── etagify@0.0.2 ├─┬ express@2.5.0

│ ├── mime@1.2.11 │ ├── mkdirp@0.0.7 │ └── qs@1.2.2

├── gobbledygook@0.0.3 ├── hood@0.2.1 ├── htmlparser@1.7.6 ├─┬ i18n-abide@0.0.14

│ ├── async@0.1.22 │ ├─┬ jsxgettext@0.1.7 │ │ ├─┬ escodegen@0.0.23 │ │ │ ├── estraverse@0.0.4 │ │ │ └─┬ source-map@0.1.38 │ │ │ └── amdefine@0.1.0

browserid@1.0.0-b2 ├── async@0.2.9 ├─┬ awsbox@0.7.1

│ ├─┬ awssum@1.1.0 │ │ ├── underscore@1.4.4 │ │ └─┬ xml2js@0.2.8 │ │ └── sax@0.5.8 │ ├─┬ awssum-amazon@1.1.0 │ │ ├── dateformat@1.0.4-1.2.3 │ │ └── underscore@1.4.4 │ ├─┬ awssum-amazon-ec2@1.5.0 │ │ ├── data2xml@0.8.1 │ │ ├── dateformat@1.0.4-1.2.3 │ │ └── underscore@1.4.4 │ ├─┬ awssum-amazon-route53@1.2.0 │ │ ├── data2xml@0.8.1 │ │ ├── dateformat@1.0.4-1.2.3 │ │ ├── fmt@0.4.0 │ │ └── underscore@1.4.4 │ ├── colors@0.6.2 │ ├─┬ nice-route53@0.3.4 │ │ └─┬ awssum-amazon-route53@1.0.3 │ │ ├── data2xml@0.8.1 │ │ ├── dateformat@1.0.4-1.2.3 │ │ ├── fmt@0.4.0 │ │ └── underscore@1.4.4 │ ├─┬ optimist@0.3.1 │ │ └── wordwrap@0.0.2 │ ├─┬ read-package-json@1.1.9 │ │ ├─┬ glob@3.2.11 │ │ │ ├── inherits@2.0.1 │ │ │ └─┬ minimatch@0.3.0 │ │ │ └── sigmund@1.0.0 │ │ ├── graceful-fs@2.0.3 │ │ ├── lru-cache@2.5.0 │ │ └─┬ normalize-package-data@0.2.13 │ │ ├── github-url-from-git@1.1.1 │ │ └── github-url-from-...@0.1.0 │ ├── relative-date@1.1.1 │ ├── temp@0.4.0 │ └─┬ xml2js@0.1.13 │ └── sax@0.6.0

├─┬ bcrypt@0.7.7 │ └── bindings@1.0.0

├─┬ cef@0.3.3 │ └── dateformat@1.0.2-1.2.3

├── cjson@0.2.1 ├─┬ client-sessions@0.6.0

│ │ ├── esprima@1.0.3 │ │ ├── estraverse@1.1.2-1 │ │ ├─┬ jade@0.30.0 │ │ │ ├── character-parser@1.0.2 │ │ │ ├─┬ commander@1.1.1 │ │ │ │ └── keypress@0.1.0 │ │ │ ├─┬ monocle@0.1.50 │ │ │ │ └─┬ readdirp@0.2.5 │ │ │ │ └─┬ minimatch@1.0.0 │ │ │ │ ├── lru-cache@2.5.0 │ │ │ │ └── sigmund@1.0.0 │ │ │ └─┬ transformers@2.0.1 │ │ │ ├─┬ css@1.0.8 │ │ │ │ ├── css-parse@1.0.4 │ │ │ │ └── css-stringify@1.0.5 │ │ │ ├─┬ promise@2.0.0 │ │ │ │ └── is-promise@1.0.1 │ │ │ └─┬ uglify-js@2.2.5 │ │ │ ├─┬ optimist@0.3.7 │ │ │ │ └── wordwrap@0.0.2 │ │ │ └─┬ source-map@0.1.38 │ │ │ └── amdefine@0.1.0 │ │ └─┬ nomnom@1.5.2 │ │ ├── colors@0.5.1 │ │ └── underscore@1.1.7 │ ├─┬ optimist@0.3.4 │ │ └── wordwrap@0.0.2 │ └─┬ plist@0.4.3 │ ├── xmlbuilder@0.4.3 │ └── xmldom@0.1.19

├── irc@0.3.6 ├─┬ jshint@2.1.11

│ ├─┬ cli@0.4.5 │ │ └─┬ glob@4.0.5 │ │ ├── graceful-fs@3.0.2 │ │ ├── inherits@2.0.1 │ │ ├─┬ minimatch@1.0.0 │ │ │ ├── lru-cache@2.5.0 │ │ │ └── sigmund@1.0.0 │ │ └── once@1.3.0 │ ├── console-browserify@0.1.6 │ ├─┬ minimatch@0.4.0 │ │ ├── lru-cache@2.5.0 │ │ └── sigmund@1.0.0 │ ├── shelljs @0.1.4

├─┬ nodemailer@0.5.3 │ ├─┬ mailcomposer@0.2.12 │ │ ├─┬ dkim-signer@0.1.2

│ │ │ └── punycode@1.2.4 │ │ ├── follow-redirects@0.0.3 │ │ ├── he@0.3.6 │ │ ├── mime@1.2.11 │ │ └─┬ mimelib@0.2.17 │ │ ├── addressparser@0.2.1 │ │ └─┬ encoding@0.1.8 │ │ └── iconv-lite@0.4.4 │ └─┬ simplesmtp@0.3.32 │ ├── rai@0.1.11 │ └── xoauth2@0.1.8

├─┬ optimist@0.6.0 │ ├── minimist@0.0.10 │ └── wordwrap@0.0.2

├── postprocess@0.2.4 ├─┬ rimraf@2.2.2

│ └── graceful-fs@2.0.3 ├── semver@2.1.0 ├─┬ temp@0.6.0

│ ├── osenv@0.0.3 │ └─┬ rimraf@2.1.4 │ └── graceful-fs@1.2.3

├─┬ toobusy@0.2.4 │ └── bindings@1.1.0

├── uglify-js@1.0.6 ├── uglifycss@0.0.5 ├── underscore@1.5.2 ├── urlparse@0.0.1 ├─┬ useragent@2.0.7

│ └── lru-cache@2.2.4 ├── validator@1.5.1 ├─┬ vows@0.7.0

│ ├── diff@1.0.8 │ ├── eyes@0.1.8 │ └─┬ glob@3.1.21 │ ├── graceful-fs@1.2.3 │ ├── inherits@1.0.0 │ └─┬ minimatch@0.2.14 │ ├── lru-cache@2.5.0 │ └── sigmund@1.0.0

├── which@1.0.5 └─┬ winston@0.7.2

├── colors@0.6.2 ├── cycle@1.0.3 ├── eyes@0.1.8 ├── pkginfo@0.3.0 ├─┬ request@2.16.6 │ ├── aws-sign@0.2.0

│ └── cookies@0.3.8 ├─┬ compute-cluster@0.0.6

│ └─┬ vows@0.6.0 │ └── eyes@0.1.8

├─┬ connect@1.7.2 │ ├── mime@1.2.11 │ └── qs@1.2.2

├── connect-cachify@0.0.15 ├─┬ connect-fonts@0.0.11

│ ├── filed@0.1.0 │ ├── mime@1.2.9 │ ├─┬ node-font-face-...@0.1.1 │ │ └─┬ ua-parser@0.2.4 │ │ └── yamlparser@0.0.2 │ ├─┬ oppressor@0.0.1 │ │ ├── negotiator@0.2.8 │ │ ├── response-stream@0.0.0 │ │ └── through@0.1.4 │ └── tmp@0.0.16

├── connect-fonts-feurasans@0.0.3 ├── connect-fonts-opensans@0.0.5 ├── connect-logger-statsd@0.0.1 ├─┬ convict@0.4.1

│ ├── moment@1.7.2 │ ├─┬ optimist@0.5.0 │ │ └── wordwrap@0.0.2 │ └── validator@0.4.24

├─┬ cover@0.2.9 │ ├─┬ cli-table@0.0.2 │ │ └── colors@0.3.0 │ ├── underscore@1.2.4 │ └── underscore.string@2.0.0

├── ejs@0.8.4 ├── etagify@0.0.2 ├─┬ express@2.5.0

│ ├── mime@1.2.11 │ ├── mkdirp@0.0.7 │ └── qs@1.2.2

├── gobbledygook@0.0.3 ├── hood@0.2.1 ├── htmlparser@1.7.6 ├─┬ i18n-abide@0.0.14

│ ├── async@0.1.22 │ ├─┬ jsxgettext@0.1.7 │ │ ├─┬ escodegen@0.0.23 │ │ │ ├── estraverse@0.0.4 │ │ │ └─┬ source-map@0.1.38 │ │ │ └── amdefine@0.1.0

1.4.4

1.2.4

1.1.7 1.5.2

not a new problem

c/c++ dynamic linking

shared libraryinstead of bundling

fix libbroken once

fix libbroken once

maintaineruploads the newupstream version

fix libbroken once

maintaineruploads the newupstream version

security teampatches the

stable package

How to leverage thiswork in our webapps?

libravatar.org

libravatar.org

delivering (federated) avatarsto third-party websites

www

www

cdn2cdn1 cdn4 cdn5

www

cdn2cdn1 cdn4 cdn5

www

cdn2cdn1 cdn4 cdn5

www

cdn2cdn1 cdn4 cdn5

www

cdn2cdn1 cdn4 cdn5

www

cdn2cdn1 cdn4 cdn5yours?

Francois@FMARIER.ORG

francois@fmarier.org

0110e86fdb31486c22dd381326d99de9

http://gravatar.com/avatar/0110e86...

$ dig SRV _avatars._tcp.fmarier.org

; <<>> DiG 9.9.5-4-Debian <<>> SRV _avatars._tcp.fmarier.org;; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 48289;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:; EDNS: version: 0, flags:; udp: 4096;; QUESTION SECTION:;_avatars._tcp.fmarier.org. IN SRV

;; ANSWER SECTION:_avatars._tcp.fmarier.org. 3600 IN SRV 1 0 80 fmarier.org.

;; Query time: 137 msec;; SERVER: 192.168.1.1#53(192.168.1.1);; WHEN: Sat Aug 16 14:45:04 EDT 2014;; MSG SIZE rcvd: 85

http://fmarier.org/avatar/0110e86...

http://cdn.libravatar.org/avatar/

https://seccdn.libravatar.org/avatar/

a pretty simpleweb application

guidelines

only use Python libraries thatare packaged for Debian

guidelines

1.

only use Python libraries thatare packaged for Debian

only use the version fromthe latest Debian release

guidelines

1.

2.

libravatar*.deb

build:

“upstream” makefile

build: $(MINIFY) $(COMPRESS) mofiles

“upstream” makefile

build: $(MINIFY) $(COMPRESS) mofiles...

test:

“upstream” makefile

build: $(MINIFY) $(COMPRESS) mofiles...

test: pep8 pyflakes pylint unittests...

“upstream” makefile

libravatar.deblibravatar-www.deblibravatar-cdn.deblibravatar-seccdn.deblibravatar-cdn-common.deblibravatar-common.deb...

reprepro

fabric

keeping mirrors up to date

apt-get update

apt-get upgrade

How did it go?

limited choice of libraries

python-gearman.libgearman

python-gearman

$ apt-cache search ^python- | grep ^python | wc -l

2248

$ apt-cache search ^python3-| grep ^python | wc -l

656

cannot use the latest features

Libravatar is a verylow-maintainance service

Problems I ran into

optimizing for sysadminsinstead of developers

non-minified jQuery

cannot easily useunattended-upgrades

apticron report [Sat, 23 Aug 2014 10:11:08 +0000]=================================================

apticron has detected that some packages needupgrading on:

husavik [ 162.x.x.x 10.x.x.x 2001::37f0 ] [ 162.x.x.x 2001::37f0 ]

The following packages are currently pending anupgrade:

python-django 1.4.5-1+deb7u8

=================================================

security updates notalways timely in Debian

if you notice...

if you notice...

you can help out withbackporting or testing!

if you don't notice...

if you don't notice...

better late than never!

www

Is it realistic?

django

system libraries

deb packaging

What would be a good fit?

not your full-time job

not your full-time job

uses a mature framework

e.g. side project

e.g. consulting company

browserid@1.0.0-b2 ├── async@0.2.9 ├─┬ awsbox@0.7.1

│ ├─┬ awssum@1.1.0 │ │ ├── underscore@1.4.4 │ │ └─┬ xml2js@0.2.8 │ │ └── sax@0.5.8 │ ├─┬ awssum-amazon@1.1.0 │ │ ├── dateformat@1.0.4-1.2.3 │ │ └── underscore@1.4.4 │ ├─┬ awssum-amazon-ec2@1.5.0 │ │ ├── data2xml@0.8.1 │ │ ├── dateformat@1.0.4-1.2.3 │ │ └── underscore@1.4.4 │ ├─┬ awssum-amazon-route53@1.2.0 │ │ ├── data2xml@0.8.1 │ │ ├── dateformat@1.0.4-1.2.3 │ │ ├── fmt@0.4.0 │ │ └── underscore@1.4.4 │ ├── colors@0.6.2 │ ├─┬ nice-route53@0.3.4 │ │ └─┬ awssum-amazon-route53@1.0.3 │ │ ├── data2xml@0.8.1 │ │ ├── dateformat@1.0.4-1.2.3 │ │ ├── fmt@0.4.0 │ │ └── underscore@1.4.4 │ ├─┬ optimist@0.3.1 │ │ └── wordwrap@0.0.2 │ ├─┬ read-package-json@1.1.9 │ │ ├─┬ glob@3.2.11 │ │ │ ├── inherits@2.0.1 │ │ │ └─┬ minimatch@0.3.0 │ │ │ └── sigmund@1.0.0 │ │ ├── graceful-fs@2.0.3 │ │ ├── lru-cache@2.5.0 │ │ └─┬ normalize-package-data@0.2.13 │ │ ├── github-url-from-git@1.1.1 │ │ └── github-url-from-...@0.1.0 │ ├── relative-date@1.1.1 │ ├── temp@0.4.0 │ └─┬ xml2js@0.1.13 │ └── sax@0.6.0

├─┬ bcrypt@0.7.7 │ └── bindings@1.0.0

├─┬ cef@0.3.3 │ └── dateformat@1.0.2-1.2.3

├── cjson@0.2.1 ├─┬ client-sessions@0.6.0

│ │ ├── esprima@1.0.3 │ │ ├── estraverse@1.1.2-1 │ │ ├─┬ jade@0.30.0 │ │ │ ├── character-parser@1.0.2 │ │ │ ├─┬ commander@1.1.1 │ │ │ │ └── keypress@0.1.0 │ │ │ ├─┬ monocle@0.1.50 │ │ │ │ └─┬ readdirp@0.2.5 │ │ │ │ └─┬ minimatch@1.0.0 │ │ │ │ ├── lru-cache@2.5.0 │ │ │ │ └── sigmund@1.0.0 │ │ │ └─┬ transformers@2.0.1 │ │ │ ├─┬ css@1.0.8 │ │ │ │ ├── css-parse@1.0.4 │ │ │ │ └── css-stringify@1.0.5 │ │ │ ├─┬ promise@2.0.0 │ │ │ │ └── is-promise@1.0.1 │ │ │ └─┬ uglify-js@2.2.5 │ │ │ ├─┬ optimist@0.3.7 │ │ │ │ └── wordwrap@0.0.2 │ │ │ └─┬ source-map@0.1.38 │ │ │ └── amdefine@0.1.0 │ │ └─┬ nomnom@1.5.2 │ │ ├── colors@0.5.1 │ │ └── underscore@1.1.7 │ ├─┬ optimist@0.3.4 │ │ └── wordwrap@0.0.2 │ └─┬ plist@0.4.3 │ ├── xmlbuilder@0.4.3 │ └── xmldom@0.1.19

├── irc@0.3.6 ├─┬ jshint@2.1.11

│ ├─┬ cli@0.4.5 │ │ └─┬ glob@4.0.5 │ │ ├── graceful-fs@3.0.2 │ │ ├── inherits@2.0.1 │ │ ├─┬ minimatch@1.0.0 │ │ │ ├── lru-cache@2.5.0 │ │ │ └── sigmund@1.0.0 │ │ └── once@1.3.0 │ ├── console-browserify@0.1.6 │ ├─┬ minimatch@0.4.0 │ │ ├── lru-cache@2.5.0 │ │ └── sigmund@1.0.0 │ ├── shelljs @0.1.4

├─┬ nodemailer@0.5.3 │ ├─┬ mailcomposer@0.2.12 │ │ ├─┬ dkim-signer@0.1.2

│ │ │ └── punycode@1.2.4 │ │ ├── follow-redirects@0.0.3 │ │ ├── he@0.3.6 │ │ ├── mime@1.2.11 │ │ └─┬ mimelib@0.2.17 │ │ ├── addressparser@0.2.1 │ │ └─┬ encoding@0.1.8 │ │ └── iconv-lite@0.4.4 │ └─┬ simplesmtp@0.3.32 │ ├── rai@0.1.11 │ └── xoauth2@0.1.8

├─┬ optimist@0.6.0 │ ├── minimist@0.0.10 │ └── wordwrap@0.0.2

├── postprocess@0.2.4 ├─┬ rimraf@2.2.2

│ └── graceful-fs@2.0.3 ├── semver@2.1.0 ├─┬ temp@0.6.0

│ ├── osenv@0.0.3 │ └─┬ rimraf@2.1.4 │ └── graceful-fs@1.2.3

├─┬ toobusy@0.2.4 │ └── bindings@1.1.0

├── uglify-js@1.0.6 ├── uglifycss@0.0.5 ├── underscore@1.5.2 ├── urlparse@0.0.1 ├─┬ useragent@2.0.7

│ └── lru-cache@2.2.4 ├── validator@1.5.1 ├─┬ vows@0.7.0

│ ├── diff@1.0.8 │ ├── eyes@0.1.8 │ └─┬ glob@3.1.21 │ ├── graceful-fs@1.2.3 │ ├── inherits@1.0.0 │ └─┬ minimatch@0.2.14 │ ├── lru-cache@2.5.0 │ └── sigmund@1.0.0

├── which@1.0.5 └─┬ winston@0.7.2

├── colors@0.6.2 ├── cycle@1.0.3 ├── eyes@0.1.8 ├── pkginfo@0.3.0 ├─┬ request@2.16.6 │ ├── aws-sign@0.2.0

│ └── cookies@0.3.8 ├─┬ compute-cluster@0.0.6

│ └─┬ vows@0.6.0 │ └── eyes@0.1.8

├─┬ connect@1.7.2 │ ├── mime@1.2.11 │ └── qs@1.2.2

├── connect-cachify@0.0.15 ├─┬ connect-fonts@0.0.11

│ ├── filed@0.1.0 │ ├── mime@1.2.9 │ ├─┬ node-font-face-...@0.1.1 │ │ └─┬ ua-parser@0.2.4 │ │ └── yamlparser@0.0.2 │ ├─┬ oppressor@0.0.1 │ │ ├── negotiator@0.2.8 │ │ ├── response-stream@0.0.0 │ │ └── through@0.1.4 │ └── tmp@0.0.16

├── connect-fonts-feurasans@0.0.3 ├── connect-fonts-opensans@0.0.5 ├── connect-logger-statsd@0.0.1 ├─┬ convict@0.4.1

│ ├── moment@1.7.2 │ ├─┬ optimist@0.5.0 │ │ └── wordwrap@0.0.2 │ └── validator@0.4.24

├─┬ cover@0.2.9 │ ├─┬ cli-table@0.0.2 │ │ └── colors@0.3.0 │ ├── underscore@1.2.4 │ └── underscore.string@2.0.0

├── ejs@0.8.4 ├── etagify@0.0.2 ├─┬ express@2.5.0

│ ├── mime@1.2.11 │ ├── mkdirp@0.0.7 │ └── qs@1.2.2

├── gobbledygook@0.0.3 ├── hood@0.2.1 ├── htmlparser@1.7.6 ├─┬ i18n-abide@0.0.14

│ ├── async@0.1.22 │ ├─┬ jsxgettext@0.1.7 │ │ ├─┬ escodegen@0.0.23 │ │ │ ├── estraverse@0.0.4 │ │ │ └─┬ source-map@0.1.38 │ │ │ └── amdefine@0.1.0

© 2014 François Marier <francois@debian.org>This work is licensed under aCreative Commons Attribution-ShareAlike 4.0 License.

Questions?