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.
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.
Gallery
Visual snapshots
Click any image to expand.