Technical Articles & Tutorials

Moving from Cloud to Self-Hosted Infrastructure: Enterprise Reliability at Value Prices

Cloud costs escalating? This guide shows how to build reliable self-hosted infrastructure using enterprise-grade components at value prices.

Introduction

The cloud revolution has transformed how businesses deploy and scale their infrastructure. Services like AWS, Azure, and Google Cloud offer incredible flexibility and a vast array of managed services that simplify operations. However, many organizations are experiencing painful increases in their cloud bills as workloads grow and stabilize.

This article explores an alternative approach: building enterprise-grade infrastructure on your own hardware. We'll show how advances in virtualization, storage, and management tools have made self-hosting a compelling option for many use cases—often at a fraction of cloud costs while maintaining similar reliability and features.

We'll cover everything from hardware selection to clustering, storage options, and self-hosted alternatives to popular cloud services. The focus will be on achieving cloud-like capabilities with used enterprise hardware and open-source software, creating a solution that's both reliable and economical.

Why Consider Moving Away from the Cloud

While cloud platforms offer tremendous value, especially for variable workloads and startups, there are several compelling reasons to consider self-hosting as your operations mature:

Reasons to Consider Self-Hosting
Cost Predictability and Control

Cloud pricing models can lead to unpredictable bills, especially with services charged by usage. Self-hosting provides fixed, predictable costs after the initial investment.

Performance Consistency

Avoid "noisy neighbor" issues common in shared cloud environments. With dedicated hardware, you control the entire stack and can tune it specifically for your workloads.

Data Sovereignty and Compliance

For organizations with strict data residency requirements, self-hosting ensures complete control over where data is stored and processed.

Total Cost of Ownership

While cloud makes sense for variable workloads, stable operations with predictable resource needs often become significantly less expensive when self-hosted—particularly at scale.

A common misconception is that self-hosting means sacrificing reliability, scalability, or ease of management. However, with modern tools like Proxmox VE and high-quality used enterprise hardware, you can achieve many of the same benefits while controlling costs.

Proxmox Clustering: Enterprise Features on a Budget

At the core of our self-hosted infrastructure is Proxmox Virtual Environment (VE)—an open-source virtualization platform that combines KVM hypervisor and LXC containers with a comprehensive web-based management interface. What makes Proxmox particularly valuable is its built-in clustering capabilities that provide enterprise features without enterprise licensing costs.

Key Proxmox Clustering Capabilities
High Availability (HA)

Configure critical VMs and containers to automatically restart on other nodes in the event of hardware failure.

Live Migration

Move running VMs between physical hosts with no downtime—perfect for maintenance windows or load balancing.

Centralized Management

Manage your entire infrastructure from a single web interface, with role-based access control for team environments.

Distributed Storage

Native support for Ceph provides software-defined storage with replication across nodes, eliminating single points of failure.

Backup and Restore

Scheduled backups with retention policies, with support for full and incremental backups to various storage types.

Setting Up a Basic Proxmox Cluster

Setting up a Proxmox cluster is straightforward. Here's a high-level overview of the process:

Basic Proxmox Cluster Setup
  1. Install Proxmox VE on each physical server (minimum 3 nodes recommended for true HA)
  2. Ensure all nodes have the same Proxmox version and are on the same subnet
  3. Create a cluster on the first node using the web interface
  4. Generate join information for additional nodes
  5. Join remaining nodes to the cluster
  6. Configure shared storage (critical for features like live migration)
Automated VM Initialization

When creating multiple VMs in Proxmox, it's efficient to clone from a template and then initialize each new VM. This script handles post-clone initialization tasks:

#!/bin/bash
# proxmox-vm-init.sh
# Post-clone initialization script for Proxmox VMs
# Usage: Edit NEWNAME variable and run on freshly cloned VM
# Example: NEWNAME="app1" ./proxmox-vm-init.sh

# Set this before running
NEWNAME="control"

