WEBVTT
00:00:00.020 --> 00:00:05.400
We're sitting down with Eric Matthews, the educator, author, and developer behind Django Simple Deploy.
00:00:06.180 --> 00:00:16.900
If you've ever struggled with taking the final step of getting your Django app onto a live server without spending days wrestling with DevOps complexities, then give Django Simple Deploy a look.
00:00:17.200 --> 00:00:26.200
Eric shares how Django Simple Deploy automates away the boilerplate parts of deployment so you can focus on building features instead of deciphering endless configs.
00:00:26.780 --> 00:00:34.200
We'll talk about the new project's journey to 1.0, the range of hosting platforms it supports, and why it's not just for beginners.
00:00:34.880 --> 00:00:40.440
This is Talk Python To Me, episode 500, recorded February 20th, 2025.
00:00:42.320 --> 00:00:43.860
Are you ready for your host, please?
00:00:44.740 --> 00:00:47.680
You're listening to Michael Kennedy on Talk Python To Me.
00:00:48.220 --> 00:00:51.300
Live from Portland, Oregon, and this segment was made with Python.
00:00:54.560 --> 00:00:57.420
Welcome to Talk Python To Me, a weekly podcast on Python.
00:00:57.740 --> 00:02:00.080
This is your host, Michael Kennedy. Follow me on Mastodon where I'm @mkennedy and follow the podcast using @talkpython, both accounts over at fosstodon.org and keep up with the show and listen to over nine years of episodes at talkpython.fm. If you want to be part of our live episodes, you can find the live streams over on YouTube. Subscribe to our YouTube channel over at talkpython.fm/youtube and get notified about upcoming shows. This episode is sponsored by worth recruiting worth recruiting specializes in placing senior level python developers and data scientists let worth help you find your next python opportunity at talkpython.fm/worth Eric welcome back to talk python great to have you here nice to see you again michael nice to see you as well last time we talked about your book right and now your project your deployment project i love talking about deployment because i think it's such an enabling technology or enabling skill and your project Django Simple Deploy is certainly in that realm.
00:02:00.480 --> 00:02:03.100
Yes, I have appreciated your comments about deployment over the years.
00:02:04.100 --> 00:02:09.280
Thanks. Well, they're a hard one. My skills in deployment are a hard one.
00:02:09.800 --> 00:02:16.160
I kind of want to talk a little bit about the journey for people, but not yet.
00:02:16.520 --> 00:02:19.740
Let's get a quick introduction of who is Eric. What do you do?
00:02:20.200 --> 00:02:21.980
What's new in your life since the last time you were on the show?
00:02:22.440 --> 00:02:28.460
Oh, gosh, yeah. It's all context for this project because this project ties together a lot of the different things that I've done.
00:02:29.140 --> 00:02:33.080
Short version, I grew up in New Hampshire, moved to New York City, then moved to Alaska.
00:02:33.880 --> 00:02:36.200
Just last year, I moved to Western North Carolina.
00:02:38.019 --> 00:02:43.640
And I had a background in science. I studied physics in college and got pulled into teaching.
00:02:43.900 --> 00:03:15.280
spent a long time teaching math and science, fifth grade through twelfth grade, which was super fun because it's not at the level of undergrad or grad work, but the questions young people ask always make things interesting. And I got pulled into programming because I always did it on the side. And I kind of felt like, I always felt like at some point, I might focus more on programming and less on classroom teaching. So for the past five, six years I've been a full-time writer and programmer.
00:03:15.760 --> 00:03:24.420
It's been enjoyable. Yeah. And congrats on the move. You really like to sample different weather systems, different environments.
00:03:26.240 --> 00:03:32.360
You're going to get a different summer experience in North Carolina than you might in Alaska. I know it gets warm somewhat there, but
00:03:32.360 --> 00:03:33.220
it's warm a
00:03:33.220 --> 00:03:33.780
lot in North Carolina.
00:03:34.140 --> 00:03:37.180
Yeah. We're in the mountains, so we can have cool nights at least.
00:03:37.500 --> 00:03:41.680
Yeah. Lovely. My brother lives there and I think North Carolina is a really neat place.
00:03:41.940 --> 00:03:42.800
It is, yes.
00:03:43.060 --> 00:04:34.880
Yeah, yeah, yeah. So let's talk about this going from science to teaching to programming just a little bit, because I did a very similar journey. I think mine was accelerated in terms of its time frame, but I was in grad school. I studied math and then taught math, calculus, linear algebra, those kinds of things at universities at GTA, and then kind of got into programming as part of it. And then I'm like, wow, this is really fun. How do I, how do I do more of this? You know what I mean? And after evaluating it, just academia didn't seem like a thing I really wanted to try to chase. And so I basically, I took one or two programming classes, but otherwise, other than that, I taught myself programming a number of years ago. That is kind of scary. Last century, let's say. And I don't know, I feel totally confident about it these days, but at first it was, you know, do I belong here?
00:04:35.300 --> 00:04:35.759
All these things
00:04:35.780 --> 00:04:54.780
seem hard. What am I doing wrong? Should I have gotten a CS degree? I don't think any of those things are true. I think just, you know, as I learned hanging out with CS people, it was hard for them too. Like it's, but maybe talk a little bit about your journey, right? Because I'm sure it would be helpful to other people. There's many people out there who are doing something somewhat similar.
00:04:55.060 --> 00:05:26.140
Yeah. Questions about academia kind of steered me this way as well. I studied physics in undergrad because I started as a chemical engineer because I had a great chemistry class in high school. But I found that engineering classes felt like being taught how to solve other people's problems. And my favorite class as an undergrad or as a freshman was physics because it was the only class that really seemed about truly trying to understand the world. And I love that. So that's what led me to focus on physics. And I was going to be a particle physicist, but I did not want to
00:05:26.140 --> 00:05:26.400
be...
00:05:26.420 --> 00:05:27.500
Wanted to spend some time at sun
00:05:27.500 --> 00:05:29.740
or maybe outside of
00:05:29.740 --> 00:05:31.140
Chicago or wherever. Yeah. Okay.
00:05:31.580 --> 00:05:39.920
Yeah. And I, yeah, when I was really young, I heard about atom smashers. I thought somebody like literally had hammers where they smash atoms.
00:05:40.960 --> 00:05:42.440
So every stage,
00:05:42.920 --> 00:05:56.800
yes, every stage I learned more about it was more and more fascinating, but I didn't want to be a student forever. And so I want to do something outside of being a student before pursuing the graduate work that would get to get me to be a part of a physicist.
00:05:57.700 --> 00:06:03.260
So when I was looking what to do, I had been a tutor in undergrad, and I tutored calculus and physics.
00:06:03.780 --> 00:06:12.140
And I tutored those classes because I watched classmates start to hate math and physics because of how they were taught.
00:06:12.440 --> 00:06:13.980
And that's the only reason people hated those topics.
00:06:14.980 --> 00:06:22.460
And it was really humbling because I was 18, 19 years old and tutoring people in their 30s and 40s who were doing mid-career changes.
00:06:23.660 --> 00:06:28.520
Speak of the field, like you maybe don't necessarily belong there telling someone how to do something.
00:06:29.560 --> 00:06:32.240
But at the same time, you probably knew it really well, right?
00:06:32.960 --> 00:06:33.140
Yeah.
00:06:33.820 --> 00:06:33.880
Yeah.
00:06:34.070 --> 00:06:40.260
And I felt like I belonged, but it was really humbling as far as just sorting out like school systems and where to go.
00:06:40.680 --> 00:06:42.120
So anyway, that led me into teaching.
00:06:42.770 --> 00:06:45.900
And I thought I would just teach for a couple of years and go back to science.
00:06:46.400 --> 00:06:53.300
But I found that the challenge of reaching everybody in the classroom was as hard and as satisfying as hard science.
00:06:53.830 --> 00:06:54.800
And so I just love teaching.
00:06:55.800 --> 00:06:57.600
I love what it brings up for other people.
00:06:57.820 --> 00:06:59.540
And, yeah, it's always stayed interesting.
00:07:02.060 --> 00:07:06.960
For me, the transition into more of a focus on programming was my father died.
00:07:07.220 --> 00:07:10.920
I've told this story a few times over the years about the origin of the book Python Crash Course.
00:07:11.620 --> 00:07:13.160
But my father died in 2011.
00:07:13.550 --> 00:07:14.320
And my mom asked.
00:07:14.370 --> 00:07:15.000
He was a programmer.
00:07:15.880 --> 00:07:16.800
That's how I first learned to program.
00:07:17.180 --> 00:07:23.440
My mom asked me to go through his computer and she found all these, or she asked me to go through his computer to see if there was anything worth keeping.
00:07:24.780 --> 00:07:29.840
And there wasn't, but for me, it was a really personal experience of seeing all these projects he had started.
00:07:30.220 --> 00:07:31.140
They would never get finished.
00:07:31.620 --> 00:07:34.320
And I realized that I had a bunch of those programming projects as well.
00:07:35.300 --> 00:07:47.080
And so that kind of was a turning point for me to get me out of the practice of just building a bunch of side projects and start to focus on one or two real world projects that other people would benefit from.
00:07:47.360 --> 00:07:48.040
That's a great story.
00:07:48.520 --> 00:08:00.500
That's certainly one of the challenges of you can build a project and you can get it to run, but you're maybe halfway there, getting it out to the world in a real world sort of way.
00:08:00.820 --> 00:08:05.020
You've got all these challenges of, I need to pick a place to run my app.
00:08:05.200 --> 00:08:05.940
Wait a minute, databases?
00:08:06.660 --> 00:08:08.340
Why are these migrations so hard?
00:08:08.340 --> 00:08:08.620
How do I
00:08:08.620 --> 00:08:09.260
do migrations?
00:08:10.060 --> 00:08:12.180
I got the first one up and now I can't change it.
00:08:12.320 --> 00:08:25.560
just breaks it doesn't run anymore and you know there's just all these these aspects not even taking into account the stuff you got to add to go from a toy project to making it real logging error handling etc etc right yeah
00:08:25.560 --> 00:09:13.040
i mean this is all a good segue into the topic of today i mean django simple deployed to kind of put it out there for people who haven't heard of it um it's a um package that automates deployment uh django deployments so if your project runs locally on your computer and you get to the point where you want to make it public for other people to use if you haven't already gone through the deployment process for most people that's a cliff and they kind of just fall off i spend all this time learning django all the time building this private they really care about solves the problem does it better than other people's work because you know it's new and whatnot and then they go to deploy it and they find that they have to spend so much time reading a platform's documentation um tweaking their settings um adding this file file and then kind of crossing your fingers and hoping that it works.
00:09:14.140 --> 00:09:19.860
Every time I've gone through that process, I've kind of thought to myself, this is all just boilerplate.
00:09:20.140 --> 00:09:25.100
Like we're just being told to, everybody's being told to add the same settings, make the same modifications.
00:09:25.880 --> 00:09:27.460
And so I had that shower
00:09:27.460 --> 00:09:28.640
thought of like, automation.
00:09:29.160 --> 00:09:29.320
Yeah.
00:09:29.780 --> 00:09:29.880
Yeah.
00:09:30.280 --> 00:09:35.260
I had that shower thought of like, okay, how could we do this configuration from the Django side?
00:09:35.560 --> 00:09:35.660
So
00:09:35.660 --> 00:09:37.040
when we're just looking
00:09:37.040 --> 00:09:41.480
at the user's computer, you've got a project that's working We know it works.
00:09:42.680 --> 00:09:50.380
How can we do all the configuration automatically so that you then just push your automatically, correctly configured project to your hosting platform?
00:09:51.160 --> 00:09:52.460
So Django Simple Deploy does that.
00:09:52.640 --> 00:09:54.320
You pip install on Django Simple Deploy.
00:09:54.900 --> 00:09:57.720
You need to have a plugin for the platform that you're using.
00:09:57.940 --> 00:10:00.240
So Fly.io is a go-to example.
00:10:01.860 --> 00:10:04.200
And then you add Django Simple Deploy to installed apps.
00:10:04.670 --> 00:10:07.900
And then there's two modes for this project to work.
00:10:08.020 --> 00:10:14.620
The fully automated mode is easier to talk about because you run one command, bifimanage.py deploy --automate all.
00:10:14.890 --> 00:10:27.900
And if you do that and you have that platform CLI installed, it configures your project, makes a git commit, and pushes your project, and your project appears in a new browser window, which feels like magic.
00:10:28.860 --> 00:10:30.120
That's kind of magical, actually.
00:10:30.860 --> 00:10:31.740
Yeah, yeah.
00:10:32.180 --> 00:10:32.440
All right.
00:10:32.920 --> 00:10:36.580
So I want to talk about what platforms are supported.
00:10:36.960 --> 00:10:46.700
But before we do, maybe we could talk more broadly about just hosting platforms that you've considered, that you see out there, that people publish Django apps to, right?
00:10:47.040 --> 00:10:49.680
On one hand, we've got really, really straightforward platforms.
00:10:50.220 --> 00:10:53.620
On the other, you can get as complicated as you want, basically.
00:10:53.820 --> 00:11:03.460
You play the game of how many AWS services could you combine into one Django app, which, you know, that's kind of like the obfuscated code contest.
00:11:04.680 --> 00:11:09.040
How much can you fit under one line that's unlegible but still does the thing or whatever, right?
00:11:09.960 --> 00:11:12.720
You know, we started this with a conversation about our backgrounds.
00:11:13.270 --> 00:11:28.400
And so kind of weaving this for a little bit back into that background story, I do remember one of my transitions to doing more professional programming work was when I was teaching, I would write programs to address inefficiencies and difficulties we had in our school for our staff.
00:11:28.880 --> 00:11:36.780
And so I remember like exactly this, getting something that like automated report card generation for our staff.
00:11:36.860 --> 00:11:37.980
And I got it working on my computer.
00:11:38.020 --> 00:11:41.700
So like for me, writing report cards was so much easier than for everybody else.
00:11:42.200 --> 00:11:43.120
And so I learned Django.
00:11:43.240 --> 00:11:45.260
I'm like, cool, I can share this with everybody else.
00:11:45.820 --> 00:11:48.580
And I tried to deploy it and it just, I could not do it.
00:11:49.080 --> 00:11:50.460
It just fell
00:11:50.460 --> 00:11:50.700
apart.
00:11:51.880 --> 00:11:53.740
And I sort of figured it out.
00:11:54.080 --> 00:12:01.480
So my first deployment platform was a laptop in a closet in my school connected directly to the school network.
00:12:02.060 --> 00:12:08.500
So the deployment worked for people on our network, and it was only out of the kindness of our IT staff that would allow me to do that.
00:12:09.120 --> 00:12:11.240
Clearly not a solution for most people.
00:12:12.720 --> 00:12:16.800
It's really hard to deploy. Let me just deploy my machine to the school.
00:12:17.020 --> 00:12:17.300
Yes,
00:12:17.500 --> 00:12:18.720
yes. Update.
00:12:18.920 --> 00:12:19.120
Let me
00:12:19.120 --> 00:12:20.040
go to that closet.
00:12:21.760 --> 00:12:22.660
Yeah, yeah, yeah.
00:12:23.340 --> 00:12:24.480
I'm going to be in here for a few
00:12:24.480 --> 00:12:26.000
hours. I'm programming on the server.
00:12:26.480 --> 00:12:26.920
Yeah.
00:12:27.750 --> 00:12:42.940
So, okay, Heroku is the first one to talk about because Heroku was one of the first platforms that really automated a lot of the DevOps work and allowed us the classic sales pitch for Heroku was run and git push Heroku main and your project is live.
00:12:43.920 --> 00:12:49.140
There's always a bit more to it than that, including that configuration to make your project work on Heroku.
00:12:49.920 --> 00:12:55.380
So the platforms I start thinking about are the ones that manage the DevOps aspect for you.
00:12:56.100 --> 00:13:03.340
Heroku, Flyto.io, Platform.sh, Python Anywhere is in there.
00:13:03.840 --> 00:13:09.480
So to take a step back even further, this project started because I used Heroku for a while.
00:13:10.070 --> 00:13:17.060
In Python Crash Course, the first edition, I taught people, I walked people through deploying a Django project to Heroku.
00:13:17.520 --> 00:13:20.480
is the only part of the book that felt like I'm not really teaching anything.
00:13:20.980 --> 00:13:23.300
I'm just telling people to write certain things and add certain
00:13:23.300 --> 00:13:23.660
files.
00:13:24.180 --> 00:13:30.120
A bit of explanation about what it does, but mostly it's, you know, make these changes and cross your fingers that you type them all right.
00:13:31.779 --> 00:13:40.400
So I wrote a Heroku build pack that did the configuration automatically, but it did it on Heroku servers.
00:13:41.140 --> 00:13:42.460
So you'd specify this build pack.
00:13:42.770 --> 00:13:47.440
It would load that build pack onto Heroku servers, and then all your configuration changes would happen on their end.
00:13:48.000 --> 00:13:49.360
Tell us what is a build pack.
00:13:50.600 --> 00:13:51.640
I'm not sure that I can tell you.
00:13:52.020 --> 00:13:54.700
It's basically, I said my short
00:13:54.700 --> 00:13:54.760
take is...
00:13:54.760 --> 00:13:58.580
I'll tell you, I've never built a build pack myself, and I've deployed a lot of Python, so...
00:13:58.620 --> 00:13:58.880
Yeah,
00:14:00.260 --> 00:14:10.460
my short description is it's a set of programs, body of code that configures your project for running on that specific platform.
00:14:10.920 --> 00:14:11.360
Got it, okay.
00:14:11.820 --> 00:14:17.800
And so typically it's generic and it's not targeting, it's not trying to do any changes to your project.
00:14:19.079 --> 00:14:19.960
We won't go further.
00:14:20.340 --> 00:14:21.000
I'll say something
00:14:21.000 --> 00:14:21.200
wrong.
00:14:21.460 --> 00:14:22.140
Yeah, yeah, yeah, sounds good.
00:14:22.480 --> 00:14:25.440
But the takeaway for that is it felt like doing Heroku's work for them.
00:14:26.000 --> 00:14:30.980
And so it was nice for anybody trying to push Django to Heroku, but that boundary of like, what's our work?
00:14:31.140 --> 00:14:31.740
What's their work?
00:14:31.960 --> 00:14:33.520
Are we doing work free for them?
00:14:34.120 --> 00:14:34.900
That's an interesting question.
00:14:35.320 --> 00:14:38.440
And it really felt like it was skewed towards doing their work.
00:14:38.900 --> 00:14:39.040
Right.
00:14:39.280 --> 00:14:47.560
Well, I've done it once or twice, deployed an app to Heroku, never for real work, but to, you know, play around with it and sort of check it out.
00:14:47.720 --> 00:14:51.320
Because Heroku was definitely a darling of
00:14:51.320 --> 00:14:52.100
the
00:14:52.100 --> 00:14:56.640
Python space and certainly of the Python tutorials, right?
00:14:56.860 --> 00:14:59.520
Because for a long time, they had a free tier.
00:14:59.940 --> 00:15:00.820
And so everybody
00:15:00.820 --> 00:15:08.140
who needed to deploy something was like, here's how you put it on Heroku to sort of complete the loop and get it out there in the world, right?
00:15:09.120 --> 00:15:28.600
Right. And then, yeah, you know, a testament to Heroku is how long it has worked without a lot of attention from them. And so they lost a lot of trust in the community, not just from doing away with their free tier. It's really hard to maintain a free tier. It's just puts a big target on the platform for abuse.
00:15:29.120 --> 00:15:37.080
But it's about some reliability issues and communication issues around issues on the platform.
00:15:37.920 --> 00:15:40.000
So there was an exodus from Heroku for a while.
00:15:40.320 --> 00:15:43.920
And I was working on this automation problem for a while.
00:15:44.880 --> 00:15:52.200
And I had that shower thought of like, okay, all that work that I'm doing through the Buildpack on Heroku's end could be done through a management command with NJNGO.
00:15:52.520 --> 00:15:57.880
You can do all the changes to your project on your computer if you know what to do.
00:15:58.260 --> 00:16:03.860
So internally, Django simple deploy is just a single management command, that deploy command.
00:16:04.350 --> 00:16:09.880
And when you run that command, based on the plugin that you have installed, it knows which platform you're targeting.
00:16:10.270 --> 00:16:15.680
And then basically, I've just spent hours pouring over the documentation for a few different platforms.
00:16:16.500 --> 00:16:23.260
And so we pick up the platform that you're trying to deploy to, make all the changes necessary for a basic initial deployment to that platform.
00:16:24.160 --> 00:16:26.480
And then there's two ways you can push your project.
00:16:26.880 --> 00:16:35.420
The fully automated mode puts all those changes into a single commit, runs that platform's deploy command, and pops up your project in a new window.
00:16:35.820 --> 00:16:41.420
Yeah, and the transport mechanism is Git, right?
00:16:41.840 --> 00:16:42.780
Good question.
00:16:43.220 --> 00:16:44.040
Not necessarily.
00:16:44.880 --> 00:16:48.720
The transport mechanism is whatever that platform uses.
00:16:49.400 --> 00:16:55.620
So for Fly, Django simple deploy makes the configuration changes for your project.
00:16:56.060 --> 00:16:58.600
and then it calls the fly deploy command.
00:16:59.110 --> 00:17:03.380
So I don't even have to know what fly deploy is using behind the scenes.
00:17:04.100 --> 00:17:08.920
You have the CLI installed, simple deploy calls that deploy command.
00:17:09.680 --> 00:17:16.800
For Heroku, when it gets to that deployment stage, in the automated mode, Django simple deploy runs git push Heroku main.
00:17:17.089 --> 00:17:27.240
And so it's one of the nice things about this project, and part of the reason it has taken so long to get to 1.0 is quite adaptable to different approaches.
00:17:27.740 --> 00:17:32.100
Yeah, that's pretty wild because you're just automating the CLI for that platform, right?
00:17:32.420 --> 00:17:32.820
Right.
00:17:34.030 --> 00:17:39.660
And Chris is commenting, there should be one obvious way to deploy your Django project to a service.
00:17:40.360 --> 00:17:41.260
Yeah, he's right.
00:17:41.390 --> 00:17:48.640
The nice thing about this is Django Simple Deploy becomes this abstraction layer between your work and the platform.
00:17:49.260 --> 00:17:53.400
So it creates a nice, consistent interface for deploying to a wide range of platforms.
00:17:54.500 --> 00:18:10.660
And when a platform inevitably changes their deployment process or configuration requirements, as long as one person makes that update to the Django SEP deploy plugin, everybody else gets to just keep using that consistent interface for how you do your initial deployment,
00:18:10.890 --> 00:18:11.580
which is really,
00:18:11.780 --> 00:18:12.160
really nice.
00:18:12.640 --> 00:18:13.860
Yeah, it is really nice.
00:18:14.400 --> 00:18:14.660
You don't
00:18:14.660 --> 00:18:20.900
have to worry about all the details and also the ability to move without losing all of your expertise.
00:18:23.660 --> 00:18:26.860
This portion of Talk Python To Me is brought to you by Worth Recruiting.
00:18:27.420 --> 00:18:29.940
Are you tired of applying for jobs and never hearing back?
00:18:30.600 --> 00:18:39.100
Have you been getting the runaround or having trouble making it past the AI resume screeners that act as the new gatekeepers for your next level Python job?
00:18:39.380 --> 00:18:41.100
You should reach out to Worth Recruiting.
00:18:41.760 --> 00:18:46.080
Worth Recruiting specializes in placing senior level Python developers and data scientists.
00:18:46.820 --> 00:18:52.820
They work directly with hiring managers at startups, helping them grow their software engineering and data science teams.
00:18:53.660 --> 00:18:56.100
With Worth, it's not just connecting you with the company.
00:18:56.660 --> 00:19:01.460
It will guide you through the interview process and help make sure you're ready with their detailed preparation approach.
00:19:01.840 --> 00:19:06.560
They can even coach you on salary negotiations and other important decision-making processes.
00:19:07.360 --> 00:19:12.180
So if you're ready to see what new opportunities are out there for you, reach out to Worth Recruiting.
00:19:12.600 --> 00:19:18.320
Let them be your partner and specialist to find the right Python developer or data scientist position for you.
00:19:18.780 --> 00:19:23.160
Fill out their short contact form at talkpython.fm/worth.
00:19:23.580 --> 00:19:24.360
It only takes a minute.
00:19:24.940 --> 00:19:27.360
That's talkpython.fm/worth.
00:19:27.800 --> 00:19:29.760
The link is in your podcast player's show notes.
00:19:30.280 --> 00:19:32.260
Thank you to Worth Recruiting for supporting the show.
00:19:33.820 --> 00:19:41.600
This is where it gets really fun to talk about this project because, you know, people think when people first hear about this project, they think it's just for beginners.
00:19:42.320 --> 00:19:44.120
It's just for people who already know deployment.
00:19:46.120 --> 00:19:47.660
But where is I going with that?
00:19:48.640 --> 00:19:55.660
Oh, so thinking about writers, authors, myself first, but content creators, tutorial writers, presenters.
00:19:56.540 --> 00:20:12.940
If you're wanting to include deployment as part of your process that you're teaching people, then a lot of people have chosen not to do that because as soon as you include deployment, you're now tied to that platform's stability.
00:20:13.520 --> 00:20:16.920
As soon as they change their process, you've got to update your materials or it's broken.
00:20:17.000 --> 00:20:18.920
and that's not appealing.
00:20:19.480 --> 00:20:31.720
So for somebody who uses Django Simply Deploy in their tutorial, again, as long as one of us keeps the plugin updated to work on that platform, your learning resources stays the same.
00:20:31.900 --> 00:20:32.720
That is really nice.
00:20:33.020 --> 00:20:33.300
And whether
00:20:33.300 --> 00:20:33.500
you're
00:20:33.500 --> 00:20:38.020
teaching a college class or you're just writing something for your blog, it is really nice.
00:20:38.880 --> 00:20:40.520
Yeah, and I think about the Django Girls workshops.
00:20:41.080 --> 00:20:46.860
And so part of that, the goal of that conclusion of deploying your project is just to see a live.
00:20:47.020 --> 00:20:48.540
Like, why are we doing this if we can't see a line?
00:20:49.120 --> 00:20:52.440
You don't necessarily want to spend a whole bunch of time focused on deployment.
00:20:52.710 --> 00:20:56.120
And so if you can kind of really crunch that into like, okay, we're going to run these commands.
00:20:57.040 --> 00:20:58.000
We have a working deployment.
00:20:58.580 --> 00:21:00.700
It's not about hiding deployment from people.
00:21:01.160 --> 00:21:06.600
Because one of the coolest parts of this project is that it contains all those configuration changes in a single Git commit.
00:21:07.520 --> 00:21:11.080
Is there a verbose mode where you get to show all the little steps it's doing and stuff?
00:21:11.440 --> 00:21:14.860
Yeah, it is verbose by default.
00:21:15.160 --> 00:21:26.780
So you get to basically it streams and dumps all the platform's output as it's deploying, which is kind of important because if you don't do that, you just see this blank screen for two, three, seven
00:21:26.780 --> 00:21:27.000
minutes.
00:21:27.040 --> 00:21:28.160
Yeah, it's just sitting there spinning.
00:21:28.980 --> 00:21:29.260
Yeah.
00:21:31.040 --> 00:21:32.720
But to slow this down, take a step back for a minute.
00:21:33.100 --> 00:21:37.340
I've mentioned the automated mode where you include this stash-tash automate all.
00:21:37.820 --> 00:21:42.440
That's easiest to talk about because it boils down this deployment process to three steps.
00:21:43.180 --> 00:21:52.940
I don't actually recommend that for most people because it makes a Git commit for you, runs a deploy command, and maybe you want to have a little more control about that process.
00:21:53.860 --> 00:22:01.580
There's a configuration-only mode, which is every bit as helpful, but it lets you kind of take a little more control.
00:22:01.880 --> 00:22:10.520
And so what you do for most platforms, you have to create a resource, basically a deployed project, an empty project on that platform, and then you run deploy.
00:22:11.960 --> 00:22:20.480
And Django Simple Deploy recognizes the resource you just created on that platform, configures your project, and then it stops.
00:22:21.000 --> 00:22:27.180
And so you now have a configured project, and you can run git diff, and you get to see all the configuration
00:22:27.180 --> 00:22:28.000
changes
00:22:28.000 --> 00:22:29.100
that were made on your behalf.
00:22:30.180 --> 00:22:31.320
So you don't have to just trust it.
00:22:32.140 --> 00:22:32.880
Yeah, yeah.
00:22:33.420 --> 00:22:39.780
So when I shared this on the Django Discord yesterday, somebody was excited about it, and then I said something about that commit that was made.
00:22:40.160 --> 00:22:41.660
And they said, oh, it makes commits for you.
00:22:41.900 --> 00:22:43.160
I'm not sure I want to use that.
00:22:43.510 --> 00:22:43.860
Is it okay?
00:22:43.970 --> 00:22:47.640
You can do the longer mode where you get to review that.
00:22:48.740 --> 00:22:52.140
And then you can see all the files that were created for that platform.
00:22:52.640 --> 00:22:55.600
You can see the settings changes that were made to make your project work.
00:22:56.400 --> 00:22:58.560
And then you can choose to make that commit.
00:22:58.850 --> 00:23:00.940
You can choose to push it or revert it.
00:23:01.380 --> 00:23:05.220
Even if you use the automated mode, it's still all the configuration is one commit.
00:23:05.550 --> 00:23:08.600
And so you can just revert that commit and you're right back to your project.
00:23:09.120 --> 00:23:10.500
I'll throw one more piece in there right away.
00:23:10.960 --> 00:23:15.800
one of the priorities of the project is that it does not change the local behavior of your project.
00:23:16.180 --> 00:23:31.800
And so when I run the test suite, it tests that all the configuration changes are correct for the target platform, but it also runs run server again locally and makes sure that we haven't impacted the local running of your project.
00:23:32.260 --> 00:23:35.780
Oh, interesting. It'll run it to make sure it basically starts. Nice.
00:23:36.200 --> 00:23:44.300
Yeah, you know, this automated versus config sort of deal, it reminds me a little bit of how maybe DBAs feel about ORMs.
00:23:45.300 --> 00:23:50.160
You know, like they're like, oh, you can't just let it run arbitrary queries against my database.
00:23:50.600 --> 00:23:52.420
Like, how do we know it's doing the right thing?
00:23:52.540 --> 00:23:54.840
I'm sure you feel that way for a while.
00:23:55.660 --> 00:23:58.580
But eventually, all right, we've reviewed them.
00:23:58.920 --> 00:23:59.660
They're fine, right?
00:23:59.840 --> 00:24:02.640
So maybe this config thing you do a couple of times, you're like,
00:24:02.740 --> 00:24:03.260
yeah, that's
00:24:03.260 --> 00:24:03.980
what I would do anyway.
00:24:04.720 --> 00:24:05.540
Just run it, right?
00:24:05.940 --> 00:24:06.580
Because what
00:24:06.580 --> 00:24:07.100
else are you going to do?
00:24:07.240 --> 00:24:13.600
You're probably going to create a script that does the things you expect it to do anyway for yourself as a bash script or something, right?
00:24:13.660 --> 00:24:15.200
And so might as well be a Python script.
00:24:15.560 --> 00:24:15.840
Yeah.
00:24:15.980 --> 00:24:20.440
I mean, it's funny hearing you talk about this because this project started as a pile of bash scripts.
00:24:20.900 --> 00:24:21.340
And so,
00:24:21.540 --> 00:24:22.560
yeah.
00:24:22.760 --> 00:24:24.380
I got a pile of bash scripts on my server.
00:24:24.460 --> 00:24:24.940
They do things.
00:24:25.580 --> 00:24:25.660
Yeah.
00:24:25.900 --> 00:24:32.820
One of the pre-1.0 tasks was a long issue that was just about converting all these shell scripts to Python.
00:24:33.560 --> 00:24:36.660
And mostly that was about creating, making this work cross-platform.
00:24:37.140 --> 00:24:39.980
So it's basically taken me like four years to get this to 1.0.
00:24:40.290 --> 00:24:45.120
And it's that 80-20 principle turned into like 595 principle.
00:24:49.380 --> 00:24:58.220
So another reason, so a good thing to kind of move into, another reason it took so long to get to 1.0 was originally this was all one library.
00:24:58.640 --> 00:24:59.960
So it was just Django simple deploy.
00:25:00.440 --> 00:25:05.100
And originally you would run managed.py deploy --platform by.io.
00:25:06.020 --> 00:25:10.660
And so the entire project contained all the code for all the different platforms.
00:25:12.300 --> 00:25:17.100
And that felt better than the original project just targeting Heroku because you have choice.
00:25:17.500 --> 00:25:19.180
But it felt like a nightmare for maintenance.
00:25:19.880 --> 00:25:26.680
Anytime any project changes, it's going to need an update and it's just going to grow exponentially.
00:25:27.300 --> 00:25:29.900
Yeah, it becomes combinatorially complex in
00:25:29.900 --> 00:25:31.280
terms of dependencies, which
00:25:31.280 --> 00:25:33.940
is not a good order of magnitude.
00:25:35.480 --> 00:25:36.220
It's not good.
00:25:36.840 --> 00:25:37.060
Yeah.
00:25:37.550 --> 00:25:45.840
So I had some people kind of very kindheartedly nudging me towards just doing a 1.0 release to get over that fear of a 1.0 release.
00:25:46.760 --> 00:25:54.220
But it was always about having – I had a vision that the mature version of this project should be plug-in based.
00:25:54.820 --> 00:25:57.820
So the core project, Django Simple Deploy, is small.
00:25:58.620 --> 00:25:59.520
It's platform agnostic.
00:25:59.960 --> 00:26:05.500
All it does is inspect your project, inspect your system, and then hand out the rest of the work to a plugin.
00:26:05.810 --> 00:26:11.460
And so currently there's a plugin targeting apply.io, plugin for platform.sh, platform for Heroku.
00:26:12.220 --> 00:26:18.920
I have a proof of concept plugin for CodeRed, and I'm working on a proof of concept for DigitalOcean.
00:26:20.860 --> 00:26:23.000
Yeah, so many cool things to talk about with this.
00:26:23.540 --> 00:26:23.620
Yeah,
00:26:23.880 --> 00:26:23.980
yeah.
00:26:24.200 --> 00:26:32.380
Before we go, I do want to maybe just go through some of these hosts and let you talk about maybe why they're included.
00:26:32.840 --> 00:26:35.840
Which ones are, there's stuff out there, obviously, that's not included.
00:26:35.920 --> 00:26:36.760
Why is it not included?
00:26:37.220 --> 00:26:42.360
So Heroku, obvious, especially when you started, when they had the free tier and stuff like that.
00:26:43.220 --> 00:26:45.480
I kind of want to get them, I know people are angry at them.
00:26:45.780 --> 00:26:46.440
I understand that.
00:26:46.500 --> 00:26:59.860
But also, I kind of want to give them a little bit of a pass, like offering free hosting to the world where people just put up malware and other badness and use the trust of your domain to sort of leverage that, it's challenging.
00:27:00.200 --> 00:27:01.220
And I don't know.
00:27:01.890 --> 00:27:04.480
I understand people are frustrated with them, but that's tough.
00:27:05.340 --> 00:27:12.200
So Heroku, platform as a service, you push your stuff up, you say, here's my code, here's how you start it, run it for me, please.
00:27:12.660 --> 00:27:13.520
There's not a lot of Linux.
00:27:13.960 --> 00:27:15.820
There's not a lot of shell, right?
00:27:15.920 --> 00:27:17.220
They kind of take care of that for you, yes?
00:27:17.360 --> 00:27:17.800
They do.
00:27:18.040 --> 00:27:19.240
And there's still, yeah.
00:27:20.220 --> 00:27:27.140
I've had conversations with people who, with founders of a number of these platforms over the years, because it's always interesting to talk about this.
00:27:28.130 --> 00:27:31.380
And platforms would love to see an easier way to deploy Django projects.
00:27:32.740 --> 00:27:38.900
One of those founders said something really insightful at one point, and I appreciated the honesty, is that we're all trying to be second best for beginners.
00:27:39.880 --> 00:27:45.200
Because if you draw that crowd, you're drawing more support than benefit in the short term.
00:27:45.950 --> 00:27:49.100
And so, yeah, for a long time, Foroku paid that cost.
00:27:49.580 --> 00:27:51.440
they were willing to be the go-to for everybody.
00:27:51.960 --> 00:27:54.800
So there's still a lot of projects running long-term on Heroku.
00:27:55.120 --> 00:27:57.200
I know some important Python ones that are there.
00:27:57.600 --> 00:27:57.700
Yeah.
00:27:57.890 --> 00:27:58.040
Yeah.
00:27:58.560 --> 00:27:58.680
Okay.
00:27:58.900 --> 00:28:02.680
And then we got fly.io and platform.sh.
00:28:03.260 --> 00:28:04.360
What's the story of these?
00:28:05.300 --> 00:28:06.480
Honestly, I haven't used either of them.
00:28:06.720 --> 00:28:07.360
I've heard of them.
00:28:07.360 --> 00:28:07.900
I haven't used them.
00:28:08.120 --> 00:28:14.280
So the selling point for fly.io is they're an edge-based platform.
00:28:14.840 --> 00:28:15.040
And so
00:28:15.040 --> 00:28:17.220
they take your,
00:28:17.620 --> 00:28:24.920
if I'm saying this right, They take your project and they push your application code to a bunch of different nodes.
00:28:25.430 --> 00:28:26.180
And so your code
00:28:26.180 --> 00:28:26.300
is...
00:28:26.320 --> 00:28:27.400
Kind of like a CDN, right?
00:28:28.260 --> 00:28:30.180
Yeah, CDN for your application code.
00:28:30.430 --> 00:28:30.760
And so your
00:28:30.760 --> 00:28:31.440
code is right
00:28:31.440 --> 00:28:32.780
close to your end users.
00:28:33.430 --> 00:28:38.700
And so I don't need it, but they've built it well enough that I can just push a project there and it works.
00:28:39.280 --> 00:28:43.140
And I'm a big fan of, you know, if your project does what you need it to, is it a good question?
00:28:43.240 --> 00:28:43.760
Is it good enough?
00:28:43.930 --> 00:28:46.000
And so it's been good enough for me for a lot.
00:28:46.320 --> 00:28:49.340
And I know it's targeting some more complex use cases.
00:28:50.000 --> 00:28:50.400
I
00:28:50.400 --> 00:28:51.100
have so many questions.
00:28:52.600 --> 00:28:53.280
It's so interesting.
00:28:53.740 --> 00:28:56.880
Well, the first thing that comes to mind is what about databases, right?
00:28:57.220 --> 00:29:05.240
If your app is running, yeah, you've got to have some way to correlate and centralize and make the currency of the database and all that work, yeah.
00:29:05.480 --> 00:29:08.780
They've had some fantastic people working for them, and they have some fantastic blog posts.
00:29:09.160 --> 00:29:15.200
So they've done really interesting cutting-edge work around distributed SQLite.
00:29:16.080 --> 00:29:20.700
databases. And so, yeah, they are quite familiar with that question and they
00:29:20.700 --> 00:29:22.020
have answered
00:29:22.020 --> 00:29:24.140
it well and they are answering it well.
00:29:24.320 --> 00:29:31.540
If you can answer that question well, then you can get some stuff that flies, you know? I mean, I guess, hence the name. I didn't even do that on purpose.
00:29:32.240 --> 00:29:45.700
I've been using bunny.net, which is a really nice CDN platform, but just for static content, not for application code that talks to the database.
00:29:46.020 --> 00:29:59.960
And I understand how you would replicate the database, but the challenge is if you have chatty rights, all of a sudden you're pushing your database away from your app, which has its own sort of latency and stuff.
00:30:00.100 --> 00:30:01.140
But what an interesting idea.
00:30:01.460 --> 00:30:03.620
Okay, and Platform.sh?
00:30:03.960 --> 00:30:12.340
Platform.sh started as a PHP, I believe, started as a PHP-only platform, but then expanded to support other languages.
00:30:12.900 --> 00:30:16.280
And so they have been sponsors of DjangoCon for a long time.
00:30:17.260 --> 00:30:20.040
And I really enjoy working with their platform.
00:30:21.260 --> 00:30:22.120
Deployment is pretty straightforward.
00:30:23.380 --> 00:30:32.080
And then, you know, one of the things I look for in these platform as a service is, so once you push it, I'm very happy to have them managing the DevOps work.
00:30:32.360 --> 00:30:35.860
I also want to be able to like get into the server and run commands and see what's going on.
00:30:36.160 --> 00:30:37.940
And so they make it easy to do that.
00:30:38.400 --> 00:30:46.240
Yeah, if things are not starting or they're crashing or something, sometimes just go, just 30 seconds at a glance at the log file or something.
00:30:46.480 --> 00:30:49.360
Oh, yeah, or maybe why is that file?
00:30:49.550 --> 00:30:50.440
That file is actually missing.
00:30:50.690 --> 00:30:51.240
Oh, that's weird.
00:30:51.360 --> 00:30:52.320
Let me see if I can just get that.
00:30:52.320 --> 00:30:55.420
And then you're back to like, okay, back to platform as a service, and you're good, you know?
00:30:55.720 --> 00:31:02.260
Yeah, and that's, you know, platform as a service certainly works for people who know nothing about, you know, hopping into a server and running commands.
00:31:03.200 --> 00:31:05.680
But they're also for, like, people who know how to do that and don't want to do that.
00:31:05.980 --> 00:31:21.100
And so a service like platform.sh that makes it easy to do both is also, I see it as an onboarding for people who have something worth deploying, don't know DevOps yet, but letting them hop in and start to do that is pretty interesting.
00:31:21.440 --> 00:31:22.360
Yeah, it's very interesting.
00:31:22.760 --> 00:31:32.500
Okay, so I can run Python manage.py deploy --automate all, and that will take my app and put it into whatever destination you pick, right, of those three.
00:31:32.640 --> 00:31:36.140
For these platforms as a service, a lot of times you have to have a database.
00:31:36.750 --> 00:31:43.700
Sometimes that's a managed Postgres or whatever you might have data that has to import initially.
00:31:44.070 --> 00:31:48.560
You know, you're like, well, here's all the counties in the United States and we have to query them for stuff.
00:31:48.610 --> 00:31:50.000
So we preload that at first.
00:31:50.140 --> 00:31:53.040
How does all that get connected and happen, right?
00:31:53.200 --> 00:31:58.740
If I had like no database and I just have a pure Django app that just runs Python, easy.
00:31:58.800 --> 00:32:03.900
I see how this works, but there's settings and stuff here that vary by production versus dev.
00:32:04.220 --> 00:32:05.200
Yeah, fun question.
00:32:06.440 --> 00:32:10.180
So I've done most of the development work on Django Simple Deploy.
00:32:10.700 --> 00:32:13.840
I've actually run sprints at several PyCons and several Django Cons.
00:32:14.540 --> 00:32:18.540
And this project has brought together like 8 to 15 people at each sprint.
00:32:19.220 --> 00:32:19.980
It draws some interest.
00:32:20.480 --> 00:32:23.720
And so the project would not be where it is without those contributions.
00:32:24.340 --> 00:32:33.660
A lot of those people have made some contributions and not done a whole lot outside of the conferences, but that whole group of people has been available to just bounce ideas off of.
00:32:34.250 --> 00:32:44.040
And so a lot of the pre-1.0 work was also like me getting rid of all the baggage that just kind of only made sense to me, or you really need to have years of contact with the project to make sense of it.
00:32:44.700 --> 00:32:48.780
And so now it's at a place where the structure is pretty consistent.
00:32:49.180 --> 00:32:57.560
And so one of the things I'm looking forward to is somebody else who knows Fly.io managing the Fly.io plugin more than me.
00:32:57.840 --> 00:33:01.120
And so they don't need to go deal with Chango Simple Deploy.
00:33:01.620 --> 00:33:05.420
They can focus on the parts of the script that do the things you were just talking about.
00:33:06.080 --> 00:33:09.160
So all the configuration has been largely my choice.
00:33:09.660 --> 00:33:16.160
You know, okay, on Heroku, we'll choose this Postgres instance because it's cheaper, because it lets people get started.
00:33:17.340 --> 00:33:28.080
It's possible for somebody to either take the Heroku plugin and add a few more CLI flags to give you a bit more choice, or just write your own Heroku plugin.
00:33:28.350 --> 00:33:33.240
And so right now the plugin for Heroku is dsd-heroku.
00:33:33.640 --> 00:33:42.260
Somebody else could do like DSD Heroku-large, and it's meant for scaling large or deploying large-scale Heroku projects.
00:33:43.620 --> 00:33:45.580
And so that's not a, I don't want to do that work.
00:33:45.850 --> 00:33:46.680
They should write their own.
00:33:46.880 --> 00:33:50.420
That's if you have a use case that you know well, you want to automate.
00:33:51.480 --> 00:34:00.600
Simple Deploy just becomes this, again, abstraction layer for, you know, you have a consistent interface for running that deployment from within Django.
00:34:00.900 --> 00:34:04.480
Yeah, there's a nice plugin model, which really opens things up.
00:34:04.670 --> 00:34:14.280
I suppose the short answer is probably, well, the Django ORM will create the database structure for you if you could just tell it where the database is, right?
00:34:14.580 --> 00:34:14.700
Right.
00:34:15.200 --> 00:34:24.460
And I know certain apps I've built, if they have data that has to be preloaded, I'll just have a little check like, hey, has this table got any data in it?
00:34:24.590 --> 00:34:27.540
If not, run the load up the database the first time.
00:34:27.980 --> 00:34:29.940
Otherwise, assume it's all good and keep going.
00:34:30.639 --> 00:34:31.679
that pretty much handles it?
00:34:31.980 --> 00:34:34.899
I think, you know, it's kind of two directions I'll take this.
00:34:35.379 --> 00:34:40.300
You know, a short list of the projects I've done over the years, they tend to be smaller, but they tend to be impactful.
00:34:40.820 --> 00:34:44.899
So one project, automated report cards for students.
00:34:45.460 --> 00:34:52.179
I used to work with struggling students, students who were plenty smart, but life had happened and they had gotten off track with school.
00:34:52.530 --> 00:34:57.760
And so they just had holes in their, in their graduation requirements.
00:34:58.440 --> 00:35:02.280
And so those students wanted to graduate, but they didn't know where to focus their efforts.
00:35:02.670 --> 00:35:07.540
And so looking at a transcript was really hard because it's just a bunch of letters and numbers.
00:35:08.660 --> 00:35:13.020
So I wrote a program that automated a generation of visual transcripts.
00:35:13.280 --> 00:35:17.060
So I'd read their text-based transcript and then give them basically a chart, a bunch of gauges.
00:35:17.540 --> 00:35:21.320
You just look at it in 30 seconds, know which classes you needed to focus on.
00:35:22.880 --> 00:35:25.260
And it also went from deficiencies to strengths.
00:35:25.800 --> 00:35:29.760
So traditionally, we talked to students who are struggling and saying, you need to do this, you need to do that.
00:35:30.400 --> 00:35:34.400
You could see where they needed to do their work, but you could also see where they had been shining.
00:35:34.690 --> 00:35:35.640
You could see where the strengths were.
00:35:36.500 --> 00:35:38.180
And so I wrote a project.
00:35:38.270 --> 00:35:39.240
I worked with whale researchers.
00:35:39.859 --> 00:35:41.220
And people don't know this.
00:35:41.860 --> 00:35:46.500
Sperm whales have learned to pick the fish off of – I'll take a step back.
00:35:47.060 --> 00:35:57.600
People catch halibut, fish for halibut by putting literally miles long cables on the ocean floor or lines with a hook every six to 10 feet.
00:35:57.900 --> 00:36:01.380
And so you put a thousand hooks on the ocean floor, leave it overnight or pull it.
00:36:01.620 --> 00:36:02.720
And that's how you catch halibut.
00:36:04.380 --> 00:36:12.860
And sperm whales have learned to listen for the sound of the transmission changes when somebody puts their boat into gear to pull those hooks.
00:36:13.400 --> 00:36:16.120
They swim towards that sound and they just pick the fish off those lines.
00:36:16.620 --> 00:36:16.860
Wow.
00:36:17.200 --> 00:36:26.160
And so these researchers were starting to put transponders on boats that would allow anybody who saw a sperm whale to report that.
00:36:26.280 --> 00:36:30.340
And then you could kind of time your fishing sets to be away from the sperm whales.
00:36:31.140 --> 00:36:35.840
And so I wrote a project that just like these researchers didn't know how to get their data from one place to another.
00:36:36.140 --> 00:36:43.260
And so I just wrote a small Django project that listened for that data and gave them a visible place where they could go to it and share it.
00:36:45.460 --> 00:36:53.420
And one other, oh, I lived in Southeast Alaska, and we were having increasing landslides, more frequent landslides, and more impactful.
00:36:54.520 --> 00:37:02.280
And so I wrote a small project that examines real-time stream gauge data and turns that into a measure of landslide risk.
00:37:03.480 --> 00:37:05.600
And they gave a talk about that last year at PyCon.
00:37:06.390 --> 00:37:07.640
All those projects are small.
00:37:07.760 --> 00:37:09.500
They're never going to scale to millions of users.
00:37:10.040 --> 00:37:10.780
They all need a database.
00:37:11.390 --> 00:37:14.900
And so they all fit this model of something like I personally would build.
00:37:15.200 --> 00:37:18.360
And if I didn't know deployment, those would not have ended up being useful.
00:37:18.940 --> 00:37:24.160
And so this tool takes all those people out there right now who are getting the skills to build something that works locally.
00:37:24.350 --> 00:37:29.900
And they don't have to go through that three weeks to three months of learning how to deploy things.
00:37:30.840 --> 00:37:35.600
So I appreciate you bringing up the questions of what happens with these larger scale projects.
00:37:36.130 --> 00:37:42.460
But there's also a whole class before you even get there of projects that would make the world better if they could be easily deployed.
00:37:43.540 --> 00:37:50.460
Such a challenge because if you go down the, there's so many paths that people get led down that are not good paths.
00:37:50.810 --> 00:37:52.540
You know, it's sort of the architectural equivalent.
00:37:52.630 --> 00:37:58.480
I guess even just the DevOps equivalent of you're not Microsoft, you're not Google, you're not Netflix.
00:37:59.120 --> 00:38:02.480
You probably don't need the chaos monkey running around your whale research project.
00:38:03.080 --> 00:38:03.680
Right, right.
00:38:04.000 --> 00:38:11.400
But people read that and they're like, well, I saw a really awesome conference talk and people loved it about how they had like geo-replication of their database and stuff.
00:38:11.400 --> 00:38:11.660
You're like,
00:38:11.740 --> 00:38:12.060
yes.
00:38:12.780 --> 00:38:13.020
Interesting.
00:38:13.480 --> 00:38:13.900
not for you.
00:38:14.120 --> 00:38:19.820
So the other direction that's interesting to finish out this discussion, so I'm targeting a VPS right now.
00:38:20.140 --> 00:38:24.800
I have deployed a Django project to DigitalOcean just on the bare VPS.
00:38:25.620 --> 00:38:32.060
For people less familiar with that virtual private server, it's basically a brand new virtual Linux machine that you can push your project to.
00:38:33.640 --> 00:38:53.020
And so this is more complicated because rather than just like making a few configuration changes to your project and then running a platform's deploy command, you have to do that whole update the server, install Django, set up a Git push if you want to do that approach, make the right port changes and whatnot, expose that.
00:38:54.480 --> 00:38:57.440
So it's more work for me to get that proof of concept done.
00:38:57.880 --> 00:39:05.040
But once it's done, the work I'm doing to write a plugin for DigitalOcean would work just as well for Hetzner, just as well for Linode.
00:39:05.940 --> 00:39:10.440
And then it opens up to all the different approaches that people take to deployment.
00:39:11.120 --> 00:39:14.080
One of the interesting questions about Django Simple Deploy is what are the boundaries?
00:39:14.490 --> 00:39:15.260
So what is simple?
00:39:16.540 --> 00:39:19.500
And I don't know the answer to that yet.
00:39:19.730 --> 00:39:21.120
It shouldn't become tube loaded.
00:39:21.470 --> 00:39:25.700
It shouldn't re-implement the entire CLI for a platform.
00:39:26.940 --> 00:39:28.960
But the bounds are pretty large.
00:39:29.480 --> 00:39:36.280
So you could have a DigitalOcean that targets NGINX Benicorn.
00:39:36.620 --> 00:39:39.640
You could have one that targets using the Doku approach.
00:39:40.180 --> 00:39:42.900
You could have one that targets external databases.
00:39:43.700 --> 00:39:49.940
There's really, it's a pretty open platform for automating deployment processes.
00:39:51.120 --> 00:39:51.920
Yeah, absolutely.
00:39:52.220 --> 00:39:52.520
Lots of people.
00:39:53.080 --> 00:40:02.400
I mean, once you knock out one of those virtual servers, it's really, really close to seeing, well, anything that can run a Linux VM pretty much can do it.
00:40:02.640 --> 00:40:03.680
And you were talking about Nginx.
00:40:03.920 --> 00:40:06.240
You know, you might, I don't know, have you considered Caddy?
00:40:06.600 --> 00:40:07.260
CaddyServer.com?
00:40:07.860 --> 00:40:11.180
As I was saying Nginx, I was like, oh, wait, there's another one that I should be saying.
00:40:11.600 --> 00:40:17.980
Well, I use Nginx for all of my stuff because it's gotten over the years, gotten more and more complicated.
00:40:18.620 --> 00:40:26.960
However, you've got to run, you've got to independently manage Let's Encrypt, and there's this sort of scaling up process.
00:40:27.260 --> 00:40:34.060
First, you've got to put the non-encrypted version up, so that cert bot and all the Let's Encrypt stuff can find it.
00:40:34.060 --> 00:40:36.760
Then you create the SSL certificate.
00:40:36.840 --> 00:40:45.600
Then you change the configuration again, because it won't run saying it's SSL until it actually has this, like there's this scaffolding step that's always messy.
00:40:45.740 --> 00:40:56.800
And if I think like easy getting started for people, Caddy, which manages the security and all that and has a real simple configuration language, it seems like it might be a good option.
00:40:56.970 --> 00:40:59.220
And it has 62,000 GitHub stars.
00:40:59.440 --> 00:41:02.360
It's, I think a person or two uses it, you know?
00:41:02.540 --> 00:41:03.080
That's kind of neat.
00:41:03.300 --> 00:41:11.900
Yeah, last week, before I started the DigitalOcean plugin, I asked on Mastodon how people are deploying to VPS these days.
00:41:13.200 --> 00:41:14.620
And Cady was one of the things that came up.
00:41:14.670 --> 00:41:17.540
It was super interesting to see the range of approaches that people are using.
00:41:18.580 --> 00:41:27.580
So, you know, as I go through this, I'm kind of asking the question for basic initial deployment for somebody new to this platform, what are some sane choices?
00:41:28.640 --> 00:41:31.980
So Cady or Nginx, Postgres or SQLite.
00:41:32.470 --> 00:41:33.380
So I'll make those choices.
00:41:34.120 --> 00:41:40.100
And one of the open questions that I don't have clear answers to is, you know, where are the boundaries around those plugins?
00:41:41.260 --> 00:41:47.600
So I'll certainly implement a --DB flag that lets you choose like Postgres or SQLite.
00:41:48.370 --> 00:41:52.740
But I don't want to do a flag for like --approach, daku, whatnot.
00:41:53.220 --> 00:42:00.020
At some point, it makes more sense to have other people write other plugins and just foster that plugin ecosystem.
00:42:00.220 --> 00:42:00.740
so
00:42:00.740 --> 00:43:02.620
another consideration and kim out in the audience was hinting at this before and it's certainly the way that i'm doing things these days is docker so let me just give you an example like yeah you can go all in and you could run on like the doc like eks and all these kinds of things you can go way way deep on it or you can just do stuff as simple as like hey i want i want the front end web server to be caddy i could install caddy on the server using apt or whatever but then you those kind of update more slowly, you have less control over it. You could just as equally well run a catty Docker image on that machine and have basically a zero touch experience on the server itself, other than just having a Docker thing there, right? And you can do whatever you want to that Docker image. You could even have a catty Django simple deployed one based off their original one or, you know, things like that where you've got it exactly configured. What's the story with Docker? And how have you been thinking about that? Because once you start to go to virtual or you start to get into some of these processes and some of these ideas?
00:43:03.000 --> 00:43:04.340
Yeah, great question.
00:43:04.980 --> 00:43:06.280
And it certainly has come up multiple times.
00:43:06.880 --> 00:43:13.940
My main experience with Docker is working with Fly because Fly is a Docker-based approach.
00:43:15.080 --> 00:43:18.740
I have not written my own Docker files, but I have learned about them.
00:43:19.540 --> 00:43:27.420
And so short answer, Docker is an approach to deployment, and there's nothing stopping anybody from writing a plugin that has a Docker-based approach.
00:43:28.480 --> 00:43:32.160
this kind of gets back to the question of like what's next
00:43:33.060 --> 00:43:33.360
yeah
00:43:34.500 --> 00:44:08.500
I'm going to finish the plugin for a proof of concept plugin for DigitalOcean I'll take it to the 1.0 version of that approach so people can reliably deploy to DigitalOcean with a particular articulated approach it'll probably be catty choice of SQLite or Progres Whereas, and then I'm probably like, my best approach is probably to back off of writing more plugins because I could spend the next few years just enjoyably exploring all these platforms and approaches.
00:44:09.540 --> 00:44:24.140
But I really should back off, just continue to let people know the project exists, make sure these set of plugins that I've started continue to work, and then just continue to tighten up the internals so that it's easier and easier for other people to write plugins.
00:44:24.640 --> 00:44:31.160
I can already tell from the way you're talking, like you could, I have a DSD plugin template repository.
00:44:31.640 --> 00:44:33.840
It's in the Django Simple Deploy organization.
00:44:34.480 --> 00:44:37.480
And so if you want to write a plugin, you don't start from scratch.
00:44:37.840 --> 00:44:43.040
You download that repository for the DSD plugin template.
00:44:43.340 --> 00:44:45.680
You don't clone it because there's no upstream for it.
00:44:46.020 --> 00:44:52.460
Download it, install it alongside Simple Deploy in development mode, and you can run tests right away.
00:44:52.940 --> 00:44:55.140
So you run an integration test and it just verifies it.
00:44:55.620 --> 00:44:56.460
It gives you a couple of questions.
00:44:56.620 --> 00:44:57.340
What's the name of your platform?
00:44:57.680 --> 00:44:59.720
What's the command you want people to use?
00:45:00.860 --> 00:45:01.940
Do you support automate all?
00:45:02.500 --> 00:45:07.880
And then it writes a new plugin for you with all the plumbing there.
00:45:08.280 --> 00:45:13.120
You run tests, verify that it works, and then you start writing your platform-specific code.
00:45:13.410 --> 00:45:17.240
And so there's a bit of a learning curve for developers where you got to learn, like, what...
00:45:17.960 --> 00:45:21.520
You know, Django's node deploy has a module called plugin utils.
00:45:22.060 --> 00:45:26.420
And so that's how you write output in a way that's consistent with the rest of the project, feeds into its logging.
00:45:27.420 --> 00:45:31.580
There's a run quick command for small changes you're making to the project.
00:45:32.040 --> 00:45:37.320
There's a run slow command for things like deploy to make sure we're capturing output, streaming it, whatnot.
00:45:37.900 --> 00:45:47.360
So you learn those utilities, but you pretty quickly get to a place where you're just focusing on your expertise or opinion about how to approach deployment for a particular platform.
00:45:47.760 --> 00:45:50.960
Yeah. Okay. I'm sure there's a ton out there.
00:45:51.120 --> 00:45:53.680
People can be like, well, what about my platform, right?
00:45:53.840 --> 00:45:59.720
You know, I'm sure there's some folks who are experts at wherever they're deploying their code that could maybe come and create a plugin, right?
00:46:00.000 --> 00:46:00.260
Absolutely.
00:46:00.760 --> 00:46:08.140
And somebody tried to write in support for Google.
00:46:08.840 --> 00:46:09.240
What was it?
00:46:09.460 --> 00:46:09.900
Google Cloud?
00:46:10.260 --> 00:46:11.000
Yeah, Google.
00:46:11.360 --> 00:46:11.760
Yeah, GCP.
00:46:12.060 --> 00:46:12.520
Google Cloud.
00:46:13.160 --> 00:46:13.660
A couple years
00:46:13.660 --> 00:46:13.940
ago.
00:46:15.180 --> 00:46:17.000
But that was back when there was no plugin system.
00:46:17.480 --> 00:46:23.180
And so it got bogged down in just like all the back and forth between core and that platform.
00:46:24.020 --> 00:46:29.840
These days, that person could just download that plugin template and start focusing on the platform.
00:46:30.160 --> 00:46:30.640
Yeah, awesome.
00:46:31.040 --> 00:46:33.940
I'm sure that there's people out there thinking, hey, we could do this for Azure.
00:46:34.240 --> 00:46:35.080
Hey, we could do this for
00:46:35.080 --> 00:46:35.880
AWS as
00:46:35.880 --> 00:46:36.440
well, right?
00:46:36.720 --> 00:46:45.560
You know, I'm really blown away about how many people choose the hyperscale clouds, given how complicated and expensive they are.
00:46:45.860 --> 00:46:48.260
There was some stat in one of the recent surveys.
00:46:48.510 --> 00:46:53.620
I don't know if it was the ESF chip brains one or just a more general developer one.
00:46:54.100 --> 00:46:54.740
Anyway, it doesn't matter.
00:46:54.990 --> 00:47:02.140
One of the bigger surveys, 75, 78% of the people used either Azure, AWS, or GCP.
00:47:02.660 --> 00:47:09.000
And I look at those, I'm like, geez, I don't think 75% of the apps out there need the stuff that those are offering.
00:47:09.300 --> 00:47:11.800
And it's so, so much more expensive.
00:47:11.940 --> 00:47:18.000
I don't think people fully understand how much more expensive it is to get like a VM on one versus the other.
00:47:18.360 --> 00:47:23.180
I did some, I think, you know, it always depends on which one you pick or something.
00:47:23.440 --> 00:47:35.960
But for a $20 Hetzner server, it's, I think, $60 on DigitalOcean, $200 something dollars on AWS, and I think pushing up towards $300 for Azure.
00:47:36.580 --> 00:47:39.980
And what you get when you go up to these prices, you don't get a better experience.
00:47:40.140 --> 00:47:45.980
you get a worse one because all the complexity, all the stuff that you got to deal with, it's not like, well, just here's your server, go with it.
00:47:46.060 --> 00:47:46.540
Like, oh, no, no.
00:47:46.660 --> 00:47:48.300
There's all these other things you got to bring in.
00:47:48.680 --> 00:47:52.220
And it just, it super surprises me that that's the case.
00:47:52.330 --> 00:47:53.580
And so, yeah, I don't know.
00:47:54.020 --> 00:47:54.300
Yeah.
00:47:54.460 --> 00:47:57.940
I built working support for Azure early on.
00:47:58.280 --> 00:48:03.200
My goal, you know, I worked for Vork originally, then I made it work for one other platform, which was Fly.
00:48:03.520 --> 00:48:04.200
Like, okay, cool.
00:48:04.300 --> 00:48:05.340
This isn't tied to one platform.
00:48:06.020 --> 00:48:07.500
And then the rule of three, I did a platform in a stage.
00:48:07.690 --> 00:48:09.980
Like, okay, now I've gotten all the generalities out.
00:48:11.200 --> 00:48:21.260
moving over to VPS as opposed to platform as a service opens up a few new things, but I can put those in internally without making breaking changes in the project.
00:48:22.160 --> 00:48:33.600
Yeah. And Azure does have a platform as a service offering, for example. I'm not, I think, I'm sure AWS does as well, although I haven't tried to try to use it. Yeah. So, I mean, they're analogies. I don't know.
00:48:34.460 --> 00:48:37.180
Well, I also focused on Heroku.
00:48:37.200 --> 00:48:40.720
One of the things for Heroku is it's one of the fastest deployments I've used.
00:48:41.620 --> 00:48:42.720
It kind of got a dialed.
00:48:44.120 --> 00:48:48.360
Azure was taking like 10 or 15 minutes, so it was hard to do development work against that.
00:48:49.480 --> 00:48:51.780
Kim posted this interesting question or comment.
00:48:52.040 --> 00:48:54.640
The various deployment mechanisms presumably all need credentials.
00:48:55.260 --> 00:48:57.080
Are these provided as NV variables?
00:48:57.780 --> 00:49:00.080
Many beginners perhaps don't know what has to do with these.
00:49:00.540 --> 00:49:01.340
This project may help.
00:49:01.780 --> 00:49:02.480
I agree completely.
00:49:03.440 --> 00:49:10.040
So this project is like I'm approaching VPS credentials around SSH as ENV variables.
00:49:10.720 --> 00:49:11.680
That's what I've used in the past.
00:49:12.900 --> 00:49:19.700
ENV variables being files that have basically key values that you don't put into Git, but you create on the platform, right?
00:49:19.720 --> 00:49:20.240
Something like that?
00:49:20.460 --> 00:49:20.720
Yeah.
00:49:20.920 --> 00:49:30.820
And so the quick start guide will say like export these two environment variables, you know, your IP address and your host password, maybe a username if you've already created a non-root user.
00:49:31.540 --> 00:49:38.580
But it goes through and it basically, if you don't give it a username, it tries the default Django user username and it goes through root and whatnot.
00:49:41.140 --> 00:49:46.220
It's a little humbling to make these plugins because it shows you exactly where my current knowledge is at.
00:49:47.120 --> 00:49:48.620
But it's also a starting place that works.
00:49:49.120 --> 00:49:52.560
And so if somebody looks at this and says like, hey, you really shouldn't be using the NB variables.
00:49:52.940 --> 00:49:55.180
Here's the current best way to deal with credentials.
00:49:55.700 --> 00:50:23.860
we can write that into the plugin and as kim is pointing out it steers all beginners all people from that point forward um into that better usage and it also comes back to that idea that this isn't just for beginners think about all the people out there who are using the inv variables because that's what they learned and maybe if there's something better and the latest version of the plugin steers them towards that as well i've often found there are things that are good for beginners that end up being really helpful for everybody else as well um and this project feels like one of those.
00:50:24.280 --> 00:50:28.540
That's very cool. Certainly making your life easier. Everybody wants that, right? Yeah.
00:50:28.740 --> 00:50:48.260
Automated a lot of things. Okay. Well, I mean, I'll throw one more thought out there. Like as you're working on the server, the virtual server side of things, I think there's a lot of opportunity to leverage Docker to say like, if you could build an image that is 90% the way there, you could just say, run this Docker image, run this Docker container based on this image.
00:50:48.640 --> 00:50:53.720
And what, it doesn't even matter what server it's on. I think there's, I think there's some interesting stuff you could do with docker here but
00:50:53.720 --> 00:50:55.720
oh absolutely yes i'll
00:50:55.720 --> 00:51:11.440
let you go down that path but i i certainly have enjoyed it um yeah so what's next what do you have to you this is by the way i don't know if we called it out that way this is kind of the 1.0 you mentioned it in passing but this is the 1.0 milestone sort of thing right
00:51:11.440 --> 00:51:21.960
yeah the 1.0 for this is really about like people should be able to trust that it's reliable from this point forward it does work works on all three OSs for the officially supported plugins.
00:51:23.260 --> 00:51:35.820
I'm going to try to keep a list of plugins that I'm aware of that are being worked on and sort out that whole, you know, how do you manage an ecosystem? But, you know, I've also thought of this as like a gift to the Django community.
00:51:36.500 --> 00:51:39.760
I wanted to release 1.0 on Christmas. I couldn't quite get there.
00:51:41.340 --> 00:51:46.060
You know, if you listen to Django chat, when the word deployment comes up, there's always this Corona.
00:51:46.100 --> 00:51:46.440
of oh
00:51:46.440 --> 00:51:52.000
um and i've been there for 20 years excited as well over he loves it yes um
00:51:52.000 --> 00:52:22.560
but so this problem has been in jango in the jango world for 20 years how do we deal with the fact that it's hard to deploy jango harder than php harder than some other things and i really think this project kind of answers that question or goes a long way towards entering it um and there's a there are people in the django community who have been kind of cheerleading this project for a while um because if they've seen it i've announced it in public i've kind of done the development in public and at django cons whatnot
00:52:22.560 --> 00:52:25.340
yeah so awesome i'm gonna
00:52:25.340 --> 00:52:33.440
i'm gonna step back from creating more plugins i'm gonna continue to refine the internals and i'm gonna go back to my own like actual django projects you're
00:52:33.440 --> 00:52:44.940
gonna use it rather than build it yes yes you know that's the way to do it you know Well, I think one of the bits of magic of Python and why it's so popular is it's very welcoming to beginners, right?
00:52:45.740 --> 00:52:50.840
People coming from science, like we talked about, or other things, they kind of get sucked in and they're like, huh, it's nice here.
00:52:50.960 --> 00:52:51.340
Maybe I'll stay.
00:52:51.840 --> 00:52:56.840
And, you know, these kind of things sort of tell that same story for web developers, right?
00:52:57.160 --> 00:53:01.020
There might be a point where people outgrow this or they don't, but they might.
00:53:01.360 --> 00:53:13.280
But it might have gotten them that year's worth of experience running a server or running a platform as a service app and dealing with all of that so that they're then ready to take whatever next step that needs to be taken, if it needs to.
00:53:13.540 --> 00:53:18.200
Yeah, it really smooths out that learning process because you just described it.
00:53:18.740 --> 00:53:20.180
Python's welcoming people to learn Python.
00:53:20.880 --> 00:53:22.580
They say, oh, I want a web front end for this.
00:53:23.160 --> 00:53:29.860
Going back to my father not releasing his projects, he was a software developer in the 70s and 80s.
00:53:30.680 --> 00:53:38.300
And so for him, deployment was, I need to make my project so good, it can be printed to like 10,000 physical copies.
00:53:39.980 --> 00:53:43.380
So it's no fault to him for having those unreleased projects.
00:53:44.600 --> 00:53:48.680
So the pathway these days is people learn Python, say, okay, I'm solving my problem with Python.
00:53:48.960 --> 00:53:51.360
I want a web front end so other people can access it.
00:53:51.680 --> 00:53:53.340
They learn Django because they already know Python.
00:53:53.940 --> 00:53:54.620
That's all smooth.
00:53:55.140 --> 00:53:57.800
Django is a bit hard, but you can learn it if you know Python.
00:53:58.520 --> 00:54:03.000
And then they get to deployment and it's this entirely different class of things to learn.
00:54:03.440 --> 00:54:04.860
And that's where that cliff comes in.
00:54:05.220 --> 00:54:09.320
And so simple deploy tends to smooth out that.
00:54:09.540 --> 00:54:10.680
It basically removes that cliff.
00:54:11.030 --> 00:54:13.280
And so you go right from where you are.
00:54:13.660 --> 00:54:15.320
I have a project working on my system.
00:54:15.840 --> 00:54:17.320
Now it's working on a remote server.
00:54:17.760 --> 00:54:27.300
I don't fully understand it, but it's much easier to poke around at the working deployment than poke around at something that you're trying to do that's broken and people end up giving up.
00:54:28.080 --> 00:54:29.620
I'm excited about like, yeah,
00:54:30.060 --> 00:54:32.220
I'm excited about like opening that pathway for people.
00:54:32.500 --> 00:54:33.160
Yeah, absolutely.
00:54:33.400 --> 00:54:33.660
That's awesome.
00:54:33.960 --> 00:54:34.400
Nice work.
00:54:34.480 --> 00:54:35.340
And thanks for doing it.
00:54:35.400 --> 00:54:52.500
There's already so much to learn to build a web app to even go from, I know Python to a web app because CSS databases, you know, HTML, JavaScript, there's already enough that you don't need to throw Linux and CDNs and all that at people at the same time, right?
00:54:52.580 --> 00:54:56.200
Let them go across the chasm and they'll figure it out on the other side.
00:54:56.480 --> 00:54:56.620
All right.
00:54:57.040 --> 00:54:58.300
Well, thanks for this project.
00:54:58.920 --> 00:54:59.880
Maybe final call to action.
00:55:00.060 --> 00:55:00.860
People want to get started with it.
00:55:00.880 --> 00:55:01.300
What do you tell them?
00:55:02.020 --> 00:55:02.860
Go take a look at the docs.
00:55:03.160 --> 00:55:06.080
There's friendly quick start docs, show you how it's used.
00:55:06.240 --> 00:55:10.840
And there's pretty comprehensive contributing docs if you're curious to write a plugin or how about otherwise?
00:55:11.500 --> 00:55:13.460
Yeah, I guess let's close it out with this.
00:55:13.780 --> 00:55:20.200
If you got a platform out there, if you're somebody like fly.io, but a different, consider creating one of these plugins.
00:55:20.440 --> 00:55:21.900
It blows my mind, Eric.
00:55:22.080 --> 00:55:25.020
I don't know how you feel, but there'll be some major, major service.
00:55:25.640 --> 00:55:30.820
And you'll go there and they're like, well, you can use our JavaScript API or you can just write it from scratch.
00:55:31.520 --> 00:55:31.940
Like how
00:55:31.940 --> 00:55:37.760
much effort is it for one of these companies to spend a week, create a package for their thing and make it go?
00:55:37.780 --> 00:55:48.560
And I think, you know, a sort of a similar call to action, like, hey, if you want to make it real easy for people to just switch to your platform, you know, consider following the steps that you talked about to build a plugin for this, right?
00:55:48.940 --> 00:55:49.040
Yeah.
00:55:49.340 --> 00:55:49.400
Yeah.
00:55:49.500 --> 00:55:52.640
And for anybody getting, anybody interested in writing a plugin, feel free to reach out.
00:55:52.800 --> 00:55:55.660
I'm happy to make sure that works first time people do it.
00:55:55.940 --> 00:55:56.420
Yeah, absolutely.
00:55:56.760 --> 00:55:56.920
All right.
00:55:57.240 --> 00:55:58.100
Thanks for being here again.
00:55:58.400 --> 00:55:58.660
Talk to you
00:55:58.660 --> 00:55:58.780
later.
00:55:58.820 --> 00:55:59.120
Thank you, Michael.
00:55:59.680 --> 00:56:00.080
Bye.
00:56:00.640 --> 00:56:00.820
Bye.
00:56:01.600 --> 00:56:04.320
This has been another episode of Talk Python To Me.
00:56:05.060 --> 00:56:06.020
Thank you to our sponsors.
00:56:06.480 --> 00:56:07.720
Be sure to check out what they're offering.
00:56:07.880 --> 00:56:09.140
It really helps support the show.
00:56:10.100 --> 00:56:12.580
This episode is sponsored by Worth Recruiting.
00:56:13.180 --> 00:56:17.560
Worth Recruiting specializes in placing senior level Python developers and data scientists.
00:56:18.200 --> 00:56:22.960
Let Worth help you find your next Python opportunity at talkpython.fm/worth.
00:56:23.720 --> 00:56:24.600
Want to level up your Python?
00:56:25.060 --> 00:56:28.700
We have one of the largest catalogs of Python video courses over at Talk Python.
00:56:29.180 --> 00:56:33.860
Our content ranges from true beginners to deeply advanced topics like memory and async.
00:56:34.300 --> 00:56:36.480
And best of all, there's not a subscription in sight.
00:56:37.000 --> 00:56:39.400
Check it out for yourself at training.talkpython.fm.
00:56:40.120 --> 00:56:44.280
Be sure to subscribe to the show, open your favorite podcast app, and search for Python.
00:56:44.720 --> 00:56:45.600
We should be right at the top.
00:56:46.000 --> 00:56:54.960
You can also find the iTunes feed at /itunes, the Google Play feed at /play, and the direct RSS feed at /rss on talkpython.fm.
00:56:55.640 --> 00:56:57.880
We're live streaming most of our recordings these days.
00:56:58.240 --> 00:57:05.720
If you want to be part of the show and have your comments featured on the air, be sure to subscribe to our YouTube channel at talkpython.fm/youtube.
00:57:06.740 --> 00:57:07.860
This is your host, Michael Kennedy.
00:57:08.280 --> 00:57:09.120
Thanks so much for listening.
00:57:09.280 --> 00:57:10.280
I really appreciate it.
00:57:10.620 --> 00:57:12.220
Now get out there and write some Python code.
00:00:00.020 --> 00:00:05.400
We're sitting down with Eric Matthews, the educator, author, and developer behind Django Simple Deploy.
00:00:06.180 --> 00:00:16.900
If you've ever struggled with taking the final step of getting your Django app onto a live server without spending days wrestling with DevOps complexities, then give Django Simple Deploy a look.
00:00:17.200 --> 00:00:26.200
Eric shares how Django Simple Deploy automates away the boilerplate parts of deployment so you can focus on building features instead of deciphering endless configs.
00:00:26.780 --> 00:00:34.200
We'll talk about the new project's journey to 1.0, the range of hosting platforms it supports, and why it's not just for beginners.
00:00:34.880 --> 00:00:40.440
This is Talk Python To Me, episode 500, recorded February 20th, 2025.
00:00:42.320 --> 00:00:43.860
Are you ready for your host, please?
00:00:44.740 --> 00:00:47.680
You're listening to Michael Kennedy on Talk Python To Me.
00:00:48.220 --> 00:00:51.300
Live from Portland, Oregon, and this segment was made with Python.
00:00:54.560 --> 00:00:57.420
Welcome to Talk Python To Me, a weekly podcast on Python.
00:00:57.740 --> 00:02:00.080
This is your host, Michael Kennedy. Follow me on Mastodon where I'm @mkennedy and follow the podcast using @talkpython, both accounts over at fosstodon.org and keep up with the show and listen to over nine years of episodes at talkpython.fm. If you want to be part of our live episodes, you can find the live streams over on YouTube. Subscribe to our YouTube channel over at talkpython.fm/youtube and get notified about upcoming shows. This episode is sponsored by worth recruiting worth recruiting specializes in placing senior level python developers and data scientists let worth help you find your next python opportunity at talkpython.fm/worth Eric welcome back to talk python great to have you here nice to see you again michael nice to see you as well last time we talked about your book right and now your project your deployment project i love talking about deployment because i think it's such an enabling technology or enabling skill and your project Django Simple Deploy is certainly in that realm.
00:02:00.480 --> 00:02:03.100
Yes, I have appreciated your comments about deployment over the years.
00:02:04.100 --> 00:02:09.280
Thanks. Well, they're a hard one. My skills in deployment are a hard one.
00:02:09.800 --> 00:02:16.160
I kind of want to talk a little bit about the journey for people, but not yet.
00:02:16.520 --> 00:02:19.740
Let's get a quick introduction of who is Eric. What do you do?
00:02:20.200 --> 00:02:21.980
What's new in your life since the last time you were on the show?
00:02:22.440 --> 00:02:28.460
Oh, gosh, yeah. It's all context for this project because this project ties together a lot of the different things that I've done.
00:02:29.140 --> 00:02:33.080
Short version, I grew up in New Hampshire, moved to New York City, then moved to Alaska.
00:02:33.880 --> 00:02:36.200
Just last year, I moved to Western North Carolina.
00:02:38.019 --> 00:02:43.640
And I had a background in science. I studied physics in college and got pulled into teaching.
00:02:43.900 --> 00:03:15.280
spent a long time teaching math and science, fifth grade through twelfth grade, which was super fun because it's not at the level of undergrad or grad work, but the questions young people ask always make things interesting. And I got pulled into programming because I always did it on the side. And I kind of felt like, I always felt like at some point, I might focus more on programming and less on classroom teaching. So for the past five, six years I've been a full-time writer and programmer.
00:03:15.760 --> 00:03:24.420
It's been enjoyable. Yeah. And congrats on the move. You really like to sample different weather systems, different environments.
00:03:26.240 --> 00:03:32.360
You're going to get a different summer experience in North Carolina than you might in Alaska. I know it gets warm somewhat there, but
00:03:32.360 --> 00:03:33.220
it's warm a
00:03:33.220 --> 00:03:33.780
lot in North Carolina.
00:03:34.140 --> 00:03:37.180
Yeah. We're in the mountains, so we can have cool nights at least.
00:03:37.500 --> 00:03:41.680
Yeah. Lovely. My brother lives there and I think North Carolina is a really neat place.
00:03:41.940 --> 00:03:42.800
It is, yes.
00:03:43.060 --> 00:04:34.880
Yeah, yeah, yeah. So let's talk about this going from science to teaching to programming just a little bit, because I did a very similar journey. I think mine was accelerated in terms of its time frame, but I was in grad school. I studied math and then taught math, calculus, linear algebra, those kinds of things at universities at GTA, and then kind of got into programming as part of it. And then I'm like, wow, this is really fun. How do I, how do I do more of this? You know what I mean? And after evaluating it, just academia didn't seem like a thing I really wanted to try to chase. And so I basically, I took one or two programming classes, but otherwise, other than that, I taught myself programming a number of years ago. That is kind of scary. Last century, let's say. And I don't know, I feel totally confident about it these days, but at first it was, you know, do I belong here?
00:04:35.300 --> 00:04:35.759
All these things
00:04:35.780 --> 00:04:54.780
seem hard. What am I doing wrong? Should I have gotten a CS degree? I don't think any of those things are true. I think just, you know, as I learned hanging out with CS people, it was hard for them too. Like it's, but maybe talk a little bit about your journey, right? Because I'm sure it would be helpful to other people. There's many people out there who are doing something somewhat similar.
00:04:55.060 --> 00:05:26.140
Yeah. Questions about academia kind of steered me this way as well. I studied physics in undergrad because I started as a chemical engineer because I had a great chemistry class in high school. But I found that engineering classes felt like being taught how to solve other people's problems. And my favorite class as an undergrad or as a freshman was physics because it was the only class that really seemed about truly trying to understand the world. And I love that. So that's what led me to focus on physics. And I was going to be a particle physicist, but I did not want to
00:05:26.140 --> 00:05:26.400
be...
00:05:26.420 --> 00:05:27.500
Wanted to spend some time at sun
00:05:27.500 --> 00:05:29.740
or maybe outside of
00:05:29.740 --> 00:05:31.140
Chicago or wherever. Yeah. Okay.
00:05:31.580 --> 00:05:39.920
Yeah. And I, yeah, when I was really young, I heard about atom smashers. I thought somebody like literally had hammers where they smash atoms.
00:05:40.960 --> 00:05:42.440
So every stage,
00:05:42.920 --> 00:05:56.800
yes, every stage I learned more about it was more and more fascinating, but I didn't want to be a student forever. And so I want to do something outside of being a student before pursuing the graduate work that would get to get me to be a part of a physicist.
00:05:57.700 --> 00:06:03.260
So when I was looking what to do, I had been a tutor in undergrad, and I tutored calculus and physics.
00:06:03.780 --> 00:06:12.140
And I tutored those classes because I watched classmates start to hate math and physics because of how they were taught.
00:06:12.440 --> 00:06:13.980
And that's the only reason people hated those topics.
00:06:14.980 --> 00:06:22.460
And it was really humbling because I was 18, 19 years old and tutoring people in their 30s and 40s who were doing mid-career changes.
00:06:23.660 --> 00:06:28.520
Speak of the field, like you maybe don't necessarily belong there telling someone how to do something.
00:06:29.560 --> 00:06:32.240
But at the same time, you probably knew it really well, right?
00:06:32.960 --> 00:06:33.140
Yeah.
00:06:33.820 --> 00:06:33.880
Yeah.
00:06:34.070 --> 00:06:40.260
And I felt like I belonged, but it was really humbling as far as just sorting out like school systems and where to go.
00:06:40.680 --> 00:06:42.120
So anyway, that led me into teaching.
00:06:42.770 --> 00:06:45.900
And I thought I would just teach for a couple of years and go back to science.
00:06:46.400 --> 00:06:53.300
But I found that the challenge of reaching everybody in the classroom was as hard and as satisfying as hard science.
00:06:53.830 --> 00:06:54.800
And so I just love teaching.
00:06:55.800 --> 00:06:57.600
I love what it brings up for other people.
00:06:57.820 --> 00:06:59.540
And, yeah, it's always stayed interesting.
00:07:02.060 --> 00:07:06.960
For me, the transition into more of a focus on programming was my father died.
00:07:07.220 --> 00:07:10.920
I've told this story a few times over the years about the origin of the book Python Crash Course.
00:07:11.620 --> 00:07:13.160
But my father died in 2011.
00:07:13.550 --> 00:07:14.320
And my mom asked.
00:07:14.370 --> 00:07:15.000
He was a programmer.
00:07:15.880 --> 00:07:16.800
That's how I first learned to program.
00:07:17.180 --> 00:07:23.440
My mom asked me to go through his computer and she found all these, or she asked me to go through his computer to see if there was anything worth keeping.
00:07:24.780 --> 00:07:29.840
And there wasn't, but for me, it was a really personal experience of seeing all these projects he had started.
00:07:30.220 --> 00:07:31.140
They would never get finished.
00:07:31.620 --> 00:07:34.320
And I realized that I had a bunch of those programming projects as well.
00:07:35.300 --> 00:07:47.080
And so that kind of was a turning point for me to get me out of the practice of just building a bunch of side projects and start to focus on one or two real world projects that other people would benefit from.
00:07:47.360 --> 00:07:48.040
That's a great story.
00:07:48.520 --> 00:08:00.500
That's certainly one of the challenges of you can build a project and you can get it to run, but you're maybe halfway there, getting it out to the world in a real world sort of way.
00:08:00.820 --> 00:08:05.020
You've got all these challenges of, I need to pick a place to run my app.
00:08:05.200 --> 00:08:05.940
Wait a minute, databases?
00:08:06.660 --> 00:08:08.340
Why are these migrations so hard?
00:08:08.340 --> 00:08:08.620
How do I
00:08:08.620 --> 00:08:09.260
do migrations?
00:08:10.060 --> 00:08:12.180
I got the first one up and now I can't change it.
00:08:12.320 --> 00:08:25.560
just breaks it doesn't run anymore and you know there's just all these these aspects not even taking into account the stuff you got to add to go from a toy project to making it real logging error handling etc etc right yeah
00:08:25.560 --> 00:09:13.040
i mean this is all a good segue into the topic of today i mean django simple deployed to kind of put it out there for people who haven't heard of it um it's a um package that automates deployment uh django deployments so if your project runs locally on your computer and you get to the point where you want to make it public for other people to use if you haven't already gone through the deployment process for most people that's a cliff and they kind of just fall off i spend all this time learning django all the time building this private they really care about solves the problem does it better than other people's work because you know it's new and whatnot and then they go to deploy it and they find that they have to spend so much time reading a platform's documentation um tweaking their settings um adding this file file and then kind of crossing your fingers and hoping that it works.
00:09:14.140 --> 00:09:19.860
Every time I've gone through that process, I've kind of thought to myself, this is all just boilerplate.
00:09:20.140 --> 00:09:25.100
Like we're just being told to, everybody's being told to add the same settings, make the same modifications.
00:09:25.880 --> 00:09:27.460
And so I had that shower
00:09:27.460 --> 00:09:28.640
thought of like, automation.
00:09:29.160 --> 00:09:29.320
Yeah.
00:09:29.780 --> 00:09:29.880
Yeah.
00:09:30.280 --> 00:09:35.260
I had that shower thought of like, okay, how could we do this configuration from the Django side?
00:09:35.560 --> 00:09:35.660
So
00:09:35.660 --> 00:09:37.040
when we're just looking
00:09:37.040 --> 00:09:41.480
at the user's computer, you've got a project that's working We know it works.
00:09:42.680 --> 00:09:50.380
How can we do all the configuration automatically so that you then just push your automatically, correctly configured project to your hosting platform?
00:09:51.160 --> 00:09:52.460
So Django Simple Deploy does that.
00:09:52.640 --> 00:09:54.320
You pip install on Django Simple Deploy.
00:09:54.900 --> 00:09:57.720
You need to have a plugin for the platform that you're using.
00:09:57.940 --> 00:10:00.240
So Fly.io is a go-to example.
00:10:01.860 --> 00:10:04.200
And then you add Django Simple Deploy to installed apps.
00:10:04.670 --> 00:10:07.900
And then there's two modes for this project to work.
00:10:08.020 --> 00:10:14.620
The fully automated mode is easier to talk about because you run one command, bifimanage.py deploy --automate all.
00:10:14.890 --> 00:10:27.900
And if you do that and you have that platform CLI installed, it configures your project, makes a git commit, and pushes your project, and your project appears in a new browser window, which feels like magic.
00:10:28.860 --> 00:10:30.120
That's kind of magical, actually.
00:10:30.860 --> 00:10:31.740
Yeah, yeah.
00:10:32.180 --> 00:10:32.440
All right.
00:10:32.920 --> 00:10:36.580
So I want to talk about what platforms are supported.
00:10:36.960 --> 00:10:46.700
But before we do, maybe we could talk more broadly about just hosting platforms that you've considered, that you see out there, that people publish Django apps to, right?
00:10:47.040 --> 00:10:49.680
On one hand, we've got really, really straightforward platforms.
00:10:50.220 --> 00:10:53.620
On the other, you can get as complicated as you want, basically.
00:10:53.820 --> 00:11:03.460
You play the game of how many AWS services could you combine into one Django app, which, you know, that's kind of like the obfuscated code contest.
00:11:04.680 --> 00:11:09.040
How much can you fit under one line that's unlegible but still does the thing or whatever, right?
00:11:09.960 --> 00:11:12.720
You know, we started this with a conversation about our backgrounds.
00:11:13.270 --> 00:11:28.400
And so kind of weaving this for a little bit back into that background story, I do remember one of my transitions to doing more professional programming work was when I was teaching, I would write programs to address inefficiencies and difficulties we had in our school for our staff.
00:11:28.880 --> 00:11:36.780
And so I remember like exactly this, getting something that like automated report card generation for our staff.
00:11:36.860 --> 00:11:37.980
And I got it working on my computer.
00:11:38.020 --> 00:11:41.700
So like for me, writing report cards was so much easier than for everybody else.
00:11:42.200 --> 00:11:43.120
And so I learned Django.
00:11:43.240 --> 00:11:45.260
I'm like, cool, I can share this with everybody else.
00:11:45.820 --> 00:11:48.580
And I tried to deploy it and it just, I could not do it.
00:11:49.080 --> 00:11:50.460
It just fell
00:11:50.460 --> 00:11:50.700
apart.
00:11:51.880 --> 00:11:53.740
And I sort of figured it out.
00:11:54.080 --> 00:12:01.480
So my first deployment platform was a laptop in a closet in my school connected directly to the school network.
00:12:02.060 --> 00:12:08.500
So the deployment worked for people on our network, and it was only out of the kindness of our IT staff that would allow me to do that.
00:12:09.120 --> 00:12:11.240
Clearly not a solution for most people.
00:12:12.720 --> 00:12:16.800
It's really hard to deploy. Let me just deploy my machine to the school.
00:12:17.020 --> 00:12:17.300
Yes,
00:12:17.500 --> 00:12:18.720
yes. Update.
00:12:18.920 --> 00:12:19.120
Let me
00:12:19.120 --> 00:12:20.040
go to that closet.
00:12:21.760 --> 00:12:22.660
Yeah, yeah, yeah.
00:12:23.340 --> 00:12:24.480
I'm going to be in here for a few
00:12:24.480 --> 00:12:26.000
hours. I'm programming on the server.
00:12:26.480 --> 00:12:26.920
Yeah.
00:12:27.750 --> 00:12:42.940
So, okay, Heroku is the first one to talk about because Heroku was one of the first platforms that really automated a lot of the DevOps work and allowed us the classic sales pitch for Heroku was run and git push Heroku main and your project is live.
00:12:43.920 --> 00:12:49.140
There's always a bit more to it than that, including that configuration to make your project work on Heroku.
00:12:49.920 --> 00:12:55.380
So the platforms I start thinking about are the ones that manage the DevOps aspect for you.
00:12:56.100 --> 00:13:03.340
Heroku, Flyto.io, Platform.sh, Python Anywhere is in there.
00:13:03.840 --> 00:13:09.480
So to take a step back even further, this project started because I used Heroku for a while.
00:13:10.070 --> 00:13:17.060
In Python Crash Course, the first edition, I taught people, I walked people through deploying a Django project to Heroku.
00:13:17.520 --> 00:13:20.480
is the only part of the book that felt like I'm not really teaching anything.
00:13:20.980 --> 00:13:23.300
I'm just telling people to write certain things and add certain
00:13:23.300 --> 00:13:23.660
files.
00:13:24.180 --> 00:13:30.120
A bit of explanation about what it does, but mostly it's, you know, make these changes and cross your fingers that you type them all right.
00:13:31.779 --> 00:13:40.400
So I wrote a Heroku build pack that did the configuration automatically, but it did it on Heroku servers.
00:13:41.140 --> 00:13:42.460
So you'd specify this build pack.
00:13:42.770 --> 00:13:47.440
It would load that build pack onto Heroku servers, and then all your configuration changes would happen on their end.
00:13:48.000 --> 00:13:49.360
Tell us what is a build pack.
00:13:50.600 --> 00:13:51.640
I'm not sure that I can tell you.
00:13:52.020 --> 00:13:54.700
It's basically, I said my short
00:13:54.700 --> 00:13:54.760
take is...
00:13:54.760 --> 00:13:58.580
I'll tell you, I've never built a build pack myself, and I've deployed a lot of Python, so...
00:13:58.620 --> 00:13:58.880
Yeah,
00:14:00.260 --> 00:14:10.460
my short description is it's a set of programs, body of code that configures your project for running on that specific platform.
00:14:10.920 --> 00:14:11.360
Got it, okay.
00:14:11.820 --> 00:14:17.800
And so typically it's generic and it's not targeting, it's not trying to do any changes to your project.
00:14:19.079 --> 00:14:19.960
We won't go further.
00:14:20.340 --> 00:14:21.000
I'll say something
00:14:21.000 --> 00:14:21.200
wrong.
00:14:21.460 --> 00:14:22.140
Yeah, yeah, yeah, sounds good.
00:14:22.480 --> 00:14:25.440
But the takeaway for that is it felt like doing Heroku's work for them.
00:14:26.000 --> 00:14:30.980
And so it was nice for anybody trying to push Django to Heroku, but that boundary of like, what's our work?
00:14:31.140 --> 00:14:31.740
What's their work?
00:14:31.960 --> 00:14:33.520
Are we doing work free for them?
00:14:34.120 --> 00:14:34.900
That's an interesting question.
00:14:35.320 --> 00:14:38.440
And it really felt like it was skewed towards doing their work.
00:14:38.900 --> 00:14:39.040
Right.
00:14:39.280 --> 00:14:47.560
Well, I've done it once or twice, deployed an app to Heroku, never for real work, but to, you know, play around with it and sort of check it out.
00:14:47.720 --> 00:14:51.320
Because Heroku was definitely a darling of
00:14:51.320 --> 00:14:52.100
the
00:14:52.100 --> 00:14:56.640
Python space and certainly of the Python tutorials, right?
00:14:56.860 --> 00:14:59.520
Because for a long time, they had a free tier.
00:14:59.940 --> 00:15:00.820
And so everybody
00:15:00.820 --> 00:15:08.140
who needed to deploy something was like, here's how you put it on Heroku to sort of complete the loop and get it out there in the world, right?
00:15:09.120 --> 00:15:28.600
Right. And then, yeah, you know, a testament to Heroku is how long it has worked without a lot of attention from them. And so they lost a lot of trust in the community, not just from doing away with their free tier. It's really hard to maintain a free tier. It's just puts a big target on the platform for abuse.
00:15:29.120 --> 00:15:37.080
But it's about some reliability issues and communication issues around issues on the platform.
00:15:37.920 --> 00:15:40.000
So there was an exodus from Heroku for a while.
00:15:40.320 --> 00:15:43.920
And I was working on this automation problem for a while.
00:15:44.880 --> 00:15:52.200
And I had that shower thought of like, okay, all that work that I'm doing through the Buildpack on Heroku's end could be done through a management command with NJNGO.
00:15:52.520 --> 00:15:57.880
You can do all the changes to your project on your computer if you know what to do.
00:15:58.260 --> 00:16:03.860
So internally, Django simple deploy is just a single management command, that deploy command.
00:16:04.350 --> 00:16:09.880
And when you run that command, based on the plugin that you have installed, it knows which platform you're targeting.
00:16:10.270 --> 00:16:15.680
And then basically, I've just spent hours pouring over the documentation for a few different platforms.
00:16:16.500 --> 00:16:23.260
And so we pick up the platform that you're trying to deploy to, make all the changes necessary for a basic initial deployment to that platform.
00:16:24.160 --> 00:16:26.480
And then there's two ways you can push your project.
00:16:26.880 --> 00:16:35.420
The fully automated mode puts all those changes into a single commit, runs that platform's deploy command, and pops up your project in a new window.
00:16:35.820 --> 00:16:41.420
Yeah, and the transport mechanism is Git, right?
00:16:41.840 --> 00:16:42.780
Good question.
00:16:43.220 --> 00:16:44.040
Not necessarily.
00:16:44.880 --> 00:16:48.720
The transport mechanism is whatever that platform uses.
00:16:49.400 --> 00:16:55.620
So for Fly, Django simple deploy makes the configuration changes for your project.
00:16:56.060 --> 00:16:58.600
and then it calls the fly deploy command.
00:16:59.110 --> 00:17:03.380
So I don't even have to know what fly deploy is using behind the scenes.
00:17:04.100 --> 00:17:08.920
You have the CLI installed, simple deploy calls that deploy command.
00:17:09.680 --> 00:17:16.800
For Heroku, when it gets to that deployment stage, in the automated mode, Django simple deploy runs git push Heroku main.
00:17:17.089 --> 00:17:27.240
And so it's one of the nice things about this project, and part of the reason it has taken so long to get to 1.0 is quite adaptable to different approaches.
00:17:27.740 --> 00:17:32.100
Yeah, that's pretty wild because you're just automating the CLI for that platform, right?
00:17:32.420 --> 00:17:32.820
Right.
00:17:34.030 --> 00:17:39.660
And Chris is commenting, there should be one obvious way to deploy your Django project to a service.
00:17:40.360 --> 00:17:41.260
Yeah, he's right.
00:17:41.390 --> 00:17:48.640
The nice thing about this is Django Simple Deploy becomes this abstraction layer between your work and the platform.
00:17:49.260 --> 00:17:53.400
So it creates a nice, consistent interface for deploying to a wide range of platforms.
00:17:54.500 --> 00:18:10.660
And when a platform inevitably changes their deployment process or configuration requirements, as long as one person makes that update to the Django SEP deploy plugin, everybody else gets to just keep using that consistent interface for how you do your initial deployment,
00:18:10.890 --> 00:18:11.580
which is really,
00:18:11.780 --> 00:18:12.160
really nice.
00:18:12.640 --> 00:18:13.860
Yeah, it is really nice.
00:18:14.400 --> 00:18:14.660
You don't
00:18:14.660 --> 00:18:20.900
have to worry about all the details and also the ability to move without losing all of your expertise.
00:18:23.660 --> 00:18:26.860
This portion of Talk Python To Me is brought to you by Worth Recruiting.
00:18:27.420 --> 00:18:29.940
Are you tired of applying for jobs and never hearing back?
00:18:30.600 --> 00:18:39.100
Have you been getting the runaround or having trouble making it past the AI resume screeners that act as the new gatekeepers for your next level Python job?
00:18:39.380 --> 00:18:41.100
You should reach out to Worth Recruiting.
00:18:41.760 --> 00:18:46.080
Worth Recruiting specializes in placing senior level Python developers and data scientists.
00:18:46.820 --> 00:18:52.820
They work directly with hiring managers at startups, helping them grow their software engineering and data science teams.
00:18:53.660 --> 00:18:56.100
With Worth, it's not just connecting you with the company.
00:18:56.660 --> 00:19:01.460
It will guide you through the interview process and help make sure you're ready with their detailed preparation approach.
00:19:01.840 --> 00:19:06.560
They can even coach you on salary negotiations and other important decision-making processes.
00:19:07.360 --> 00:19:12.180
So if you're ready to see what new opportunities are out there for you, reach out to Worth Recruiting.
00:19:12.600 --> 00:19:18.320
Let them be your partner and specialist to find the right Python developer or data scientist position for you.
00:19:18.780 --> 00:19:23.160
Fill out their short contact form at talkpython.fm/worth.
00:19:23.580 --> 00:19:24.360
It only takes a minute.
00:19:24.940 --> 00:19:27.360
That's talkpython.fm/worth.
00:19:27.800 --> 00:19:29.760
The link is in your podcast player's show notes.
00:19:30.280 --> 00:19:32.260
Thank you to Worth Recruiting for supporting the show.
00:19:33.820 --> 00:19:41.600
This is where it gets really fun to talk about this project because, you know, people think when people first hear about this project, they think it's just for beginners.
00:19:42.320 --> 00:19:44.120
It's just for people who already know deployment.
00:19:46.120 --> 00:19:47.660
But where is I going with that?
00:19:48.640 --> 00:19:55.660
Oh, so thinking about writers, authors, myself first, but content creators, tutorial writers, presenters.
00:19:56.540 --> 00:20:12.940
If you're wanting to include deployment as part of your process that you're teaching people, then a lot of people have chosen not to do that because as soon as you include deployment, you're now tied to that platform's stability.
00:20:13.520 --> 00:20:16.920
As soon as they change their process, you've got to update your materials or it's broken.
00:20:17.000 --> 00:20:18.920
and that's not appealing.
00:20:19.480 --> 00:20:31.720
So for somebody who uses Django Simply Deploy in their tutorial, again, as long as one of us keeps the plugin updated to work on that platform, your learning resources stays the same.
00:20:31.900 --> 00:20:32.720
That is really nice.
00:20:33.020 --> 00:20:33.300
And whether
00:20:33.300 --> 00:20:33.500
you're
00:20:33.500 --> 00:20:38.020
teaching a college class or you're just writing something for your blog, it is really nice.
00:20:38.880 --> 00:20:40.520
Yeah, and I think about the Django Girls workshops.
00:20:41.080 --> 00:20:46.860
And so part of that, the goal of that conclusion of deploying your project is just to see a live.
00:20:47.020 --> 00:20:48.540
Like, why are we doing this if we can't see a line?
00:20:49.120 --> 00:20:52.440
You don't necessarily want to spend a whole bunch of time focused on deployment.
00:20:52.710 --> 00:20:56.120
And so if you can kind of really crunch that into like, okay, we're going to run these commands.
00:20:57.040 --> 00:20:58.000
We have a working deployment.
00:20:58.580 --> 00:21:00.700
It's not about hiding deployment from people.
00:21:01.160 --> 00:21:06.600
Because one of the coolest parts of this project is that it contains all those configuration changes in a single Git commit.
00:21:07.520 --> 00:21:11.080
Is there a verbose mode where you get to show all the little steps it's doing and stuff?
00:21:11.440 --> 00:21:14.860
Yeah, it is verbose by default.
00:21:15.160 --> 00:21:26.780
So you get to basically it streams and dumps all the platform's output as it's deploying, which is kind of important because if you don't do that, you just see this blank screen for two, three, seven
00:21:26.780 --> 00:21:27.000
minutes.
00:21:27.040 --> 00:21:28.160
Yeah, it's just sitting there spinning.
00:21:28.980 --> 00:21:29.260
Yeah.
00:21:31.040 --> 00:21:32.720
But to slow this down, take a step back for a minute.
00:21:33.100 --> 00:21:37.340
I've mentioned the automated mode where you include this stash-tash automate all.
00:21:37.820 --> 00:21:42.440
That's easiest to talk about because it boils down this deployment process to three steps.
00:21:43.180 --> 00:21:52.940
I don't actually recommend that for most people because it makes a Git commit for you, runs a deploy command, and maybe you want to have a little more control about that process.
00:21:53.860 --> 00:22:01.580
There's a configuration-only mode, which is every bit as helpful, but it lets you kind of take a little more control.
00:22:01.880 --> 00:22:10.520
And so what you do for most platforms, you have to create a resource, basically a deployed project, an empty project on that platform, and then you run deploy.
00:22:11.960 --> 00:22:20.480
And Django Simple Deploy recognizes the resource you just created on that platform, configures your project, and then it stops.
00:22:21.000 --> 00:22:27.180
And so you now have a configured project, and you can run git diff, and you get to see all the configuration
00:22:27.180 --> 00:22:28.000
changes
00:22:28.000 --> 00:22:29.100
that were made on your behalf.
00:22:30.180 --> 00:22:31.320
So you don't have to just trust it.
00:22:32.140 --> 00:22:32.880
Yeah, yeah.
00:22:33.420 --> 00:22:39.780
So when I shared this on the Django Discord yesterday, somebody was excited about it, and then I said something about that commit that was made.
00:22:40.160 --> 00:22:41.660
And they said, oh, it makes commits for you.
00:22:41.900 --> 00:22:43.160
I'm not sure I want to use that.
00:22:43.510 --> 00:22:43.860
Is it okay?
00:22:43.970 --> 00:22:47.640
You can do the longer mode where you get to review that.
00:22:48.740 --> 00:22:52.140
And then you can see all the files that were created for that platform.
00:22:52.640 --> 00:22:55.600
You can see the settings changes that were made to make your project work.
00:22:56.400 --> 00:22:58.560
And then you can choose to make that commit.
00:22:58.850 --> 00:23:00.940
You can choose to push it or revert it.
00:23:01.380 --> 00:23:05.220
Even if you use the automated mode, it's still all the configuration is one commit.
00:23:05.550 --> 00:23:08.600
And so you can just revert that commit and you're right back to your project.
00:23:09.120 --> 00:23:10.500
I'll throw one more piece in there right away.
00:23:10.960 --> 00:23:15.800
one of the priorities of the project is that it does not change the local behavior of your project.
00:23:16.180 --> 00:23:31.800
And so when I run the test suite, it tests that all the configuration changes are correct for the target platform, but it also runs run server again locally and makes sure that we haven't impacted the local running of your project.
00:23:32.260 --> 00:23:35.780
Oh, interesting. It'll run it to make sure it basically starts. Nice.
00:23:36.200 --> 00:23:44.300
Yeah, you know, this automated versus config sort of deal, it reminds me a little bit of how maybe DBAs feel about ORMs.
00:23:45.300 --> 00:23:50.160
You know, like they're like, oh, you can't just let it run arbitrary queries against my database.
00:23:50.600 --> 00:23:52.420
Like, how do we know it's doing the right thing?
00:23:52.540 --> 00:23:54.840
I'm sure you feel that way for a while.
00:23:55.660 --> 00:23:58.580
But eventually, all right, we've reviewed them.
00:23:58.920 --> 00:23:59.660
They're fine, right?
00:23:59.840 --> 00:24:02.640
So maybe this config thing you do a couple of times, you're like,
00:24:02.740 --> 00:24:03.260
yeah, that's
00:24:03.260 --> 00:24:03.980
what I would do anyway.
00:24:04.720 --> 00:24:05.540
Just run it, right?
00:24:05.940 --> 00:24:06.580
Because what
00:24:06.580 --> 00:24:07.100
else are you going to do?
00:24:07.240 --> 00:24:13.600
You're probably going to create a script that does the things you expect it to do anyway for yourself as a bash script or something, right?
00:24:13.660 --> 00:24:15.200
And so might as well be a Python script.
00:24:15.560 --> 00:24:15.840
Yeah.
00:24:15.980 --> 00:24:20.440
I mean, it's funny hearing you talk about this because this project started as a pile of bash scripts.
00:24:20.900 --> 00:24:21.340
And so,
00:24:21.540 --> 00:24:22.560
yeah.
00:24:22.760 --> 00:24:24.380
I got a pile of bash scripts on my server.
00:24:24.460 --> 00:24:24.940
They do things.
00:24:25.580 --> 00:24:25.660
Yeah.
00:24:25.900 --> 00:24:32.820
One of the pre-1.0 tasks was a long issue that was just about converting all these shell scripts to Python.
00:24:33.560 --> 00:24:36.660
And mostly that was about creating, making this work cross-platform.
00:24:37.140 --> 00:24:39.980
So it's basically taken me like four years to get this to 1.0.
00:24:40.290 --> 00:24:45.120
And it's that 80-20 principle turned into like 595 principle.
00:24:49.380 --> 00:24:58.220
So another reason, so a good thing to kind of move into, another reason it took so long to get to 1.0 was originally this was all one library.
00:24:58.640 --> 00:24:59.960
So it was just Django simple deploy.
00:25:00.440 --> 00:25:05.100
And originally you would run managed.py deploy --platform by.io.
00:25:06.020 --> 00:25:10.660
And so the entire project contained all the code for all the different platforms.
00:25:12.300 --> 00:25:17.100
And that felt better than the original project just targeting Heroku because you have choice.
00:25:17.500 --> 00:25:19.180
But it felt like a nightmare for maintenance.
00:25:19.880 --> 00:25:26.680
Anytime any project changes, it's going to need an update and it's just going to grow exponentially.
00:25:27.300 --> 00:25:29.900
Yeah, it becomes combinatorially complex in
00:25:29.900 --> 00:25:31.280
terms of dependencies, which
00:25:31.280 --> 00:25:33.940
is not a good order of magnitude.
00:25:35.480 --> 00:25:36.220
It's not good.
00:25:36.840 --> 00:25:37.060
Yeah.
00:25:37.550 --> 00:25:45.840
So I had some people kind of very kindheartedly nudging me towards just doing a 1.0 release to get over that fear of a 1.0 release.
00:25:46.760 --> 00:25:54.220
But it was always about having – I had a vision that the mature version of this project should be plug-in based.
00:25:54.820 --> 00:25:57.820
So the core project, Django Simple Deploy, is small.
00:25:58.620 --> 00:25:59.520
It's platform agnostic.
00:25:59.960 --> 00:26:05.500
All it does is inspect your project, inspect your system, and then hand out the rest of the work to a plugin.
00:26:05.810 --> 00:26:11.460
And so currently there's a plugin targeting apply.io, plugin for platform.sh, platform for Heroku.
00:26:12.220 --> 00:26:18.920
I have a proof of concept plugin for CodeRed, and I'm working on a proof of concept for DigitalOcean.
00:26:20.860 --> 00:26:23.000
Yeah, so many cool things to talk about with this.
00:26:23.540 --> 00:26:23.620
Yeah,
00:26:23.880 --> 00:26:23.980
yeah.
00:26:24.200 --> 00:26:32.380
Before we go, I do want to maybe just go through some of these hosts and let you talk about maybe why they're included.
00:26:32.840 --> 00:26:35.840
Which ones are, there's stuff out there, obviously, that's not included.
00:26:35.920 --> 00:26:36.760
Why is it not included?
00:26:37.220 --> 00:26:42.360
So Heroku, obvious, especially when you started, when they had the free tier and stuff like that.
00:26:43.220 --> 00:26:45.480
I kind of want to get them, I know people are angry at them.
00:26:45.780 --> 00:26:46.440
I understand that.
00:26:46.500 --> 00:26:59.860
But also, I kind of want to give them a little bit of a pass, like offering free hosting to the world where people just put up malware and other badness and use the trust of your domain to sort of leverage that, it's challenging.
00:27:00.200 --> 00:27:01.220
And I don't know.
00:27:01.890 --> 00:27:04.480
I understand people are frustrated with them, but that's tough.
00:27:05.340 --> 00:27:12.200
So Heroku, platform as a service, you push your stuff up, you say, here's my code, here's how you start it, run it for me, please.
00:27:12.660 --> 00:27:13.520
There's not a lot of Linux.
00:27:13.960 --> 00:27:15.820
There's not a lot of shell, right?
00:27:15.920 --> 00:27:17.220
They kind of take care of that for you, yes?
00:27:17.360 --> 00:27:17.800
They do.
00:27:18.040 --> 00:27:19.240
And there's still, yeah.
00:27:20.220 --> 00:27:27.140
I've had conversations with people who, with founders of a number of these platforms over the years, because it's always interesting to talk about this.
00:27:28.130 --> 00:27:31.380
And platforms would love to see an easier way to deploy Django projects.
00:27:32.740 --> 00:27:38.900
One of those founders said something really insightful at one point, and I appreciated the honesty, is that we're all trying to be second best for beginners.
00:27:39.880 --> 00:27:45.200
Because if you draw that crowd, you're drawing more support than benefit in the short term.
00:27:45.950 --> 00:27:49.100
And so, yeah, for a long time, Foroku paid that cost.
00:27:49.580 --> 00:27:51.440
they were willing to be the go-to for everybody.
00:27:51.960 --> 00:27:54.800
So there's still a lot of projects running long-term on Heroku.
00:27:55.120 --> 00:27:57.200
I know some important Python ones that are there.
00:27:57.600 --> 00:27:57.700
Yeah.
00:27:57.890 --> 00:27:58.040
Yeah.
00:27:58.560 --> 00:27:58.680
Okay.
00:27:58.900 --> 00:28:02.680
And then we got fly.io and platform.sh.
00:28:03.260 --> 00:28:04.360
What's the story of these?
00:28:05.300 --> 00:28:06.480
Honestly, I haven't used either of them.
00:28:06.720 --> 00:28:07.360
I've heard of them.
00:28:07.360 --> 00:28:07.900
I haven't used them.
00:28:08.120 --> 00:28:14.280
So the selling point for fly.io is they're an edge-based platform.
00:28:14.840 --> 00:28:15.040
And so
00:28:15.040 --> 00:28:17.220
they take your,
00:28:17.620 --> 00:28:24.920
if I'm saying this right, They take your project and they push your application code to a bunch of different nodes.
00:28:25.430 --> 00:28:26.180
And so your code
00:28:26.180 --> 00:28:26.300
is...
00:28:26.320 --> 00:28:27.400
Kind of like a CDN, right?
00:28:28.260 --> 00:28:30.180
Yeah, CDN for your application code.
00:28:30.430 --> 00:28:30.760
And so your
00:28:30.760 --> 00:28:31.440
code is right
00:28:31.440 --> 00:28:32.780
close to your end users.
00:28:33.430 --> 00:28:38.700
And so I don't need it, but they've built it well enough that I can just push a project there and it works.
00:28:39.280 --> 00:28:43.140
And I'm a big fan of, you know, if your project does what you need it to, is it a good question?
00:28:43.240 --> 00:28:43.760
Is it good enough?
00:28:43.930 --> 00:28:46.000
And so it's been good enough for me for a lot.
00:28:46.320 --> 00:28:49.340
And I know it's targeting some more complex use cases.
00:28:50.000 --> 00:28:50.400
I
00:28:50.400 --> 00:28:51.100
have so many questions.
00:28:52.600 --> 00:28:53.280
It's so interesting.
00:28:53.740 --> 00:28:56.880
Well, the first thing that comes to mind is what about databases, right?
00:28:57.220 --> 00:29:05.240
If your app is running, yeah, you've got to have some way to correlate and centralize and make the currency of the database and all that work, yeah.
00:29:05.480 --> 00:29:08.780
They've had some fantastic people working for them, and they have some fantastic blog posts.
00:29:09.160 --> 00:29:15.200
So they've done really interesting cutting-edge work around distributed SQLite.
00:29:16.080 --> 00:29:20.700
databases. And so, yeah, they are quite familiar with that question and they
00:29:20.700 --> 00:29:22.020
have answered
00:29:22.020 --> 00:29:24.140
it well and they are answering it well.
00:29:24.320 --> 00:29:31.540
If you can answer that question well, then you can get some stuff that flies, you know? I mean, I guess, hence the name. I didn't even do that on purpose.
00:29:32.240 --> 00:29:45.700
I've been using bunny.net, which is a really nice CDN platform, but just for static content, not for application code that talks to the database.
00:29:46.020 --> 00:29:59.960
And I understand how you would replicate the database, but the challenge is if you have chatty rights, all of a sudden you're pushing your database away from your app, which has its own sort of latency and stuff.
00:30:00.100 --> 00:30:01.140
But what an interesting idea.
00:30:01.460 --> 00:30:03.620
Okay, and Platform.sh?
00:30:03.960 --> 00:30:12.340
Platform.sh started as a PHP, I believe, started as a PHP-only platform, but then expanded to support other languages.
00:30:12.900 --> 00:30:16.280
And so they have been sponsors of DjangoCon for a long time.
00:30:17.260 --> 00:30:20.040
And I really enjoy working with their platform.
00:30:21.260 --> 00:30:22.120
Deployment is pretty straightforward.
00:30:23.380 --> 00:30:32.080
And then, you know, one of the things I look for in these platform as a service is, so once you push it, I'm very happy to have them managing the DevOps work.
00:30:32.360 --> 00:30:35.860
I also want to be able to like get into the server and run commands and see what's going on.
00:30:36.160 --> 00:30:37.940
And so they make it easy to do that.
00:30:38.400 --> 00:30:46.240
Yeah, if things are not starting or they're crashing or something, sometimes just go, just 30 seconds at a glance at the log file or something.
00:30:46.480 --> 00:30:49.360
Oh, yeah, or maybe why is that file?
00:30:49.550 --> 00:30:50.440
That file is actually missing.
00:30:50.690 --> 00:30:51.240
Oh, that's weird.
00:30:51.360 --> 00:30:52.320
Let me see if I can just get that.
00:30:52.320 --> 00:30:55.420
And then you're back to like, okay, back to platform as a service, and you're good, you know?
00:30:55.720 --> 00:31:02.260
Yeah, and that's, you know, platform as a service certainly works for people who know nothing about, you know, hopping into a server and running commands.
00:31:03.200 --> 00:31:05.680
But they're also for, like, people who know how to do that and don't want to do that.
00:31:05.980 --> 00:31:21.100
And so a service like platform.sh that makes it easy to do both is also, I see it as an onboarding for people who have something worth deploying, don't know DevOps yet, but letting them hop in and start to do that is pretty interesting.
00:31:21.440 --> 00:31:22.360
Yeah, it's very interesting.
00:31:22.760 --> 00:31:32.500
Okay, so I can run Python manage.py deploy --automate all, and that will take my app and put it into whatever destination you pick, right, of those three.
00:31:32.640 --> 00:31:36.140
For these platforms as a service, a lot of times you have to have a database.
00:31:36.750 --> 00:31:43.700
Sometimes that's a managed Postgres or whatever you might have data that has to import initially.
00:31:44.070 --> 00:31:48.560
You know, you're like, well, here's all the counties in the United States and we have to query them for stuff.
00:31:48.610 --> 00:31:50.000
So we preload that at first.
00:31:50.140 --> 00:31:53.040
How does all that get connected and happen, right?
00:31:53.200 --> 00:31:58.740
If I had like no database and I just have a pure Django app that just runs Python, easy.
00:31:58.800 --> 00:32:03.900
I see how this works, but there's settings and stuff here that vary by production versus dev.
00:32:04.220 --> 00:32:05.200
Yeah, fun question.
00:32:06.440 --> 00:32:10.180
So I've done most of the development work on Django Simple Deploy.
00:32:10.700 --> 00:32:13.840
I've actually run sprints at several PyCons and several Django Cons.
00:32:14.540 --> 00:32:18.540
And this project has brought together like 8 to 15 people at each sprint.
00:32:19.220 --> 00:32:19.980
It draws some interest.
00:32:20.480 --> 00:32:23.720
And so the project would not be where it is without those contributions.
00:32:24.340 --> 00:32:33.660
A lot of those people have made some contributions and not done a whole lot outside of the conferences, but that whole group of people has been available to just bounce ideas off of.
00:32:34.250 --> 00:32:44.040
And so a lot of the pre-1.0 work was also like me getting rid of all the baggage that just kind of only made sense to me, or you really need to have years of contact with the project to make sense of it.
00:32:44.700 --> 00:32:48.780
And so now it's at a place where the structure is pretty consistent.
00:32:49.180 --> 00:32:57.560
And so one of the things I'm looking forward to is somebody else who knows Fly.io managing the Fly.io plugin more than me.
00:32:57.840 --> 00:33:01.120
And so they don't need to go deal with Chango Simple Deploy.
00:33:01.620 --> 00:33:05.420
They can focus on the parts of the script that do the things you were just talking about.
00:33:06.080 --> 00:33:09.160
So all the configuration has been largely my choice.
00:33:09.660 --> 00:33:16.160
You know, okay, on Heroku, we'll choose this Postgres instance because it's cheaper, because it lets people get started.
00:33:17.340 --> 00:33:28.080
It's possible for somebody to either take the Heroku plugin and add a few more CLI flags to give you a bit more choice, or just write your own Heroku plugin.
00:33:28.350 --> 00:33:33.240
And so right now the plugin for Heroku is dsd-heroku.
00:33:33.640 --> 00:33:42.260
Somebody else could do like DSD Heroku-large, and it's meant for scaling large or deploying large-scale Heroku projects.
00:33:43.620 --> 00:33:45.580
And so that's not a, I don't want to do that work.
00:33:45.850 --> 00:33:46.680
They should write their own.
00:33:46.880 --> 00:33:50.420
That's if you have a use case that you know well, you want to automate.
00:33:51.480 --> 00:34:00.600
Simple Deploy just becomes this, again, abstraction layer for, you know, you have a consistent interface for running that deployment from within Django.
00:34:00.900 --> 00:34:04.480
Yeah, there's a nice plugin model, which really opens things up.
00:34:04.670 --> 00:34:14.280
I suppose the short answer is probably, well, the Django ORM will create the database structure for you if you could just tell it where the database is, right?
00:34:14.580 --> 00:34:14.700
Right.
00:34:15.200 --> 00:34:24.460
And I know certain apps I've built, if they have data that has to be preloaded, I'll just have a little check like, hey, has this table got any data in it?
00:34:24.590 --> 00:34:27.540
If not, run the load up the database the first time.
00:34:27.980 --> 00:34:29.940
Otherwise, assume it's all good and keep going.
00:34:30.639 --> 00:34:31.679
that pretty much handles it?
00:34:31.980 --> 00:34:34.899
I think, you know, it's kind of two directions I'll take this.
00:34:35.379 --> 00:34:40.300
You know, a short list of the projects I've done over the years, they tend to be smaller, but they tend to be impactful.
00:34:40.820 --> 00:34:44.899
So one project, automated report cards for students.
00:34:45.460 --> 00:34:52.179
I used to work with struggling students, students who were plenty smart, but life had happened and they had gotten off track with school.
00:34:52.530 --> 00:34:57.760
And so they just had holes in their, in their graduation requirements.
00:34:58.440 --> 00:35:02.280
And so those students wanted to graduate, but they didn't know where to focus their efforts.
00:35:02.670 --> 00:35:07.540
And so looking at a transcript was really hard because it's just a bunch of letters and numbers.
00:35:08.660 --> 00:35:13.020
So I wrote a program that automated a generation of visual transcripts.
00:35:13.280 --> 00:35:17.060
So I'd read their text-based transcript and then give them basically a chart, a bunch of gauges.
00:35:17.540 --> 00:35:21.320
You just look at it in 30 seconds, know which classes you needed to focus on.
00:35:22.880 --> 00:35:25.260
And it also went from deficiencies to strengths.
00:35:25.800 --> 00:35:29.760
So traditionally, we talked to students who are struggling and saying, you need to do this, you need to do that.
00:35:30.400 --> 00:35:34.400
You could see where they needed to do their work, but you could also see where they had been shining.
00:35:34.690 --> 00:35:35.640
You could see where the strengths were.
00:35:36.500 --> 00:35:38.180
And so I wrote a project.
00:35:38.270 --> 00:35:39.240
I worked with whale researchers.
00:35:39.859 --> 00:35:41.220
And people don't know this.
00:35:41.860 --> 00:35:46.500
Sperm whales have learned to pick the fish off of – I'll take a step back.
00:35:47.060 --> 00:35:57.600
People catch halibut, fish for halibut by putting literally miles long cables on the ocean floor or lines with a hook every six to 10 feet.
00:35:57.900 --> 00:36:01.380
And so you put a thousand hooks on the ocean floor, leave it overnight or pull it.
00:36:01.620 --> 00:36:02.720
And that's how you catch halibut.
00:36:04.380 --> 00:36:12.860
And sperm whales have learned to listen for the sound of the transmission changes when somebody puts their boat into gear to pull those hooks.
00:36:13.400 --> 00:36:16.120
They swim towards that sound and they just pick the fish off those lines.
00:36:16.620 --> 00:36:16.860
Wow.
00:36:17.200 --> 00:36:26.160
And so these researchers were starting to put transponders on boats that would allow anybody who saw a sperm whale to report that.
00:36:26.280 --> 00:36:30.340
And then you could kind of time your fishing sets to be away from the sperm whales.
00:36:31.140 --> 00:36:35.840
And so I wrote a project that just like these researchers didn't know how to get their data from one place to another.
00:36:36.140 --> 00:36:43.260
And so I just wrote a small Django project that listened for that data and gave them a visible place where they could go to it and share it.
00:36:45.460 --> 00:36:53.420
And one other, oh, I lived in Southeast Alaska, and we were having increasing landslides, more frequent landslides, and more impactful.
00:36:54.520 --> 00:37:02.280
And so I wrote a small project that examines real-time stream gauge data and turns that into a measure of landslide risk.
00:37:03.480 --> 00:37:05.600
And they gave a talk about that last year at PyCon.
00:37:06.390 --> 00:37:07.640
All those projects are small.
00:37:07.760 --> 00:37:09.500
They're never going to scale to millions of users.
00:37:10.040 --> 00:37:10.780
They all need a database.
00:37:11.390 --> 00:37:14.900
And so they all fit this model of something like I personally would build.
00:37:15.200 --> 00:37:18.360
And if I didn't know deployment, those would not have ended up being useful.
00:37:18.940 --> 00:37:24.160
And so this tool takes all those people out there right now who are getting the skills to build something that works locally.
00:37:24.350 --> 00:37:29.900
And they don't have to go through that three weeks to three months of learning how to deploy things.
00:37:30.840 --> 00:37:35.600
So I appreciate you bringing up the questions of what happens with these larger scale projects.
00:37:36.130 --> 00:37:42.460
But there's also a whole class before you even get there of projects that would make the world better if they could be easily deployed.
00:37:43.540 --> 00:37:50.460
Such a challenge because if you go down the, there's so many paths that people get led down that are not good paths.
00:37:50.810 --> 00:37:52.540
You know, it's sort of the architectural equivalent.
00:37:52.630 --> 00:37:58.480
I guess even just the DevOps equivalent of you're not Microsoft, you're not Google, you're not Netflix.
00:37:59.120 --> 00:38:02.480
You probably don't need the chaos monkey running around your whale research project.
00:38:03.080 --> 00:38:03.680
Right, right.
00:38:04.000 --> 00:38:11.400
But people read that and they're like, well, I saw a really awesome conference talk and people loved it about how they had like geo-replication of their database and stuff.
00:38:11.400 --> 00:38:11.660
You're like,
00:38:11.740 --> 00:38:12.060
yes.
00:38:12.780 --> 00:38:13.020
Interesting.
00:38:13.480 --> 00:38:13.900
not for you.
00:38:14.120 --> 00:38:19.820
So the other direction that's interesting to finish out this discussion, so I'm targeting a VPS right now.
00:38:20.140 --> 00:38:24.800
I have deployed a Django project to DigitalOcean just on the bare VPS.
00:38:25.620 --> 00:38:32.060
For people less familiar with that virtual private server, it's basically a brand new virtual Linux machine that you can push your project to.
00:38:33.640 --> 00:38:53.020
And so this is more complicated because rather than just like making a few configuration changes to your project and then running a platform's deploy command, you have to do that whole update the server, install Django, set up a Git push if you want to do that approach, make the right port changes and whatnot, expose that.
00:38:54.480 --> 00:38:57.440
So it's more work for me to get that proof of concept done.
00:38:57.880 --> 00:39:05.040
But once it's done, the work I'm doing to write a plugin for DigitalOcean would work just as well for Hetzner, just as well for Linode.
00:39:05.940 --> 00:39:10.440
And then it opens up to all the different approaches that people take to deployment.
00:39:11.120 --> 00:39:14.080
One of the interesting questions about Django Simple Deploy is what are the boundaries?
00:39:14.490 --> 00:39:15.260
So what is simple?
00:39:16.540 --> 00:39:19.500
And I don't know the answer to that yet.
00:39:19.730 --> 00:39:21.120
It shouldn't become tube loaded.
00:39:21.470 --> 00:39:25.700
It shouldn't re-implement the entire CLI for a platform.
00:39:26.940 --> 00:39:28.960
But the bounds are pretty large.
00:39:29.480 --> 00:39:36.280
So you could have a DigitalOcean that targets NGINX Benicorn.
00:39:36.620 --> 00:39:39.640
You could have one that targets using the Doku approach.
00:39:40.180 --> 00:39:42.900
You could have one that targets external databases.
00:39:43.700 --> 00:39:49.940
There's really, it's a pretty open platform for automating deployment processes.
00:39:51.120 --> 00:39:51.920
Yeah, absolutely.
00:39:52.220 --> 00:39:52.520
Lots of people.
00:39:53.080 --> 00:40:02.400
I mean, once you knock out one of those virtual servers, it's really, really close to seeing, well, anything that can run a Linux VM pretty much can do it.
00:40:02.640 --> 00:40:03.680
And you were talking about Nginx.
00:40:03.920 --> 00:40:06.240
You know, you might, I don't know, have you considered Caddy?
00:40:06.600 --> 00:40:07.260
CaddyServer.com?
00:40:07.860 --> 00:40:11.180
As I was saying Nginx, I was like, oh, wait, there's another one that I should be saying.
00:40:11.600 --> 00:40:17.980
Well, I use Nginx for all of my stuff because it's gotten over the years, gotten more and more complicated.
00:40:18.620 --> 00:40:26.960
However, you've got to run, you've got to independently manage Let's Encrypt, and there's this sort of scaling up process.
00:40:27.260 --> 00:40:34.060
First, you've got to put the non-encrypted version up, so that cert bot and all the Let's Encrypt stuff can find it.
00:40:34.060 --> 00:40:36.760
Then you create the SSL certificate.
00:40:36.840 --> 00:40:45.600
Then you change the configuration again, because it won't run saying it's SSL until it actually has this, like there's this scaffolding step that's always messy.
00:40:45.740 --> 00:40:56.800
And if I think like easy getting started for people, Caddy, which manages the security and all that and has a real simple configuration language, it seems like it might be a good option.
00:40:56.970 --> 00:40:59.220
And it has 62,000 GitHub stars.
00:40:59.440 --> 00:41:02.360
It's, I think a person or two uses it, you know?
00:41:02.540 --> 00:41:03.080
That's kind of neat.
00:41:03.300 --> 00:41:11.900
Yeah, last week, before I started the DigitalOcean plugin, I asked on Mastodon how people are deploying to VPS these days.
00:41:13.200 --> 00:41:14.620
And Cady was one of the things that came up.
00:41:14.670 --> 00:41:17.540
It was super interesting to see the range of approaches that people are using.
00:41:18.580 --> 00:41:27.580
So, you know, as I go through this, I'm kind of asking the question for basic initial deployment for somebody new to this platform, what are some sane choices?
00:41:28.640 --> 00:41:31.980
So Cady or Nginx, Postgres or SQLite.
00:41:32.470 --> 00:41:33.380
So I'll make those choices.
00:41:34.120 --> 00:41:40.100
And one of the open questions that I don't have clear answers to is, you know, where are the boundaries around those plugins?
00:41:41.260 --> 00:41:47.600
So I'll certainly implement a --DB flag that lets you choose like Postgres or SQLite.
00:41:48.370 --> 00:41:52.740
But I don't want to do a flag for like --approach, daku, whatnot.
00:41:53.220 --> 00:42:00.020
At some point, it makes more sense to have other people write other plugins and just foster that plugin ecosystem.
00:42:00.220 --> 00:42:00.740
so
00:42:00.740 --> 00:43:02.620
another consideration and kim out in the audience was hinting at this before and it's certainly the way that i'm doing things these days is docker so let me just give you an example like yeah you can go all in and you could run on like the doc like eks and all these kinds of things you can go way way deep on it or you can just do stuff as simple as like hey i want i want the front end web server to be caddy i could install caddy on the server using apt or whatever but then you those kind of update more slowly, you have less control over it. You could just as equally well run a catty Docker image on that machine and have basically a zero touch experience on the server itself, other than just having a Docker thing there, right? And you can do whatever you want to that Docker image. You could even have a catty Django simple deployed one based off their original one or, you know, things like that where you've got it exactly configured. What's the story with Docker? And how have you been thinking about that? Because once you start to go to virtual or you start to get into some of these processes and some of these ideas?
00:43:03.000 --> 00:43:04.340
Yeah, great question.
00:43:04.980 --> 00:43:06.280
And it certainly has come up multiple times.
00:43:06.880 --> 00:43:13.940
My main experience with Docker is working with Fly because Fly is a Docker-based approach.
00:43:15.080 --> 00:43:18.740
I have not written my own Docker files, but I have learned about them.
00:43:19.540 --> 00:43:27.420
And so short answer, Docker is an approach to deployment, and there's nothing stopping anybody from writing a plugin that has a Docker-based approach.
00:43:28.480 --> 00:43:32.160
this kind of gets back to the question of like what's next
00:43:33.060 --> 00:43:33.360
yeah
00:43:34.500 --> 00:44:08.500
I'm going to finish the plugin for a proof of concept plugin for DigitalOcean I'll take it to the 1.0 version of that approach so people can reliably deploy to DigitalOcean with a particular articulated approach it'll probably be catty choice of SQLite or Progres Whereas, and then I'm probably like, my best approach is probably to back off of writing more plugins because I could spend the next few years just enjoyably exploring all these platforms and approaches.
00:44:09.540 --> 00:44:24.140
But I really should back off, just continue to let people know the project exists, make sure these set of plugins that I've started continue to work, and then just continue to tighten up the internals so that it's easier and easier for other people to write plugins.
00:44:24.640 --> 00:44:31.160
I can already tell from the way you're talking, like you could, I have a DSD plugin template repository.
00:44:31.640 --> 00:44:33.840
It's in the Django Simple Deploy organization.
00:44:34.480 --> 00:44:37.480
And so if you want to write a plugin, you don't start from scratch.
00:44:37.840 --> 00:44:43.040
You download that repository for the DSD plugin template.
00:44:43.340 --> 00:44:45.680
You don't clone it because there's no upstream for it.
00:44:46.020 --> 00:44:52.460
Download it, install it alongside Simple Deploy in development mode, and you can run tests right away.
00:44:52.940 --> 00:44:55.140
So you run an integration test and it just verifies it.
00:44:55.620 --> 00:44:56.460
It gives you a couple of questions.
00:44:56.620 --> 00:44:57.340
What's the name of your platform?
00:44:57.680 --> 00:44:59.720
What's the command you want people to use?
00:45:00.860 --> 00:45:01.940
Do you support automate all?
00:45:02.500 --> 00:45:07.880
And then it writes a new plugin for you with all the plumbing there.
00:45:08.280 --> 00:45:13.120
You run tests, verify that it works, and then you start writing your platform-specific code.
00:45:13.410 --> 00:45:17.240
And so there's a bit of a learning curve for developers where you got to learn, like, what...
00:45:17.960 --> 00:45:21.520
You know, Django's node deploy has a module called plugin utils.
00:45:22.060 --> 00:45:26.420
And so that's how you write output in a way that's consistent with the rest of the project, feeds into its logging.
00:45:27.420 --> 00:45:31.580
There's a run quick command for small changes you're making to the project.
00:45:32.040 --> 00:45:37.320
There's a run slow command for things like deploy to make sure we're capturing output, streaming it, whatnot.
00:45:37.900 --> 00:45:47.360
So you learn those utilities, but you pretty quickly get to a place where you're just focusing on your expertise or opinion about how to approach deployment for a particular platform.
00:45:47.760 --> 00:45:50.960
Yeah. Okay. I'm sure there's a ton out there.
00:45:51.120 --> 00:45:53.680
People can be like, well, what about my platform, right?
00:45:53.840 --> 00:45:59.720
You know, I'm sure there's some folks who are experts at wherever they're deploying their code that could maybe come and create a plugin, right?
00:46:00.000 --> 00:46:00.260
Absolutely.
00:46:00.760 --> 00:46:08.140
And somebody tried to write in support for Google.
00:46:08.840 --> 00:46:09.240
What was it?
00:46:09.460 --> 00:46:09.900
Google Cloud?
00:46:10.260 --> 00:46:11.000
Yeah, Google.
00:46:11.360 --> 00:46:11.760
Yeah, GCP.
00:46:12.060 --> 00:46:12.520
Google Cloud.
00:46:13.160 --> 00:46:13.660
A couple years
00:46:13.660 --> 00:46:13.940
ago.
00:46:15.180 --> 00:46:17.000
But that was back when there was no plugin system.
00:46:17.480 --> 00:46:23.180
And so it got bogged down in just like all the back and forth between core and that platform.
00:46:24.020 --> 00:46:29.840
These days, that person could just download that plugin template and start focusing on the platform.
00:46:30.160 --> 00:46:30.640
Yeah, awesome.
00:46:31.040 --> 00:46:33.940
I'm sure that there's people out there thinking, hey, we could do this for Azure.
00:46:34.240 --> 00:46:35.080
Hey, we could do this for
00:46:35.080 --> 00:46:35.880
AWS as
00:46:35.880 --> 00:46:36.440
well, right?
00:46:36.720 --> 00:46:45.560
You know, I'm really blown away about how many people choose the hyperscale clouds, given how complicated and expensive they are.
00:46:45.860 --> 00:46:48.260
There was some stat in one of the recent surveys.
00:46:48.510 --> 00:46:53.620
I don't know if it was the ESF chip brains one or just a more general developer one.
00:46:54.100 --> 00:46:54.740
Anyway, it doesn't matter.
00:46:54.990 --> 00:47:02.140
One of the bigger surveys, 75, 78% of the people used either Azure, AWS, or GCP.
00:47:02.660 --> 00:47:09.000
And I look at those, I'm like, geez, I don't think 75% of the apps out there need the stuff that those are offering.
00:47:09.300 --> 00:47:11.800
And it's so, so much more expensive.
00:47:11.940 --> 00:47:18.000
I don't think people fully understand how much more expensive it is to get like a VM on one versus the other.
00:47:18.360 --> 00:47:23.180
I did some, I think, you know, it always depends on which one you pick or something.
00:47:23.440 --> 00:47:35.960
But for a $20 Hetzner server, it's, I think, $60 on DigitalOcean, $200 something dollars on AWS, and I think pushing up towards $300 for Azure.
00:47:36.580 --> 00:47:39.980
And what you get when you go up to these prices, you don't get a better experience.
00:47:40.140 --> 00:47:45.980
you get a worse one because all the complexity, all the stuff that you got to deal with, it's not like, well, just here's your server, go with it.
00:47:46.060 --> 00:47:46.540
Like, oh, no, no.
00:47:46.660 --> 00:47:48.300
There's all these other things you got to bring in.
00:47:48.680 --> 00:47:52.220
And it just, it super surprises me that that's the case.
00:47:52.330 --> 00:47:53.580
And so, yeah, I don't know.
00:47:54.020 --> 00:47:54.300
Yeah.
00:47:54.460 --> 00:47:57.940
I built working support for Azure early on.
00:47:58.280 --> 00:48:03.200
My goal, you know, I worked for Vork originally, then I made it work for one other platform, which was Fly.
00:48:03.520 --> 00:48:04.200
Like, okay, cool.
00:48:04.300 --> 00:48:05.340
This isn't tied to one platform.
00:48:06.020 --> 00:48:07.500
And then the rule of three, I did a platform in a stage.
00:48:07.690 --> 00:48:09.980
Like, okay, now I've gotten all the generalities out.
00:48:11.200 --> 00:48:21.260
moving over to VPS as opposed to platform as a service opens up a few new things, but I can put those in internally without making breaking changes in the project.
00:48:22.160 --> 00:48:33.600
Yeah. And Azure does have a platform as a service offering, for example. I'm not, I think, I'm sure AWS does as well, although I haven't tried to try to use it. Yeah. So, I mean, they're analogies. I don't know.
00:48:34.460 --> 00:48:37.180
Well, I also focused on Heroku.
00:48:37.200 --> 00:48:40.720
One of the things for Heroku is it's one of the fastest deployments I've used.
00:48:41.620 --> 00:48:42.720
It kind of got a dialed.
00:48:44.120 --> 00:48:48.360
Azure was taking like 10 or 15 minutes, so it was hard to do development work against that.
00:48:49.480 --> 00:48:51.780
Kim posted this interesting question or comment.
00:48:52.040 --> 00:48:54.640
The various deployment mechanisms presumably all need credentials.
00:48:55.260 --> 00:48:57.080
Are these provided as NV variables?
00:48:57.780 --> 00:49:00.080
Many beginners perhaps don't know what has to do with these.
00:49:00.540 --> 00:49:01.340
This project may help.
00:49:01.780 --> 00:49:02.480
I agree completely.
00:49:03.440 --> 00:49:10.040
So this project is like I'm approaching VPS credentials around SSH as ENV variables.
00:49:10.720 --> 00:49:11.680
That's what I've used in the past.
00:49:12.900 --> 00:49:19.700
ENV variables being files that have basically key values that you don't put into Git, but you create on the platform, right?
00:49:19.720 --> 00:49:20.240
Something like that?
00:49:20.460 --> 00:49:20.720
Yeah.
00:49:20.920 --> 00:49:30.820
And so the quick start guide will say like export these two environment variables, you know, your IP address and your host password, maybe a username if you've already created a non-root user.
00:49:31.540 --> 00:49:38.580
But it goes through and it basically, if you don't give it a username, it tries the default Django user username and it goes through root and whatnot.
00:49:41.140 --> 00:49:46.220
It's a little humbling to make these plugins because it shows you exactly where my current knowledge is at.
00:49:47.120 --> 00:49:48.620
But it's also a starting place that works.
00:49:49.120 --> 00:49:52.560
And so if somebody looks at this and says like, hey, you really shouldn't be using the NB variables.
00:49:52.940 --> 00:49:55.180
Here's the current best way to deal with credentials.
00:49:55.700 --> 00:50:23.860
we can write that into the plugin and as kim is pointing out it steers all beginners all people from that point forward um into that better usage and it also comes back to that idea that this isn't just for beginners think about all the people out there who are using the inv variables because that's what they learned and maybe if there's something better and the latest version of the plugin steers them towards that as well i've often found there are things that are good for beginners that end up being really helpful for everybody else as well um and this project feels like one of those.
00:50:24.280 --> 00:50:28.540
That's very cool. Certainly making your life easier. Everybody wants that, right? Yeah.
00:50:28.740 --> 00:50:48.260
Automated a lot of things. Okay. Well, I mean, I'll throw one more thought out there. Like as you're working on the server, the virtual server side of things, I think there's a lot of opportunity to leverage Docker to say like, if you could build an image that is 90% the way there, you could just say, run this Docker image, run this Docker container based on this image.
00:50:48.640 --> 00:50:53.720
And what, it doesn't even matter what server it's on. I think there's, I think there's some interesting stuff you could do with docker here but
00:50:53.720 --> 00:50:55.720
oh absolutely yes i'll
00:50:55.720 --> 00:51:11.440
let you go down that path but i i certainly have enjoyed it um yeah so what's next what do you have to you this is by the way i don't know if we called it out that way this is kind of the 1.0 you mentioned it in passing but this is the 1.0 milestone sort of thing right
00:51:11.440 --> 00:51:21.960
yeah the 1.0 for this is really about like people should be able to trust that it's reliable from this point forward it does work works on all three OSs for the officially supported plugins.
00:51:23.260 --> 00:51:35.820
I'm going to try to keep a list of plugins that I'm aware of that are being worked on and sort out that whole, you know, how do you manage an ecosystem? But, you know, I've also thought of this as like a gift to the Django community.
00:51:36.500 --> 00:51:39.760
I wanted to release 1.0 on Christmas. I couldn't quite get there.
00:51:41.340 --> 00:51:46.060
You know, if you listen to Django chat, when the word deployment comes up, there's always this Corona.
00:51:46.100 --> 00:51:46.440
of oh
00:51:46.440 --> 00:51:52.000
um and i've been there for 20 years excited as well over he loves it yes um
00:51:52.000 --> 00:52:22.560
but so this problem has been in jango in the jango world for 20 years how do we deal with the fact that it's hard to deploy jango harder than php harder than some other things and i really think this project kind of answers that question or goes a long way towards entering it um and there's a there are people in the django community who have been kind of cheerleading this project for a while um because if they've seen it i've announced it in public i've kind of done the development in public and at django cons whatnot
00:52:22.560 --> 00:52:25.340
yeah so awesome i'm gonna
00:52:25.340 --> 00:52:33.440
i'm gonna step back from creating more plugins i'm gonna continue to refine the internals and i'm gonna go back to my own like actual django projects you're
00:52:33.440 --> 00:52:44.940
gonna use it rather than build it yes yes you know that's the way to do it you know Well, I think one of the bits of magic of Python and why it's so popular is it's very welcoming to beginners, right?
00:52:45.740 --> 00:52:50.840
People coming from science, like we talked about, or other things, they kind of get sucked in and they're like, huh, it's nice here.
00:52:50.960 --> 00:52:51.340
Maybe I'll stay.
00:52:51.840 --> 00:52:56.840
And, you know, these kind of things sort of tell that same story for web developers, right?
00:52:57.160 --> 00:53:01.020
There might be a point where people outgrow this or they don't, but they might.
00:53:01.360 --> 00:53:13.280
But it might have gotten them that year's worth of experience running a server or running a platform as a service app and dealing with all of that so that they're then ready to take whatever next step that needs to be taken, if it needs to.
00:53:13.540 --> 00:53:18.200
Yeah, it really smooths out that learning process because you just described it.
00:53:18.740 --> 00:53:20.180
Python's welcoming people to learn Python.
00:53:20.880 --> 00:53:22.580
They say, oh, I want a web front end for this.
00:53:23.160 --> 00:53:29.860
Going back to my father not releasing his projects, he was a software developer in the 70s and 80s.
00:53:30.680 --> 00:53:38.300
And so for him, deployment was, I need to make my project so good, it can be printed to like 10,000 physical copies.
00:53:39.980 --> 00:53:43.380
So it's no fault to him for having those unreleased projects.
00:53:44.600 --> 00:53:48.680
So the pathway these days is people learn Python, say, okay, I'm solving my problem with Python.
00:53:48.960 --> 00:53:51.360
I want a web front end so other people can access it.
00:53:51.680 --> 00:53:53.340
They learn Django because they already know Python.
00:53:53.940 --> 00:53:54.620
That's all smooth.
00:53:55.140 --> 00:53:57.800
Django is a bit hard, but you can learn it if you know Python.
00:53:58.520 --> 00:54:03.000
And then they get to deployment and it's this entirely different class of things to learn.
00:54:03.440 --> 00:54:04.860
And that's where that cliff comes in.
00:54:05.220 --> 00:54:09.320
And so simple deploy tends to smooth out that.
00:54:09.540 --> 00:54:10.680
It basically removes that cliff.
00:54:11.030 --> 00:54:13.280
And so you go right from where you are.
00:54:13.660 --> 00:54:15.320
I have a project working on my system.
00:54:15.840 --> 00:54:17.320
Now it's working on a remote server.
00:54:17.760 --> 00:54:27.300
I don't fully understand it, but it's much easier to poke around at the working deployment than poke around at something that you're trying to do that's broken and people end up giving up.
00:54:28.080 --> 00:54:29.620
I'm excited about like, yeah,
00:54:30.060 --> 00:54:32.220
I'm excited about like opening that pathway for people.
00:54:32.500 --> 00:54:33.160
Yeah, absolutely.
00:54:33.400 --> 00:54:33.660
That's awesome.
00:54:33.960 --> 00:54:34.400
Nice work.
00:54:34.480 --> 00:54:35.340
And thanks for doing it.
00:54:35.400 --> 00:54:52.500
There's already so much to learn to build a web app to even go from, I know Python to a web app because CSS databases, you know, HTML, JavaScript, there's already enough that you don't need to throw Linux and CDNs and all that at people at the same time, right?
00:54:52.580 --> 00:54:56.200
Let them go across the chasm and they'll figure it out on the other side.
00:54:56.480 --> 00:54:56.620
All right.
00:54:57.040 --> 00:54:58.300
Well, thanks for this project.
00:54:58.920 --> 00:54:59.880
Maybe final call to action.
00:55:00.060 --> 00:55:00.860
People want to get started with it.
00:55:00.880 --> 00:55:01.300
What do you tell them?
00:55:02.020 --> 00:55:02.860
Go take a look at the docs.
00:55:03.160 --> 00:55:06.080
There's friendly quick start docs, show you how it's used.
00:55:06.240 --> 00:55:10.840
And there's pretty comprehensive contributing docs if you're curious to write a plugin or how about otherwise?
00:55:11.500 --> 00:55:13.460
Yeah, I guess let's close it out with this.
00:55:13.780 --> 00:55:20.200
If you got a platform out there, if you're somebody like fly.io, but a different, consider creating one of these plugins.
00:55:20.440 --> 00:55:21.900
It blows my mind, Eric.
00:55:22.080 --> 00:55:25.020
I don't know how you feel, but there'll be some major, major service.
00:55:25.640 --> 00:55:30.820
And you'll go there and they're like, well, you can use our JavaScript API or you can just write it from scratch.
00:55:31.520 --> 00:55:31.940
Like how
00:55:31.940 --> 00:55:37.760
much effort is it for one of these companies to spend a week, create a package for their thing and make it go?
00:55:37.780 --> 00:55:48.560
And I think, you know, a sort of a similar call to action, like, hey, if you want to make it real easy for people to just switch to your platform, you know, consider following the steps that you talked about to build a plugin for this, right?
00:55:48.940 --> 00:55:49.040
Yeah.
00:55:49.340 --> 00:55:49.400
Yeah.
00:55:49.500 --> 00:55:52.640
And for anybody getting, anybody interested in writing a plugin, feel free to reach out.
00:55:52.800 --> 00:55:55.660
I'm happy to make sure that works first time people do it.
00:55:55.940 --> 00:55:56.420
Yeah, absolutely.
00:55:56.760 --> 00:55:56.920
All right.
00:55:57.240 --> 00:55:58.100
Thanks for being here again.
00:55:58.400 --> 00:55:58.660
Talk to you
00:55:58.660 --> 00:55:58.780
later.
00:55:58.820 --> 00:55:59.120
Thank you, Michael.
00:55:59.680 --> 00:56:00.080
Bye.
00:56:00.640 --> 00:56:00.820
Bye.
00:56:01.600 --> 00:56:04.320
This has been another episode of Talk Python To Me.
00:56:05.060 --> 00:56:06.020
Thank you to our sponsors.
00:56:06.480 --> 00:56:07.720
Be sure to check out what they're offering.
00:56:07.880 --> 00:56:09.140
It really helps support the show.
00:56:10.100 --> 00:56:12.580
This episode is sponsored by Worth Recruiting.
00:56:13.180 --> 00:56:17.560
Worth Recruiting specializes in placing senior level Python developers and data scientists.
00:56:18.200 --> 00:56:22.960
Let Worth help you find your next Python opportunity at talkpython.fm/worth.
00:56:23.720 --> 00:56:24.600
Want to level up your Python?
00:56:25.060 --> 00:56:28.700
We have one of the largest catalogs of Python video courses over at Talk Python.
00:56:29.180 --> 00:56:33.860
Our content ranges from true beginners to deeply advanced topics like memory and async.
00:56:34.300 --> 00:56:36.480
And best of all, there's not a subscription in sight.
00:56:37.000 --> 00:56:39.400
Check it out for yourself at training.talkpython.fm.
00:56:40.120 --> 00:56:44.280
Be sure to subscribe to the show, open your favorite podcast app, and search for Python.
00:56:44.720 --> 00:56:45.600
We should be right at the top.
00:56:46.000 --> 00:56:54.960
You can also find the iTunes feed at /itunes, the Google Play feed at /play, and the direct RSS feed at /rss on talkpython.fm.
00:56:55.640 --> 00:56:57.880
We're live streaming most of our recordings these days.
00:56:58.240 --> 00:57:05.720
If you want to be part of the show and have your comments featured on the air, be sure to subscribe to our YouTube channel at talkpython.fm/youtube.
00:57:06.740 --> 00:57:07.860
This is your host, Michael Kennedy.
00:57:08.280 --> 00:57:09.120
Thanks so much for listening.
00:57:09.280 --> 00:57:10.280
I really appreciate it.
00:57:10.620 --> 00:57:12.220
Now get out there and write some Python code.