[Script Info] Title: [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:17.16,0:00:19.80,Default,,0000,0000,0000,,BEN DIXON: OK. So, I'm Ben. Dialogue: 0,0:00:19.80,0:00:22.17,Default,,0000,0000,0000,,I'm a Rails developer and the author Dialogue: 0,0:00:22.17,0:00:26.15,Default,,0000,0000,0000,,of a book called Reliably Deploying Rails\NApplications. Dialogue: 0,0:00:26.18,0:00:28.09,Default,,0000,0000,0000,,I spend a lot of people - a lot of people? Dialogue: 0,0:00:28.10,0:00:30.81,Default,,0000,0000,0000,,A lot of time teaching people Ruby at Dialogue: 0,0:00:30.81,0:00:32.26,Default,,0000,0000,0000,,MakeItWithCode dot com, Dialogue: 0,0:00:32.26,0:00:35.12,Default,,0000,0000,0000,,which is an online mentor-driven class Dialogue: 0,0:00:35.12,0:00:36.78,Default,,0000,0000,0000,,for people who are new to Ruby Dialogue: 0,0:00:36.78,0:00:39.00,Default,,0000,0000,0000,,but want to get started making things quickly. Dialogue: 0,0:00:39.00,0:00:41.20,Default,,0000,0000,0000,,I spend the rest of my time working with Dialogue: 0,0:00:41.20,0:00:43.68,Default,,0000,0000,0000,,the awesome guys at HelloSwimio, where we\Nmake cool Dialogue: 0,0:00:43.68,0:00:46.11,Default,,0000,0000,0000,,tech for swimmers. So we make things like\Nthe Dialogue: 0,0:00:46.11,0:00:49.31,Default,,0000,0000,0000,,time tabling system for the Olympic pool in\NLondon, Dialogue: 0,0:00:49.31,0:00:52.01,Default,,0000,0000,0000,,the speedo swim tracking app, and the first\Nautomatic Dialogue: 0,0:00:52.02,0:00:54.36,Default,,0000,0000,0000,,lap tracker for the Pebble smart watch. Dialogue: 0,0:00:54.36,0:00:57.75,Default,,0000,0000,0000,,So, before we get started, could you put your Dialogue: 0,0:00:57.75,0:01:00.45,Default,,0000,0000,0000,,hands up if you've deployed a Rails app of Dialogue: 0,0:01:00.46,0:01:05.21,Default,,0000,0000,0000,,some sort to Heroku. Awesome. Now keep your\Nhand Dialogue: 0,0:01:05.21,0:01:07.34,Default,,0000,0000,0000,,up if you've deployed a Rails app to a Dialogue: 0,0:01:07.34,0:01:11.61,Default,,0000,0000,0000,,server that you've set up yourself. Good.\NThat's less Dialogue: 0,0:01:11.64,0:01:12.57,Default,,0000,0000,0000,,people. Dialogue: 0,0:01:12.57,0:01:14.77,Default,,0000,0000,0000,,So if someone came to me and said, I Dialogue: 0,0:01:14.77,0:01:16.28,Default,,0000,0000,0000,,want to deploy my first Rails app, how should Dialogue: 0,0:01:16.28,0:01:18.57,Default,,0000,0000,0000,,I do it? I wouldn't think about it, I'd Dialogue: 0,0:01:18.58,0:01:22.15,Default,,0000,0000,0000,,just say use Heroku. And I'd say use Heroku, Dialogue: 0,0:01:22.15,0:01:25.53,Default,,0000,0000,0000,,because Heroku makes deploying apps incredibly\Nsimple. You just Dialogue: 0,0:01:25.53,0:01:29.75,Default,,0000,0000,0000,,commit your code, Heroku create, git push\NHeroku, and Dialogue: 0,0:01:29.78,0:01:32.66,Default,,0000,0000,0000,,magically, a couple of minutes later, your\Napplication is Dialogue: 0,0:01:32.66,0:01:36.01,Default,,0000,0000,0000,,live, on the internet, for the world to see. Dialogue: 0,0:01:36.01,0:01:38.63,Default,,0000,0000,0000,,And because Heroku has made this process so\Nsimple Dialogue: 0,0:01:38.63,0:01:40.86,Default,,0000,0000,0000,,and so easy, it's really easy to take that Dialogue: 0,0:01:40.86,0:01:42.22,Default,,0000,0000,0000,,server stuff and kind of put it in a Dialogue: 0,0:01:42.24,0:01:44.99,Default,,0000,0000,0000,,bucket of things we don't look at. Because\Nit's Dialogue: 0,0:01:44.99,0:01:48.50,Default,,0000,0000,0000,,complicated and Heroku makes it really easy,\Nso why Dialogue: 0,0:01:48.50,0:01:50.03,Default,,0000,0000,0000,,would we bother? Dialogue: 0,0:01:50.04,0:01:51.75,Default,,0000,0000,0000,,And what I'd like to demonstrate in this talk Dialogue: 0,0:01:51.75,0:01:53.85,Default,,0000,0000,0000,,is that, in the same way Rails makes building Dialogue: 0,0:01:53.85,0:01:57.07,Default,,0000,0000,0000,,web applications really, really easy, there\Nare lots of Dialogue: 0,0:01:57.08,0:01:59.08,Default,,0000,0000,0000,,great tools out there that make setting up\Nservers Dialogue: 0,0:01:59.08,0:02:02.05,Default,,0000,0000,0000,,for them and deploying to those servers really\Neasy. Dialogue: 0,0:02:02.06,0:02:03.60,Default,,0000,0000,0000,,And once you get the hang of these tools, Dialogue: 0,0:02:03.60,0:02:06.17,Default,,0000,0000,0000,,you can do some really cool stuff. Dialogue: 0,0:02:06.17,0:02:09.76,Default,,0000,0000,0000,,Before we get started, two important bits\Nof terminology, Dialogue: 0,0:02:09.76,0:02:12.93,Default,,0000,0000,0000,,which probably you already know. A PaaS, a\Nplatform Dialogue: 0,0:02:12.94,0:02:15.26,Default,,0000,0000,0000,,as a service, and by that I mean something Dialogue: 0,0:02:15.26,0:02:18.03,Default,,0000,0000,0000,,like Heroku. So something that just abstracts\Nall of Dialogue: 0,0:02:18.03,0:02:19.42,Default,,0000,0000,0000,,your infrastructure away so that you don't\Nhave to Dialogue: 0,0:02:19.42,0:02:20.61,Default,,0000,0000,0000,,worry about it. Dialogue: 0,0:02:20.61,0:02:23.06,Default,,0000,0000,0000,,On the other scale, you've got a VPS, a Dialogue: 0,0:02:23.06,0:02:26.12,Default,,0000,0000,0000,,Virtual Private Server, and for the purposes\Nof this Dialogue: 0,0:02:26.14,0:02:28.48,Default,,0000,0000,0000,,talk, I just mean some sort of Linux server Dialogue: 0,0:02:28.48,0:02:30.56,Default,,0000,0000,0000,,running the cloud. So the type of thing you Dialogue: 0,0:02:30.56,0:02:33.63,Default,,0000,0000,0000,,get from Linode or RackSpace or DigitalOcean. Dialogue: 0,0:02:33.63,0:02:36.37,Default,,0000,0000,0000,,So, to get started, I want to take a Dialogue: 0,0:02:36.38,0:02:38.73,Default,,0000,0000,0000,,little look at what's going on behind the\Nscenes Dialogue: 0,0:02:38.73,0:02:41.79,Default,,0000,0000,0000,,when you deploy a typical Rails application.\NHow do Dialogue: 0,0:02:41.79,0:02:44.57,Default,,0000,0000,0000,,we go from Rails S on our development machine Dialogue: 0,0:02:44.57,0:02:47.28,Default,,0000,0000,0000,,to a Rails app on a VPS somewhere serving Dialogue: 0,0:02:47.28,0:02:49.16,Default,,0000,0000,0000,,our application to the world? Dialogue: 0,0:02:49.16,0:02:52.45,Default,,0000,0000,0000,,So, here we've got a beautiful picture that\NI've Dialogue: 0,0:02:52.46,0:02:55.66,Default,,0000,0000,0000,,drawn, because I'm new to Keynote. And the\Nblack Dialogue: 0,0:02:55.66,0:02:57.90,Default,,0000,0000,0000,,box around the outside is our VPS. It's a Dialogue: 0,0:02:57.92,0:03:01.01,Default,,0000,0000,0000,,single VPS. And this is the first thing that Dialogue: 0,0:03:01.01,0:03:03.92,Default,,0000,0000,0000,,seemed to surprise lots of people. For a simple Dialogue: 0,0:03:03.92,0:03:07.51,Default,,0000,0000,0000,,production configuration, you only need one\NVPS. In the Dialogue: 0,0:03:07.52,0:03:10.36,Default,,0000,0000,0000,,same way, in development, you can run your\Nentire Dialogue: 0,0:03:10.36,0:03:14.43,Default,,0000,0000,0000,,Rails application on your development machine.\NFor simple production Dialogue: 0,0:03:14.43,0:03:17.21,Default,,0000,0000,0000,,application, you can run everything on a single\NVPS. Dialogue: 0,0:03:17.22,0:03:20.67,Default,,0000,0000,0000,,And that VPS will have three main components\Non Dialogue: 0,0:03:20.67,0:03:23.34,Default,,0000,0000,0000,,it for almost all Rails applications. You're\Ngonna have Dialogue: 0,0:03:23.34,0:03:25.76,Default,,0000,0000,0000,,a web server, you're gonna have an app server, Dialogue: 0,0:03:25.76,0:03:29.65,Default,,0000,0000,0000,,and you're gonna have a database server. So,\Nwhen Dialogue: 0,0:03:29.66,0:03:31.83,Default,,0000,0000,0000,,someone types in the address of our website,\Na Dialogue: 0,0:03:31.83,0:03:35.20,Default,,0000,0000,0000,,request comes in. It hits our VPS, and the Dialogue: 0,0:03:35.20,0:03:36.93,Default,,0000,0000,0000,,first place that request is gonna go is our Dialogue: 0,0:03:36.94,0:03:40.32,Default,,0000,0000,0000,,web server. Now, if that request was for a Dialogue: 0,0:03:40.32,0:03:42.78,Default,,0000,0000,0000,,static file, and by a static file, I basically Dialogue: 0,0:03:42.78,0:03:45.51,Default,,0000,0000,0000,,mean, anything that goes in the Rails asset\Npipeline Dialogue: 0,0:03:45.51,0:03:47.52,Default,,0000,0000,0000,,or anything that you might find in the public Dialogue: 0,0:03:47.52,0:03:49.64,Default,,0000,0000,0000,,folder, the web server's gonna deal with that\Ndirectly. Dialogue: 0,0:03:49.64,0:03:51.88,Default,,0000,0000,0000,,It's gonna send that file straight back to\Nthe Dialogue: 0,0:03:51.88,0:03:54.22,Default,,0000,0000,0000,,user for display in their browser and that's\Nthe Dialogue: 0,0:03:54.22,0:03:55.39,Default,,0000,0000,0000,,end of it. Dialogue: 0,0:03:55.40,0:03:58.76,Default,,0000,0000,0000,,If, however, that request is for a dynamic\Npage, Dialogue: 0,0:03:58.76,0:04:02.97,Default,,0000,0000,0000,,so for a page in our Rails app, essentially, Dialogue: 0,0:04:02.97,0:04:05.83,Default,,0000,0000,0000,,that's gonna get passed back to an app server. Dialogue: 0,0:04:05.84,0:04:09.21,Default,,0000,0000,0000,,Now, when we run Rails S in development, what Dialogue: 0,0:04:09.21,0:04:12.84,Default,,0000,0000,0000,,we're starting is an instance of an app server. Dialogue: 0,0:04:12.84,0:04:15.49,Default,,0000,0000,0000,,So, the app server here is Rails S running Dialogue: 0,0:04:15.49,0:04:17.63,Default,,0000,0000,0000,,on our VPS. So the web server passes the Dialogue: 0,0:04:17.63,0:04:21.08,Default,,0000,0000,0000,,request back. The app server generates the\Nresponse and Dialogue: 0,0:04:21.08,0:04:24.04,Default,,0000,0000,0000,,then passes it back to the web server, which Dialogue: 0,0:04:24.04,0:04:26.22,Default,,0000,0000,0000,,then returns it to the user. Dialogue: 0,0:04:26.22,0:04:28.33,Default,,0000,0000,0000,,And in development, we're probably used to\Nthe web, Dialogue: 0,0:04:28.33,0:04:31.27,Default,,0000,0000,0000,,the app server being something like Thin or\NWebRick. Dialogue: 0,0:04:31.28,0:04:33.11,Default,,0000,0000,0000,,In production it might also be Thin or Webrick. Dialogue: 0,0:04:33.11,0:04:35.05,Default,,0000,0000,0000,,It might also be something a bit more advanced Dialogue: 0,0:04:35.06,0:04:37.47,Default,,0000,0000,0000,,like Puma or Unicorn. Dialogue: 0,0:04:37.47,0:04:40.88,Default,,0000,0000,0000,,Finally, for pretty much all Rails applications,\Nwe're gonna Dialogue: 0,0:04:40.88,0:04:43.37,Default,,0000,0000,0000,,want some sort of database server. And that's\Nprobably Dialogue: 0,0:04:43.38,0:04:47.23,Default,,0000,0000,0000,,gonna be PostGres or mySQL or Mongo. And,\Nagain, Dialogue: 0,0:04:47.23,0:04:49.96,Default,,0000,0000,0000,,we don't need a separate database server.\NThis all Dialogue: 0,0:04:49.98,0:04:52.37,Default,,0000,0000,0000,,runs on our single VPS. Dialogue: 0,0:04:52.38,0:04:55.44,Default,,0000,0000,0000,,So, to recap, a request comes in and it Dialogue: 0,0:04:55.44,0:04:58.35,Default,,0000,0000,0000,,hits our web server. Probably EngineX or Apache.\NIf Dialogue: 0,0:04:58.35,0:05:00.52,Default,,0000,0000,0000,,it's for a static file, the web server deals Dialogue: 0,0:05:00.52,0:05:02.68,Default,,0000,0000,0000,,with it. If it's for part of our Rails Dialogue: 0,0:05:02.68,0:05:05.11,Default,,0000,0000,0000,,application, it gets passed back to the app\Nserver, Dialogue: 0,0:05:05.11,0:05:07.64,Default,,0000,0000,0000,,which is basically Rails S, and the app server Dialogue: 0,0:05:07.64,0:05:10.42,Default,,0000,0000,0000,,may communicate with the database server,\Nread some data, Dialogue: 0,0:05:10.42,0:05:13.11,Default,,0000,0000,0000,,write some data, and then the app server constructs Dialogue: 0,0:05:13.11,0:05:14.81,Default,,0000,0000,0000,,the response, sends it back to the web server, Dialogue: 0,0:05:14.82,0:05:16.42,Default,,0000,0000,0000,,which serves it to the user. Dialogue: 0,0:05:16.42,0:05:19.60,Default,,0000,0000,0000,,So, you'd be forgiven for looking at that\Nand Dialogue: 0,0:05:19.60,0:05:22.89,Default,,0000,0000,0000,,thinking, well, that already looks more complicated\Nthan Heroku. Dialogue: 0,0:05:22.89,0:05:24.88,Default,,0000,0000,0000,,Why on earth would you ever do that? Why Dialogue: 0,0:05:24.88,0:05:26.36,Default,,0000,0000,0000,,not just use Heroku? Dialogue: 0,0:05:26.36,0:05:28.35,Default,,0000,0000,0000,,Well, I started doing this, if I'm honest,\Nbecause Dialogue: 0,0:05:28.36,0:05:30.61,Default,,0000,0000,0000,,of cost. I had quite a lot of side Dialogue: 0,0:05:30.62,0:05:35.77,Default,,0000,0000,0000,,projects, and as you probably already know,\Nmost past Dialogue: 0,0:05:35.78,0:05:38.05,Default,,0000,0000,0000,,solutions charge by the process. And a lot\Nof Dialogue: 0,0:05:38.05,0:05:41.89,Default,,0000,0000,0000,,my personal projects and side projects had\Nbackground jobs. Dialogue: 0,0:05:41.89,0:05:45.19,Default,,0000,0000,0000,,Now when you've got five or six side projects, Dialogue: 0,0:05:45.19,0:05:47.61,Default,,0000,0000,0000,,all of which would need two Heroku dynos,\Nsuddenly Dialogue: 0,0:05:47.62,0:05:48.93,Default,,0000,0000,0000,,that bill at the end of the month starts Dialogue: 0,0:05:48.93,0:05:52.48,Default,,0000,0000,0000,,to get quite substantial. Dialogue: 0,0:05:52.48,0:05:53.96,Default,,0000,0000,0000,,And so I wanted to save money by deploying Dialogue: 0,0:05:53.96,0:05:57.21,Default,,0000,0000,0000,,to my own servers. And I did. It's worth Dialogue: 0,0:05:57.24,0:05:59.51,Default,,0000,0000,0000,,bearing in mind, if that's also your motivation,\Nthat, Dialogue: 0,0:05:59.51,0:06:03.59,Default,,0000,0000,0000,,as with any new skill, you have to invert. Dialogue: 0,0:06:03.59,0:06:05.20,Default,,0000,0000,0000,,Invert? You have to put in a certain amount Dialogue: 0,0:06:05.22,0:06:07.85,Default,,0000,0000,0000,,of time to learn it. If you were to Dialogue: 0,0:06:07.85,0:06:09.51,Default,,0000,0000,0000,,account for the time I put into learning this Dialogue: 0,0:06:09.51,0:06:12.39,Default,,0000,0000,0000,,to begin with, at market rates, I'm fairly\Nsure Dialogue: 0,0:06:12.39,0:06:14.32,Default,,0000,0000,0000,,there would have been no saving at all. Personally, Dialogue: 0,0:06:14.34,0:06:16.74,Default,,0000,0000,0000,,they're my own projects. I wasn't paying myself\Nmarket Dialogue: 0,0:06:16.74,0:06:19.08,Default,,0000,0000,0000,,rates. And I was happy to treat it as Dialogue: 0,0:06:19.08,0:06:20.77,Default,,0000,0000,0000,,an investment which would pay off in the long Dialogue: 0,0:06:20.77,0:06:23.19,Default,,0000,0000,0000,,term, and it has. Dialogue: 0,0:06:23.20,0:06:26.80,Default,,0000,0000,0000,,Actually, it turned out, the biggest benefit\Nof learning Dialogue: 0,0:06:26.80,0:06:28.30,Default,,0000,0000,0000,,how to do this was nothing to do with Dialogue: 0,0:06:28.30,0:06:31.64,Default,,0000,0000,0000,,money. It was the infrastructure went from\Nbeing this Dialogue: 0,0:06:31.64,0:06:33.77,Default,,0000,0000,0000,,kind of necessary evil that I have to have Dialogue: 0,0:06:33.77,0:06:36.25,Default,,0000,0000,0000,,in order to run my Rails apps, to just Dialogue: 0,0:06:36.25,0:06:38.64,Default,,0000,0000,0000,,another tool that I could use for building\Ninteresting Dialogue: 0,0:06:38.66,0:06:42.02,Default,,0000,0000,0000,,stuff. And the best example of that, for me, Dialogue: 0,0:06:42.04,0:06:44.83,Default,,0000,0000,0000,,is Make It With Code. We provide our students Dialogue: 0,0:06:44.83,0:06:47.84,Default,,0000,0000,0000,,with a cloud IDE that has Ruby pre-installed.\NAnd Dialogue: 0,0:06:47.84,0:06:50.06,Default,,0000,0000,0000,,that means they can hit the ground running.\NThey Dialogue: 0,0:06:50.06,0:06:53.20,Default,,0000,0000,0000,,can start writing Ruby code really quickly. Dialogue: 0,0:06:53.20,0:06:54.70,Default,,0000,0000,0000,,And the techniques that we use setting those\Nup Dialogue: 0,0:06:54.70,0:06:57.48,Default,,0000,0000,0000,,automatically for all of our students are\Nexactly the Dialogue: 0,0:06:57.48,0:06:59.54,Default,,0000,0000,0000,,same techniques that I'm gonna cover in this\Npresentation Dialogue: 0,0:06:59.54,0:07:01.88,Default,,0000,0000,0000,,for setting up Rails apps. So it means that Dialogue: 0,0:07:01.88,0:07:04.48,Default,,0000,0000,0000,,our infrastructure has gone from being this\Nthing that Dialogue: 0,0:07:04.48,0:07:05.100,Default,,0000,0000,0000,,we have to have in the background, as like Dialogue: 0,0:07:06.00,0:07:09.20,Default,,0000,0000,0000,,a supporting thing, to something that actually\Nadds value Dialogue: 0,0:07:09.20,0:07:11.44,Default,,0000,0000,0000,,to our product in itself. It's a part of Dialogue: 0,0:07:11.44,0:07:13.17,Default,,0000,0000,0000,,our product. Dialogue: 0,0:07:13.18,0:07:14.83,Default,,0000,0000,0000,,So if you decide to give this a go, Dialogue: 0,0:07:14.83,0:07:16.92,Default,,0000,0000,0000,,I really, really urge you not to do it Dialogue: 0,0:07:16.92,0:07:19.58,Default,,0000,0000,0000,,even slightly like I did it originally. Because\Nit Dialogue: 0,0:07:19.58,0:07:21.45,Default,,0000,0000,0000,,was terrible. I started off by getting a VPS. Dialogue: 0,0:07:21.45,0:07:23.56,Default,,0000,0000,0000,,That bit was good. That bit worked. I Googled, Dialogue: 0,0:07:23.58,0:07:26.74,Default,,0000,0000,0000,,how do I set up a Rails VPS. I Dialogue: 0,0:07:26.74,0:07:28.81,Default,,0000,0000,0000,,found all these great tutorials that said,\Ntype in Dialogue: 0,0:07:28.81,0:07:31.19,Default,,0000,0000,0000,,this command, then that command, then edit\Nthis config Dialogue: 0,0:07:31.20,0:07:33.24,Default,,0000,0000,0000,,file. And I found loads of things on StackOverflow Dialogue: 0,0:07:33.24,0:07:34.76,Default,,0000,0000,0000,,that said, here's what to do when that goes Dialogue: 0,0:07:34.76,0:07:37.21,Default,,0000,0000,0000,,wrong and that goes wrong. And eventually\NI had Dialogue: 0,0:07:37.21,0:07:38.44,Default,,0000,0000,0000,,this working server. And it was great. Dialogue: 0,0:07:38.44,0:07:40.67,Default,,0000,0000,0000,,And it broke a few times in the first Dialogue: 0,0:07:40.68,0:07:43.42,Default,,0000,0000,0000,,few weeks. But we fixed that when it happened. Dialogue: 0,0:07:43.42,0:07:47.70,Default,,0000,0000,0000,,And, by and large, it worked for quite awhile. Dialogue: 0,0:07:47.70,0:07:49.92,Default,,0000,0000,0000,,And it worked until it didn't work, and when Dialogue: 0,0:07:49.92,0:07:51.93,Default,,0000,0000,0000,,it didn't work, I was in France, on a Dialogue: 0,0:07:51.93,0:07:53.71,Default,,0000,0000,0000,,holiday with my family, and it was a fairly Dialogue: 0,0:07:53.72,0:07:56.61,Default,,0000,0000,0000,,rural bit of France, and we had, we had Dialogue: 0,0:07:56.61,0:07:58.41,Default,,0000,0000,0000,,a wifi connection. But it was only one wifi Dialogue: 0,0:07:58.41,0:08:02.70,Default,,0000,0000,0000,,connection for, basically, the village. And\Nto access that, Dialogue: 0,0:08:02.72,0:08:04.70,Default,,0000,0000,0000,,we, we could access it by sitting half in Dialogue: 0,0:08:04.70,0:08:08.18,Default,,0000,0000,0000,,a wardrobe on the top floor of the house, Dialogue: 0,0:08:08.18,0:08:09.98,Default,,0000,0000,0000,,which was nice. Dialogue: 0,0:08:09.98,0:08:12.46,Default,,0000,0000,0000,,And, so one morning I woke up and I Dialogue: 0,0:08:12.46,0:08:14.98,Default,,0000,0000,0000,,was sitting in the wardrobe with a coffee\Nand Dialogue: 0,0:08:14.98,0:08:17.23,Default,,0000,0000,0000,,checking my email, and I had a wonderful,\Na Dialogue: 0,0:08:17.23,0:08:19.22,Default,,0000,0000,0000,,lovely email from my host to say, Dear Valued Dialogue: 0,0:08:19.22,0:08:20.93,Default,,0000,0000,0000,,Customer, your server is dead, you need to\Nmake Dialogue: 0,0:08:20.94,0:08:23.58,Default,,0000,0000,0000,,a new one, Lots of love, from your hosts. Dialogue: 0,0:08:23.58,0:08:25.94,Default,,0000,0000,0000,,And I thought, good. Right. So I set up Dialogue: 0,0:08:25.94,0:08:28.25,Default,,0000,0000,0000,,a little desk in this wardrobe and for the Dialogue: 0,0:08:28.25,0:08:30.18,Default,,0000,0000,0000,,rest of the day, my family sat by a Dialogue: 0,0:08:30.18,0:08:35.49,Default,,0000,0000,0000,,river. They drank wine, ate cheese, mocked\Nme slightly, Dialogue: 0,0:08:35.49,0:08:37.59,Default,,0000,0000,0000,,and I sat in a roof, in a wardrobe, Dialogue: 0,0:08:37.60,0:08:40.01,Default,,0000,0000,0000,,in a heat wave, and pretty much followed the Dialogue: 0,0:08:40.01,0:08:42.60,Default,,0000,0000,0000,,same tutorials I employed the first time.\NMade the Dialogue: 0,0:08:42.60,0:08:45.14,Default,,0000,0000,0000,,same mistakes that I'd made the first time,\Nand Dialogue: 0,0:08:45.16,0:08:47.11,Default,,0000,0000,0000,,I got the server back up, but it really Dialogue: 0,0:08:47.11,0:08:49.74,Default,,0000,0000,0000,,wasn't any easier the second time. And that\Nseemed Dialogue: 0,0:08:49.74,0:08:52.13,Default,,0000,0000,0000,,kind of wrong to me. That it seemed really Dialogue: 0,0:08:52.13,0:08:52.43,Default,,0000,0000,0000,,frustrating. Dialogue: 0,0:08:52.43,0:08:53.71,Default,,0000,0000,0000,,So I figured there must be a better way Dialogue: 0,0:08:53.74,0:08:56.29,Default,,0000,0000,0000,,of doing this. If I'm honest, actually what\NI Dialogue: 0,0:08:56.29,0:08:58.32,Default,,0000,0000,0000,,thought was, I can't believe there isn't already\Na Dialogue: 0,0:08:58.32,0:09:00.54,Default,,0000,0000,0000,,better way of doing this, I should invent\Nit Dialogue: 0,0:09:00.54,0:09:01.97,Default,,0000,0000,0000,,and then I'll be rich and famous and everyone Dialogue: 0,0:09:01.98,0:09:05.67,Default,,0000,0000,0000,,will love me. Luckily I took a step back Dialogue: 0,0:09:05.67,0:09:07.51,Default,,0000,0000,0000,,and thought, OK, this probably already exists. Dialogue: 0,0:09:07.52,0:09:11.18,Default,,0000,0000,0000,,And, of course, it did. And what I wanted Dialogue: 0,0:09:11.18,0:09:15.08,Default,,0000,0000,0000,,was a configuration management tool. And a\Nconfiguration management Dialogue: 0,0:09:15.08,0:09:17.36,Default,,0000,0000,0000,,tool is really simple. It allows you to define Dialogue: 0,0:09:17.36,0:09:19.33,Default,,0000,0000,0000,,and automate the commands that it takes to\Nset Dialogue: 0,0:09:19.33,0:09:22.30,Default,,0000,0000,0000,,up the server to do a particular thing. And Dialogue: 0,0:09:22.30,0:09:25.08,Default,,0000,0000,0000,,what's amazing about a configuration management\Ntool is once Dialogue: 0,0:09:25.08,0:09:27.28,Default,,0000,0000,0000,,you've done it once, doing it again and again Dialogue: 0,0:09:27.28,0:09:29.98,Default,,0000,0000,0000,,and again is completely trivial. Dialogue: 0,0:09:29.98,0:09:33.53,Default,,0000,0000,0000,,So, that time you put in to start with, Dialogue: 0,0:09:33.53,0:09:34.87,Default,,0000,0000,0000,,it will probably only be one command to set Dialogue: 0,0:09:34.92,0:09:37.64,Default,,0000,0000,0000,,up an identical server the next time. And\Nto Dialogue: 0,0:09:37.64,0:09:38.89,Default,,0000,0000,0000,,give you an idea of just how simple it Dialogue: 0,0:09:38.89,0:09:40.94,Default,,0000,0000,0000,,can be, I've got a brief demonstration of\Nthe Dialogue: 0,0:09:40.96,0:09:43.10,Default,,0000,0000,0000,,process that I actually move, at the moment,\Non Dialogue: 0,0:09:43.10,0:09:45.39,Default,,0000,0000,0000,,a pretty much weekly basis for setting up\Nnew Dialogue: 0,0:09:45.39,0:09:45.96,Default,,0000,0000,0000,,servers. Dialogue: 0,0:09:45.96,0:09:49.12,Default,,0000,0000,0000,,At the end of this presentation, I'll link\Nto Dialogue: 0,0:09:49.12,0:09:51.06,Default,,0000,0000,0000,,tutorials of how to do this yourself and the Dialogue: 0,0:09:51.06,0:09:53.49,Default,,0000,0000,0000,,sample code. So please don't worry about following\Nit Dialogue: 0,0:09:53.50,0:09:54.73,Default,,0000,0000,0000,,step by step, I just want to give an Dialogue: 0,0:09:54.73,0:09:57.22,Default,,0000,0000,0000,,idea about how simple it can be. Dialogue: 0,0:09:57.22,0:10:02.21,Default,,0000,0000,0000,,So, here you can see, on the left, your Dialogue: 0,0:10:02.22,0:10:04.30,Default,,0000,0000,0000,,left, there is a list of servers that I've Dialogue: 0,0:10:04.30,0:10:07.78,Default,,0000,0000,0000,,deployed in the past. And I'm using my configuration Dialogue: 0,0:10:07.78,0:10:11.16,Default,,0000,0000,0000,,management tool of choice, Chef Solo, which\Nuses JSON Dialogue: 0,0:10:11.16,0:10:14.91,Default,,0000,0000,0000,,files for defining what should go onto a particular Dialogue: 0,0:10:14.91,0:10:15.50,Default,,0000,0000,0000,,type of server. Dialogue: 0,0:10:15.50,0:10:17.10,Default,,0000,0000,0000,,And on the bottom you can see I've got Dialogue: 0,0:10:17.10,0:10:18.47,Default,,0000,0000,0000,,a couple of web servers for Make It With Dialogue: 0,0:10:18.47,0:10:20.65,Default,,0000,0000,0000,,Code, which at the moment is running a selection Dialogue: 0,0:10:20.65,0:10:23.43,Default,,0000,0000,0000,,of Rails and Sinatra apps. And I want to Dialogue: 0,0:10:23.44,0:10:25.78,Default,,0000,0000,0000,,write a new one. And to do this, I Dialogue: 0,0:10:25.78,0:10:28.39,Default,,0000,0000,0000,,just create a new JSON file, web3 dot makeitwithcode Dialogue: 0,0:10:28.39,0:10:31.51,Default,,0000,0000,0000,,dot com. I save it, and then this server, Dialogue: 0,0:10:31.52,0:10:33.40,Default,,0000,0000,0000,,it's gonna be pretty much the same as web2. Dialogue: 0,0:10:33.40,0:10:35.07,Default,,0000,0000,0000,,It's just running Rails apps. Dialogue: 0,0:10:35.08,0:10:36.31,Default,,0000,0000,0000,,So I just copy all the JSON from my Dialogue: 0,0:10:36.32,0:10:39.72,Default,,0000,0000,0000,,previous server, but it into the new one,\Nand Dialogue: 0,0:10:39.72,0:10:40.90,Default,,0000,0000,0000,,the bit I want to draw your attention to Dialogue: 0,0:10:40.90,0:10:43.35,Default,,0000,0000,0000,,is, if you look at the bottom of that, Dialogue: 0,0:10:43.35,0:10:44.70,Default,,0000,0000,0000,,you've got this run list with a list of Dialogue: 0,0:10:44.70,0:10:47.31,Default,,0000,0000,0000,,things that are being called roles. And pretty\Nmuch Dialogue: 0,0:10:47.32,0:10:50.82,Default,,0000,0000,0000,,all configuration management systems have\Nsome sort of analogous Dialogue: 0,0:10:50.82,0:10:55.94,Default,,0000,0000,0000,,concept to this, which, kind of individual\Ncomponents that Dialogue: 0,0:10:55.94,0:10:58.26,Default,,0000,0000,0000,,you can mix and match to define what should Dialogue: 0,0:10:58.26,0:11:00.49,Default,,0000,0000,0000,,go onto this server that you're setting up. Dialogue: 0,0:11:00.49,0:11:02.98,Default,,0000,0000,0000,,So I've defined in the past, what goes on Dialogue: 0,0:11:02.98,0:11:04.85,Default,,0000,0000,0000,,an internet server. What goes on a PostGres\Nserver. Dialogue: 0,0:11:04.85,0:11:06.70,Default,,0000,0000,0000,,And now if I want that, I can just Dialogue: 0,0:11:06.72,0:11:08.32,Default,,0000,0000,0000,,drop that role in, and I know that it Dialogue: 0,0:11:08.32,0:11:09.77,Default,,0000,0000,0000,,will be set up in exactly the way that Dialogue: 0,0:11:09.77,0:11:12.49,Default,,0000,0000,0000,,I want it. So on this server I want Dialogue: 0,0:11:12.50,0:11:14.45,Default,,0000,0000,0000,,Redis. I didn't on the previous one. So I Dialogue: 0,0:11:14.45,0:11:17.93,Default,,0000,0000,0000,,can just uncomment it. Uncomment it, yeah.\NAnd I'll Dialogue: 0,0:11:17.94,0:11:20.87,Default,,0000,0000,0000,,get exactly the Redis configuration I want. Dialogue: 0,0:11:20.87,0:11:22.78,Default,,0000,0000,0000,,The good bit, the fun bit, is once I've Dialogue: 0,0:11:22.78,0:11:25.31,Default,,0000,0000,0000,,done this, I can type on command - knife Dialogue: 0,0:11:25.31,0:11:27.07,Default,,0000,0000,0000,,solo bootstrap - and then the address of the, Dialogue: 0,0:11:27.07,0:11:31.05,Default,,0000,0000,0000,,the VPS I've created. Presenter. And then\Nleave it Dialogue: 0,0:11:31.06,0:11:33.64,Default,,0000,0000,0000,,for about twenty minutes, go and get a coffee, Dialogue: 0,0:11:33.66,0:11:36.42,Default,,0000,0000,0000,,and the output that will scroll through, it\Nwill Dialogue: 0,0:11:36.42,0:11:39.27,Default,,0000,0000,0000,,tell me what commands it's applying. It will\Nshow Dialogue: 0,0:11:39.27,0:11:42.01,Default,,0000,0000,0000,,me diffs of any configuration files that it's\Nchanging. Dialogue: 0,0:11:42.02,0:11:43.61,Default,,0000,0000,0000,,And if it goes wrong, which it doesn't very Dialogue: 0,0:11:43.61,0:11:45.40,Default,,0000,0000,0000,,often, it will tell me exactly what it was Dialogue: 0,0:11:45.40,0:11:47.00,Default,,0000,0000,0000,,doing when it went wrong, so I can fix Dialogue: 0,0:11:47.00,0:11:47.51,Default,,0000,0000,0000,,it. Dialogue: 0,0:11:47.51,0:11:49.77,Default,,0000,0000,0000,,And at the end of this process, I will Dialogue: 0,0:11:49.78,0:11:52.71,Default,,0000,0000,0000,,have a Rails server which is identical the\Nlast Dialogue: 0,0:11:52.71,0:11:54.59,Default,,0000,0000,0000,,one I set up, and the one before that, Dialogue: 0,0:11:54.60,0:11:56.36,Default,,0000,0000,0000,,and I can check that this works. I can Dialogue: 0,0:11:56.36,0:11:58.64,Default,,0000,0000,0000,,fire up a web browser. I can go to Dialogue: 0,0:11:58.64,0:12:00.76,Default,,0000,0000,0000,,web3 and the address that I gave it, and Dialogue: 0,0:12:00.76,0:12:03.42,Default,,0000,0000,0000,,I'll get this wonderful Welcome to EngineX\Npage, which Dialogue: 0,0:12:03.42,0:12:05.91,Default,,0000,0000,0000,,says, that server is set up and it's ready Dialogue: 0,0:12:05.91,0:12:06.76,Default,,0000,0000,0000,,to use. Dialogue: 0,0:12:06.78,0:12:10.26,Default,,0000,0000,0000,,So, what I'm trying to demonstrate with that\Nfigure Dialogue: 0,0:12:10.26,0:12:14.79,Default,,0000,0000,0000,,is that configuration management is basically,\Ndon't repeat yourself Dialogue: 0,0:12:14.79,0:12:17.05,Default,,0000,0000,0000,,for setting up servers. If you think back\Nto Dialogue: 0,0:12:17.06,0:12:20.05,Default,,0000,0000,0000,,the first time you used, say, Devise, for\Nexample, Dialogue: 0,0:12:20.05,0:12:21.59,Default,,0000,0000,0000,,the first time I used Devise, it took me Dialogue: 0,0:12:21.59,0:12:24.21,Default,,0000,0000,0000,,ages to get all_auth and things like that\Nworking. Dialogue: 0,0:12:24.21,0:12:26.62,Default,,0000,0000,0000,,And then, six months later, I came back to Dialogue: 0,0:12:26.64,0:12:28.44,Default,,0000,0000,0000,,it, and didn't really remember any of the\Nstuff Dialogue: 0,0:12:28.44,0:12:31.07,Default,,0000,0000,0000,,that I'd done to get it to work. But Dialogue: 0,0:12:31.08,0:12:32.33,Default,,0000,0000,0000,,I could go back to the code I wrote Dialogue: 0,0:12:32.33,0:12:34.38,Default,,0000,0000,0000,,the first time, I could look at that code, Dialogue: 0,0:12:34.38,0:12:37.22,Default,,0000,0000,0000,,copy bits of it, and it was much quicker. Dialogue: 0,0:12:37.22,0:12:41.47,Default,,0000,0000,0000,,Now, the problem with just copying commands\Nor entering Dialogue: 0,0:12:41.47,0:12:44.14,Default,,0000,0000,0000,,commands manually when setting up the server\Nis there Dialogue: 0,0:12:44.16,0:12:46.77,Default,,0000,0000,0000,,is no natural audit trail of what did I Dialogue: 0,0:12:46.77,0:12:49.09,Default,,0000,0000,0000,,do to make this work the first time. So Dialogue: 0,0:12:49.10,0:12:50.81,Default,,0000,0000,0000,,there's a good chance, the second time you're\Ngonna Dialogue: 0,0:12:50.81,0:12:52.63,Default,,0000,0000,0000,,do it, you'll make the same mistakes as the Dialogue: 0,0:12:52.64,0:12:53.68,Default,,0000,0000,0000,,first time. Dialogue: 0,0:12:53.68,0:12:56.68,Default,,0000,0000,0000,,With a configuration management utility, you\Nnaturally create this Dialogue: 0,0:12:56.68,0:12:59.96,Default,,0000,0000,0000,,audit trail as you go along. So that, in Dialogue: 0,0:12:59.96,0:13:02.30,Default,,0000,0000,0000,,time, that time you invest up front, it goes Dialogue: 0,0:13:02.30,0:13:05.25,Default,,0000,0000,0000,,much, much further in the long run. Dialogue: 0,0:13:05.25,0:13:08.92,Default,,0000,0000,0000,,So, hopefully that's shown that the bit where\Npeople Dialogue: 0,0:13:08.92,0:13:11.40,Default,,0000,0000,0000,,often trip up, getting a server setup, it\Ndoesn't Dialogue: 0,0:13:11.40,0:13:12.89,Default,,0000,0000,0000,,need to be that difficult, and I'll give you Dialogue: 0,0:13:12.89,0:13:14.80,Default,,0000,0000,0000,,the exact sample code at the end, which you Dialogue: 0,0:13:14.82,0:13:17.24,Default,,0000,0000,0000,,can use if you want a head start. Dialogue: 0,0:13:17.24,0:13:20.18,Default,,0000,0000,0000,,But something like Heroku, it doesn't just\Nmake setting Dialogue: 0,0:13:20.18,0:13:23.29,Default,,0000,0000,0000,,up a server really easy. It makes deploying\Nto Dialogue: 0,0:13:23.29,0:13:25.59,Default,,0000,0000,0000,,one incredibly easy. Git push heroku. It pretty\Nmuch Dialogue: 0,0:13:25.60,0:13:28.29,Default,,0000,0000,0000,,couldn't be easier. And I think it's fair\Nto Dialogue: 0,0:13:28.29,0:13:29.89,Default,,0000,0000,0000,,say that the first time I used Heroku, it Dialogue: 0,0:13:29.89,0:13:31.76,Default,,0000,0000,0000,,was completely revolutionary. Dialogue: 0,0:13:31.78,0:13:34.41,Default,,0000,0000,0000,,So I came to Rails from Python/Jengo, and\Nbefore Dialogue: 0,0:13:34.41,0:13:37.38,Default,,0000,0000,0000,,that, PHP, and I'd used a whole range of, Dialogue: 0,0:13:37.38,0:13:40.82,Default,,0000,0000,0000,,kind of, home grown deployment systems, which\Nranged from Dialogue: 0,0:13:40.82,0:13:42.86,Default,,0000,0000,0000,,trying to remember what files you've changed\Nand FTP Dialogue: 0,0:13:42.86,0:13:47.23,Default,,0000,0000,0000,,them across to all sync things and custom\Nshell Dialogue: 0,0:13:47.23,0:13:49.16,Default,,0000,0000,0000,,scripts. And the one thing they all had in Dialogue: 0,0:13:49.18,0:13:52.32,Default,,0000,0000,0000,,common was they were flaky and deployment\Nwas something Dialogue: 0,0:13:52.32,0:13:54.34,Default,,0000,0000,0000,,you didn't want to do, because it would probably Dialogue: 0,0:13:54.34,0:13:56.70,Default,,0000,0000,0000,,break. So you maybe deployed a couple of times Dialogue: 0,0:13:56.70,0:13:57.71,Default,,0000,0000,0000,,a week. Dialogue: 0,0:13:57.71,0:13:59.36,Default,,0000,0000,0000,,So I used Heroku for the first time and Dialogue: 0,0:13:59.36,0:14:02.37,Default,,0000,0000,0000,,it was amazing. Suddenly I could apploy. Apploy?\NDeploy Dialogue: 0,0:14:02.37,0:14:05.62,Default,,0000,0000,0000,,ten times a day. And it was just fitted Dialogue: 0,0:14:05.62,0:14:06.71,Default,,0000,0000,0000,,into my normal workflow. Dialogue: 0,0:14:06.72,0:14:09.06,Default,,0000,0000,0000,,So I was really keen that if I was Dialogue: 0,0:14:09.06,0:14:11.06,Default,,0000,0000,0000,,deploying to my own servers, it had to be Dialogue: 0,0:14:11.06,0:14:12.60,Default,,0000,0000,0000,,as simple as that. It had to be one Dialogue: 0,0:14:12.60,0:14:15.66,Default,,0000,0000,0000,,command to deploy. And luckily, as is often\Nthe Dialogue: 0,0:14:15.66,0:14:18.04,Default,,0000,0000,0000,,case in the Rails community, loads of very\Nclever Dialogue: 0,0:14:18.04,0:14:20.36,Default,,0000,0000,0000,,people wanted exactly the same thing, and\Nso have Dialogue: 0,0:14:20.36,0:14:23.22,Default,,0000,0000,0000,,developed some awesome tools, some awesome\Ngems, to make Dialogue: 0,0:14:23.22,0:14:25.72,Default,,0000,0000,0000,,it really simple to set that up. Dialogue: 0,0:14:25.72,0:14:27.57,Default,,0000,0000,0000,,In the Rails community, I think the best known Dialogue: 0,0:14:27.58,0:14:30.41,Default,,0000,0000,0000,,of these is probably Capistrano, which I'll\Ntalk about Dialogue: 0,0:14:30.41,0:14:34.68,Default,,0000,0000,0000,,a bit more towards the end of the presentation. Dialogue: 0,0:14:34.68,0:14:37.21,Default,,0000,0000,0000,,But, first, another brief demo of how simple\Nit Dialogue: 0,0:14:37.22,0:14:40.20,Default,,0000,0000,0000,,is to add Capistrano into an existing, in\Nthis Dialogue: 0,0:14:40.20,0:14:43.77,Default,,0000,0000,0000,,case, Rails 4.1 application. Again, at the\Nend, I'll Dialogue: 0,0:14:43.77,0:14:46.88,Default,,0000,0000,0000,,give details of step by, a step by step Dialogue: 0,0:14:46.88,0:14:49.35,Default,,0000,0000,0000,,tutorial and the ensemble code for doing this.\NSo Dialogue: 0,0:14:49.36,0:14:51.19,Default,,0000,0000,0000,,please don't worry about the individual steps.\NI just Dialogue: 0,0:14:51.19,0:14:55.03,Default,,0000,0000,0000,,want to give an idea of what's involved. Dialogue: 0,0:14:55.04,0:15:00.97,Default,,0000,0000,0000,,So, to get started, Rails 4.1 application.\NI just Dialogue: 0,0:15:00.97,0:15:04.78,Default,,0000,0000,0000,,drop in the Capistrano gem and a few supporting Dialogue: 0,0:15:04.78,0:15:08.02,Default,,0000,0000,0000,,helper gems. Save that, and then add it to Dialogue: 0,0:15:08.02,0:15:11.52,Default,,0000,0000,0000,,git and, sorry, bundle and add it to Git. Dialogue: 0,0:15:11.52,0:15:13.94,Default,,0000,0000,0000,,Under the hood we're still using Git to deploy Dialogue: 0,0:15:13.94,0:15:15.90,Default,,0000,0000,0000,,in the same way Heroku does, so it's important Dialogue: 0,0:15:15.90,0:15:18.26,Default,,0000,0000,0000,,to make sure changes like that are committed. Dialogue: 0,0:15:18.26,0:15:20.41,Default,,0000,0000,0000,,And then running cap install, which just generates\Nsome Dialogue: 0,0:15:20.42,0:15:23.34,Default,,0000,0000,0000,,basic configuration files. The first one of\Nthese is Dialogue: 0,0:15:23.34,0:15:25.66,Default,,0000,0000,0000,,a cap file. This is just a rake file Dialogue: 0,0:15:25.66,0:15:28.54,Default,,0000,0000,0000,,for capistrano. And here, I'm just telling\Nit that Dialogue: 0,0:15:28.54,0:15:30.72,Default,,0000,0000,0000,,I want to use those helper gems that I Dialogue: 0,0:15:30.72,0:15:32.49,Default,,0000,0000,0000,,included in the first step. So I'm telling\Nit Dialogue: 0,0:15:32.49,0:15:34.32,Default,,0000,0000,0000,,that I want to use rbenv to manage what Dialogue: 0,0:15:34.32,0:15:36.46,Default,,0000,0000,0000,,Ruby version I'm using. I want it to install Dialogue: 0,0:15:36.46,0:15:39.60,Default,,0000,0000,0000,,gems for me, compile assets for me, and apply Dialogue: 0,0:15:39.60,0:15:42.08,Default,,0000,0000,0000,,migrations. All the normal stuff you do when\Nsetting Dialogue: 0,0:15:42.08,0:15:43.14,Default,,0000,0000,0000,,up a Rails app. Dialogue: 0,0:15:43.14,0:15:45.94,Default,,0000,0000,0000,,We've then got our main config file, just\Ndeploy Dialogue: 0,0:15:45.94,0:15:48.47,Default,,0000,0000,0000,,dot rb. And here I'm just giving the app Dialogue: 0,0:15:48.48,0:15:50.58,Default,,0000,0000,0000,,a name, telling it which Git repository to\Ndeploy Dialogue: 0,0:15:50.58,0:15:53.19,Default,,0000,0000,0000,,from, and getting rid of the load of the Dialogue: 0,0:15:53.19,0:15:56.83,Default,,0000,0000,0000,,boilerplate for the simple application. I'm\Nnot gonna use Dialogue: 0,0:15:56.84,0:15:58.92,Default,,0000,0000,0000,,it. Uncommenting out a few other bits of boilerplate. Dialogue: 0,0:15:58.92,0:16:02.48,Default,,0000,0000,0000,,And then finally I'm gonna add an rbenv specific Dialogue: 0,0:16:02.48,0:16:05.29,Default,,0000,0000,0000,,block that tells it to always use a particular Dialogue: 0,0:16:05.29,0:16:08.10,Default,,0000,0000,0000,,Ruby version. I think, in this case, 2 point Dialogue: 0,0:16:08.10,0:16:10.36,Default,,0000,0000,0000,,1 point 1, when deploying this app. Dialogue: 0,0:16:10.36,0:16:13.27,Default,,0000,0000,0000,,Finally, we have stage configuration files,\Nso if you Dialogue: 0,0:16:13.27,0:16:15.68,Default,,0000,0000,0000,,have a production server and a staging server,\Nand Dialogue: 0,0:16:15.70,0:16:17.93,Default,,0000,0000,0000,,here I'm just telling it that the production\Nserver Dialogue: 0,0:16:17.94,0:16:20.63,Default,,0000,0000,0000,,is going to be web3 dot makeitwithcode dot\Ncom, Dialogue: 0,0:16:20.63,0:16:21.71,Default,,0000,0000,0000,,which is the server we set up in the Dialogue: 0,0:16:21.72,0:16:24.28,Default,,0000,0000,0000,,first demo. And then that should be made available Dialogue: 0,0:16:24.28,0:16:28.37,Default,,0000,0000,0000,,to the public at, imaginatively, web3 dot\Nmakeitwithcode dot Dialogue: 0,0:16:28.37,0:16:28.97,Default,,0000,0000,0000,,com. Dialogue: 0,0:16:28.97,0:16:32.99,Default,,0000,0000,0000,,Then, firing up a console, running a command\Ncalled Dialogue: 0,0:16:32.99,0:16:35.64,Default,,0000,0000,0000,,setup config, and you can think of this like Dialogue: 0,0:16:35.66,0:16:38.38,Default,,0000,0000,0000,,heroku create. This is just telling that server,\Nor Dialogue: 0,0:16:38.38,0:16:41.33,Default,,0000,0000,0000,,preparing that server for a new application.\NIt's generating Dialogue: 0,0:16:41.33,0:16:44.19,Default,,0000,0000,0000,,a few config files, it's creating a new database Dialogue: 0,0:16:44.19,0:16:48.21,Default,,0000,0000,0000,,yml and telling EngineX that it needs to serve Dialogue: 0,0:16:48.22,0:16:50.92,Default,,0000,0000,0000,,a new site. Then running another helper task\Nthat Dialogue: 0,0:16:50.94,0:16:55.64,Default,,0000,0000,0000,,I added this time. Create database. This is\Njust, Dialogue: 0,0:16:55.64,0:16:57.77,Default,,0000,0000,0000,,create a new database on that server. Making\Nsure Dialogue: 0,0:16:57.77,0:17:00.13,Default,,0000,0000,0000,,there's a user that has permission to access\Nthat Dialogue: 0,0:17:00.13,0:17:00.57,Default,,0000,0000,0000,,server. Dialogue: 0,0:17:00.57,0:17:03.65,Default,,0000,0000,0000,,And this is the important command. Cap production\Ndeploy. Dialogue: 0,0:17:03.66,0:17:06.97,Default,,0000,0000,0000,,And this, if we're using capistrano, is our\Nequivalent Dialogue: 0,0:17:06.98,0:17:10.45,Default,,0000,0000,0000,,to git push heroku. And if you look at Dialogue: 0,0:17:10.45,0:17:12.78,Default,,0000,0000,0000,,the output, it's doing some pretty standard\Nstuff. It's Dialogue: 0,0:17:12.78,0:17:16.91,Default,,0000,0000,0000,,applying migrations, compiling assets and\Nrestarting the app server. Dialogue: 0,0:17:16.92,0:17:18.87,Default,,0000,0000,0000,,And once that completes, we can fire up the Dialogue: 0,0:17:18.88,0:17:21.09,Default,,0000,0000,0000,,web browser, visit it, and you can see we've Dialogue: 0,0:17:21.09,0:17:23.42,Default,,0000,0000,0000,,got a simple, if utterly useless Rails application. Dialogue: 0,0:17:23.42,0:17:26.02,Default,,0000,0000,0000,,And it has access to the database, it can Dialogue: 0,0:17:26.02,0:17:27.98,Default,,0000,0000,0000,,read and write, and now we can iterate on Dialogue: 0,0:17:27.98,0:17:30.42,Default,,0000,0000,0000,,that, and every time we want to make a Dialogue: 0,0:17:30.42,0:17:34.41,Default,,0000,0000,0000,,change, we can just make that change, commit\Nit, Dialogue: 0,0:17:34.41,0:17:37.81,Default,,0000,0000,0000,,cap production deploy, and it really is as\Nsimple Dialogue: 0,0:17:37.82,0:17:40.71,Default,,0000,0000,0000,,as deploying it to heroku. Dialogue: 0,0:17:40.72,0:17:43.08,Default,,0000,0000,0000,,So one thing that we haven't looked at yet Dialogue: 0,0:17:43.08,0:17:46.39,Default,,0000,0000,0000,,is, it's very easy to set this stuff up, Dialogue: 0,0:17:46.39,0:17:48.19,Default,,0000,0000,0000,,but the other great thing about using a path Dialogue: 0,0:17:48.20,0:17:50.72,Default,,0000,0000,0000,,like heroku is that when it breaks at 2 Dialogue: 0,0:17:50.72,0:17:53.24,Default,,0000,0000,0000,,AM, it kind of isn't our problem. They have Dialogue: 0,0:17:53.24,0:17:55.26,Default,,0000,0000,0000,,engineers and they get woken up at 2 AM. Dialogue: 0,0:17:55.26,0:17:57.82,Default,,0000,0000,0000,,And they go and fix it. And our application Dialogue: 0,0:17:57.82,0:17:59.76,Default,,0000,0000,0000,,just comes back up online again. Dialogue: 0,0:17:59.76,0:18:04.05,Default,,0000,0000,0000,,And we can't get around that completely. It's\Nnow Dialogue: 0,0:18:04.05,0:18:06.38,Default,,0000,0000,0000,,our problem when it breaks at 2 AM. But Dialogue: 0,0:18:06.38,0:18:09.61,Default,,0000,0000,0000,,luckily there are lots of tools out there\Nwhich Dialogue: 0,0:18:09.62,0:18:11.51,Default,,0000,0000,0000,,mean we can minimize the number of times this Dialogue: 0,0:18:11.51,0:18:15.20,Default,,0000,0000,0000,,will happen. If you think in a typical production Dialogue: 0,0:18:15.20,0:18:19.100,Default,,0000,0000,0000,,Rails application, you probably got some exception\Nhandling. You Dialogue: 0,0:18:20.00,0:18:22.10,Default,,0000,0000,0000,,know some exceptions will happen from time\Nto time, Dialogue: 0,0:18:22.10,0:18:23.69,Default,,0000,0000,0000,,and so you've got to have your begin and Dialogue: 0,0:18:23.70,0:18:26.36,Default,,0000,0000,0000,,rescues in that. And then hopefully you've\Nalso got Dialogue: 0,0:18:26.36,0:18:29.35,Default,,0000,0000,0000,,some sort of exception notification. And that\Nmeans that Dialogue: 0,0:18:29.35,0:18:32.22,Default,,0000,0000,0000,,when an exception that you haven't planned\Nfor happens, Dialogue: 0,0:18:32.22,0:18:34.05,Default,,0000,0000,0000,,you get an email and you know that you Dialogue: 0,0:18:34.05,0:18:35.44,Default,,0000,0000,0000,,can go in, you should go in and fix Dialogue: 0,0:18:35.44,0:18:36.08,Default,,0000,0000,0000,,it. Dialogue: 0,0:18:36.08,0:18:38.96,Default,,0000,0000,0000,,So, there are an analogous set of tools when Dialogue: 0,0:18:38.98,0:18:41.60,Default,,0000,0000,0000,,you're setting up your own servers. And these\Nare Dialogue: 0,0:18:41.60,0:18:45.01,Default,,0000,0000,0000,,called monitoring tools, and they're really,\Nreally simple. They're Dialogue: 0,0:18:45.01,0:18:47.43,Default,,0000,0000,0000,,essentially just a list of checks that say,\Nhere's Dialogue: 0,0:18:47.44,0:18:50.03,Default,,0000,0000,0000,,how something ought to behave. If it's not\Nbehaving, Dialogue: 0,0:18:50.03,0:18:52.44,Default,,0000,0000,0000,,here's a command that you can run to try Dialogue: 0,0:18:52.44,0:18:55.88,Default,,0000,0000,0000,,and fix it. If it's still not working, here's Dialogue: 0,0:18:55.88,0:18:57.66,Default,,0000,0000,0000,,the person to notify and how to notify them Dialogue: 0,0:18:57.66,0:18:58.89,Default,,0000,0000,0000,,there's a problem. Dialogue: 0,0:18:58.89,0:19:02.05,Default,,0000,0000,0000,,And that might sound a little bit daunting.\NSo Dialogue: 0,0:19:02.06,0:19:03.50,Default,,0000,0000,0000,,every time you set up an application you're\Ngonna Dialogue: 0,0:19:03.50,0:19:05.99,Default,,0000,0000,0000,,have to think about all these checks. In practice, Dialogue: 0,0:19:06.00,0:19:08.64,Default,,0000,0000,0000,,this is where configuration management comes\Nin. So, if Dialogue: 0,0:19:08.64,0:19:10.94,Default,,0000,0000,0000,,you remember in that first demonstration,\Nwhen I uncommented Dialogue: 0,0:19:10.94,0:19:14.33,Default,,0000,0000,0000,,that Redis role, as part of that Redis role, Dialogue: 0,0:19:14.33,0:19:16.64,Default,,0000,0000,0000,,when I originally wrote it, probably a year\Nor Dialogue: 0,0:19:16.64,0:19:19.38,Default,,0000,0000,0000,,a couple of years ago, I included the monitoring Dialogue: 0,0:19:19.38,0:19:22.98,Default,,0000,0000,0000,,configuration for it, which basically says,\Nis Redis working? Dialogue: 0,0:19:22.98,0:19:25.33,Default,,0000,0000,0000,,If no, restart it. If it's still not working, Dialogue: 0,0:19:25.34,0:19:25.84,Default,,0000,0000,0000,,email me. Dialogue: 0,0:19:25.84,0:19:28.95,Default,,0000,0000,0000,,And now that will get automatically setup\Nevery time Dialogue: 0,0:19:28.95,0:19:31.21,Default,,0000,0000,0000,,I include that Redis role. So there really\Nisn't Dialogue: 0,0:19:31.21,0:19:33.89,Default,,0000,0000,0000,,that much duplication. Configuration management\Njust does all of Dialogue: 0,0:19:33.90,0:19:35.93,Default,,0000,0000,0000,,this for us. Dialogue: 0,0:19:35.94,0:19:38.92,Default,,0000,0000,0000,,So to get a bit more practical, if you Dialogue: 0,0:19:38.92,0:19:41.83,Default,,0000,0000,0000,,decide to, to go ahead and try this. This Dialogue: 0,0:19:41.83,0:19:44.06,Default,,0000,0000,0000,,is the stack that I end up using, probably Dialogue: 0,0:19:44.06,0:19:48.73,Default,,0000,0000,0000,,99% of the time. For a web server, EngineX, Dialogue: 0,0:19:48.73,0:19:50.57,Default,,0000,0000,0000,,really popular in the Rails community. There's\Nlots of Dialogue: 0,0:19:50.58,0:19:54.06,Default,,0000,0000,0000,,really great Rails-specific documentation\Nout there. Dialogue: 0,0:19:54.06,0:19:56.55,Default,,0000,0000,0000,,For an app server, Unicorn. This probably\Nisn't what Dialogue: 0,0:19:56.56,0:19:58.36,Default,,0000,0000,0000,,you're using in development at the moment.\NThat's more Dialogue: 0,0:19:58.38,0:20:01.19,Default,,0000,0000,0000,,likely to be Thin or Webrick. Unicorn's a\Nlittle Dialogue: 0,0:20:01.19,0:20:04.26,Default,,0000,0000,0000,,bit more complicated. But, for that little\Nbit of Dialogue: 0,0:20:04.26,0:20:07.76,Default,,0000,0000,0000,,extra complexity, you get some really nice\Nfeatures. In Dialogue: 0,0:20:07.76,0:20:09.90,Default,,0000,0000,0000,,particular, it's very easy to set up what's\Ncalled Dialogue: 0,0:20:09.90,0:20:13.65,Default,,0000,0000,0000,,zero-downtime deployment, which you may already\Nbe familiar with. Dialogue: 0,0:20:13.65,0:20:16.86,Default,,0000,0000,0000,,Essentially what this means is, the simplest\Nway to Dialogue: 0,0:20:16.88,0:20:21.12,Default,,0000,0000,0000,,deploy an application is to deploy your new\Ncode, Dialogue: 0,0:20:21.12,0:20:23.56,Default,,0000,0000,0000,,stop the existing application, and then start\Nit again Dialogue: 0,0:20:23.56,0:20:25.26,Default,,0000,0000,0000,,with the new code. The problem is, if you've Dialogue: 0,0:20:25.26,0:20:27.06,Default,,0000,0000,0000,,got a big Rails application, it can take two Dialogue: 0,0:20:27.06,0:20:29.21,Default,,0000,0000,0000,,or three minutes to start up. And that means Dialogue: 0,0:20:29.21,0:20:30.68,Default,,0000,0000,0000,,that, for two or three minutes, every time\Nyou Dialogue: 0,0:20:30.68,0:20:33.97,Default,,0000,0000,0000,,deploy, your app's offline, which is pretty\Nbad for Dialogue: 0,0:20:33.98,0:20:36.75,Default,,0000,0000,0000,,your customers if you're doing this five,\Nsix times Dialogue: 0,0:20:36.75,0:20:37.57,Default,,0000,0000,0000,,a day. Dialogue: 0,0:20:37.58,0:20:39.31,Default,,0000,0000,0000,,With Unicorn, you can set it up so that Dialogue: 0,0:20:39.31,0:20:42.26,Default,,0000,0000,0000,,when you deploy new code, it will start up Dialogue: 0,0:20:42.26,0:20:44.09,Default,,0000,0000,0000,,your app in the background, and only once\Nit's Dialogue: 0,0:20:44.09,0:20:46.41,Default,,0000,0000,0000,,ready will it switch it over and stop the Dialogue: 0,0:20:46.41,0:20:51.04,Default,,0000,0000,0000,,previous version, so your customers don't\Nnotice an interruption. Dialogue: 0,0:20:51.06,0:20:53.60,Default,,0000,0000,0000,,For a database, I typ, by default go with Dialogue: 0,0:20:53.60,0:20:56.42,Default,,0000,0000,0000,,PostGres. Again, you've probably all heard\Nof it. Very Dialogue: 0,0:20:56.42,0:20:59.26,Default,,0000,0000,0000,,popular in the Rails community. I recommend\Nit to Dialogue: 0,0:20:59.26,0:21:01.42,Default,,0000,0000,0000,,people, because if you're on the Heroku free\Nplan, Dialogue: 0,0:21:01.42,0:21:05.50,Default,,0000,0000,0000,,it's probably what you're using already, because\Nit's their Dialogue: 0,0:21:05.50,0:21:06.59,Default,,0000,0000,0000,,default database. Dialogue: 0,0:21:06.60,0:21:09.01,Default,,0000,0000,0000,,The only controversial item on this list,\Nbecause all Dialogue: 0,0:21:09.01,0:21:11.08,Default,,0000,0000,0000,,lists should have at least one controversial\Nitem, is Dialogue: 0,0:21:11.08,0:21:14.24,Default,,0000,0000,0000,,probably Monit. And it's a bit controversial\Nbecause there Dialogue: 0,0:21:14.24,0:21:16.32,Default,,0000,0000,0000,,are some amazing monitoring tools out there\Nwhich are Dialogue: 0,0:21:16.32,0:21:20.71,Default,,0000,0000,0000,,written using Ruby syntax for defining rules.\NI keep Dialogue: 0,0:21:20.71,0:21:24.56,Default,,0000,0000,0000,,coming back to Monit because it's tiny. Its\Nsyntax Dialogue: 0,0:21:24.58,0:21:25.98,Default,,0000,0000,0000,,isn't quite as nice to work with as some Dialogue: 0,0:21:26.00,0:21:27.72,Default,,0000,0000,0000,,of the others, some of the others, but it Dialogue: 0,0:21:27.72,0:21:30.45,Default,,0000,0000,0000,,uses absolutely no memory, and once you set\Nit Dialogue: 0,0:21:30.45,0:21:32.17,Default,,0000,0000,0000,,up, it just stays out of the way and Dialogue: 0,0:21:32.17,0:21:35.50,Default,,0000,0000,0000,,works, which is pretty much what I look for Dialogue: 0,0:21:35.52,0:21:37.29,Default,,0000,0000,0000,,in a monitoring tool. Dialogue: 0,0:21:37.29,0:21:39.21,Default,,0000,0000,0000,,For setting up your server, so your server\Nprovisioning Dialogue: 0,0:21:39.22,0:21:43.26,Default,,0000,0000,0000,,tool, I recommend getting started with Chef\NSolo. Chef Dialogue: 0,0:21:43.26,0:21:44.72,Default,,0000,0000,0000,,Solo is the tool you saw me using in Dialogue: 0,0:21:44.72,0:21:49.99,Default,,0000,0000,0000,,the first demonstration. And it's designed\Nfor deploying individual Dialogue: 0,0:21:49.99,0:21:53.21,Default,,0000,0000,0000,,servers from your development machine. What's\Nreally nice about Dialogue: 0,0:21:53.22,0:21:56.50,Default,,0000,0000,0000,,Chef Solo is it's built on top of a Dialogue: 0,0:21:56.50,0:21:58.94,Default,,0000,0000,0000,,much bigger piece of software called Chef\NServer. And Dialogue: 0,0:21:58.94,0:22:00.51,Default,,0000,0000,0000,,Chef Server is designed for when you need\Nto Dialogue: 0,0:22:00.51,0:22:03.83,Default,,0000,0000,0000,,deploy lots of servers in complicated configurations. Dialogue: 0,0:22:03.84,0:22:06.19,Default,,0000,0000,0000,,So, if you need, eventually, to move on from Dialogue: 0,0:22:06.19,0:22:10.62,Default,,0000,0000,0000,,your simple single-box configuration to much\Nmore complicated ones, Dialogue: 0,0:22:10.62,0:22:13.81,Default,,0000,0000,0000,,almost everything you've learnt using Chef\NSolo will be Dialogue: 0,0:22:13.82,0:22:15.40,Default,,0000,0000,0000,,applicable to Chef Server. Dialogue: 0,0:22:15.40,0:22:21.02,Default,,0000,0000,0000,,I mentioned, previously, there were lots of\Ndeployment tools, Dialogue: 0,0:22:21.02,0:22:24.22,Default,,0000,0000,0000,,automation tools out there for Rails. Probably\Nthe best-known Dialogue: 0,0:22:24.22,0:22:28.24,Default,,0000,0000,0000,,one is Capistrano. At the moment, there are\Ntwo Dialogue: 0,0:22:28.24,0:22:31.33,Default,,0000,0000,0000,,stable versions of Capistrano out in the wild.\NThere Dialogue: 0,0:22:31.33,0:22:36.13,Default,,0000,0000,0000,,is Capistrano 2 and Capistrano 3. Most of\Nthe Dialogue: 0,0:22:36.14,0:22:39.76,Default,,0000,0000,0000,,documentation and tutorials that you find\Nwill probably be Dialogue: 0,0:22:39.76,0:22:43.20,Default,,0000,0000,0000,,for Capistrano 2. Dialogue: 0,0:22:43.20,0:22:45.95,Default,,0000,0000,0000,,Despite that, I recommend starting off with\NCapistrano 3, Dialogue: 0,0:22:45.95,0:22:48.36,Default,,0000,0000,0000,,if you are starting from a blank slate. The Dialogue: 0,0:22:48.36,0:22:50.96,Default,,0000,0000,0000,,reason for this is that version 3 was a Dialogue: 0,0:22:50.96,0:22:55.08,Default,,0000,0000,0000,,complete ground-up rewrite of version 2. In\Nparticular, it's Dialogue: 0,0:22:55.08,0:22:58.70,Default,,0000,0000,0000,,just a rake application. So Capistrano 3 is\Njust Dialogue: 0,0:22:58.70,0:23:03.55,Default,,0000,0000,0000,,a, a layer on top of rake that provides Dialogue: 0,0:23:03.55,0:23:07.02,Default,,0000,0000,0000,,deployment-specific functionality. And that\Nmeans that any knowledge you've Dialogue: 0,0:23:07.04,0:23:09.00,Default,,0000,0000,0000,,already got of how to write rake tasks and Dialogue: 0,0:23:09.00,0:23:10.64,Default,,0000,0000,0000,,how to interact with rake tasks and how to Dialogue: 0,0:23:10.64,0:23:13.92,Default,,0000,0000,0000,,debug them is directly applicable to Capistrano\N3. And Dialogue: 0,0:23:13.92,0:23:16.07,Default,,0000,0000,0000,,that just makes the learning curve that little\Nbit Dialogue: 0,0:23:16.07,0:23:19.13,Default,,0000,0000,0000,,shallower. Dialogue: 0,0:23:19.13,0:23:21.31,Default,,0000,0000,0000,,So next steps, if you're gonna give it a Dialogue: 0,0:23:21.32,0:23:23.83,Default,,0000,0000,0000,,go. I suggest you go and get a VPS. Dialogue: 0,0:23:23.83,0:23:26.78,Default,,0000,0000,0000,,I suggest starting off with a one gig one. Dialogue: 0,0:23:26.80,0:23:28.64,Default,,0000,0000,0000,,You can run a Rails app on a 512 Dialogue: 0,0:23:28.64,0:23:31.25,Default,,0000,0000,0000,,meg VPS. You can also spend a huge amount Dialogue: 0,0:23:31.25,0:23:33.34,Default,,0000,0000,0000,,of time troubleshooting out of memory hours,\Nwhich I Dialogue: 0,0:23:33.34,0:23:36.71,Default,,0000,0000,0000,,think is the least enjoyable thing possible.\NYou can Dialogue: 0,0:23:36.72,0:23:39.29,Default,,0000,0000,0000,,get a one gig VPS for about ten dollars Dialogue: 0,0:23:39.29,0:23:42.97,Default,,0000,0000,0000,,a month at DigitalOcean, I think. They're\Nalso a Dialogue: 0,0:23:42.97,0:23:45.76,Default,,0000,0000,0000,,sponsor, and they're really generous with\Nfree credit. So Dialogue: 0,0:23:45.78,0:23:47.37,Default,,0000,0000,0000,,if you corner them in a booth, I imagine Dialogue: 0,0:23:47.37,0:23:48.80,Default,,0000,0000,0000,,you can get at least a few months of Dialogue: 0,0:23:48.80,0:23:50.33,Default,,0000,0000,0000,,experimentation for free. Dialogue: 0,0:23:50.34,0:23:54.01,Default,,0000,0000,0000,,So, the url at the top there, talkingquickly\Ndot Dialogue: 0,0:23:54.01,0:23:58.85,Default,,0000,0000,0000,,co dot uk slash deploying_rails. That's a\Npage specific Dialogue: 0,0:23:58.85,0:24:02.25,Default,,0000,0000,0000,,to this presentation, and it contains links\Nto two Dialogue: 0,0:24:02.25,0:24:06.11,Default,,0000,0000,0000,,key tutorials. The first one goes through\Nstep-by-step how Dialogue: 0,0:24:06.11,0:24:08.43,Default,,0000,0000,0000,,to set up a Rails server in the way Dialogue: 0,0:24:08.46,0:24:10.65,Default,,0000,0000,0000,,I did in the first video, and the second Dialogue: 0,0:24:10.66,0:24:13.43,Default,,0000,0000,0000,,one is how to set up Capistrano with a Dialogue: 0,0:24:13.43,0:24:16.17,Default,,0000,0000,0000,,new or existing Rails application, as per\Nthe second Dialogue: 0,0:24:16.18,0:24:17.59,Default,,0000,0000,0000,,video. Dialogue: 0,0:24:17.59,0:24:20.62,Default,,0000,0000,0000,,They also include the complete sample code\Nthat I'm Dialogue: 0,0:24:20.62,0:24:23.27,Default,,0000,0000,0000,,actually using in production, pretty much\Nevery day, for Dialogue: 0,0:24:23.28,0:24:27.57,Default,,0000,0000,0000,,deploying new Rails apps. So, hopefully, the\Nfairly large Dialogue: 0,0:24:27.57,0:24:29.12,Default,,0000,0000,0000,,amount of time I put in originally trying\Nto Dialogue: 0,0:24:29.12,0:24:31.29,Default,,0000,0000,0000,,work out how to get a working configuration\Nmanagement Dialogue: 0,0:24:31.29,0:24:33.03,Default,,0000,0000,0000,,set up, you can take that as a starting Dialogue: 0,0:24:33.03,0:24:35.88,Default,,0000,0000,0000,,point and get it started very quickly. It\Nshould Dialogue: 0,0:24:35.90,0:24:37.82,Default,,0000,0000,0000,,take maybe an hour and a half to get Dialogue: 0,0:24:37.82,0:24:40.17,Default,,0000,0000,0000,,your first server set up and an app deployed Dialogue: 0,0:24:40.18,0:24:41.01,Default,,0000,0000,0000,,to it. Dialogue: 0,0:24:41.01,0:24:43.47,Default,,0000,0000,0000,,I mentioned at start, I've also written a\Nbook Dialogue: 0,0:24:43.48,0:24:46.08,Default,,0000,0000,0000,,about this. Reliably Deploying Rails Applications. Dialogue: 0,0:24:46.08,0:24:46.96,Default,,0000,0000,0000,,This was basically Dialogue: 0,0:24:46.96,0:24:48.88,Default,,0000,0000,0000,,the reference that I wish I'd had when I Dialogue: 0,0:24:48.88,0:24:51.96,Default,,0000,0000,0000,,started doing this. It uses exactly the same\Nsample Dialogue: 0,0:24:51.96,0:24:56.27,Default,,0000,0000,0000,,code as those tutorials. So if you start off Dialogue: 0,0:24:56.27,0:24:58.44,Default,,0000,0000,0000,,using those and find you want to do more Dialogue: 0,0:24:58.44,0:24:59.79,Default,,0000,0000,0000,,complicated things, Dialogue: 0,0:24:59.80,0:25:01.01,Default,,0000,0000,0000,,hopefully that will be a useful reference. Dialogue: 0,0:25:01.01,0:25:03.74,Default,,0000,0000,0000,,And there's a discount code, et cetera, for\NRailsConf Dialogue: 0,0:25:03.74,0:25:06.81,Default,,0000,0000,0000,,attendees on that link. Dialogue: 0,0:25:06.82,0:25:10.62,Default,,0000,0000,0000,,Finally, I'll be in the AirPad Pit at 4:30 Dialogue: 0,0:25:10.62,0:25:12.15,Default,,0000,0000,0000,,today. So if anyone wants to give this a Dialogue: 0,0:25:12.15,0:25:14.82,Default,,0000,0000,0000,,go for real and wants a hand setting stuff Dialogue: 0,0:25:14.82,0:25:17.22,Default,,0000,0000,0000,,up, I'd be very happy to help out. Yeah. Dialogue: 0,0:25:17.22,0:25:19.72,Default,,0000,0000,0000,,Thank you so much for coming to the talk. Dialogue: 0,0:25:19.72,0:25:22.92,Default,,0000,0000,0000,,I've really enjoyed doing this. Let's have\Nsome questions.