Your SlideShare is downloading. ×
How to host an app  for $20 in 20min using buildout and hostout
Upcoming SlideShare
Loading in...5

Thanks for flagging this SlideShare!

Oops! An error has occurred.

Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

How to host an app for $20 in 20min using buildout and hostout


Published on

an introduction zc.buildout and how it can help manage complex python installations and reproducible production environments. Dylan will also introduce a new open source project: collective.hostout, a …

an introduction zc.buildout and how it can help manage complex python installations and reproducible production environments. Dylan will also introduce a new open source project: collective.hostout, a technology for rapidly provisioning and deploying buildout environments on many hosts at once.

Published in: Technology
  • Be the first to comment

No Downloads
Total Views
On Slideshare
From Embeds
Number of Embeds
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

No notes for slide


  • 1. Buildout and Hostout or “How to host an app for $20 in 20min” Dylan Jay [email_address] Technical Solutions Manager PretaWeb (Thanks to Darryl Cousins for slides 1-10 from NZPUG presentation)
  • 2. A Python Module A block of code imported by some other code
  • 3. A python module: We can import the method from the module: def helloworld (): print u"Hello World from hello import helloworld
  • 4. A Python Package: hello A package is a module that contains other modules: hello/ Now we must import the method from the module within the module. from hello.hello import helloworld
  • 5. Disutils Distutils was written so we have a unified way to install python modules. python install
  • 6. Disutils – creating a distribution To distribute the hello module we need have it in a directory with a file. workingdir/ hello/ The file needs at the least the following. from distutils.core import setup setup(name="hello", )
  • 7. Disutils creating a distribution continued Now we can create a distribution tarball with disutils. python sdist Our directory now looks like this workingdir/ hello/ dist/ hello-1.0.tar.gz If we unpack the source distribution it looks like this: Hello-1.0/ PKG-INFO hello/
  • 8. setuptools • Setuptools is built on top of distutils • uses the • uses eggs for distribution • allows us to save our modules as eggs to pypi Installing setuptools wget python
  • 9. Eggs To create an egg change the import line in from setuptools import setup setup(name="hello", version="1.0", ) We can call that with: python bdist_egg Which creates a binary egg in our dist directory dist/ hello-1.0-py2.4.egg
  • 10. pypi If we want that egg available on pypi and we have an account we can do that with a single command. python sdist upload Which all the world can use easy_install hello
  • 11. virtualenv If we want to install without affecting whole system $ easy_install virtualenv $ virtualenv myenv $ source myenv/bin/activate (myenv)$ easy_install hello . . . (myenv)$ deactivate
  • 12. zc.buildout – what is it? “ Buildout is a system of configuring repeatable steps for assembling complicated systems (applications) from multiple parts.”
    • Configure different parts using one config file
    • Glue the parts togeather
    • Specify versions
    • Isolated in one directory
    • Repeat that configuration over and over
  • 13. Installing buildout $ easy_install zc.buildout $ cd myproj $ buildout init This creates the following directory structure myproj/ bin/ buildout parts/ develop-eggs/ buildout.cfg
  • 14. buildout.cfg Buildout does very little by itself [buildout] parts = A buildout is made of parts. Parts are instances of recipes. Recipes do the work. [buildout] parts = py [py] recipe = zc.recipe.egg interpreter = py eggs = hello
  • 15. Recipes – 185+ on pypi
  • 16. Running buildout $ bin/buildout Installing py. Generated interpreter 'myproj/bin/py'. $ bin/py >>> from hello import helloworld >>> helloworld() Hello World
  • 17. Buildout - Scripts You can generate scripts [buildout] parts = buildout1 buildout2 [buildout1] recipe = zc.recipe.egg eggs = zc.buildout==1.2.1 scripts = buildout=buildout1 [buildout2] recipe = zc.recipe.egg eggs = zc.buildout<=1.2.0 scripts = buildout=buildout2
  • 18. Buildout - Versions You can pin versions [buildout] parts = buildout1 buildout2 versions = versions [buildout1] recipe = zc.recipe.egg eggs = zc.buildout scripts = buildout=buildout1 [versions] zc.buildout = 1.2.1
  • 19. Buildout - Scripts are wrappers $ cat bin/buildout1 #!/bin/python import sys sys.path[0:0] = [ '/download-cache/eggs/zc.buildout-1.2.1-py2.4.egg', '/download-cache/eggs/setuptools-0.6c9-py2.4.egg', ] import zc.buildout.buildout if __name__ == '__main__': zc.buildout.buildout.main()
  • 20. Buildout – manages installation $ bin/buildout -v Uninstalling py. Installing buildout1. Installing 'zc.buildout==1.2.1'. We have the distribution that satisfies 'zc.buildout==1.2.1'. Adding required 'setuptools' required by zc.buildout 1.2.1. Picked: setuptools = 0.6c9 Generated script 'myproj/bin/buildout1'. Installing buildout2. Installing 'zc.buildout==1.2.0'. We have the distribution that satisfies 'zc.buildout==1.2.0'. Adding required 'setuptools' required by zc.buildout 1.2.0. Picked: setuptools = 0.6c9 Generated script 'myproj/bin/buildout2'.
  • 21. Buildout – variables and dependencies and distutils [ buildout ] parts = py [ py ] recipe = zc .recipe.egg Interpreter = py extra-paths= ${reportlab:output} [ reportlab ] recipe = collective.recipe. distutils url = output = ${buildout:directory}/parts/site-packages/
  • 22. Helloworld in Plone src/hello/hello/ from Products.Five.browser import BrowserView class HelloWorld (BrowserView): def __call__ ( self ): return &quot;Hello World&quot; src/hello/hello/configure.zcml <configure xmlns:browser=&quot; &quot;> <browser:page name=&quot;hello&quot; class=&quot;.hello.HelloWorld&quot; permission=&quot;zope2.Public&quot; /> </configure>
  • 23. Helloworld in Plone buildout base.cfg [ buildout ] parts = instance develop = src /hello [zope2] recipe = plone .recipe.zope2install url = [instance] recipe = plone .recipe.zope2instance zope2-location = ${zope2:location} user = dylan:jay eggs = hello Plone zcml = hello
  • 24. Run Helloworld $ bin/buildout -c base.cfg Develop: 'myproj/src/hello' Updating zope2. Updating fake eggs Installing instance. $ bin/instance fg 2009-06-08 20:24:54 INFO ZServer HTTP server started at Mon Jun 8 20:24:54 2009 Hostname: localhost Port: 8080 ... 2009-06-08 20:25:44 INFO Zope Ready to handle requests
  • 25. Production buildout extends base prod.cfg [ buildout ] extends = base. cfg parts += supervisor [instance] zeo -client = True zeo -address = ${zeo:zeo-address} [ zeo ] recipe = plone .recipe.zope2zeoserver zope2-location = ${zope2:location} Zeo -address = [varnish] recipe = plone .recipe.varnish:instance bind = mode = foreground backends = ${instance:http-address} daemon = ${varnish-build:location}/ sbin / varnishd [varnish-build] recipe = zc .recipe. cmmi url = [supervisor] recipe = collective.recipe.supervisor programs = 10 zeo ${zeo:location}/bin/ runzeo 20 instance1 ${instance:location}/bin/ runzope 70 cache ${buildout:bin-directory}/varnish ${varnish:location} true
  • 26. Hosting a buildout First get a server with root access ~$20USD p/m for 256mb Slicehost, Amazon ec2, etc
  • 27. collective.hostout
    • Aims to to make a hosted python app :-
    • as easy to install as a cPanel app
    • as easy to deploy as google app engine
    • keep control of code
  • 28. Put collective.hostout in buildout.cfg [ buildout ] extends = base. cfg parts += hostout [ hostout ] recipe = collective. hostout host= myproj . slicehost . com buildout = prod . cfg start_cmd = ${buildout:bin-directory}/ supervisord stop_cmd = ${buildout:bin-directory}/ supervisorctl shutdown
  • 29. Run hostout $ bin/buildout Develop: 'myproj/src/hello' Updating zope2. Updating fake eggs Updating instance. Installing hostout. $ bin/hostout running setup script 'src/hello/'. … creating deployment file: versions.cfg prod.cfg base.cfg hello1.0dev_12...6-py2.4.egg logging into the following hosts as root: Password: Installing python Bootstrapping buildout in /var/local/buildout Unpacking deployment file Running buildout Running start command
  • 30. Hostout – with source control Doesn't need access to svn or git on the server
  • 31. Hostout TODO
    • Multi server
    • Transfer databases
    • Integrate with source control
    • Rollback