• Save
Django deployment with PaaS
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Django deployment with PaaS

  • 43,274 views
Uploaded on

This presentation was given at the Boston Django meetup on November 16, and surveyed several leading PaaS providers including Stackato, Dotcloud, OpenShift and Heroku. ...

This presentation was given at the Boston Django meetup on November 16, and surveyed several leading PaaS providers including Stackato, Dotcloud, OpenShift and Heroku.

For each PaaS provider, I documented the steps necessary to deploy Mezzanine, a popular Django-based CMS and blogging platform.

At the end of the presentation, I do a wrap-up of the different providers and provide a comparison matrix showing which providers have which features. This matrix is likely to go out-of-date quickly because these providers are adding new features all the time.

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
No Downloads

Views

Total Views
43,274
On Slideshare
4,424
From Embeds
38,850
Number of Embeds
38

Actions

Shares
Downloads
0
Comments
1
Likes
36

Embeds 38,850

http://appsembler.com 38,631
http://feeds.feedburner.com 48
http://www.tuicool.com 26
http://www.google.com 22
http://translate.googleusercontent.com 22
http://127.0.0.1 14
https://www.google.com 11
http://still-savannah-8658.herokuapp.com 9
http://webcache.googleusercontent.com 9
https://www.google.com.br 8
http://www.google.co.uk 7
http://www.google.ca 5
https://twitter.com 3
https://www.google.co.il 3
https://www.google.co.uk 3
http://www.google.nl 2
http://www.google.com.mt 2
https://www.google.com.ua 2
https://www.google.co.in 2
https://www.google.com.sg 2
https://www.google.fr 2
http://www.alabalanica.org 1
http://www.google.com.hk 1
http://www.google.com.au 1
http://www.google.ro 1
http://www.google.fr 1
http://www.pearltrees.com 1
http://www.google.dk 1
http://www.google.se 1
https://www.google.es 1
http://reader.aol.com 1
http://www.google.co.nz 1
http://www.slashdocs.com 1
http://feedly.com 1
https://www.google.it 1
http://www.inoreader.com 1
https://www.google.ie 1
http://news.google.com 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide
  • \n
  • I started Jazkarta, a web consulting firm in 2004. AWS for our own website, before EBS. Connexions @ Rice University. GAE project for Aprigo, now known as ClockLock. Founded DZ to provide GAE-like capabilities to Django devs. Appsembler helps developers SaaSify their apps. Tried lots of PaaS providers and hope to share some of that knowledge w/ you tonight.\n
  • \n
  • How many are ... ? Who still hasn’t deployed Django onto a server?\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Lucas argues that over the years, the costs of hosting apps has exponentially decreased, while the productivity has exponentially increased.\n
  • \n
  • \n
  • Two open source options (CloudFoundry and OpenShift). CloudFoundry given birth to AppFog/Stackato. Big companies moved into this space within the last couple years (Redhat, VMWare, Salesforce through acquisitions). Amazon, Microsoft and Google built their own cloud platforms.\n
  • Two open source options (CloudFoundry and OpenShift). CloudFoundry given birth to AppFog/Stackato. Big companies moved into this space within the last couple years (Redhat, VMWare, Salesforce through acquisitions). Amazon, Microsoft and Google built their own cloud platforms.\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • First company to bet on polyglot.\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n

