The count
A four-region network is not four servers.
Start with a 2 by 2 grid. Every extra region is another server to pay for, and the interesting behaviour is all there with four.
The hub is not strictly required — without one a drain logs an error and leaves players where they are — but you cannot cleanly restart a shard without it.
Versions
Atlas reaches into the server for things Bukkit does not expose, which fixes two things: it needs Paper or a fork of it, and it is built against one Minecraft version. Paper forks are fine — Purpur, Pufferfish, Leaf, Gale and anything else downstream inherit what it uses. Spigot and CraftBukkit are not, and neither is Folia, which has a different threading model entirely. What it will not survive is a different Minecraft version; a different Paper build of the same version is fine. The versions pinned ingradle.properties are pinned so the build is reproducible.
MongoDB: a standalone is fine
A plainmongod works. Ownership is a fenced lease, which is a single-document update, and single-document atomicity is something every deployment provides.
What differs is the read concern, and Atlas asks the server what it is on startup and adapts. On a replica set it reads with majority, which guards against a failover rolling back an acknowledged write and resurrecting a lease another shard has taken. A standalone has no second node and therefore no failover, so it reads with local, which is the same guarantee rather than a lesser one.
The one thing you lose is the multi-document transaction helper offered to other plugins. Nothing in the crossing path uses it, and plugins that need it fail loudly rather than half-applying.
If you want it, a single-member replica set is one flag and one command on the same mongod:
?replicaSet=rs0. Any managed MongoDB is already a replica set.
Redis: one per network
Keys are not namespaced by tenant. Two networks pointed at one Redis overwrite each other’s routing and transfer tickets, and the symptom is players being sent to the wrong network’s servers rather than an error. Use a separate instance, or at minimum a separate database number:The world
This is the requirement with no error message, and the one that looks like a bug in Atlas when it bites. Chunk decoration is not a pure function of the seed. Four servers generating “the same” world from the same seed disagree about where the trees are, visibly, at every border, as a seam where terrain does not line up. So generate the world once, pre-generate it out to the edge of the grid, stop the server, and copy the folder to every shard. Every shard must also use the samelevel-name. Each then keeps its own copy and what players build on region 0 lives only on region 0’s server, which is the point.