# Run this block as-is
sudo hostnamectl set-hostname $NEWNAME
echo $NEWNAME | sudo tee /etc/hostname
sudo sed -i "s/app1/$NEWNAME/" /etc/hosts
sudo rm /etc/ssh/ssh_host_*
sudo dpkg-reconfigure openssh-server
sudo rm /etc/machine-id
sudo systemd-machine-id-setup

This script handles common post-cloning tasks like setting a unique hostname, regenerating SSH host keys, and creating a new machine ID to ensure the clone is properly individualized.

Enterprise Hardware on a Budget

One of the most significant advantages of self-hosting is the ability to leverage enterprise-grade hardware at a fraction of its original cost. The server market has a rapid upgrade cycle, meaning excellent hardware is often available on the secondary market at steep discounts.

Server Recommendations
Dell PowerEdge R720/R730

Excellent balance of performance, expandability, and value. These 2U servers support high memory configurations (up to 768GB on the R730) and plenty of PCIe slots for expansion.

HP ProLiant DL380 G8/G9

Robust and widely available 2U servers with similar capabilities to the Dell PowerEdge series. Well-supported with a strong community.

Supermicro Systems

Often available at lower prices than Dell/HP with similar specifications. Less polish but excellent reliability and flexibility.

Storage Considerations

Storage is critical for virtualization performance. A tiered approach provides the best balance of cost and performance:

Storage Hierarchy for Self-Hosted Infrastructure
Tier 1: NVMe SSDs

Use for highest-performance workloads like databases. Even consumer-grade NVMe drives offer exceptional performance for most workloads. Consider enterprise options like Intel Optane for write-intensive applications.

Tier 2: SATA SSDs

Excellent for VM operating systems and applications. Enterprise SSDs (like Intel DC series) offer better endurance but consumer drives often provide sufficient performance at much lower costs.

Tier 3: Enterprise HDDs

"Used spinning rust" is perfect for bulk storage. 10-12TB SAS drives offer an excellent balance of capacity and value. Consider RAID 6 or RAID 10 for improved reliability.

Networking Infrastructure

Fast, reliable networking is essential for clustering and distributed storage:

Networking Recommendations
10Gb Ethernet

Used 10GbE switches from Dell, Cisco, or Mellanox are widely available at reasonable prices. Essential for storage traffic and live migration.

Direct Attached Copper (DAC) Cables

Significantly less expensive than optical transceivers for short runs (under 5 meters). Perfect for rack deployments.

Network Segregation

Consider separate networks for management, VM traffic, and storage replication to prevent congestion and improve security.

Self-Hosted Cloud Alternatives

A mature ecosystem of open-source software can replace most cloud services. Here are key components to consider for your self-hosted infrastructure:

Object Storage: MinIO

MinIO provides S3-compatible object storage that can run on your own hardware. Features include:

  • S3-compatible API—works with existing tools and libraries
  • Distributed deployment option for high availability
  • Erasure coding for data protection with minimal overhead
  • Supports encryption, identity management, and object lifecycle policies
Container Platform: Coolify

Coolify is an open-source, self-hostable Heroku/Netlify alternative that provides:

  • One-click deployments from Git repositories
  • Automated builds and deployments
  • Support for various application types (Node.js, Python, PHP, etc.)
  • Built-in database management
  • Simple scaling and monitoring
Database Services
MongoDB

Self-hosted MongoDB provides document database capabilities without the cost of MongoDB Atlas.

PostgreSQL + Patroni

Create a highly available PostgreSQL cluster using Patroni for automatic failover.

Redis

Run Redis clusters for caching, session storage, and real-time features.

Message Queue and Streaming
Apache Kafka

Self-hosted Kafka provides robust event streaming capabilities for complex data pipelines.

RabbitMQ

Excellent for traditional message queueing needs with lower resource requirements than Kafka.

Monitoring and Logging
Prometheus + Grafana

