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

Rails Pacific - Multitenancy with Rails

Ryan Bigg
October 25, 2014

Rails Pacific - Multitenancy with Rails

Covers the lessons learned about Multitenancy with Rails in the process of writing my book.

Ryan Bigg

October 25, 2014
Tweet

More Decks by Ryan Bigg

Other Decks in Programming

Transcript

  1. lifx.co

    View Slide

  2. #21
    Not #21

    View Slide

  3. Multitenancy
    with Rails
    Ryan Bigg

    View Slide

  4. View Slide

  5. View Slide

  6. Multitenancy?

    View Slide

  7. View Slide

  8. View Slide

  9. View Slide

  10. Organization
    Team
    Repos

    View Slide

  11. User
    Repos

    View Slide

  12. View Slide


  13. View Slide

  14. DOGLIFEBETA!
    Garçon Fluffy Brutus
    “Like Facebook, but for dogs”

    View Slide

  15. Multitenancy
    with Rails?

    View Slide

  16. View Slide

  17. Is it…
    ✔ well maintained
    ✔ well documented
    ✔ clean code

    View Slide

  18. acts_as_tenant
    ✔ well documented

    View Slide

  19. acts_as_tenant
    ✔ well maintained
    ✔ 140 commits, 19 contributors, low issue count
    ✔ CI on Travis

    View Slide

  20. acts_as_tenant
    ✔ clean code

    View Slide

  21. acts_as_tenant

    View Slide

  22. RequestStore.store

    View Slide

  23. View Slide

  24. Thread.current
    Thread.current

    View Slide

  25. apartment
    ✔ well documented
    ✔ well maintained
    ✔ clean code

    View Slide

  26. “If you are using PostgreSQL, Apartment
    by default will set up a new schema and
    migrate into there.”

    View Slide

  27. “If you are using
    PostgreSQL, Apartment
    by default will set up a new
    schema and
    migrate into there.”

    View Slide

  28. View Slide

  29. “A database contains one or more
    named schemas, which in turn
    contain tables.”
    “There are several reasons why one
    might want to use schemas:
    * To allow many users to use one
    database without interfering with
    each other.”

    View Slide

  30. “To allow many users
    to use one database
    without interfering
    with each other.”

    View Slide

  31. ryanbigg=# SHOW search_path;
    search_path
    ----------------
    "$user",public
    (1 row)
    "$user",public

    View Slide

  32. fluffy.doglife.com
    garcon.doglife.com
    DOGLIFE BETA!
    brutus.doglife.com
    1
    2
    3

    View Slide

  33. (1.4ms) CREATE SCHEMA "garcon"

    View Slide

  34. View Slide

  35. View Slide

  36. View Slide

  37. DEPLOY IT!

    View Slide

  38. Heroku Postgres

    View Slide

  39. Backup time
    24 hours

    View Slide

  40. PostgreSQL
    is great

    View Slide

  41. PostgreSQL with too many schemas

    View Slide

  42. Part 2:
    Schema-less
    Multitenancy

    View Slide

  43. Apartment

    View Slide

  44. View Slide

  45. TEST ALL THE TIME

    View Slide

  46. TEST ALL THE TIME?

    View Slide

  47. TEST ALL
    THE TIME

    View Slide

  48. Are you testing right now?
    No?

    View Slide

  49. TEST ALL
    THE TIME
    OR ELSE

    View Slide

  50. A codebase without tests

    View Slide


  51. fluffy.doglife.com
    Fluffy’s Posts
    current_account = Fluffy
    @posts = current_account.posts
    fluffy.doglife.com/posts
    Feature #1: Viewing Posts

    View Slide

  52. A guest
    on Account A’s subdomain
    should only see Account A’s posts
    Expected to not see “”
    Feature #1: Viewing Posts

    View Slide

  53. Feature #1: Viewing Posts

    View Slide

  54. Feature #1: Viewing Posts

    View Slide

  55. Feature #1: Viewing Posts

    View Slide

  56. A guest
    on Account A’s subdomain
    should only see Account A’s posts

    Feature #1: Viewing Posts

    View Slide


  57. fluffy.doglife.com
    Fluffy’s Posts
    current_account = Fluffy
    @posts = current_account.posts
    fluffy.doglife.com/posts
    Feature #1: Viewing Posts

    View Slide


  58. fluffy.doglife.com
    Fluffy’s Albums
    current_account = Fluffy
    @albums = current_account.albums
    fluffy.doglife.com/albums
    Fluffy’s First Birthday Pictures
    @pictures = @album.pictures
    fluffy.doglife.com/albums/1/pictures
    Feature #2: Viewing Pictures

    View Slide

  59. A guest
    on Account A’s subdomain
    should only see Account A’s albums
    Expected to not see “”
    Feature #2: Viewing Pictures

    View Slide

  60. Feature #2: Viewing Pictures

    View Slide

  61. Feature #2: Viewing Pictures

    View Slide

  62. A guest
    on Account A’s subdomain
    should only see Account A’s albums

    Feature #2: Viewing Pictures

    View Slide

  63. A guest
    on Account A’s subdomain
    viewing an album
    shows pictures from that album
    Expected to not see “”
    Feature #2: Viewing Pictures

    View Slide

  64. Feature #2: Viewing Pictures

    View Slide

  65. Feature #2: Viewing Pictures

    View Slide

  66. A guest
    on Account A’s subdomain
    viewing an album
    shows pictures from that album

    Feature #2: Viewing Pictures

    View Slide


  67. fluffy.doglife.com
    Fluffy’s Albums
    current_account = Fluffy
    @albums = current_account.albums
    fluffy.doglife.com/albums
    Fluffy’s First Birthday Pictures
    @pictures = @album.pictures
    fluffy.doglife.com/albums/1/pictures
    Feature #2: Viewing Pictures

    View Slide

  68. Feature #2: Viewing Pictures

    View Slide

  69. REGRESSION
    TEST ALL THE
    TIME

    View Slide

  70. Feature #2: Viewing Pictures

    View Slide

  71. View Slide

  72. Part 3:
    Subscriptions

    View Slide

  73. View Slide


  74. doglife.com/sign_up
    plan = Basic ($9.99)
    Feature #3: User subscribes to a plan
    ???

    View Slide

  75. “Writing code to manage
    subscriptions is easy.”
    - nobody, ever

    View Slide

  76. Your subscriptions code

    View Slide

  77. PayPal

    View Slide

  78. View Slide

  79. PayPal

    View Slide

  80. View Slide

  81. “Stripe makes
    recurring and
    subscription-based
    billing easy.”

    View Slide

  82. View Slide

  83. View Slide

  84. View Slide


  85. :CreateRecurringPaymentsProfileRequestDetails
    PayPal

    View Slide

  86. View Slide

  87. “My company
    makes your life
    easy.”

    View Slide


  88. doglife.com/sign_up
    plan = Basic ($9.99)
    Feature #3: User subscribes to a plan



    View Slide

  89. View Slide

  90. View Slide

  91. leanpub.com/multi-tenancy-rails/c/railspacific
    $10 off

    View Slide