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

ServerPrimary Function
NebulaHeavy compute & virtualization
NimbusStorage and data services
ZenithHigh‑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

LayerTechnologyPurpose
Container OrchestrationDocker & Docker ComposeSimplified deployment & isolation
Platform‑as‑a‑ServiceCoolifyWeb‑based management panel
IngressTraefikDynamic reverse proxy, wildcard domains, automated HTTPS
MonitoringPrometheus + Grafana + Node Exporter + cAdvisorMetrics collection, visualization,
alerting
Status PagesUptime KumaPublic & internal uptime dashboards
CI/CDSelf‑hosted GitHub runnersAutomated builds & deployments
Custom ServicesNode.js & other APIsTailored 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

ComponentConfigurationPurpose
RAID Arrays24 × 24 TB drivesHigh capacity, fault tolerance
NVMe Pools3 × 1 TB SSDsLow‑latency, high‑throughput workloads
SAS Arrays8 × 6 TB HDDsBulk data archival
Networking10 GbE interconnectsMinimal 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?

ReasonExplanation
CostThe scale of storage and compute required would be prohibitively expensive on public clouds.
ControlFull authority over configuration, security hardening, and optimisation.
LearningHands‑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.