Virtualmin GPL on AWS User Guide
Virtualmin GPL on AWS User Guide
Virtualmin GPL is a free, open source web hosting control panel built on Webmin. From one point-and-click panel it provisions and manages many websites on a single server, wiring together the Apache web server, MariaDB databases, Postfix and Dovecot email, BIND DNS and per-site users for each virtual server (hosting account) you create.
This cloudimg Amazon Machine Image delivers the complete hosting stack fully installed and
configured on Ubuntu 24.04, so a working control panel is running within minutes of launch.
The panel is served over HTTPS on port 10000 by Webmin's own web server (miniserv);
Apache owns ports 80 and 443 for the websites you host. The edition installed is the fully
open source GPL edition (GPL-3.0) — core hosting management is completely functional with
no per-domain licensing.
This guide covers connecting to your instance, retrieving the per-instance administrator password, signing in to the panel, creating your first virtual server, scoping the admin port, installing a real TLS certificate and renaming the server.

The panel is root-equivalent. The Virtualmin admin has full control of the server and provisions system users, mailboxes and DNS zones. Treat its password as root-equivalent and restrict the admin port (10000) to trusted source IPs (see Securing the admin port below).
Architecture at a glance
| Component | Detail |
|---|---|
| Control panel | Virtualmin GPL 8.1.0 on Webmin 2.652, served on port 10000 over HTTPS |
| Web server | Apache (apache2) on ports 80 / 443, one virtual host per hosted site |
| Database | MariaDB, managed per hosted site |
| Postfix (SMTP) and Dovecot (IMAP/POP3), per hosted domain | |
| DNS | BIND (named), one zone per hosted domain |
| Admin panel URL | https://<instance-public-ip>:10000/ (self-signed certificate) |
| Health endpoint | https://127.0.0.1:10000/session_login.cgi (returns the login page) |
Virtualmin manages the whole server, so its data (hosted-site home directories, the MariaDB datadir, mail spools and DNS zones) lives across the operating-system disk rather than on a separate volume. Grow the root EBS volume if you host many sites.
Connecting to your instance
Connect over SSH on port 22 as the default login user for your operating-system variant.
| OS variant | SSH login user |
|---|---|
| Ubuntu 24.04 | ubuntu |
ssh -i /path/to/your-key.pem ubuntu@<instance-public-ip>
Replace <instance-public-ip> with the public IPv4 address of your instance (visible in the
EC2 console) and /path/to/your-key.pem with the private key you launched the instance with.
Per-instance credentials
On the first boot of every instance, a one-shot service (virtualmin-firstboot.service)
generates identity that is unique to that instance:
- a fresh self-signed TLS certificate for the panel, and
- a fresh 24-character administrator password for the Virtualmin
rootpanel user.
No default or shared credentials ship in the image, and the operating-system root account stays locked. The panel password is written to a root-only file. Retrieve it over SSH:
cat /root/virtualmin-credentials.txt
The file looks like this (your URL and password will differ):
VIRTUALMIN_URL=https://<instance-public-ip>:10000/
VIRTUALMIN_USERNAME=root
VIRTUALMIN_PASSWORD=************************
Sign in to the panel as user root with the VIRTUALMIN_PASSWORD value.
Signing in to the panel
Browse to https://<instance-public-ip>:10000/. The appliance ships a self-signed
certificate, so your browser shows a certificate warning the first time — this is expected;
proceed to the site (and see Installing a real TLS certificate below to replace it for
production). Sign in as root with the password from the credentials file.

The dashboard shows the running GPL edition, live CPU / memory / disk usage and the package status of the server at a glance.
Securing the admin port (important)
Port 10000 is the control panel and is root-equivalent, so it must not be open to the
whole internet. In your EC2 security group, scope inbound tcp/10000 to the specific
source IP addresses your administrators connect from (for example your office or VPN egress),
and leave ports 80 and 443 open for the websites you host. SSH (port 22) should likewise be
scoped to trusted sources.
You can confirm which services are listening on the instance:
ss -tln | grep -E ':(80|443|10000)\b'
Creating your first virtual server
A virtual server is one hosted domain with its own website, database, mailboxes, DNS zone and Unix user. Create one from Create Virtual Server in the panel: enter the domain name and an administration password, and Virtualmin provisions the whole stack for that domain in one step.

The Enabled features section shows everything provisioned for the domain — the Apache website, MariaDB database, DNS zone, mailboxes and spam/virus filtering. Every hosted domain you create is listed and managed from the Virtual Servers page.

You can do the same from the command line. This lists the hosted domains (empty on a fresh instance):
virtualmin list-domains --name-only
To create a domain from the shell (replace the domain and choose a strong password):
virtualmin create-domain --domain example.test --pass 'CHANGE-ME' --unix --dir --web --dns --mail
Managing the hosting stack
The hosting daemons run as systemd services. Confirm they are active:
systemctl is-active webmin apache2 mariadb postfix dovecot named
Each prints active:
active
active
active
active
active
active
Manage any of them with systemctl (for example systemctl restart apache2). The control
panel itself is the webmin service.
You can confirm the installed edition is the open source GPL edition:
grep '^SerialNumber=' /etc/virtualmin-license
SerialNumber=GPL
Installing a real TLS certificate
The panel ships a self-signed certificate. For production, install a trusted certificate:
- For the panel itself: in Webmin go to Webmin → Webmin Configuration → SSL Encryption and either upload a certificate or request one from Let's Encrypt for a hostname that resolves to this instance.
- For a hosted website: open the virtual server, then Server Configuration → SSL Certificate → Let's Encrypt, and request a certificate for that domain (its DNS must point at this instance first).
Renaming the server
The appliance boots with a placeholder hostname (virtualmin.cloudimg.co.uk) that Virtualmin
baked into its Apache, Postfix and BIND configuration at build time, and cloud-init is
configured to preserve it. To give the server its own name, rename it from within
Virtualmin so every dependent service is updated together:
- Webmin → Networking → Network Configuration → Hostname and DNS Client — set the new fully-qualified hostname.
- Virtualmin → System Settings → Re-Check Configuration — so Virtualmin re-reads the new identity across Apache, Postfix and BIND.
Do not change the hostname with hostnamectl alone, as that would desynchronise the hosting
stack from the name Virtualmin has recorded.
Support
This AMI includes 24/7 technical support from cloudimg by email and live chat. We help with deployment, creating and managing virtual servers, DNS and mail configuration, TLS certificate installation, backups and upgrades.
- Email: support@cloudimg.co.uk
- Live chat: available 24/7 at www.cloudimg.co.uk
All product and company names are trademarks or registered trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them.