What began as a single server has evolved into a fully realized homelab infrastructure, which I now call MailoDataCenter. This personal data center serves as a hub for hosting game servers, websites, APIs, monitoring systems, storage solutions, and experimental projects—all operating on custom hardware.
The Vision Behind MailoDataCenter
The core objective of MailoDataCenter is straightforward:
Full control, high performance, and independence from external cloud platforms.
Rather than relying on monthly costs for a dozen virtual private servers (VPS), I’ve built a physical infrastructure tailored to my needs. Key components include:
- Nebula: A high-performance compute node for virtualization and heavy workloads.
- Nimbus: A storage-centric server for data services and backups.
- Zenith: A high-speed storage node optimized for demanding applications.
These servers operate in harmony, forming a cohesive, scalable infrastructure.
The Software Stack
The MailoDataCenter leverages modern containerization and open-source tools to streamline deployment and management. Key components include:
- Docker & Docker Compose: For service orchestration and container management.
- Coolify: A centralized platform-as-a-service (PaaS) interface for managing applications.
- Traefik: A reverse proxy with wildcard domain support and automatic HTTPS.
- Monitoring Stack: Prometheus, Grafana, Node Exporter, and cAdvisor for real-time performance tracking.
- Uptime Kuma: For public and internal status page management.
- Self-Hosted GitHub Runners: For continuous integration and deployment (CI/CD) workflows.
- Custom APIs: Built using Node.js for tailored functionality.
This stack enables rapid deployment:
Create a project → Push to the repository → Done.
What Runs in MailoDataCenter?
The infrastructure supports a diverse range of applications:
- Minecraft Networks: Hosting Paper, Fabric, Velocity, modded servers, and proxies.
- Web Services: Personal websites, APIs, and media systems (including large music libraries).
- Automation Tools: Bots, scrapers, and internal dashboards.
- Testing Environments: For experimenting with new projects and infrastructure.
- Monitoring Systems: Tracking performance metrics across all services.
Some servers host world files exceeding hundreds of gigabytes, while others manage pre-generated maps for 50,000+ chunks.
Storage and Performance Priorities
Storage is a critical focus in MailoDataCenter:
- RAID Arrays: Comprising 24 × 24TB drives for redundancy and capacity.
- NVMe Pools: For low-latency, high-speed workloads.
- SAS Arrays: For bulk data storage and archival.
- 10GbE Networking: Ensuring seamless communication between nodes.
Performance bottlenecks are proactively identified, visualized via Grafana, and resolved through optimization.
Why Not Use the Cloud?
Three primary reasons drive this approach:
- Cost Efficiency: Achieving the same scale in the cloud would incur prohibitively high expenses.
- Autonomy: Full control over configuration, security, and optimization strategies.
- Learning and Mastery: A hands-on environment to deepen expertise in Linux, networking, containers, and infrastructure design.
Challenges of Self-Hosting
Of course, self-hosting comes with trade-offs:
- Responsibility: If a system fails at 3 AM, I am the sole point of contact.
- Maintenance: Disk failures, failed updates, and container crashes require immediate attention.
However, these challenges are part of the journey—each issue resolved strengthens the infrastructure and my technical skills.
The Road Ahead
MailoDataCenter is evolving toward becoming:
- A Private Cloud: A self-contained, scalable environment for personal and potential external use.
- A Hosting Platform: For my own projects and possibly for others.
- A Testbed: For experimenting with distributed systems, container orchestration, and cloud-native technologies.
Final Thoughts
Operating a personal data center is not about minimizing costs—it’s about ownership, performance, and freedom.
Ultimately, the true value of MailoDataCenter lies not in cost savings, but in the autonomy, performance, and control it provides.
And yes—there’s a certain satisfaction in seeing everything run on your own machines, knowing you’ve built it from the ground up.
Code Sample: 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);