Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Deploying Happiness & Fighting Homelessness (Hourschool & the 12factor App)

Deploying Happiness & Fighting Homelessness (Hourschool & the 12factor App)

Hourschool is a peer to peer learning network built to help you learn from those around you. Anyone can post a class online and anyone else can sign up for your class. Hourschool helps fight homelessness by...

Richard Schneeman

January 26, 2012
Tweet

More Decks by Richard Schneeman

Other Decks in Technology

Transcript

  1. Mar 21th
    2012
    Deploying
    Happiness
    Richard Schneeman
    @schneems
    Fighting
    Homelessness
    &
    Hourschool & the 12factor App
    Thursday, March 22, 12

    View full-size slide

  2. whoami
    • @Schneems
    • BSME with Honors from Georgia Tech
    • 5 + years experience Ruby & Rails
    • Work for @Heroku
    • Rails 3.1 & 3.2 contributor
    • 3 + years technical teaching
    • UT Austin
    Thursday, March 22, 12

    View full-size slide

  3. Thursday, March 22, 12

    View full-size slide

  4. Meet
    Hourschool
    Thursday, March 22, 12

    View full-size slide

  5. Hourschool.com
    • Empower communities through teaching
    • Peer to Peer learning
    Thursday, March 22, 12

    View full-size slide

  6. Hourschool.com
    • Community
    • Enterprise
    • Homeless Outreach
    • Nonprofit
    Thursday, March 22, 12

    View full-size slide

  7. Homeless?
    Thursday, March 22, 12

    View full-size slide

  8. Hourschool.com
    • Homelessness affects
    • All races, ages, and
    genders
    • Treating the symptoms
    won’t solve the problem
    • More shelters
    • More soup kitchens
    • Help them to help each
    other
    Thursday, March 22, 12

    View full-size slide

  9. Real Skills
    Thursday, March 22, 12

    View full-size slide

  10. Hourschool.com
    • Does Worry About
    • Filling classes with students
    • Bringing in new teachers
    • Spreading the word
    • Making an impact in the community
    Thursday, March 22, 12

    View full-size slide

  11. Hourschool.com
    • Doesn’t worry about
    • Scaling their architecture
    • When to deploy
    • Managing their production system
    • Sleeping soundly at night
    Thursday, March 22, 12

    View full-size slide

  12. But how?
    (you might ask)
    Thursday, March 22, 12

    View full-size slide

  13. Hourschool.com
    • Heroku to manages their systems
    • The Twelve-Factor App manages their
    development methodology
    Thursday, March 22, 12

    View full-size slide

  14. Twelve Factor
    • Can apply to any language
    • Speeds up deployment, makes scaling
    easier & keeps apps clean
    • Developed over direct exposure to the
    deployment of hundreds of thousands of
    apps
    Thursday, March 22, 12

    View full-size slide

  15. Twelve-Factor
    for Hourschool
    Thursday, March 22, 12

    View full-size slide

  16. Code + Methodology
    • Speed and confidence through:
    • Development environment
    • Staging environments
    • Consistent codebase practices
    • Quick access to logs and metrics
    • Easy scaling architecture
    Lets take a look
    Thursday, March 22, 12

    View full-size slide

  17. development
    vs.
    production
    Thursday, March 22, 12

    View full-size slide

  18. Development
    • As close to production as possible
    • Same data-stores (postgres, memcache)
    • Same language versions (Ruby 1.9)
    • Real/consistent data
    $ heroku db:pull
    Thursday, March 22, 12

    View full-size slide

  19. Bundler
    • Bundle versions specified
    • ~>
    • Use semantic versioning
    • Prevent unexpected library changes
    gem 'twitter', '~> 2.0.2'
    gem "koala", '~> 1.2.1'
    gem 'tumblr-api', '~> 0.1.4'
    # ...
    Gemfile
    Thursday, March 22, 12

    View full-size slide

  20. README.md
    • Living document
    • Standardize dev environment
    • Instructions for external dependencies
    • Instructions for starting processes
    • Problem with dev environment?
    • Put the fix in the readme
    $ brew install memcache
    $ foreman start
    Thursday, March 22, 12

    View full-size slide

  21. but... it
    worked in
    development
    Thursday, March 22, 12

    View full-size slide

  22. Staging
    • A “production like” environment
    • Try stuff out here before production
    • Set up:
    $ heroku create --stack cedar
    --remote staging
    Thursday, March 22, 12

    View full-size slide

  23. Staging
    [remote "production"]
    url = [email protected]:hourschool.git
    fetch = +refs/heads/*:refs/remotes/heroku/*
    [remote "staging"]
    url = [email protected]:hourschool-drama.git
    fetch = +refs/heads/*:refs/remotes/heroku/*
    .git/config
    $ git push --remote staging
    mybranch:master
    Thursday, March 22, 12

    View full-size slide

  24. Multiple Staging
    [remote "production"]
    # ...
    [remote "staging"]
    # ...
    [remote "staging-bill"]
    # ...
    [remote "staging-ted"]
    # ...
    .git/config
    Thursday, March 22, 12

    View full-size slide

  25. Stage with Data
    • Install gem
    • Set up git remotes
    • Add pgbackups
    • Seed staging data
    $ gem install pgbackup-tasks
    $ heroku addons:add pgbackups
    $ bundle exec rake pgbackup:seed
    Thursday, March 22, 12

    View full-size slide

  26. Deploy to Stage
    • Deploy to staging
    • Verify your changes worked
    • Merge into master
    • Deploy to production
    $ git push --remote staging
    mybranch:master
    $ git push --remote production
    Thursday, March 22, 12

    View full-size slide

  27. 1 app
    1 codebase
    Thursday, March 22, 12

    View full-size slide

  28. Git
    • All code for the app goes in one repository
    • Split out easily reusable code into separate
    libraries
    • i.e. github.com/schneems/wicked
    Thursday, March 22, 12

    View full-size slide

  29. Git Flow
    • New feature?
    • Put it in a branch
    • Refactoring code?
    • Put it in a branch
    • Need a New Demo?
    • Put it in a branch
    Thursday, March 22, 12

    View full-size slide

  30. Branches
    • Keep the codebase clean
    • Testing feature branches in staging is
    painless and easy with Heroku
    $ git co schneems/solr_search
    $ git push --remote staging
    mybranch:master
    Thursday, March 22, 12

    View full-size slide

  31. Config
    Thursday, March 22, 12

    View full-size slide

  32. Config
    • What varies between deploys
    • resource strings to databases
    • credentials to S3, twitter, facebook, etc.
    • canonical values, hostname
    • security tokens
    Thursday, March 22, 12

    View full-size slide

  33. Config Does NOT
    go in
    source control
    Thursday, March 22, 12

    View full-size slide

  34. secrets in
    source control
    aren’t secret
    Thursday, March 22, 12

    View full-size slide

  35. Config - Production
    • Heroku ‘config’
    • Read from environment
    $ heroku config:add S3_KEY=AFOONVBAR
    > puts ENV[“S3_KEY”]
    > “AFOONVBAR”
    Thursday, March 22, 12

    View full-size slide

  36. Config - Development
    • Foreman
    • Procfile
    $ foreman start
    $ cat Procfile
    web: bundle exec unicorn -p
    $PORT -c ./config/unicorn.rb
    worker: bundle exec rake jobs:work
    Thursday, March 22, 12

    View full-size slide

  37. Config - Development
    • Local .env file
    • Foreman uses .env
    $ cat .env
    S3_KEY=AFOONVBAR
    FACEBOOK_APP_ID=281502345249818
    FACEBOOK_SECRET=d59c2a439f4be49cf1
    $ foreman run rails console
    ruby-1.9.3 > puts ENV[“S3_KEY”]
    ruby-1.9.3 > “AFOONVBAR”
    Thursday, March 22, 12

    View full-size slide

  38. Open
    source-
    able?
    Thursday, March 22, 12

    View full-size slide

  39. logging
    Thursday, March 22, 12

    View full-size slide

  40. Logging
    • Production errors still happen
    • Tail logs to find the cause
    • Use a logging service to dig in deeper
    $ heroku logs --remote production
    --tail
    Thursday, March 22, 12

    View full-size slide

  41. Logging Addons
    • Record Logs & Errors
    • New Relic (rpm)
    • Scout
    • Loggly
    • Papertrails
    • Airbrake (hoptoad)
    Thursday, March 22, 12

    View full-size slide

  42. Logging Addons
    • Help when the problem is intermittent
    • Too much traffic for tail to be effective
    • Provide additional insights
    Thursday, March 22, 12

    View full-size slide

  43. Error Pages
    • Admins get error
    + Backtrace
    Couldn't find Course with ID=chunkybacon
    Details
    Params: {"action"=>"show", "controller"=>"courses", "id"=>"chunkybacon"}
    Backtrace:
    lib/active_record/relation/finder_methods.rb:304:in `find_one'
    Thursday, March 22, 12

    View full-size slide

  44. scale out
    Thursday, March 22, 12

    View full-size slide

  45. Web Instances
    • Handle web requests
    • More instances = more throughput
    • Worker instances can help offload tasks
    Thursday, March 22, 12

    View full-size slide

  46. Workers
    • Push long tasks that don’t fit in request
    cycle to a worker
    • Workers have the same code, but don’t
    serve web content
    • Perfect for
    • Delayed emails
    • Image Processing
    • etc.
    Thursday, March 22, 12

    View full-size slide

  47. Workers
    • Use with a queuing system
    • Resque (redis)
    • DelayedJob (sql)
    • Enqueue from the web server
    • User signs up, queue email
    • Dequeue & run on the worker
    • Process next item in queue
    Thursday, March 22, 12

    View full-size slide

  48. the web
    app
    demystified
    Thursday, March 22, 12

    View full-size slide

  49. Twelve
    Factor
    Thursday, March 22, 12

    View full-size slide

  50. Twelve Factor
    • Hourschool as a software service has a
    contract with Heroku
    • When the right development methods are
    used, their app can be cleanly deployed
    quickly
    Thursday, March 22, 12

    View full-size slide

  51. Do You Like?
    • Minimizing new developer overhead?
    • Running in multiple environments?
    • Easily scaling without tooling, architecture
    or development headaches?
    • Having the latest updates available to
    users at a moments notice?
    Read more at 12factor.net
    Thursday, March 22, 12

    View full-size slide

  52. Questions?
    @schneems
    Thursday, March 22, 12

    View full-size slide

  53. 12factor.net
    • Codebase
    • One codebase tracked in revision control, many deploys
    • Dependencies
    • Explicitly declare and isolate dependencies
    • Config
    • Store config in the environment
    • Backing Services
    • Treat backing services as attached resources
    Thursday, March 22, 12

    View full-size slide

  54. 12factor.net
    • Build, Release, Run
    • Strictly separate build and run stages
    • Process
    • Execute the app as one or more stateless processes
    • Port Binding
    • Export services via port binding
    • Concurrency
    • Scale out via the process model
    Thursday, March 22, 12

    View full-size slide

  55. 12factor.net
    • Disposability
    • Maximize robustness with fast startup and graceful shutdown
    • Dev/Prod Parity
    • Keep development, staging, and production as similar as possible
    • Logs
    • Treat logs as event streams
    • Admin Process
    • Run admin/management tasks as one-off processes
    Thursday, March 22, 12

    View full-size slide