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
  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
  3. 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
  4. 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
  5. Hourschool.com • Doesn’t worry about • Scaling their architecture •

    When to deploy • Managing their production system • Sleeping soundly at night Thursday, March 22, 12
  6. Hourschool.com • Heroku to manages their systems • The Twelve-Factor

    App manages their development methodology Thursday, March 22, 12
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. Staging • A “production like” environment • Try stuff out

    here before production • Set up: $ heroku create --stack cedar --remote staging Thursday, March 22, 12
  13. 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
  14. Multiple Staging [remote "production"] # ... [remote "staging"] # ...

    [remote "staging-bill"] # ... [remote "staging-ted"] # ... .git/config Thursday, March 22, 12
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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
  20. Config • What varies between deploys • resource strings to

    databases • credentials to S3, twitter, facebook, etc. • canonical values, hostname • security tokens Thursday, March 22, 12
  21. Config - Production • Heroku ‘config’ • Read from environment

    $ heroku config:add S3_KEY=AFOONVBAR > puts ENV[“S3_KEY”] > “AFOONVBAR” Thursday, March 22, 12
  22. 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
  23. 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
  24. 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
  25. Logging Addons • Record Logs & Errors • New Relic

    (rpm) • Scout • Loggly • Papertrails • Airbrake (hoptoad) Thursday, March 22, 12
  26. Logging Addons • Help when the problem is intermittent •

    Too much traffic for tail to be effective • Provide additional insights Thursday, March 22, 12
  27. 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
  28. Web Instances • Handle web requests • More instances =

    more throughput • Worker instances can help offload tasks Thursday, March 22, 12
  29. 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
  30. 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
  31. 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
  32. 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
  33. 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
  34. 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
  35. 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