So I mentioned in the previous devlog that I would make a detailed architecture post; well that just got a whole lot simpler!
The initial architecture
The initial architecture was created using better-t-stack which is an amazing tool to kickstart a js monorepo. The problem with this approach is that you now have a bunch of dependencies that need to be bundled correctly (which better-t-stack already sets up) and - in my usecase - containerized to have the smallest image size.
Then came the biggest issues: mails & scheduled jobs. Don't get me wrong, there are solutions for both in Javascript ecosystem (React Email, bullmq, pgboss and more come to mind) but I felt it would add another layer of complexity the app could probably do without. So the question now became; should I just move the api layer to something like AdonisJS to have a more batteries included setup and where I could easily
The new architecture
Turns out I know of a framework that has scheduling, mails, queued jobs and more out of the box: Laravel. And I can kind of keep most of my frontend code by using it with Inertia. It's not a 1:1 port by any means, though. I lose out on better-auth and orpc, having to rely on Laravel's auth system and on making the calls typesafe in another way - by using spatie/laravel-data to generate types from my DTOs.
The new deployment strategy
Before, I had multiple docker images that I needed to maintain:
a helper that ran the migrations if/when there was something new
the actual server image
Each of these images needed to have different packages copied inside them for the build step and it was kind of messy - though still manageable.
Now this is not yet finalized, but I think I might be able to either have:
a single image with different start commands in a docker-compose stack
a single image and container with more services defined inside some s6 services
Anyway I'll keep you updated when all of this is finished :)