The standard for metrics collection and visualization in self-hosted environments.

ELK Stack (Elasticsearch, Logstash, Kibana)

Comprehensive log collection, indexing, and analysis—a replacement for cloud logging services.

Zabbix

Mature, enterprise-ready monitoring solution with extensive alerting capabilities.

Migration Strategies and Considerations

Moving from cloud to self-hosted infrastructure requires careful planning. Here's a methodical approach:

Pre-Migration Planning
  1. Resource Assessment: Analyze current cloud resource usage to determine hardware requirements
  2. Service Inventory: Document all cloud services in use and identify self-hosted alternatives
  3. Dependency Mapping: Understand how services interact to plan migration order
  4. Network Architecture: Design network architecture, including VLANs, routing, and firewall rules
  5. Backup Strategy: Establish backup procedures before starting migration
Phased Migration Approach
Phase 1: Infrastructure Setup

Build and test the physical infrastructure, including servers, networking, and storage.

Phase 2: Core Services

Deploy fundamental services like DNS, monitoring, and backup systems.

Phase 3: Stateless Applications

Move web servers and other stateless applications first, as they're typically easier to migrate.

Phase 4: Stateful Services

Carefully migrate databases and other stateful services, often requiring specialized migration tools.

Phase 5: Validation and Optimization

Test thoroughly and optimize performance, then decommission cloud resources.

DNS and Traffic Management

A well-planned DNS strategy allows for gradual migration with minimal downtime:

DNS Migration Strategies
  • TTL Adjustment: Lower TTLs before migration to allow faster DNS propagation
  • Blue/Green Deployment: Set up both environments and switch traffic when ready
  • Weighted Routing: Gradually shift traffic from cloud to self-hosted infrastructure
  • Reverse Proxy: Use a proxy layer to redirect traffic without DNS changes

Real-World Example: Setting Up a Complete Stack

Let's walk through a practical example of setting up a complete self-hosted infrastructure for a typical web application with database backend and object storage needs.

Hardware Configuration
3x Dell PowerEdge R730 Servers
  • 2x Intel Xeon E5-2690 v3 (12 cores each)
  • 256GB DDR4 RAM
  • 2x 1TB NVMe (local OS and high-performance storage)
  • 6x 4TB SAS HDDs (for distributed storage)
  • 10GbE network interfaces
Networking
  • 1x 24-port 10GbE switch (Dell S4048-ON or similar)
  • 1x 48-port 1GbE switch for management network
  • DAC cables for 10GbE connections
Proxmox Cluster Setup
  1. Install Proxmox VE on all three servers
  2. Configure separate networks for management, VM traffic, and storage
  3. Create Proxmox cluster and join all nodes
  4. Set up Ceph storage across the three nodes for resilient storage
  5. Configure VM templates for common OS distributions
Application Infrastructure
Create the following VMs/Containers:
  • 3x HAProxy/Nginx load balancers (configured as an HA cluster)
  • 4x Application servers
  • 3x PostgreSQL database servers (with Patroni for automatic failover)
  • 3x MinIO servers (distributed deployment)
  • 2x Monitoring servers (Prometheus, Grafana, Alertmanager)
  • 2x Log management servers (Elasticsearch, Logstash, Kibana)
  • 2x Backup servers (with appropriate storage allocation)
Example: Deploying the PostgreSQL Cluster

Here's how to set up a highly available PostgreSQL cluster using Patroni:

# On each PostgreSQL node

# Install required packages
sudo apt update
sudo apt install -y postgresql-14 python3-pip python3-dev libpq-dev

# Install Patroni and requirements
pip3 install patroni[etcd] psycopg2-binary

# Create Patroni configuration
sudo mkdir -p /etc/patroni
sudo cat > /etc/patroni/config.yml << EOF
scope: postgres-cluster
namespace: /db/
name: postgresql-1  # unique for each node

