skip to content
Blog by Hafid
Table of Contents

Last month, I finished one of the projects I had been working on for a while. It was a Game as a Service platform for Minecraft servers, and this project ended up teaching me quite a lot about backend development, infrastructure, and what it actually takes to run an application in production.

From Manual Setup to Automatic Provisioning

I started with the application itself. The idea was pretty straightforward. Users should be able to choose a Minecraft server, configure what they need, make a payment, and get their server without having an admin manually set everything up.

I built the whole flow around that idea. The application handles the purchase process, payment gateway integration, and automatic server provisioning. I also integrated it directly with Pterodactyl Panel. Once a payment was completed, the system could communicate with Pterodactyl and create the server automatically.

I also added a ticketing system and dashboards for managing servers and user requests. This was important because I didn’t want the application to stop at the point where the user gets their server. There needed to be a way to manage everything that happens after that too.

The Infrastructure Part

The infrastructure was probably the part I enjoyed the most.

For the Laravel application, I decided to use FrankenPHP as the runtime. I also put Traefik in front of the services to handle reverse proxying and load balancing. This gave me a simple way to manage how traffic was routed between the different services.

I used Redis for caching and other fast data operations. I also introduced queues for processes that didn’t need to happen inside the user’s request. Things like events and heavier background processes could be pushed into a queue and handled separately.

Deploying to Production

Then came the part that always feels a little different from local development: deploying everything to production.

I set up the deployment pipeline with GitHub Actions so I could automate the build, testing, and deployment process. After making a change and pushing it to the repository, the application could go through the pipeline and be deployed without me having to manually repeat the same steps every time.

There were definitely some things I had to figure out along the way. Getting all the services to work together was different from simply running a Laravel application locally. The application, payment gateway, Pterodactyl, Redis, queues, containers, Traefik, and deployment pipeline all had to work together properly.

What I Liked Most

What I liked most about this project was that I got to see the entire journey of an application. It started as code on my local machine and eventually became a real system running in production.

In the end, I was also able to keep the production environment relatively lightweight. The application was running with low RAM usage and didn’t require a lot of resources to keep the whole system running. That was something I was quite happy with because I wanted the infrastructure to stay simple, lightweight, and efficient.

This project made me even more interested in backend development and infrastructure. There’s something different about building an application when you also have to think about what happens after you deploy it and real users start using it.