Deployment guide

ISPConfig

Overview

ISPConfig is an open source hosting control panel. From one browser interface, it manages Apache web sites and their PHP settings, MariaDB databases, FTP accounts, clients and resellers.

This guide covers deploying and configuring ISPConfig 3.3 on Ubuntu 24.04 on Azure with the SecureAnyCloud Azure Marketplace image. The image installs ISPConfig with the official autoinstaller, focused on web, database and panel management. Apache 2.4, PHP, MariaDB and PureFTPd are wired together, and the panel is served over HTTPS on port 8080.

The mail (Postfix/Dovecot), DNS (BIND), firewall, Roundcube and phpMyAdmin modules are left out to keep the image lean and reduce attack surface. Step 10 shows how to add the mail and DNS modules if you want them.

What you get:

  • ISPConfig 3.3 hosting control panel, served over HTTPS on port 8080.
  • Apache 2.4, PHP 8.3, MariaDB 10.11 and PureFTPd, configured and enabled.
  • No baked login credential. On first boot, ispconfig-firstboot.service generates a fresh MariaDB root password, panel database password, panel administrator password and remote API password, all unique to your VM. It writes them to /root/ispconfig-credentials.txt (mode 0600, root only). The build-time secrets are locked and discarded, so no image and no person holds a working credential for your machine.
  • A panel that stays offline until the password is rotated. The panel is not served until first boot has generated your unique administrator password. There is no window in which a shipped default could be used, and the upstream admin / admin default is rejected outright.
  • A per-VM TLS certificate. A fresh self-signed certificate for the panel is generated on first boot with your VM's address, so no two VMs share a key. Step 9 shows how to replace it with a trusted certificate.
  • The remote JSON-RPC API, enabled for automated provisioning.
  • Unattended security upgrades, left enabled.

Prerequisites

  • An active Azure subscription, an SSH public key, and a VNet and subnet in the target region.
  • A subscription to the ISPConfig listing on Azure Marketplace.
  • Network Security Group rules that allow TCP 22 for administration and TCP 8080 for the control panel, both restricted to your own management network. Also open TCP 80 and 443 once you start hosting web sites on the VM.
  • Recommended virtual machine size: Standard_B2s (2 vCPU, 4 GB RAM) to evaluate and run a small number of sites. Use Standard_B2ms or Standard_D2s_v5 for a busier hosting server.
1

Deploy from the Azure Portal

Search for ISPConfig in Marketplace, select the SecureAnyCloud publisher, and click Create.

Configure the Network Security Group to allow TCP 22 and TCP 8080 from your management network only. Do not expose the panel to the whole internet until you have completed Step 9 and put a trusted certificate in front of it.

2

Deploy from the Azure CLI

RG="ispconfig-prod"; LOCATION="eastus"; VM_NAME="ispconfig" IMAGE_URN="sac1647283583153:ispconfig-ubuntu-24-04:default:latest" SSH_KEY="$(cat ~/.ssh/id_rsa.pub)" az group create --name "$RG" --location "$LOCATION"
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:ispconfig-ubuntu-24-04:default:latest
az vm create \
  --resource-group "$RG" --name "$VM_NAME" \
  --image "$IMAGE_URN" \
  --size Standard_B2s \
  --admin-username azureuser \
  --ssh-key-values "$SSH_KEY" \
  --public-ip-sku Standard
3

First boot

On first boot, the VM generates every secret it needs. ispconfig-firstboot.service runs once, before Apache starts serving the panel. It does the following:

  • Rotates the MariaDB root password and the panel database password, rewriting ISPConfig's configuration files in lock step.
  • Rotates the panel administrator password and the remote API password.
  • Regenerates the self-signed panel TLS certificate with the VM's address.
  • Writes everything to /root/ispconfig-credentials.txt and drops a sentinel so it never runs again.

Wait about thirty seconds after the VM reports running. Then connect over SSH and confirm the stack.

4

Connect and confirm the stack is running

Connect over SSH:

ssh azureuser@<vm-ip>

Confirm the database and the panel are up:

systemctl is-active mariadb apache2 curl -ks -o /dev/null -w 'panel HTTP %{http_code}\n' https://127.0.0.1:8080/login/

MariaDB and Apache both report active, and the panel returns HTTP 200.

Confirm the component versions:

grep -oE "ISPC_APP_VERSION', *'[^']+'" /usr/local/ispconfig/interface/lib/config.inc.php apache2 -v | head -1 php -v | head -1 mariadb --version

Confirm which ports are listening. Port 8080 is the control panel, and ports 80 and 443 serve the web sites you host:

ss -tlnp | grep -E ':(8080|80|443) ' | awk '{print $1, $4}' | sort -u

Read your per-VM credentials. This file is mode 0600 and readable only by root:

sudo cat /root/ispconfig-credentials.txt

The panel username is admin. The password is the ispconfig.admin.pass value in that file, and it is unique to your VM.

5

First sign in to the control panel

Browse to https://<vm-ip>:8080/ and accept the self-signed certificate warning. Step 9 replaces the certificate with a trusted one.

Sign in with the username admin and the ispconfig.admin.pass password from Step 4. You land on the ISPConfig dashboard, with the Client, Sites, Monitor, Tools and System modules across the top and the available modules listed below.

The upstream default is rejected. ISPConfig normally ships with admin / admin, but this image does not. From the shell, you can confirm that your per-VM password works and that both the default and a blank password are refused:

sudo python3 /usr/local/sbin/ispconfig-panel-check.py && echo "per-VM password works; admin/admin and blank are rejected"
6

