Case study

GCP Virtualmin Mail Server

This repository documents and partially automates a Virtualmin / Webmin mail server build on GCP Debian 12. It covers the specific issues encountered in practice: incorrect /etc/hosts breaking Virtualmin links, firewall rules for Webmin on port 10000, ClamAV freshclam locks, BIND DNS handling, and Let's Encrypt setup.

RoleInfrastructure engineering, technical writing
TimelineSelf-hosted mail project
FocusInfrastructure + DevOps
Mail server setupGCP infrastructureOperations runbookShell automation
GCP Debian 12Platform
Virtualmin + Webmin + PostfixStack

The brief

Challenge

Standing up a self-hosted mail server on GCP runs into hostname resolution, firewall, and antivirus issues that are not well documented in a single place.

Approach

What we made

Captured the working steps as a layered docs + scripts repo so the build is reproducible, and isolated each fix (hosts, firewall, ClamAV, BIND) in its own document and shell script.

  • Documents the exact /etc/hosts fix that resolves Virtualmin generating internal-IP links.
  • Captures the GCP firewall rule needed to expose Webmin on 0.0.0.0:10000.
  • Includes scripts for installing Virtualmin, fixing hosts, installing ClamAV, and restarting services.
  • Explicit decision notes for BIND DNS, Let's Encrypt, and mail DNS records.
  • Safe to share publicly: no secrets, private keys, or DKIM material committed.

Outcome

Results

A reusable runbook plus automation for spinning up a Virtualmin / Webmin mail server on GCP without rediscovering the same gotchas.

VirtualminWebminPostfixClamAVBINDGCPDebian 12Bash

Gallery

Visual snapshots

Click any image to expand.

Next project

Alan Fraud Detection Dashboard

A full-stack fraud detection system for an insurance provider that scores optical care providers 0–100 using four independent detection rules and automatically routes claims to approval, manual review, or hold.

View next project