The way I've done this is to use planettiler to generate vector tiles for the whole world and then pack that into a squashfs archive. That way I don't need an additional program to serve them, and I can regenerate the whole archive every couple of months or so (I don't need the latest data).

An exciting new standard here is pmtiles; a standardized way to store map tiles that can be used via http range requests. I believe planettiler has plans to add pmtiles output support as well.

https://github.com/protomaps/PMTiles