External dependencies in web apps: system libs are not that scary

External dependencies in web apps: system libs are not that scary

Going to production is very different from setting up a development environment. We have great tools like pip and virtualenv for the latter but they lead to maintenance anti-patterns when they are used for production deployments. We don't "pip install apache" and instead leverage the QA and integration work of distro developers, so why not rely on distros for more than just the base system?

http://lanyrd.com/2014/kiwi-pycon/sdcwpt/

0110e86fdb31486c22dd381326d99de9?s=128

Francois Marier

September 13, 2014
Tweet

Transcript

  1. External dependencies in web apps system libs are not that

    scary François Marier @fmarier mozilla
  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++ in Linux distros

  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. delivering (federated) avatars to third-party websites

  21. None
  22. None
  23. None
  24. www

  25. www cdn2 cdn1 cdn4 cdn5

  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 yours?

  31. None
  32. Francois@FMARIER.ORG

  33. francois@fmarier.org

  34. 0110e86fdb31486c22dd381326d99de9

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

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

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

  39. a very simple web application

  40. rules

  41. only use Python libraries that are packaged for Debian rules

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

    use the version from the latest Debian release rules 1. 2.
  43. libravatar*.deb

  44. build: “upstream” makefile

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

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

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

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

  49. reprepro

  50. fabric

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

  52. How did it go?

  53. limited choice of libraries

  54. python-gearman.libgearman python-gearman

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

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

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

  59. Problems I ran into

  60. optimizing for sysadmins instead of developers

  61. None
  62. non-minified jQuery

  63. None
  64. cannot easily use unattended-upgrades

  65. 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 =================================================
  66. security updates not always timely in distros

  67. if you notice...

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

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

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

  71. Is it realistic?

  72. None
  73. django system libraries deb packaging

  74. What would be a good fit?

  75. not your full-time job

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

  77. e.g. side project

  78. e.g. consulting company

  79. 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
  80. © 2014 François Marier <francois@mozilla.com> This work is licensed under

    a Creative Commons Attribution-ShareAlike 4.0 License. Questions?