Look, there's a rich spectrum of abstraction that we are lucky enough to choose from as developers. Obviously you can write a byte stream onto the disk using assembly if you want, or you can have a high-level API store data for you without knowing how or where it's going. You can call any combination of technology a "stack."
Since you asked, the level I've chosen for this project is Go and PostgreSQL via pq. There's a single level of indirection to wrap the database access in case we need to switch from Postgres for any reason, but otherwise the app interfaces directly with the database. Migrations are simple SQL files that are run as necessary as the server starts up.
This will all run on a dedicated server that is already doing other stuff. That's the full "stack" as it were.
The one I use creates the migrations, locally, for free and deterministically in about 30 seconds.