Overview
What began as a single server has grown into a fully‑featured private data center that I refer to as
MailoDataCenter. The goal is simple: gain complete control over a fleet of purpose‑built physical
machines that host game servers, websites, APIs, monitoring services, storage, and experimental
workloads—all powered by my own hardware.
Motivation
The Core Objective
- Full control – no reliance on third‑party cloud providers.
- High performance – raw hardware delivers the speed and responsiveness required for demanding
workloads. - Cost efficiency – a single infrastructure can run a wide range of services more cheaply than
multiple VPS instances.
Server Roles
| Server | Primary Function |
|---|---|
| Nebula | Heavy compute & virtualization |
| Nimbus | Storage and data services |
| Zenith | High‑performance storage & compute workloads |
Each server is dedicated to a specific set of responsibilities but they all interconnect seamlessly to
form a unified environment.
Architecture & Stack
| Layer | Technology | Purpose |
|---|---|---|
| Container Orchestration | Docker & Docker Compose | Simplified deployment & isolation |
| Platform‑as‑a‑Service | Coolify | Web‑based management panel |
| Ingress | Traefik | Dynamic reverse proxy, wildcard domains, automated HTTPS |
| Monitoring | Prometheus + Grafana + Node Exporter + cAdvisor | Metrics collection, visualization, |
| alerting | ||
| Status Pages | Uptime Kuma | Public & internal uptime dashboards |
| CI/CD | Self‑hosted GitHub runners | Automated builds & deployments |
| Custom Services | Node.js & other APIs | Tailored business logic & integrations |
The container‑centric approach allows me to push a new repository to a GitHub branch and have the new
service spun up automatically.
Production Workloads
- Game Servers – Minecraft (Paper, Fabric, Velocity, modded) and other real‑time multiplayer
platforms. - Web & API Services – Personal sites, public APIs, and internal dashboards.
- Media & Storage – Large music libraries, media transcoding pipelines.
- Automation – Bots, scrapers, custom automation tools.
- Testing Environments – Rapid prototyping of new projects and features.
- Monitoring & Metrics – End‑to‑end visibility across all services.
Some game worlds exceed hundreds of gigabytes and require pre‑generated maps with 50 000+ chunks.
Storage & Performance Focus
| Component | Configuration | Purpose |
|---|---|---|
| RAID Arrays | 24 × 24 TB drives | High capacity, fault tolerance |
| NVMe Pools | 3 × 1 TB SSDs | Low‑latency, high‑throughput workloads |
| SAS Arrays | 8 × 6 TB HDDs | Bulk data archival |
| Networking | 10 GbE interconnects | Minimal bottlenecks between nodes |
All performance metrics are continuously measured, visualised in Grafana, and acted upon—if a component
slows, I identify, quantify, and remediate.
Why a Self‑Hosted Data Center?
| Reason | Explanation |
|---|---|
| Cost | The scale of storage and compute required would be prohibitively expensive on public clouds. |
| Control | Full authority over configuration, security hardening, and optimisation. |
| Learning | Hands‑on exposure to Linux, networking, containerisation, and infrastructure |
| engineering. |
The trade‑off is that I am the only “cloud provider” for my services, meaning any hardware failure or
software regression has immediate impact. However, this risk is an inherent part of operating a real data
center and is a valuable learning experience.
Long‑Term Vision
- Transform MailoDataCenter into a private cloud for my own projects.
- Potentially offer VPS or managed services to external clients.
- Continue evolving the platform into a scalable, production‑ready infrastructure playground.
Technical Demo: Server Status Simulator
Below is a simple Node.js script that simulates server load and status. It’s useful for testing
monitoring dashboards and alerting rules.
// Fake server status simulator const servers = [ { name: "Nebula", load: 0 }, { name: "Nimbus", load: 0 }, { name: "Zenith", load: 0 }, ]; function randomLoad() { return Math.floor(Math.random() * 101); // 0 - 100% } function updateStatus() { console.clear(); console.log("=== MailoDataCenter Status ===\n"); servers.forEach(server => { server.load = randomLoad(); let status = "OK"; if (server.load > 85) status = "HIGH LOAD"; if (server.load > 95) status = "CRITICAL"; console.log( `${server.name.padEnd(8)} | Load: ${server.load}% | Status: ${status}` ); }); } // Update every 2 seconds setInterval(updateStatus, 2000);
Closing Thoughts
Operating my own data center isn’t merely about reducing expenses. It’s about owning the entire stack,
achieving peak performance, and continuously learning. Seeing every component—from the physical servers
to the monitoring dashboards—run on my own hardware is profoundly rewarding and, admittedly, somewhat
addictive.