This series teaches you how to transition from classic hosting to an advanced architecture, explaining step-by-step how to deploy your own Docker Swarm cluster to run a fully scalable WordPress site.

🔹Episode 0: Transitioning to the Enterprise Level and Project Architecture

“We built a tank together (Proxmox HA). Now, instead of putting a classic engine in it, we are giving it a rocket engine: Docker Swarm.”

Welcome to a new chapter of our journey. We are leaving classic control panels behind and building our own container infrastructure.

What we keep from the “From zero to a complete website” series (The mandatory foundation):

For this new project to work, we will rely on the solid infrastructure we built in the previous series. If you haven’t completed those steps, I recommend reviewing the following chapters:

  • Episode 0: The Foundation. Proxmox Cluster and High Availability (HA)
  • Episode 1: Choosing and buying a cheap domain – Namecheap –
  • Episode 2: Configuring the domain in Cloudflare + Free SSL
  • Episode 3: The Invisible Architecture. Cloudflare Tunnel and ZFS Replication

The Structure of the New Project (The 6 Indestructible Episodes):

In this project, we will build an Enterprise architecture step-by-step, logically distributed across the following episodes:

  • Episode 0: The Software Foundation. Installing Docker Swarm (The cluster’s operating system).
  • Episode 1: The City Hall and the Gatekeeper. Installing Portainer (Management) and Traefik (Reverse Proxy).
  • Episode 2: Connecting to the Internet. Reconfiguring Cloudflare Tunnel (The Access).
  • Episode 3: The Actual Website. Deploying WordPress (The Engine) and MariaDB (The Vault).
  • Episode 4: Maintenance Tools. Adding FileBrowser and phpMyAdmin (The Intervention).
  • Episode 5: Monitoring and Survival. Grafana (Health) and Duplicati (External Backup).

🔹Preamble: The Software Foundation. Installing Docker Engine and Initializing the Swarm

Our applications need stable “ground” to be built upon. That ground is the Docker engine, which we will install on just two nodes: your physical Ubuntu machine (The Manager – .111) and the new virtual machine created in Proxmox (renuka – .112), which will be protected by ZFS.

⚠️ CRUCIAL NOTE: Environment cleanliness. Do not install Docker over the old project (CyberPanel) to avoid conflicts. We will use a completely fresh environment.

a. Creating and Preparing the “House” for Docker

In Proxmox, we created the VM with ID 201, named renuka (Ubuntu Server, 4GB RAM, 2 CPU Cores).

The golden rule (ZFS Replication): Immediately after creation, we set up replication every minute to the secondary node. To finalize the preparation, we execute the following commands on the new server:

# Updating the system to the latest version
sudo apt update && sudo apt upgrade -y

# Installing and enabling the QEMU Guest Agent
sudo apt install qemu-guest-agent -y
sudo systemctl enable --now qemu-guest-agent

# Synchronizing the time zone (Bucharest)
sudo timedatectl set-timezone Europe/Bucharest

b. Preparing and Installing Docker Engine

Before installation, we ensure that the renuka node (VM) is correctly integrated into Proxmox and that both systems are up to date:

# On the renuka node (VM) - Proxmox Integration and Update
sudo apt update && sudo apt upgrade -y
sudo apt install qemu-guest-agent -y
sudo systemctl enable --now qemu-guest-agent

Now we run the official Docker script on both machines (Manager .111 and renuka .112):

# Downloading and running the official script
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# Applying permissions without needing to restart/logout
sudo usermod -aG docker $USER
newgrp docker

c. Creating the Cluster (The Great Docker Swarm Union)

We are transforming the two entities into a single organism. The first step is done on the Manager (.111):

# Initializing the Swarm cluster
docker swarm init --advertise-addr 192.168.1.111

Copy the command like docker swarm join --token... generated by the manager and run it in the console of the renuka server.

d. Verifying the Cluster

Return to the laptop (Manager) and check if the “worker” joined successfully:

docker node ls

If both nodes appear with the status Ready, congratulations! You have a functional Docker Swarm cluster.