Create your first client

Hosting in ISPConfig is organized around clients. Open the Client module and click Add new client to create a hosting customer. You can also create clients from the shell through the remote API in Step 8.

7

Add a web site

Open the Sites module and click Add new website. Choose the PHP handler and version, and assign the site to a client.

ISPConfig provisions the Apache virtual host and writes the Apache configuration and the document root for you.

8

Automate provisioning with the remote API

ISPConfig exposes a JSON-RPC remote API at /remote/json.php. The image ships a remote user (sac_api). Its password is generated per VM and stored alongside the admin password in /root/ispconfig-credentials.txt.

The following commands log in, create a client, read it back and delete it, which proves the API end to end:

API_USER=$(sudo grep '^ispconfig.api.user=' /root/ispconfig-credentials.txt | cut -d= -f2)
API_PASS=$(sudo grep '^ispconfig.api.pass=' /root/ispconfig-credentials.txt | cut -d= -f2)
python3 - "$API_USER" "$API_PASS" <<'PY' import sys, ssl, json, urllib.request, secrets user, pw = sys.argv[1], sys.argv[2] base = "https://127.0.0.1:8080" ctx = ssl.create_default_context(); ctx.check_hostname = False; ctx.verify_mode = ssl.CERT_NONE def call(fn, payload): req = urllib.request.Request(base + "/remote/json.php?" + fn, data=json.dumps(payload).encode(), headers={"Content-Type": "application/json"}) o = json.loads(urllib.request.urlopen(req, timeout=30, context=ctx).read().decode()) assert o.get("code") == "ok", "%s failed: %s" % (fn, o.get("message")) return o.get("response") sid = call("login", {"username": user, "password": pw}) name = "demo" + secrets.token_hex(3) cid = int(call("client_add", {"session_id": sid, "reseller_id": 0, "params": { "company_name": "Demo Hosting", "contact_name": "Demo", "username": name, "password": secrets.token_hex(12), "email": name + "@example.com", "language": "en", "usertheme": "default", "country": "US", "web_php_options": "no,fast-cgi,php-fpm", "ssh_chroot": "no"}})) got = call("client_get", {"session_id": sid, "client_id": cid}) print("created + read back client id", cid, "username", (got[0] if isinstance(got, list) else got)["username"]) call("client_delete", {"session_id": sid, "client_id": cid}) call("logout", {"session_id": sid}) print("API round-trip OK") PY

The full remote API documentation is at docs.ispconfig.org.

9

Put a trusted certificate on the panel

The panel ships with a per-VM self-signed certificate, so browsers warn on first use. Point a DNS name at the VM, then obtain a Let's Encrypt certificate and place it where ISPConfig serves the panel:

sudo apt-get install -y certbot
sudo certbot certonly --standalone -d panel.your-domain.example
sudo cp /etc/letsencrypt/live/panel.your-domain.example/fullchain.pem /usr/local/ispconfig/interface/ssl/ispserver.crt
sudo cp /etc/letsencrypt/live/panel.your-domain.example/privkey.pem /usr/local/ispconfig/interface/ssl/ispserver.key
sudo cat /usr/local/ispconfig/interface/ssl/ispserver.key /usr/local/ispconfig/interface/ssl/ispserver.crt > /usr/local/ispconfig/interface/ssl/ispserver.pem
sudo systemctl restart apache2

Restrict the Network Security Group so that port 8080 is reachable only from the networks that manage the server.

10

Optionally enable the mail and DNS modules

This image is focused on web, database and panel management, so the mail and DNS server modules are not installed. To add them, choose one of two routes:

  • Re-run the ISPConfig autoinstaller without the --no-mail or --no-dns switch, following the upstream documentation at docs.ispconfig.org.
  • Install and configure Postfix, Dovecot and BIND, then enable their ISPConfig server modules under System.
11

Administration and upgrades

The panel lives under /usr/local/ispconfig. Its interface configuration is in /usr/local/ispconfig/interface/lib/config.inc.php, and hosted site data is under /var/www.

ISPConfig runs its periodic work from a cron entry that calls /usr/local/ispconfig/server/server.sh every minute. Leave it in place.

The operating system, Apache, PHP and MariaDB packages continue to receive security updates through unattended upgrades. ISPConfig itself is pinned to the release this image shipped. Follow the upstream release notes when you choose to move to a newer version.

12

Security recommendations

  • Restrict the Network Security Group so TCP 22 and TCP 8080 are reachable only from your management networks. Put a trusted certificate in front of the panel before wider exposure (Step 9).
  • Treat /root/ispconfig-credentials.txt as a one-time handover. Record the values in your password manager, then remove the file.
  • After first sign-in, change the administrator password from the generated one under Tools -> Password and Language. Create named administrator accounts rather than sharing admin.
  • Keep MariaDB bound to the loopback interface. Nothing outside the VM needs to reach it directly.
  • If you do not use the API, rotate the remote API user's password or disable the remote user under System -> Remote Users.
13

Support and Licensing

ISPConfig is free and open source software, published under the BSD 3-Clause License. The upstream project documentation is at docs.ispconfig.org.

SecureAnyCloud builds and maintains this image. Support for the image, including deployment questions and security updates, is available 24/7 through the support channel listed on the Azure Marketplace offer page.

Deploy on Azure

Launch ISPConfig 3.3 on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.

View this image

Need Help?

Our support team is available 24/7.

sales@secureanycloud.com

Deploy on Azure