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

CT Radon Reconstruction

MATLAB exploration of Radon-based CT reconstruction with sinogram corruption, limited-angle Hamming filtering, and noise-test recovery using spatial filters.

View next project