From Monolith to Separate Apps
One of the biggest changes was breaking down the old monolith into separate applications.
Yes, at the very beginning the game server, the client, and even what could be called a public website were all one single app. Now the “kids have grown up,” and it was time for them to leave the nest and start maturing on their own. The heart of this new infrastructure is, of course, the game server. It’s what processes all the game logic, states, and real-time events — and what allows clients to “see” this world.
Extracting the server also meant giving it an API to communicate with the other new parts of the system. Later, as this little bird grows up, it too will fly off and become a fully independent service.
The second major app is the game client. It got new tools to communicate with the server API. But more importantly, it can now be packaged not only as a web client, but also as a standalone application. Yes, at the moment it’s only for macOS, and the code isn’t signed yet (so it’s not exactly recommended for prefer use). Still, this is a strong foundation for the future, where standalone clients for different platforms will become the main way to play.
The third app is the public website — the entry point for anyone who wants to check out the game or download the client. Simple, but hopefully tasteful - https://awaken-protocol.com/ :) And then there was the fourth element… but more on that later.
DevOps
Moving everything onto a new physical server required preparation — both on the machine itself and in the deployment tooling for all the apps.
At this stage of the project, with frequent updates, I decided to go with containerization as one of the simplest and most reliable ways to deploy. Setting up Docker containers, integrating with GitHub, creating configs and scripts to automate deployment and updates — all of this now makes it easy to roll out changes to individual parts of the infrastructure.
Sure, there’s still plenty to improve here, but for now it’s working great!
The Fourth Element
Once everything was up and running, the next big question appeared: how do I know it’s all working? :)
In other words, I needed a way to monitor the state of the whole system — from the physical server, to individual containers, to the BEAM server internal state, and even in-game parameters.
For this, I set up Prometheus and Grafana, combined with the server’s internal telemetry. The result? A ton of beautiful dashboards showing the pulse and vital signs of the entire system.