Transcript

  • 1. Djangodeployment revisited Nate Aune, @natea Appsembler & Jazkarta November 15, 2012 Django Boston Users Group
  • 2. A brief history of /me• Jazkarta (2004-Current) AWS) first taste of cloud platforms (GAE,• DjangoZoom -(2010-2011) it be!?” built my own PaaS “how hard can• Appsembler (2012-Current) SaaS apps leveraging PaaS, make it easy to launch
  • 3. What’s on the menu• Where are you deploying Django apps today?• What is a PaaS?• Why you might want to use a PaaS?• What are the different PaaS players?• How do they compare?
  • 4. Where are youdeploying Django today?• Shared hosting (i.e. Webfaction)• Running your own servers (co-located)?• Using an IaaS provider (i.e. AWS or Rackspace)• Already using a platform-as-a-service (PaaS)
  • 5. What is a PaaS? Platform-as-a-service enables developers to createinnovative applications without operational overhead around configuration, deployment and management.
  • 6. Layers of infrastructureSource: EngineYard “PaaS - State of the Market Survey” May 2012 - http://venturebeat.com/2012/07/05/engine-yard-paas-infographic/
  • 7. Source: EngineYard “PaaS - State of the Market Survey” May 2012 - http://venturebeat.com/2012/07/05/engine-yard-paas-infographic/
  • 8. Source: EngineYard “PaaS - State of the Market Survey” May 2012 - http://venturebeat.com/2012/07/05/engine-yard-paas-infographic/
  • 9. Source: EngineYard “PaaS - State of the Market Survey” May 2012 - http://venturebeat.com/2012/07/05/engine-yard-paas-infographic/
  • 10. Source: AppFog “Evolution of the Cloud: Toward a NoOps World” Jan 2012http://gigaom.com/cloud/why-2013-is-the-year-of-noops-for-programmers-infographic/
  • 11. Efficient, Elastic, Secure• Lots of applications co-located on a few servers • Drastically reduces resources • Add/remove servers depending on load • All secured using SELinux or LXC
  • 12. Let them do the boring stuff• Let the PaaS provider do the boring stuff • Patches and updates • Migrating applications • Backups / snapshots • Configuring everything (web servers, load balancers, modules, databases)
  • 13. Who are the players?• CloudFoundry • Heroku (open source by VMWare) (now Salesforce) • OpenShift (Redhat’s open source PaaS)• AppFog • Dotcloud • App Engine (Google)• Stackato (ActiveState) • Gondor (Python only) • Elastic Beanstalk (Amazon) • Azure (Microsoft)
  • 14. Who are the players? We’ll look at these ones tonight.• CloudFoundry • Heroku • OpenShift (open source by VMWare) (now Salesforce) (Redhat’s open source PaaS)• AppFog • Dotcloud • App Engine (Google)• Stackato • Gondor (ActiveState) • Elastic Beanstalk (Python only) (Amazon) • Azure (Microsoft)
  • 15. Stackato by ActiveState Python 3, Run anywhere, New Relic integrationhttp://appsembler.com/blog/django-deployment-using-stackato/
  • 16. Stackato
  • 17. Secure using Linux Containers (LXC)
  • 18. New Relic integration
  • 19. Consistent deployment at all stages of the lifecycle
  • 20. Stackato for Django1. Download the Stackato client http://www.activestate.com/stackato/download_client2. Create a wsgi.py file3. Create a requirements.txt file (if you don’t already have one)4. Edit the DATABASES and MEDIA_ROOT settings in settings.py file5. Create a stackato.yml file to persist the configuration (optional)
  • 21. wsgi.py file
  • 22. requirements.txtDjango==1.4.2psycopg2==2.4.5-e git+git@github.com:yourname/django-awesome.git#egg=django-awesome Or you can just reference another requirements file in your repo-r requirements/project.txt
  • 23. Database overrides
  • 24. MEDIA_ROOT
  • 25. Target and login$ stackato target api.appsembler.net$ stackato login --email user@domain.comAttempting to login to [https://api.appsembler.net]Password: ********Successfully logged into [https://api.appsembler.net]
  • 26. Initial push$ stackato pushWould you like to deploy from the current directory ? [Yn]:Would you like to use paasbakeoff as application name ? [Yn]:Detected a Python Application, is this correct ? [Yn]:Framework: pythonRuntime: <framework-specific default>Application Deployed URL [paasbakeoff.appsembler.net]:Application Url: paasbakeoff.appsembler.netEnter Memory Reservation [128M]:Creating Application [paasbakeoff]: OKCreate services to bind to paasbakeoff ? [yN]: y
  • 27. Bind servicesWhat kind of service ?1. filesystem2. memcached3. mongodb4. mysql5. postgresql6. rabbitmq7. redisChoose: 5Specify the name of the service [postgresql-cf691]:Creating Service: OKBinding Service: OKCreate another ? [yN]:Would you like to save this configuration? [yN]: yUploading Application [paasbakeoff]: Checking for bad links: 29 OK Copying to temp space: 28 OK Checking for available resources: 44022 OK Packing application: OK Uploading (20K): 100% OKPush Status: OKStaging Application [paasbakeoff]:
  • 28. Auto-generated stackato.yml filename: paasbakeoffinstances: 1framework: type: pythonmem: 128services: postgresql-cf691: postgresql Let’s add some other requirements to be installedrequirements: requirements: pypm: pypm: - pillow -OR- - pillow - psycopg2 pip: - psycopg2
  • 29. Running syncdb manually$ stackato update -n$ stackato start$ stackato logs$ stackato run python mywebsite/manage.py syncdb --noinputCreating tables ......Creating table django_commentsCreating table django_comment_flagsCreating default account (username: admin / password: default) ...Creating default Site 127.0.0.1:8000 ...Creating initial content (About page, Blog, Contact form, Gallery) ...Installed 18 object(s) from 3 fixture(s)Installing custom SQL ...Installing indexes ...Installed 0 object(s) from 0 fixture(s)
  • 30. Handling static assets$ stackato run python mywebsite/manage.py collectstatic --noinput...Copying /app/python/lib/python2.7/site-packages/django/contrib/admin/static/admin/css/rtl.cssCopying /app/python/lib/python2.7/site-packages/django/contrib/admin/static/admin/css/ie.cssCopying /app/python/lib/python2.7/site-packages/django/contrib/admin/static/admin/css/forms.css554 static files copied. Make sure they were copied to the right placeframework: type: python home-dir: appprocesses: web: $STACKATO_UWSGI --static-map /static=$HOME/mywebsite/static
  • 31. Run management commands automaticallyhooks: post-staging: - python mywebsite/manage.py syncdb --noinput - python mywebsite/manage.py collectstatic --noinput - python mywebsite/manage.py migrate --noinput Make sure you add South to the requirementsrequirements: pypm: - pillow - psycopg2 - south
  • 32. Persisted filesystem for file uploadsservices: postgresql-cf691: postgresql filesystem-paasbakeoff: filesystemRemember to set the MEDIA_ROOT in settings.py:MEDIA_ROOT = os.environ[STACKATO_FILESYSTEM]
  • 33. stackato.yml file
  • 34. Directory layout
  • 35. OpenShift by Redhat Open source, Auto-scaling, Jenkins buildshttp://appsembler.com/blog/django-deployment-using-openshift/
  • 36. Install the rhc client $ sudo gem install rhc $ rhc setup ... $ rhc domain status 7 tests, 12 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications 100% passedYou may need to add the SSH key and start the SSH agent $ ssh-add ~/.ssh/id_rsa $ ssh-agent
  • 37. Quick ‘n dirty instructions$ rhc app create -a mezzanineopenshift -t python 2.6$ rhc cartridge add -c mysql-5.1 -a mezzanineopenshift$ cd mezzanineopenshift$ git remote add paasbakeoff git://github.com/appsembler/paasbakeoff.git$ git fetch paasbakeoff$ git merge paasbakeoff/openshift$ git push
  • 38. Action hooks for running commands during build, deploy, post-deploy, etc./data/ dir to store uploaded media files Anatomy of an OpenShift repo .htaccess to serve up static files application inside of wsgi dir setup.py instead of requirements.txt
  • 39. /wsgi/application
  • 40. setup.py
  • 41. STATIC_ROOT and MEDIA_ROOT
  • 42. /wsgi/static/.htaccess
  • 43. .openshift/action_hooks/deploy
  • 44. .openshift/action_hooks/build
  • 45. Create and bind the database $ rhc cartridge add -c mysql-5.1 -a mezz Password: ****** Adding mysql-5.1 to application mezz Success mysql-5.1 ========= Properties ========== Connection URL = mysql://127.12.26.129:3306/ Database Name = mezz Password = ********** Username = admin Similar for PostgreSQL $ rhc cartridge add -c postgresql-8.4 -a mezz
  • 46. Git push to deploy$ git pushCounting objects: 5, done.Delta compression using up to 2 threads.Compressing objects: 100% (3/3), done.Writing objects: 100% (3/3), 498 bytes, done.Total 3 (delta 1), reused 0 (delta 0)remote: restart_on_add=falseremote: Waiting for stop to finishremote: Doneremote: restart_on_add=falseremote: ~/git/mezz.git ~/git/mezz.gitremote: ~/git/mezz.gitremote: Running .openshift/action_hooks/pre_buildremote: setup.py found. Setting up virtualenvremote: New python executable in /var/lib/openshift/x/python-2.6/virtenv/bin/pythonremote: Installing setuptools............done.remote: Installing pip...............done....remote: Running .openshift/action_hooks/deployremote: hot_deploy_added=falseremote: MySQL already runningremote: Doneremote: Running .openshift/action_hooks/post_deployTo ssh://0e94a6186e07430f8d9b989fdf702362@mezz-natea.rhcloud.com/~/git/mezz.git/ 03605bf..e05607c master -> master
  • 47. More resources• Getting started with Django on OpenShift https://openshift.redhat.com/community/get-started/django• openshift-django-example https://bitbucket.org/mdoglio/openshift-django-sample• Rapid Python and Django app deployment https://openshift.redhat.com/community/blogs/rapid-python- and-django-app-deployment-to-the-cloud-with-a-paas
  • 48. Dotcloudpolyglot from the start, very flexible, most Python centric
  • 49. Install the Dotcloud client$ sudo pip install dotcloud$ dotcloud setupdotCloud username or email: natea@jazkarta.comPassword:==> dotCloud authentication is complete!You are recommended to run `dotcloud check` now.$ dotcloud check==> Checking the authentication status==> Client is authenticated as natea
  • 50. Create and push an app$ dotcloud create mezz==> Creating a sandbox application named "mezz"==> Application "mezz" created.Connect the current directory to "mezz"? [Y/n]:==> Connecting with the application "mezz"==> Connected with default push options: --rsync$ dotcloud push==> Pushing code with rsync from "./" to application mezzbuilding file list ... done14:17:51: [www.0] Migrating stateful data located in ~/data14:18:05: [www.0] Launching...14:18:07: [www.0] Re-routing traffic to the new build...14:18:08: [www.0] Successfully installed build revision rsync instance #014:18:08: [www.0] Installation successful for service (www) instance #014:18:08: --> Application (mezz) fully installed==> Application is live at http://mezz-natea.dotcloud.com$ dotcloud open==> Opening service "www" in a browser: http://mezz-natea.dotcloud.com
  • 51. Anatomy of a Django app on Dotcloudcustomized settings.py for Dotcloudcreatedb.py to create the databasedotcloud.yml to store config infomkadmin.py to make the admin usernginx.conf to config URL rewritingpostinstall to run syncdb, collectstaticwsgi.py to serve using uWSGI
  • 52. dotcloud.yml
  • 53. DATABASE in settings.py
  • 54. STATIC_ROOT andMEDIA_ROOT in settings.py
  • 55. nginx.conf
  • 56. postinstall
  • 57. createdb.py and mkadmin.py createdb.pyhttps://github.com/dotcloud/django-on-dotcloud/blob/master/createdb.py mkadmin.py
  • 58. More resources• Dotcloud Python docs http://docs.dotcloud.com/0.9/services/python/• Dotcloud Django docs http://docs.dotcloud.com/0.9/tutorials/python/django/• django-on-dotcloud https://github.com/dotcloud/django-on-dotcloud/• python-on-dotcloud https://github.com/kencochrane/python-on-dotcloud
  • 59. Heroku
  • 60. Install the Heroku toolbeltDownload the Heroku Toolbelthttp://toolbelt.herokuapp.com/osx/download$ heroku loginEnter your Heroku credentials.Email: someone@example.comPassword: ******Could not find an existing public key.Would you like to generate one? [Yn]Generating new SSH public key.Uploading ssh public key /Users/someone/.ssh/id_rsa.pub
  • 61. Create app and DB$ heroku create paasbakeoffCreating paasbakeoff... done, stack is cedarhttp://paasbakeoff.herokuapp.com/ | git@heroku.com:paasbakeoff.gitGit remote heroku added$ heroku addons:add heroku-postgresql:devAdding heroku-postgresql:dev on paasbakeoff... done, v3 (free)Attached as HEROKU_POSTGRESQL_GREEN_URLDatabase has been created and is availableUse `heroku addons:docs heroku-postgresql:dev` to view documentation.$ heroku pg:info=== HEROKU_POSTGRESQL_GREEN_URLPlan: DevStatus: availableConnections: 0PG Version: 9.1.6Created: 2012-11-15 20:59 UTCData Size: 5.9 MBTables: 0Rows: 0/10000 (In compliance)Fork/Follow: Unavailable
  • 62. Set DB env variables$ heroku config=== paasbakeoff Config VarsHEROKU_POSTGRESQL_GREEN_URL: postgres://x:y@z.com:5432/d2b3c9ichbauv0$ heroku pg:promote HEROKU_POSTGRESQL_GREENPromoting HEROKU_POSTGRESQL_GREEN_URL to DATABASE_URL... done$ heroku config=== paasbakeoff Config VarsDATABASE_URL: postgres://x:y@z.com:5432/d2b3c9ichbauv0HEROKU_POSTGRESQL_GREEN_URL: postgres://x:y@z.com:5432/d2b3c9ichbauv0
  • 63. Add to settings.pySet the RACK_ENV environment variable to production $ heroku config:set RACK_ENV=production
  • 64. Use S3 for servingstatic and media files And Sendgrid for sending emails
  • 65. Procfile
  • 66. $ git push heroku masterCounting objects: 8, done.Delta compression using up to 2 threads. Deploy with git pushCompressing objects: 100% (6/6), done.Writing objects: 100% (6/6), 616 bytes, done.Total 6 (delta 3), reused 0 (delta 0)-----> Heroku receiving push-----> Python/Django app detected-----> Preparing Python interpreter (2.7.2)-----> Creating Virtualenv version 1.7.2 New python executable in .heroku/venv/bin/python2.7 ... Running virtualenv with interpreter /usr/local/bin/python2.7-----> Activating virtualenv-----> Installing dependencies using pip version 1.1 Downloading/unpacking Django==1.4.2 (from -r requirements.txt (line 1)) ... Cleaning up...-----> Collecting static files 0 static files copied.-----> Discovering process types Procfile declares types -> (none) Default types for Python/Django -> web-----> Compiled slug size: 9.4MB-----> Launching... done, v7 http://djangosample.herokuapp.com deployed to HerokuTo git@heroku.com:djangosample.git af73905..3046deb master -> master
  • 67. More Heroku resources• Getting Started with Django on Heroku https://devcenter.heroku.com/articles/django• Heroku Hackers Guide ($10 eBook) http://theherokuhackersguide.com• Developers Guide to Running Django Applications on Heroku http://kencochrane.net/blog/2011/11/developers-guide-for-running-django-apps-on-heroku/
  • 68. Stackato OpenShift Dotcloud HerokuPython 2.7, 3.2 2.6 (2.7) 2.6.5, 2.7.2, 2.7.2 stackato runtimes 3.1.2, 3.2.2PostgreSQL 9.1 8.4 9.0 9.1.6MySQL 5.5 5.1 5.1 (Yes, via RDS)Persisted FS Yes Yes Yes (Yes, via S3)Redis Yes, 2.4 No Yes, 2.4.11 (Yes, via addon)MongoDB Yes, 2.0 Yes, 2.2 Yes, 2.2.1 (Yes, via addon)Memcached Yes, 1.4 No Yes (Yes, via addon)RabbitMQ Yes, 2.4 No Yes, 2.8.5 (Yes, via addon)Solr No No Yes, 3.4.0 (Yes, via Websolr)Cron Yes Yes Yes YesExtensible Yes, apt-get install Yes, DIY cartridge Yes, custom service Yes, buildpacksWebSockets Yes Yes Yes Yes, via Pusher add-on
  • 69. Other resources• Wrap-up from PaaS bake-off http://appsembler.com/blog/wrap-up-from-paas-bake-off/• Django deployment using PaaS http://appsembler.com/blog/django-deployment-using-paas/• django-deployer https://github.com/natea/django-deployer• paasbakeoff - code examples https://github.com/appsembler/paasbakeoff/