Part 1: Setting up a Proxmox Cluster

A cartoon illustration of four happy servers linked together as a Proxmox Cluster.

After acquiring four HP EliteDesk 800 G3 PCs from eBay, the first phase of my home data center project was getting them from bare metal to a fully functioning, clustered platform.

Each server came with:

  • Intel Core i5-7500 CPU
  • 8GB DDR4-2400 SDRAM (up to 64GB)
  • 256GB SSD

All four cost me £84 (an absolute bargain).

For networking, I found a TP-Link TL-SG1016D 16-port unmanaged gigabit switch. Yes, it's unmanaged, but it was cheap and does the job.

Update the BIOS

Before installing any operating system, I updated the BIOS on all four machines. It's easy to overlook, but important for security and stability.

Running the latest BIOS patches hardware vulnerabilities and ensures the best compatibility for everything that follows.


Installing Proxmox VE

With the hardware in place, I installed Proxmox Virtual Environment (VE) on each server's 256GB SSD.

Proxmox is a powerful, open-source hypervisor that manages both full virtual machines and lightweight Linux Containers (LXC). This flexibility makes it perfect for running various open source services. You can find the installer and documentation on the Proxmox website.


Post-Installation Scripts

A standard Proxmox install is configured for commercial use. Using enterprise repositories that require a subscription and displaying a reminder every time you log in.

For my setup, I used the recommended Proxmox VE Helper-Scripts. One script to automate switching to the public (non-subscription repositories) and to disable the nag screen.

⚠️
Always inspect scripts from third-party sources before running.

➡️Proxmox VE Post Install

To install, on your Proxmox server, enter the following into the terminal:

bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/pve/post-pve-install.sh)"

Update Processor Microcode

I updated the Intel processor microcode on each server. Microcode updates fix's hardware bugs, improves performance, and security.

➡️Proxmox VE Processor Microcode

bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/pve/microcode.sh)"

Setting Up Email Notifications

I wanted to receive email notifications, s0 I configured an SMTP relay on each server using a dedicated Gmail account. This lets each server send email notifications for system events such as, backup completions, hardware failures, and other events.

Generate Gmail App Password

  1. In your Google Account, go to Security -> 2-Step Verification and ensure it's enabled
  2. In the Security section, go to App passwords
  3. For ‘App’, select Mail. For ‘Device’, select Other, name it (e.g., “Proxmox“)
  4. Click Generate and copy the 16-character password

Install Required Packages

apt update
apt install -y libsasl2-modules mailutils

Create Credential File

Create and edit the password file:

nano /etc/postfix/sasl_passwd

Add the following line, replacing the placeholders with your details:

[smtp.gmail.com]:587 [email protected]:your-16-character-app-password

Secure the file and create the Postfix database:

chmod 600 /etc/postfix/sasl_passwd
postmap hash:/etc/postfix/sasl_passwd

Configure Postfix

Edit the main configuration file:

nano /etc/postfix/main.cf

Add these lines to the very end of the file.

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

Apply and Test

Reload the Postfix:

 systemctl reload postfix

Send a test email, replacing the placeholder with your destination email address.

echo "This is a test email from Proxmox" | mail -s "Proxmox Test" [email protected]

Check your inbox to confirm it has arrived.


Installing Tailscale for Remote Access

To manage my cluster remotely, I installed Tailscale on each server. Tailscale builds a secure, private network over the internet using WireGuard, letting me access the Proxmox control panel from anywhere as if I were on the local network.

Run the Installation Script

Execute the official Tailscale installation script:

curl -fsSL https://tailscale.com/install.sh | sh

Start Tailscale and connect to your account.

tailscale up

After running the command, a login URL will appear. Copy it, paste it into a browser, and authenticate with your Tailscale account to add the server to your network (tailnet).

Verify Installation

Check that Tailscale is active:

tailscale status

Your Proxmox server is now securely connected to your tailnet.


Creating the Proxmox Cluster

With the individual servers ready, it was time to unite them. I configured them into a cluster, which allows all machines to be managed as a single entity from one web interface.

I decided not to enable high-availability storage at this point due to my network speeds, as each server currently has only a single 1GbE network interface. A redundant, high-speed storage network is a planned future upgrade.

Prerequisites

  • All servers installed and running on the same network
  • Nodes can ping each other by IP address
  • Each node has a unique hostname
  • You're logged into the Proxmox web interface

On the Main Node (Node 1)

Create the Cluster

In the terminal of your chosen main server, run:

pvecm create YourClusterName

Give your cluster a unique name without spaces.

Copy Join Information

In the Proxmox web interface, navigate to DatacenterCluster. Click Join Information, then click Copy Information. This copies the connection details to your clipboard.

On Each Joining Node (Node 2, Node 3, etc.)

Join the Cluster

In the web interface of the node you want to add, navigate to DatacenterCluster.

Paste Join Information

  • Click Join Cluster
  • Paste the information from the main node into the Information text box. The IP address and fingerprint fields will fill automatically
  • Enter the root password for the main server (Node 1)
  • Click Join Your Cluster Name

The server's web interface will refresh as it joins. Repeat for any other servers.

Verify the Cluster

On any server, refresh the web interface. You should now see all connected servers listed under the data center view.

Alternatively, run this command in any server terminal:

pvecm nodes

⚠️
Keep the Host Clean
It can be very tempting to install utilities or services directly on the Proxmox host, after all, it is just a standard Linux system underneath. This can lead to system clutter, where installed packages and their dependencies eventually conflict with Proxmox's own updates.

Keeping the host 'clean' is much safer because additional software can cause major system upgrades to fail or introduce security vulnerabilities that compromise the entire hypervisor.

It's regarded best practice to treat the host purely as infrastructure and place all applications inside their own VMs or LXC containers.

Quick Cheat Sheet 📄

Proxmox Post-Install & Microcode

# Run post-install script (non-subscription repos, disable nag)
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/pve/post-pve-install.sh)"

# Update processor microcode
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/pve/microcode.sh)"

Gmail SMTP Relay Setup

# Install packages
apt update
apt install -y libsasl2-modules mailutils

# Create/edit password file
nano /etc/postfix/sasl_passwd
# Add this line to the file:
[smtp.gmail.com]:587 [email protected]:your-16-character-app-password

# Secure file and create Postfix DB
chmod 600 /etc/postfix/sasl_passwd
postmap hash:/etc/postfix/sasl_passwd

# Edit main Postfix config
nano /etc/postfix/main.cf
# Add the following lines to the end of the file:
relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

# Reload Postfix
systemctl reload postfix

# Send test email
echo "This is a test email from Proxmox" | mail -s "Proxmox Test" [email protected]

Tailscale Remote Access

# Install Tailscale
curl -fsSL https://tailscale.com/install.sh | sh

# Start Tailscale and connect
tailscale up

# Check status
tailscale status

Proxmox Cluster Creation

# On Main Node (Node 1) - Create the cluster
pvecm create YourClusterName

# On Any Node - Verify cluster status
pvecm nodes

Applications and Packages

Virtualization & Management

Networking (VPN)

System Services (Email)