restapi:
  listen: 0.0.0.0:8008
  connect_address: 192.168.1.11:8008  # Replace with node IP

etcd:
  hosts: 192.168.1.21:2379,192.168.1.22:2379,192.168.1.23:2379  # etcd endpoints

bootstrap:
  dcs:
    ttl: 30
    loop_wait: 10
    retry_timeout: 10
    maximum_lag_on_failover: 1048576
    postgresql:
      use_pg_rewind: true
      parameters:
        max_connections: 500
        shared_buffers: 4GB
        effective_cache_size: 12GB
        maintenance_work_mem: 1GB
        
  initdb:
    - encoding: UTF8
    - data-checksums
    
postgresql:
  listen: 0.0.0.0:5432
  connect_address: 192.168.1.11:5432  # Replace with node IP
  data_dir: /var/lib/postgresql/14/main
  bin_dir: /usr/lib/postgresql/14/bin
  
  authentication:
    replication:
      username: replicator
      password: replPass123
    superuser:
      username: postgres
      password: adminPass123
EOF

# Create Patroni systemd service
sudo cat > /etc/systemd/system/patroni.service << EOF
[Unit]
Description=Patroni PostgreSQL Cluster
After=network.target

[Service]
Type=simple
User=postgres
Group=postgres
ExecStart=/usr/local/bin/patroni /etc/patroni/config.yml
KillMode=process
TimeoutSec=30
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

# Enable and start the service
sudo systemctl enable patroni
sudo systemctl start patroni

Cost Comparison: Cloud vs. Self-Hosted

Let's compare the costs of running our example infrastructure in the cloud versus self-hosting:

Cloud Costs (Monthly)
Service Configuration Monthly Cost
VM Instances (12x) 8 vCPU, 32GB RAM $3,600
Load Balancer Regional, standard tier $150
Managed Database HA cluster, 8 vCPU, 32GB RAM $1,200
Object Storage 5TB storage + operations $280
Data Transfer 5TB outbound $450
Monitoring and Logging Basic tier $200
Total Monthly $5,880
Annual Cost $70,560
Self-Hosted Costs
Initial Investment
Component Details Cost
3x Servers Dell R730, 2x E5-2690 v3, 256GB RAM $9,000
Storage NVMe, SSDs, HDDs $4,500
Networking Switches, cables, etc. $3,000
Rack and PDUs 42U rack, redundant power $2,000
Total Initial Investment $18,500
Ongoing Monthly Costs
Item Details Monthly Cost
Colocation/Power 4U rack space, power, cooling $600
Internet Connectivity 1Gbps bandwidth $300
Support Contract Basic hardware support $150
Maintenance Reserve For hardware replacements $200
Total Monthly $1,250
Annual Operating Cost $15,000
3-Year Total Cost of Ownership
Option 3-Year Total
Cloud $211,680
Self-Hosted $63,500 ($18,500 + $45,000)
3-Year Savings $148,180 (70% less)
When Cloud Still Makes Sense
Variable Workloads

Applications with significant traffic spikes or seasonal variation benefit from cloud elasticity.

Early-Stage Startups

When capital preservation is crucial and infrastructure needs are evolving rapidly.

Globally Distributed Applications

When you need presence in multiple regions without establishing your own global data center network.

Specialized Services

When using cloud-specific services like AI/ML platforms, IoT hubs, or specialized analytics that would be complex to self-host.

Conclusion and Next Steps

Self-hosting doesn't mean returning to the challenges of traditional data centers. Modern tools like Proxmox, combined with quality used enterprise hardware, allow you to build infrastructure that rivals cloud platforms in reliability and functionality—often at a fraction of the cost.

The key advantages of self-hosting include:

  • Significant cost savings for stable workloads (typically 50-70% over 3 years)
  • Full control over data location and security
  • Elimination of unexpected charges and "bill shock"
  • No performance degradation from multi-tenant environments
  • Freedom from vendor lock-in

