Building data-driven web apps with Pyramid and SQLAlchemy Transcripts
Chapter: Deployment
Lecture: Concepts: Deployment

Login or purchase this course to watch this video and the rest of the course contents.
0:00 Let's review some of the concepts we saw during deployment.
0:03 Now, we deployed to Ubuntu and DigitalOcean.
0:07 But you don't have to go to DigitalOcean.
0:09 What you saw would work almost exactly the same
0:11 in places like AWS, or Azure, or Linode, or whatever.
0:15 You do have to be aware on AWS
0:17 there's also a cloud-controlled firewall
0:20 that happens to be blocking things
0:21 so you have to unblock the HTTP ports in a couple places.
0:25 That's AWS. It's kind of super complicated.
0:27 And if you're doing basic things that
0:29 anyway, that's a whole different discussion.
0:31 Let's talk about the concepts.
0:33 We started by having a production.ini.
0:36 And there's a couple settings
0:37 that I didn't point out there that are important.
0:40 I did point out the uWSGI section.
0:43 So here you have the localhost port
0:46 it's going to listen on, this is where Nginx speaks to it
0:49 you don't expose this on the internet directly.
0:51 Master mode means we're going to run
0:53 five processes for parallelism.
0:56 Five actually can handle quite a bit.
0:57 Threads amplifies that further.
0:59 And then the hari kari thing
1:01 is if they don't respond in a certain amount of time
1:03 they'll get killed off.
1:04 And finally, you want logging in your app
1:07 so you can figure out what's happening.
1:08 The production.ini settings I did not show you were
1:11 there's a difference between the development.ini
1:14 and production.ini, where for example
1:16 the templates don't auto-reload.
1:18 You have to restart the process if you change the templates.
1:20 The debug toolbar thankfully is not there in production.
1:24 That would be bad, you don't want it there.
1:26 So things like that, you can check the differences.
1:28 They're not major but there's a few other differences
1:30 that Pyramid itself puts into those two files, plus this.
1:35 Once we have our production.ini ready to go
1:39 we want to create a system daemon, using the systemd
1:42 that's going to run uWSGI anytime the server is on.
1:46 It's going to auto-start it and keep it running.
1:48 So here is the settings we used.
1:51 Here, we just say execstart
1:52 use that virtual environment to uWSGI
1:55 and use our production.ini to do it, so really simple.
1:59 I just noticed I didn't have a forward slash
2:01 in the runtime directory in the end.
2:03 uWSGI claims that the directory is invalid
2:05 if you don't explicitly put that trailing slash
2:08 so make sure you put that there, if you care.
2:11 Alright, so you have basically this file
2:13 in the files I'm giving you as well.
2:15 So this would be uWSGI running as a system daemon
2:18 and you're going to need to copy that from wherever it is
2:21 over to etc/systemd/system.
2:24 Finally we want to set up the outer shell
2:27 the thing that listens on the actual internet
2:29 the thing that serves the static files
2:31 and then also delegates the Python request
2:33 back to uWSGI and that's Nginx.
2:36 So here's how we can configure that.
2:38 You can listen on more than one port.
2:40 You can listen on 80 and do a redirect to 443.
2:43 There's a lot of configuration stuff you can do
2:44 but here's a super basic one.
2:46 Listen on 80 for fake_pypi.com
2:49 as the domain name that we registered.
2:52 You know, registered by typing it into our host file.
2:54 My serve up static files
2:56 point at the static directory and set some expiration date.
3:00 And this one you want to copy over
3:01 to etc/nginx/sites-enabled.
3:06 Now finally we also have in our Nginx files
3:09 telling it to go, if you don't go to /static
3:12 just go to / or anything below that, except static.
3:15 Just go and do a request over to your application
3:18 which forwards over to our configuration in uWSGI.
3:23 Be really careful that that port 8999 is the same one
3:27 as you have back in your production.ini's
3:29 configuration for uWSGI.
3:31 They have to match, of course
3:32 so that they can find each other.
3:33 Or use a system socket.
3:35 That takes a little more setup
3:36 so I'm just using the localhost HTTP.
3:40 And that's it. I gave you the script of all the pieces you need to run.
3:43 These are the details of the
3:44 configuration files you have to set up.
3:46 And hopefully you come away feeling like
3:48 setting up that Linux server wasn't too much work.
3:51 Did talk a lot about it, but if I just put my head down
3:53 and focused, and went after it
3:54 we could probably do it in 10 minutes
3:56 And most of that time is waiting on installs
3:58 you know, apt this, pip that, right?
4:01 Just waiting for those things to happen.
4:02 So not a lot of work once you have the scripts
4:05 and everything put together for you.