Transcript: Deployments
Hello and welcome to another episode of Django chat. In this episode, we're going to talk about
deployment, the things you need to do to change your Django application and options for putting
your site online. As ever, I'm joined by Carlton Gibson. Hi, Carlton. Hello, Will. How are you?
I am good. So let's this is one of the top questions that I get as a Django educator.
And it really is confusing the first time or several times you go through it. So there's
a long list of things that are different on local django versus deployment django as a django fellow
perhaps you could talk about why django makes some of the choices they use such as sqlite and all
the rest to make local development easier well sqlite uh or sqlite like you know sql was a
separate programming language back today so surely it's called sql rather than sql so we'll call it
sqlite i you know i don't know anyway sqlite why because it's in comes embedded in um python and
you can just get up and running and you don't have to set up a different server and and so when you
do start project and start app and you can run server you're up and running with sqlite or sqlite
i just said sqlite who knows what it's called you're up with yeah yeah you're up with sqlite
um without any extra work and and you know when you're first starting the last thing you need is
oh install postgres um yeah it's it's hard it's quite hard to set up postgres or another one on
server, especially if you're not using Docker. And yeah, where a SQLite is file based. So it's
just that little file right there. And boop, away you go. So let's go through there's a list of
things. And then we'll go through maybe and talk about the choices Django has made. But first,
we should mention, there is a deployment checklist in the fantastic docs, which we'll link to,
and you can run run a command, manage.py, check dash dash deploy, which will in an automated way,
say, hey, you forgot some of these must-haves
because there's a bunch of nice-to-haves
depending on your project,
but there's a bunch of must-haves
of which switching over from SQLite
is in most cases one of them.
Yeah, to run that deployment check is, well, handy.
Yeah, but I say that because I wasn't aware
of that page in the docs for a long time.
Yeah, so the two things,
the checklist, which is a page in the docs,
and then the check command with the deploy flag,
which is like automated.
So normally when you migrate, the checks get run to make sure you haven't misconfigured an admin
or misconfigured a model, but these extra deployment-only checks,
you have to actually enable the flag and run the command.
Yes, you need the flag.
So let's go through the list.
So number one is probably debug.
So in the settings.py file, by default, debug is turned to true,
which gives all sorts of nice debugging and other error collection,
But you do not want to have that on for production.
You want to change that to false because that means that anyone out there in the great wide web can see things you don't want them to see about your project and it will be insecure.
So that is probably number one.
If you had to pick only one thing is switch debug to false.
Yeah, and the error page that Django throws up shows your whole environment.
Yeah, it's everything.
It's everything.
So you can't have that visible.
But I mean, how you configure that, there's multiple ways to automatically toggle debug.
I mean, you can do it with different settings files.
You can do it with environment variables.
I'm curious, do you have a personal preference for how to do it?
Because it's actually a little bit tricky configuring it so it automatically knows,
oh, I'm in local, you know, change debug.
And when I'm in production, change it to something else.
Oh, I'm almost scared to say what my personal preference is.
Oh, yeah, you're a bit of a, what's the kind word?
stalinist no okay so so i well i'll say so so most many people are probably aware of the two
scoops of django book which came out a couple years ago which advocated multiple settings files
so you'd have a base settings file and then a local settings file and deployment settings file
which would override and so you would sort of chain them together and run a different set of
settings files depending upon which environment you are in that's the standard pattern people are
aware of and to be honest that's what i use on quite a number of my projects yeah and it it works
there's nothing wrong with that i have been using docker a lot recently and with docker you can use
environment variables which is 12 factor auth type of deal and so there you can also override but
basically you can have a single settings file and then you can override your environment variables
yeah and if i was starting fresh today that's probably the way i would i would do it yeah i
think it's simple it's simpler if you're if you've never done it before use environment variables
don't do the settings pattern but the settings pattern is fine too but it is quite confusing i
mean i've just finished the the chapter on this in my book jango for professionals and i've talked
to quite a few experts about i mean i could do a whole episode on just environment variables within
docker so it's um and it's not just in docker it's in your local development environment it's
it's how do you set environment variables sensibly and um think crazy things like you know because of
the way the the the heart the unix programming environment is settings environment variables
arrive in your process as strings even though they might be integers you might want them as
integers so you need some kind of help to cast them to the right type or you need to be aware
that they're going to come in as strings environment variables are kind of complicated
and they are i think a first level um multiple setting files can actually be easy so you've got
your base ones which are the same in every environment and then you've got your local ones
where you've got you know your i know your local debate database set and then you've got your
production settings which have your production database settings plus this debug equals false
yeah well and with with the docker-based environment variable setup you have your
your default which is basically your local and then you so you have a single settings file you
have a single environment variable file like a dot env and then you have a dot prod dot env which
just overwrites those so it's actually what it's two files instead of three the way you would have
with settings but it's the same idea you want to automate it so so one way people handle environment
variables is to put them in an m file of some kind so this is a file that has key pairs between
an environment variable name an environment variable value and somehow you get that into
your environment when launching the process yeah and there are all sorts of tricks about that but
if you're going to have multiple environments you're going to end up with one of these m files
for each of those and well how is this any different for multiple settings files it's
you know there's no there's no free there's no free lunch here right no and and you can also
just hard code your environment variables into your docker compose file with docker though
i think generally speaking a better practice is to create a dot m file because then you can
get ignore that file so it's not in your source control so you're yeah so the whole point about
this is which is the whole point secret right the whole the whole thing is otherwise you put
things like your secret key or your database password and or whatever into your into your
source control and you don't want to do that um and so yeah but so this so what we just discussed
is a very a shorter variation of the conversations i've been having with other experts so
you need some way to toggle between local and production um it is complicated you can do the
settings file approach you can do the environment variable approach pick one try not to spend too
much time on it as would be my advice but um it is tricky and that leads us to the second probably
the second thing you would want to change or at least make truly secret when you're going to
production which is your secret key so this is what 50 i think it's 50 character string that's
something like that that's automatically generated um when you do start project command you've
probably checked it into source control you can actually i'll do a link to it you can use the
internal django to do on the command line to generate a new random secret key which you might
want to do um and then link to that through an environment variable but that's something that
you like it says in the settings files but you really want your secret key to be secret because
of some it's used for all the hashing of all this all the other secret stuff within dango no but
everything like um if you've got a sign-in link then it will be it will be hashed used with the
dango secrets and that will be used the secret key to generate the hash the session identifiers the
you know everything like absolutely everything so what do you so what do you how do you keep
your secret since you're setting files okay so yeah exactly this so for a production environment
um you have one which is outside of source control and normally i would keep that in an
in a dot m file and then if i have a soup in a supervisor or in whatever process manager i'm
using load that into the environment when calling the the django process yeah and that works with
ansible as well and you know ideally you can store these things in some sort of vault yeah like a
password manager somewhere somewhere safe well the password manager for small teams but then when
you're deploying it um all the major cloud providers will provide a um a secret keeper
place where you can put a secret in and you can only fetch it back out with the right key and
it'll give you the it'll give you that value but it's not readable by anybody ever um so um
hashicorp have got one called vault and then um microsoft azure's got one and google have got
one and amazon have got one as well i can never remember the names of all the services but they're
a nice place where you can put those and they're online they're shareable with with a team and then
you can have your process access those on demand right because this is another key aspect if you're
in a team setting you might want everyone to have access to the code base but you don't want everyone
to have access to your um stripe api key for example or your production database password
reproduction yeah certainly yeah some horror stories i could tell about that so um if also
one thing to mention there is a fantastic third-party package django environ which um i
haven't found a use case for it within docker but in standard non-docker environments it packages
up a bunch of other tools and it's a really great way to do 12 factor auth with environment variables
so we'll link to that um number three i would say so debug secret key allowed hosts do you want to
yeah so what allowed hosts are okay so um you you don't want your django app for my pretty
website.com to respond to um requests for someone else's evil website.com so you allowed hosts is a
list of exactly allowed hosts you you might respond to my pretty website.com as well as
my friends pretty website.com you might respond to those two but nothing else and so you put those
into allowed hosts and then django will reject any settings any requests for hosts which don't
aren't matching that's not you know that's not there are ways of spoofing the host header and
other such things but that's a nice base level check it says no i'm not going to respond to
requests for the wrong website right and the the default if you look in your settings.py file
it is just um empty oh it looks empty but really it's set to um local host and one two seven zero
zero eight thousand if so true was that if debug is true if debug is true correct yeah right right
so um uh you will have to set a loud host whatever your deployment whether it's heroku all the rest
you'll have to put that in there so yes and you will get an error so but this is this is the error
you get is from the checks you remember earlier on we talked about the check framework where you
manage dot by check that's automatically run and that allowed host check is run every time and if
the if debug is false then it will check that you set allowed host correctly yeah and that's
independent of the extra checks which the deploy deploy flag deploy flag django has these batteries
thoughtful people smarter than me have thought gone through this before yeah and like for instance
like setting the right header values and things on cookies and stuff that you you know you and i
and everybody else we don't know but somebody has thought about it and they put the time in and
they've made sure that you've configured it right and they tell you if you don't and that's yeah
it's quite nice so let's see what would be number four i would say static file
stuff so this would be images css javascript uh there's actually uh jacob kaplan moss will link
to this gave a fantastic talk at pycon on um it's called assets in django without losing your hair
and basically you need to uh in django what our assets are called static for legacy reasons and
then there's often media which refers to user uploaded content so you know so a static asset
would be an image but you could also if it was coming from users you would put it into a media
and his talk kind of goes into this but the reason why there's a distinction is because you don't
trust your users you shouldn't so you want to put that information not on your server and then when
you reach a certain size you probably want to take all those assets and not have them on your
server either even the ones you've created and put them in a cdn um like s3 or cloudfront something
like that um but one thing that i took away from that talk is you can scale pretty far actually
with keeping assets on your local server, actually.
The numbers he gave were much higher than I expected
because I've always, I guess, pretty much really optimized
and gone right to S3 CloudFront.
But maybe your experience is the same,
so you can go pretty far with not doing that.
Yeah, I mean, let's say you have some standard setup,
you know, a single virtual machine running Nginx
with a Django application behind it,
perhaps with Gunicorn in front of it,
Green Unicorn, we call it, but Garnacorn.
If you've configured NGINX to serve your static files directly from the file system,
and especially if you set the right headers, the right response headers,
so that those requests are cached, because they're static, they don't change.
You can set long-lived headers.
Actually, that instance, that really basic one server instance, can serve a lot of traffic.
Don't do it unless you need to.
and then there's the fourth level is webpack and parcel and all these things you know for
her packaging your javascript which if you can avoid avoid yeah i mean certainly yeah it depends
again it's like if you're if you're if you're shipping a small django app yourself then keep
it simple don't get into all of that stuff if you're part of a bigger team yeah you need all
of that you need that front end because that's what the front end team will give you but you
need to bundle it up then you need to put it somewhere where your web server can find it be
that on a cdn or be that on your single web server but you'd be amazed how much you can get a small
instance to serve if you do the right things yes two more points i have anyways on quick list so
one is so the database so we mentioned you need to decide on your production database and generally
speaking you don't want sqlite right now built-in support for postgres sql mysql and oracle though
oracle may not be there for that long so no i think i don't know if it's going no no okay i
we're keeping maria dp is coming along too i think okay well i'll edit out the oracle slang
then the slag then no no let's let's slag off oracle do you so for me i've almost predominantly
worked with um postgres uh i feel like if you don't if you need advice that's probably the
advice you will hear in the django community but if you're asking for advice you also don't really
know what you're doing so it's they're kind of all the same at the beginner level yeah i mean
so when i started it was all mysql it was just that was that was the database and so for four
five years i was running mysql all the time and then postgres came along and particularly with
when django brought in the contrib.postgres the extra fields like the json field the array field
the hdoor stuff you know there's range fields in there now there's case insensitive text fields
there's all kind of extra stuff which postgres um gave you as well as the geo django stuff which
works kind of better on postgres or postgis um postgis i ended up moving over to postgres and
for a number of years now that's been my sort of go-to option um i'm a big fan of full text
search as well that jango has integrated that postgres has had for a while yeah i'm increasingly
coming back towards um sqlite for a lot of use cases if they're read heavy and things like this
i'm just a really closet fan and not a closet fan you'll wear it proudly on the sleeve i'm a big fan
of SQLite but yeah Postgres is perhaps the beginning place to go in the Django community
at this time Adam Johnson I'm really hoping to get on he maintains a package called Django MySQL
which brings a lot of the features from that are similar to Contrib Postgres for MySQL and he'll
come and tell us why you should use that or MariaDB which is the open source equivalent or the free
software
equivalent of mysql because um some microsoft um sun or no sun owned mysql and oracle bought sun
and so with it um mysql is is owned by the oracle brand so maria db is the open is the free software
um right offshoot of that i think what oracle owns java now right or sun or one of them you know so
that's partly why java is so when sun bought i'm sorry when oracle bought sun they got java and
mysql as the yeah for the package good way to kill an open source uh community um well last
last big one i would say is uh the admin um there's multiple ways to what's called harden it
probably the biggest one is you should not run um you should change the url for your admin you can
go into your um top level urls file and do this um just make it anything other than admin because
if you were a malicious actor you could write a script that says hey whatever site slash admin
would be a django site and i will just try to brute force my way into the admin and cause all
sorts of harm yeah and if you run any web server ever and you just look at the access logs for that
you will see regulate like every hour you will see request after request for known urls and most of
Those are WordPress URLs, but also Django URLs appear in those.
And these are people running automated penetration kits, automated scripts, which find a server, attack a server, and find if it's got weaknesses.
So by renaming your admin, you can avoid most of those attacks for Django because it's not that your admin is any more secure.
It's that the automated scripts don't hit it.
Yeah. Well, I remember the first time I set up, I think it was a DigitalOcean server, and I didn't know what I was doing. And within, and whatever, I forget the lockdown steps you're supposed to take, within 90 minutes, basically bots had taken over and I got a notice from DigitalOcean saying like, your servers doing malicious things.
so it happens it's a scary place out there in the uh internet especially if you're rolling your own
server stuff yeah and this is this the key point is that these these attacks aren't somebody
picking you out they are yeah it's not personal yeah it's not fully automated and so it's not
if there is a vulnerability which your site exposes it's not a matter of if it's a matter of
when yeah and so so definitely change the admin url um there's actually um lacey williams and
Jeff Triplett have written an article on hardening your admin, which we will link to.
So that's the basic stuff.
So it sounds like a lot.
In practice, you will write scripts or you'll get used to doing this for your Django sites.
But the top ones are you got to switch to bug, keep your secret key secret, allowed
hosts, you'll need to put in wherever it is in production, static files, you'll need to
think about that, you need to choose a production database, and you should do some basic steps
around the admin.
And in addition to the check, there's also Pony Checkup, I believe, is still the site
that's run by Sasha, yeah, that you can put in the URL for your site and it will run a
bunch of automated tests to see if it's secure.
So that's a good, like, I always do that after I've gone through all these things, just as
like a triple check.
But there's also, within Django, there's a couple commands that maybe, do you want to
cover, Carlton?
So migrate, collect static.
Ah, right. Okay. So for me, right, there's a one, two, three of deployment, which you've got to do
every single time. So the first one is upload your code. You've got to get it onto the server
somehow. Now, you know, back in the day, that's our sink and a can of beer is the joke about
deploying PHP sites. But you can, what can you do? I don't know. You can clone your repository
on the server and you can get pull onto the server, which is not a bad way. As long as you
don't mess around on there and get your your um that your checkout messed up by you know getting
i think most people most companies i think do it this way they put it up on github or wherever and
then pull from there i think that's the standard approach and that's quite cool um you can extract
some kind of zip archive you can you can even set up a um a pipey icon and uh set up tools publish
it to there but that's you know yeah i mean with like heroku you you push the code so you you do
like um sort of git push organ you do git push heroku origin so that so literally you the two
step is you push it to github or bitbucket or wherever and then separately you push it up to
heroku and then it will automatically go through all the steps for each time you push new code to
it yeah and these your app service has a similar thing where you can do a push from your local
commit and yeah i think they can also pull on you know they can watch a github branch as well some
of these services do that when you push to the github branch it automatically pulls on the on
the server that's kind of cool yeah but this is just sorry to interrupt but so a big thing for
beginners is they'll say well i you know i wrote a local blog jingle blog and i put 10 entries in
there and then i put it up on my platform of service and i don't see it what up with that
yes and that's because it makes a ton of sense it's because it it just takes a while to understand
that your local database is not your production database it shouldn't be you kind of get this
drilled into you with practice but that's why you know your local and your production environments
are different but it is it is confusing and it takes a while for people to internalize that and
i don't know if you have anything to add on that but i see people do that again and again and i
certainly went through that process myself saying like oh i just my site looks how i want it to look
why does it look like that in production it's like well okay so the thing you can do here is you can
set your, you can create a settings file so you're not connecting to a local database,
that you're actually connecting to your remote database. So assuming that your local IP address
is allowing you, or you can SSH tunnel into wherever your production database is, you can
set your local install to connect to your production database. If you want to, when you're
creating a small blog like this, this kind of works. So locally, you're developing on the code,
but you're still, when you write a blog post locally, it still goes into your production
database and importantly as well your media files so you know you create a blog post and you upload
an image and that gets saved your local media file not to the one on your web server right
where's it gone and how do i sync these things uh-huh it's one thing you can do as well is if
it's read heavy you can use sqlite and you can just upload you can yeah yeah if it's just a
file into place yeah and when you want to work locally you can just download it and then you
can work on that and then you can upload it to replace it that that's kind of um poor man's
sink to yeah yeah no i yeah um it does work it does work so all right so migrate uh the second
command yeah yeah okay so the first one is upload code right and then the second one is you've got
to migrate your database um and so not if you've got a hosted you know you've run rds and you've
got a hosted postgres instance and um you've you've created some changes you've tested them
locally you've put your code up there now you've got to run migrate and so you need to do that on
your server that's connecting to your production database or again you can connect locally to
production yeah and again you'll say i ran it locally like what's going on in production yeah
you've got to migrate your production database and then the third one is collect static where
you put all the static files from your project somewhere where your web server knows how to find
them yeah and jacob talks about this but yeah the collect static command which is automatically run
on heroku and i assume other platforms takes all the static files from all over your app puts them
into one nice um place for django to refer to um that's another thing that takes take some time to
internalize how static files work within django yeah but there's a great guide and you've just
got to take your time and like all these things yeah the docs are clear once you know what you
like that's what i always find like once i understand something i go read the docs i'm like
oh like they make so much sense like i would have written them this way but when you are learning it
and when you are frustrated you know it's like these half truths and you're like ah so it's not
the doc's fault but that is the reality of django beginner it's like what we talked about in the how
to learn django episode it's like um there's the docs which are kind of like reference material
versus the tutorial you need the walkthrough yeah yeah and then first time this is my this is like
my meta understanding at this point in my career is that tutorials and
documentation are different things and should be and always will be but often you want the tutorial
when you're learning not the docs um yeah no entirely entirely which is what i'm working on
so and others so don't worry about it we'll cover we'll cover the bases actually for image stuff i
wrote a a recent tutorial on how to do image uploading or file uploading within django that
covers some of the basics on static and media files that we'll link to it gives you and often
Often the hardest thing here is if you're configuring on a web server is to configure the right directory permissions and make sure that, you know, your Django process can write to the folder and your web server can read from it.
Yeah, that's the last thing we should cover.
So, yeah, where to deploy.
So one way you were just saying is a virtual machine where Linode, DigitalOcean, I'm sure there's others we're forgetting.
But, yeah.
Yeah, all of the cloud servers offer pretty much all of these things as far as I can tell.
They all seem to offer what I'd call a hosted runtime or a platform as a service where you just push your app code and it runs it for you and you don't have to worry about it.
They all seem to offer a virtual machine solution where you can provision a virtual machine.
It's like having Ubuntu server there and you have to install the right software.
But again, you can get images, like base images, which you provision from that one and it's already got the right Python installed.
And then you just have to pip install, you know, Django or your project requirements and create a virtual environment, pip install your requirements and run it.
And it works because that base image has all the things you need to run a Django project on it.
And then they all now seem to offer a container runtime where you can push a Docker container.
And so, you know, it doesn't really matter which hosting provider I think.
Yeah, they're all, but they're all challenging and confusing.
I mean, I've only done it with a couple of them.
I understand in the abstract how it is done.
I could figure out how to do it in all the others.
But realistically speaking, you just sort of pick one.
If a beginner asked me, I would say do not go anywhere near a virtual machine.
You should do it as a learning exercise, but just use a platform as a service.
Use Docker, Azure, Python, anywhere.
Just get it up there.
The trap of virtual machines I found is that it feels like real engineering because it is, you know, DevOps is like a whole separate profession and like it's like getting gnarly and you get in there and you fix things, but it's just endless.
And your end users do not care where your site was hosted.
They just want it to work and be up.
And so unless you are at significant scale, in which case you shouldn't be the only developer, I would say don't go anywhere near this stuff, except for learning exercises worth doing.
Or if you know what you're doing, you've automated scripts, which I suspect is kind of where you're at, Carlton.
Yeah, and this is what I was going to say.
So you pick one and you learn it.
And then you make sure that your deployment to that is scriptable.
So tools here like Fabric or Ansible.
You know, Ansible is the big sort of name and that's what's built in Python.
Yeah.
But you, so you've got a deployment script.
So when you run, you know, my project deploy, Ansible playbook deploy, it uploads your code.
you know does the git pull or whatever on the server in the right place it migrates the database
it collects static it runs you know the deployment checks that you want to do it reboots your process
managers that restarts your django application the all these kind of things you know it refreshes
your ssh certificate from let's encrypt it yeah you know a script all of these bits and then you
can start to think oh you know i've got this running on app engine i could easily get this
going on you know this app service over here or this bean elastic beanstalk over here by just
changing a few bits of the script and then all of a sudden instead of being able to do it in one you
can do it in three and then you think oh i could do this with a virtual machine and yeah i can
provision a virtual machine and and you slowly increase the yeah you slide you slide down into
more and more control well and it depends how what value that has to you yeah so um tom dyson said on
the wagtail episode that you know we were talking about the price or did he say or was it in the
after chat i don't know but he was saying that you know that actually the platforms of the service
they're really quite affordable quite you know until you scale up quite high because the time
you take yes configuring virtual machine or whatever is it's like oh it'd be much cheaper
if i did it on this micro instance that only costs x dollars a month yeah but you're not counting
your hourly rate that it took to get that micro instance in the position where it could serve
those requests exactly i mean i've i've wasted weeks and weeks and weeks of my time on solo
projects or you know early stage startups fiddling around with virtual machines when
you know you know thinking yeah exactly that thinking oh well i'm saving fifty dollars a
month versus this other this platform of service meanwhile two weeks of my life have gone away
so yeah and you could that could have been two weeks of your life writing copy or writing user
interface code which actually so i see one so you should it is fun to learn how to do this stuff and
is interesting but value your time and i would say be very specific about this is a uh a learning
exercise unless you're in a big company and then you know you get paid unless your focus is down
towards that devops stuff yeah because there are different ways you can go you might be more
interested in that back-end system admin devops stuff in which case learn it because you ain't
going to get the roles that you want without without that experience but if it's not your
specialty if it's not your what they call the area of genius then head somewhere else area of
genius i'd like that yeah my wife told me about it she read some books so i'll have to find out
what the book was oh okay that's such a nice way to phrase it yeah well and i so i i know that i
am not a devops person i am a very product focused engineer if that's a term um i kind of veer more
even though i spend all this time on jango i veer much more towards the front end and i just want it
to work and talk to users and get feedback right if you imagine a continuum right yeah where like
at the top end you've got um i don't know doing the graphic design for the buttons and in the ui
that kind of stuff and at the bottom end you've got the um configuring the network layer for your
kubernetes cluster like django's sort of up the front end side of it even though it's it is a
back-end framework yeah it is there's so much gnarly stuff below to be able to serve requests
that django's actually front end yeah that's the title for the podcast django's front end
And I think, you know, in terms of just a side note on career advice, because I get emailed for career advice all the time, which is kind of hilarious to me. But I would say that it is probably much more marketable to have a strong backend knowledge, though it narrows down the number of companies you can work at, because not that many companies are at scale. However, you can spend 5-10 years, you know, learning how to do all these things that are really hard to learn otherwise, whereas, you know, CSS or JavaScript, you can do that on your own a little bit.
Yeah, but you can also spend five or 10 years
learning that stuff, which-
Oh, you can and should.
I'm just saying, maybe this is,
the bias that I see is that people respect
10 years of backend experience
more than 10 years of frontend experience.
And maybe that's just picking the wrong clients, but-
No, there is that bias.
I think it's totally misplaced
because somebody who really knows CSS
is absolutely invaluable.
And it's just as much a skill
and it's just, you know,
great experiences can't be crafted without it.
Yeah, even the most hardcore,
you know, lives in the command line
engineer, when they see a site, they can say that's an ugly site and they will implicit, you
know, implicitly judge it in some way. So anyways, um, all right, I think we covered it. Uh, it's a
complicated topic. Um, I've been spending months and months trying to figure out how to simplify
this, um, for, for my new book. So I understand the pain of, of all this, but the takeaway is
you should check the deployment checklist. You should be aware of the check flag and pick a
platform as a service if you're just starting out get it running and then be aware that there are
all these other levels and it's it is really fun and interesting to learn all this stuff but
it's deep yeah and be so you know be a on the first hand be prepared to take the time because
it is deep and you need to get it right but on the second hand be conscious of hey am i going down a
rabbit hole that i don't really need to here yeah don't spend two weeks on like you know depending
think seriously you know what what's my career what's my project what's you know is this a
benefit to me yes um great anyway that that's about all that that's about all we've got to
say about deployment i think so yeah so we will see you next week carlton i'll talk to you then
all right take care bye