While not appropriate for every organization or workload, self-hosting represents a mature, viable alternative that deserves consideration as cloud costs continue to increase and the self-hosted tooling ecosystem matures.

Getting Started

If you're considering a move to self-hosted infrastructure:

  1. Start with a thorough analysis of your current cloud usage and costs
  2. Identify which workloads are stable and suitable for migration
  3. Build a small test environment to validate performance and management processes
  4. Develop expertise with key tools like Proxmox, Ceph, and your selected service alternatives
  5. Create a phased migration plan that minimizes risk and downtime

The journey to self-hosted infrastructure is an investment in both hardware and knowledge, but for many organizations, it delivers substantial returns in cost savings and control.

Resources for Further Learning
  • Proxmox VE Wiki - Comprehensive documentation for Proxmox
  • ServeTheHome - Excellent resource for server hardware reviews and guides
  • MinIO Documentation - Guides for setting up S3-compatible storage
  • r/homelab - Community for home lab enthusiasts with excellent guides and discussions
  • r/selfhosted - Resource for self-hosted alternatives to cloud services

About

Why fear those copying you, if you are doing good they will do the same to the world.

Archives

  1. AI & Automation
  2. AI Filtering for Web Content
  3. Web Fundamentals & Infrastructure
  4. Reclaiming Connection: Decentralized Social Networks
  5. Web Economics & Discovery
  6. The Broken Discovery Machine
  7. Evolution of Web Links
  8. Code & Frameworks
  9. Breaking the Tech Debt Avoidance Loop
  10. Evolution of Scaling & High Availability
  11. Evolution of Configuration & Environment
  12. Evolution of API Support
  13. Evolution of Browser & Client Support
  14. Evolution of Deployment & DevOps
  15. Evolution of Real-time Capabilities
  16. The Visual Basic Gap in Web Development
  17. Evolution of Testing & Monitoring
  18. Evolution of Internationalization & Localization
  19. Evolution of Form Processing
  20. Evolution of Security
  21. Evolution of Caching
  22. Evolution of Data Management
  23. Evolution of Response Generation
  24. Evolution of Request Routing & Handling
  25. Evolution of Session & State Management
  26. Web Framework Responsibilities
  27. Evolution of Internet Clients
  28. Evolution of Web Deployment
  29. The Missing Architectural Layer in Web Development
  30. Development Velocity Gap: WordPress vs. Modern Frameworks
  31. Data & Storage
  32. Evolution of Web Data Storage
  33. Information Management
  34. Managing Tasks Effectively: A Complete System
  35. Managing Appointments: Designing a Calendar System
  36. Building a Personal Knowledge Base
  37. Contact Management in the Digital Age
  38. Project Management for Individuals
  39. The Art of Response: Communicating with Purpose
  40. Strategic Deferral: Purposeful Postponement
  41. The Art of Delegation: Amplifying Impact
  42. Taking Action: Guide to Decisive Execution
  43. The Art of Deletion: Digital Decluttering
  44. Digital Filing: A Clutter-Free Life
  45. Managing Incoming Information
  46. Cloud & Infrastructure
  47. Moving from Cloud to Self-Hosted Infrastructure
  48. AWS Lightsail versus EC2
  49. WordPress on AWS Lightsail
  50. Migrating from Heroku to Dokku
  51. Storage & Media
  52. Vultr Object Storage on Django Wagtail
  53. Live Video Streaming with Nginx
  54. YI 4k Live Streaming
  55. Tools & Connectivity
  56. Multi Connection VPN
  57. Email Forms with AWS Lambda
  58. Static Sites with Hexo

Optimize Your Website!

Is your WordPress site running slowly? I offer a comprehensive service that includes needs assessments and performance optimizations. Get your site running at its best!

Check Out My Fiverr Gig!

Elsewhere

  1. YouTube
  2. Twitter
  3. GitHub