For the deployment, I am running the server applications for both Maginet (
https://evrimzone.itch.io/maginet) and Critter Showdown on the same $5 server, under a different subdomain. These subdomains are reverse-proxied by nginx behind Let's Encrypt certificates. Game servers host lobby and game logic, and are compiled to native Rust binaries. The client-side is compiled to WebAssembly (I don't use an engine, so it's all wasm-bindgen) and the Steam version (of Maginet) is just a thin Electron wrapper around the same thing that runs in the browser. In both games, the client and server share all the game related logic, with the server orchestrating synchronization of states, and client wrapping it all with the I/O.
Was it easy? In the end, sure, it's a very simple system. However, a lot of gotchas including HTTP headers (connecting itch.io to my personal domain, or making sure that when the game updates the clients pick up the new binary).
I wrote about the client/server part of Maginet and its technical aspects over at https://evrim.zone/blog/projects/maginet/development_overvie.... However, I did not write much about the deployment. Both Critter Showdown and Maginet are essentially the same framework, I built the former in two weeks for a jam based on the stripped-down Maginet shell. If you follow the instructions on GitHub, you should be able to download and run both of them quite easily. Build client, build and run server, then head out to localhost:port to play!
PS: Maginet runs the shared game logic on the server side, but Critter Showdown (with Rapier2D physics) does not. Maginet has a stricter move validation logic (legal vs illegal turns for your mages) that Critter Showdown doesn't (force impulse vectors for your bugs). Turns are passed in Critter Showdown only when both players' turns are received, and it works pretty seamlessly.