Outsourcing your webapp maintenance to Debian

Outsourcing your webapp maintenance to Debian

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.

http://lanyrd.com/2014/debconf-14/sdbqqt/

0110e86fdb31486c22dd381326d99de9?s=128

Francois Marier

August 29, 2014
Tweet

Transcript

  1. #!/bin/sh # # # # # # by Francois Marier

    <francois@debian.org> # apt-get update apt-get -y upgrade Outsourcing your webapp maintenance to Debian
  2. dependencies in webapps

  3. dependencies in webapps case study

  4. dependencies in webapps case study approach

  5. dependencies in webapps case study approach results

  6. dependencies in webapps case study discussion approach results

  7. external depencies in web applications

  8. $ ls vendor/packages/ amqplib anyjson BeautifulSoup beautifulsoup4 bleach celery decorator

    distribute Django django-assets django-authopenid django-celery django-debug-toolbar django-extensions django-inplaceedit django-invitation django-kombu django-model-utils django-picklefield django-registration django-reversion django-tastypie django-voting django-webtest dj-database-url docutils feedparser gdata ghettoq html2text html5lib importlib Jinja2 jsmin kombu markupsafe mechanize mimeparse mock odict ordereddict pygeoip Pygments python-dateutil python-memcached python-mimeparse python-openid python-otp python-patch pytz PyYaml requests scrapy sessionprofile six south sphinx sqlparse staticgenerator twill twisted typecheck unicodecsv unittest-xml-reporting webob webtest whoosh zope.interface
  9. 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@ │ │ ├── he@0.3.6 │ │ ├── mime@1.2.11 │ │ └─┬ mimelib@0.2.17 │ │ ├── addressparser@0 │ │ └─┬ encoding@0.1.8 │ │ └── iconv-lite@0. │ └─┬ 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
  10. 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@ │ │ ├── he@0.3.6 │ │ ├── mime@1.2.11 │ │ └─┬ mimelib@0.2.17 │ │ ├── addressparser@0 │ │ └─┬ encoding@0.1.8 │ │ └── iconv-lite@0. │ └─┬ 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
  11. 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@ │ │ ├── he@0.3.6 │ │ ├── mime@1.2.11 │ │ └─┬ mimelib@0.2.17 │ │ ├── addressparser@0 │ │ └─┬ encoding@0.1.8 │ │ └── iconv-lite@0. │ └─┬ 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
  12. not a new problem

  13. c/c++ dynamic linking

  14. shared library instead of bundling

  15. fix libbroken once

  16. fix libbroken once maintainer uploads the new upstream version

  17. fix libbroken once maintainer uploads the new upstream version security

    team patches the stable package
  18. How to leverage this work in our webapps?

  19. libravatar.org

  20. libravatar.org

  21. delivering (federated) avatars to third-party websites

  22. None
  23. None
  24. None
  25. www

  26. www cdn2 cdn1 cdn4 cdn5

  27. www cdn2 cdn1 cdn4 cdn5

  28. www cdn2 cdn1 cdn4 cdn5

  29. www cdn2 cdn1 cdn4 cdn5

  30. www cdn2 cdn1 cdn4 cdn5

  31. www cdn2 cdn1 cdn4 cdn5 yours?

  32. None
  33. Francois@FMARIER.ORG

  34. francois@fmarier.org

  35. 0110e86fdb31486c22dd381326d99de9

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

  37. $ 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 ;; 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
  38. http://fmarier.org/avatar/0110e86...

  39. http://cdn.libravatar.org/avatar/ https://seccdn.libravatar.org/avatar/

  40. a pretty simple web application

  41. guidelines

  42. only use Python libraries that are packaged for Debian guidelines

    1.
  43. only use Python libraries that are packaged for Debian only

    use the version from the latest Debian release guidelines 1. 2.
  44. libravatar*.deb

  45. build: “upstream” makefile

  46. build: $(MINIFY) $(COMPRESS) mofiles “upstream” makefile

  47. build: $(MINIFY) $(COMPRESS) mofiles ... test: “upstream” makefile

  48. build: $(MINIFY) $(COMPRESS) mofiles ... test: pep8 pyflakes pylint unittests

    ... “upstream” makefile
  49. libravatar.deb libravatar-www.deb libravatar-cdn.deb libravatar-seccdn.deb libravatar-cdn-common.deb libravatar-common.deb ...

  50. reprepro

  51. fabric

  52. keeping mirrors up to date apt-get update apt-get upgrade

  53. How did it go?

  54. limited choice of libraries

  55. python-gearman.libgearman python-gearman

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

    2248 $ apt-cache search ^python3- | grep ^python | wc -l 656
  57. cannot use the latest features

  58. None
  59. Libravatar is a very low-maintainance service

  60. Problems I ran into

  61. optimizing for sysadmins instead of developers

  62. None
  63. non-minified jQuery

  64. None
  65. cannot easily use unattended-upgrades

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

    has detected that some packages need upgrading on: husavik [ 162.x.x.x 10.x.x.x 2001::37f0 ] [ 162.x.x.x 2001::37f0 ] The following packages are currently pending an upgrade: python-django 1.4.5-1+deb7u8 =================================================
  67. security updates not always timely in Debian

  68. if you notice...

  69. if you notice... you can help out with backporting or

    testing!
  70. if you don't notice...

  71. if you don't notice... better late than never!

  72. www

  73. None
  74. Is it realistic?

  75. None
  76. None
  77. django system libraries deb packaging

  78. What would be a good fit?

  79. not your full-time job

  80. not your full-time job uses a mature framework

  81. e.g. side project

  82. e.g. consulting company

  83. 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@ │ │ ├── he@0.3.6 │ │ ├── mime@1.2.11 │ │ └─┬ mimelib@0.2.17 │ │ ├── addressparser@0 │ │ └─┬ encoding@0.1.8 │ │ └── iconv-lite@0. │ └─┬ 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
  84. © 2014 François Marier <francois@debian.org> This work is licensed under

    a Creative Commons Attribution-ShareAlike 4.0 License. Questions?