Deployment guide

Cloudprober

Overview

Cloudprober is an open-source active monitoring tool. Instead of waiting for an outage to be reported, it probes your endpoints on a schedule over HTTP, HTTPS, PING, DNS, TCP, gRPC and external commands. It turns the results into availability and latency time series that you can alert on.

This SecureAnyCloud image runs Cloudprober 0.14.3 on Ubuntu 24.04 on Azure, installed from the official upstream release binary (a single self-contained Go binary) and run under systemd as an unprivileged cloudprober user. Cloudprober's built-in web server, which serves the status page and the /metrics endpoint, is bound to the loopback interface only on port 9313. nginx is the only network-facing service: it terminates TLS on port 443 and protects the whole monitoring surface with HTTP basic authentication.

Cloudprober's own HTTP surface has no authentication, so this image never exposes it directly. Nothing secret is baked into the image. On the first boot of every instance, the image generates a unique HTTP basic authentication username and password and a unique self-signed TLS certificate, and writes the credentials to a root-only file. A demonstration probe monitors the instance itself, so metrics flow as soon as the VM boots and you can then point Cloudprober at your own targets.

What you get:

  • Cloudprober 0.14.3 from the official upstream release binary, run under systemd (cloudprober.service) as an unprivileged cloudprober user, with the status page and /metrics bound to 127.0.0.1:9313
  • nginx (nginx.service) terminating TLS on port 443 as the only network-facing service, protecting the status page and metrics with HTTP basic auth, plus an unauthenticated /healthz for load balancer probes
  • A per-instance HTTP basic authentication credential and TLS certificate, generated on first boot, with the per-instance values written to /root/cloudprober-credentials.txt
  • A Prometheus metrics endpoint (/metrics) and a live status page (/ and /status), ready to scrape into Prometheus and visualise in Grafana
  • A demonstration probe, sac_selfcheck, and the whole configuration in one readable file, /etc/cloudprober.cfg, that you can keep under version control and reload with a single command

Prerequisites

Before you deploy, make sure you have:

  • An active Azure subscription, an SSH public key, and a VNet with a subnet in the target region
  • A subscription to the Cloudprober listing on Azure Marketplace
  • Network security group (NSG) rules that allow TCP 22 (administration) and TCP 443 (HTTPS, for the status page and metrics) from the operators and monitoring systems that will reach the server

Recommended virtual machine size: Standard_B2s (2 vCPU, 4 GB RAM) is ample for monitoring a few dozen targets. Choose a larger size for very large numbers of probes or very short probe intervals.

1

Deploy from the Azure Portal

Search the Azure Marketplace for Cloudprober, select the SecureAnyCloud publisher, and click Create.

Configure the NSG to allow TCP 443 from the operators and monitoring systems that will reach the status page and metrics, and TCP 22 for administration. Restrict port 443 to the networks you serve, because a monitoring appliance rarely needs to be reachable from the whole internet.

2

Deploy from the Azure CLI

RG="monitoring-prod"; LOCATION="eastus"; VM_NAME="cloudprober1" IMAGE_URN="sac1647283583153:cloudprober-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:cloudprober-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
az vm open-port --resource-group "$RG" --name "$VM_NAME" --port 443 --priority 1001
az vm open-port --resource-group "$RG" --name "$VM_NAME" --port 22 --priority 1002
3

First boot and per instance credentials

On first boot the image resolves the VM's IP address, generates a per-instance HTTP basic authentication username and password and a per-instance TLS certificate, and writes everything to /root/cloudprober-credentials.txt. This completes within seconds. SSH in as azureuser and read the credentials file:

sudo cat /root/cloudprober-credentials.txt

The file is 0600 root:root. It records the console user and password, the HTTPS URL, and the paths for the status page, metrics and health endpoints. These values are unique to this instance.

4

Confirm the services are running

Confirm that cloudprober.service and nginx.service are both active and that cloudprober --version reports 0.14.3. Then use ss to confirm that nginx owns port 443 and that the Cloudprober web surface is bound to loopback only on port 9313.

systemctl is-active cloudprober.service nginx.service /opt/cloudprober/cloudprober --version sudo ss -tlnp | grep -E ':443 |:9313 '
5

The monitoring surface is never open

The status page and the metrics endpoint are reachable only through nginx on port 443, and only with the per-instance HTTP basic authentication. An unauthenticated request returns 401, and a request with the per-instance credentials returns 200. Only the /healthz load balancer probe is served without credentials.

The following block reads the credentials from the instance credentials file, so it works unchanged on any instance.

CLOUDPROBER_USER=$(sudo grep -E '^CLOUDPROBER_USER=' /root/cloudprober-credentials.txt | cut -d= -f2-)
CLOUDPROBER_PASSWORD=$(sudo grep -E '^CLOUDPROBER_PASSWORD=' /root/cloudprober-credentials.txt | cut -d= -f2-)
curl -sk -o /dev/null -w 'healthz (no auth) -> HTTP %{http_code}\n' https://127.0.0.1/healthz
curl -sk -o /dev/null -w 'metrics (no auth) -> HTTP %{http_code}\n' https://127.0.0.1/metrics
curl -sk -u "$CLOUDPROBER_USER:$CLOUDPROBER_PASSWORD" -o /dev/null -w 'status (with auth) -> HTTP %{http_code}\n' https://127.0.0.1/status

The -k flag tells curl to accept the self-signed per-instance certificate. The unauthenticated /metrics request returns 401, and the status page returns 200 only when you supply the per-instance credentials.

6

View the probe metrics

Cloudprober exports the standard success, total, latency and resp_code series for every probe in Prometheus format on /metrics. The demonstration probe sac_selfcheck monitors this instance's own status endpoint, so metrics are already flowing.

Read the metrics through nginx with the per-instance credentials.

CLOUDPROBER_USER=$(sudo grep -E '^CLOUDPROBER_USER=' /root/cloudprober-credentials.txt | cut -d= -f2-)
CLOUDPROBER_PASSWORD=$(sudo grep -E '^CLOUDPROBER_PASSWORD=' /root/cloudprober-credentials.txt | cut -d= -f2-)
curl -sk -u "$CLOUDPROBER_USER:$CLOUDPROBER_PASSWORD" https://127.0.0.1/metrics | grep -E '^(total|success|latency|resp_code)\{'

Each series is labelled by probe type (ptype), probe name (probe) and destination (dst). For the demonstration probe, success equals total and resp_code carries code="200", which confirms that the probe is running and every request has succeeded.

Point your Prometheus scraper at this endpoint to collect the metrics.

7

The live status page

Cloudprober serves a live status page at / and /status that lists every configured probe with its recent success and latency. nginx serves it over HTTPS with the same per-instance credentials.

Open https://<vm-ip>/status in your browser and accept the self-signed certificate. Alternatively, confirm from the shell that the page is served:

CLOUDPROBER_USER=$(sudo grep -E '^CLOUDPROBER_USER=' /root/cloudprober-credentials.txt | cut -d= -f2-)
CLOUDPROBER_PASSWORD=$(sudo grep -E '^CLOUDPROBER_PASSWORD=' /root/cloudprober-credentials.txt | cut -d= -f2-)
curl -sk -u "$CLOUDPROBER_USER:$CLOUDPROBER_PASSWORD" https://127.0.0.1/status | grep -iE 'cloudprober|probe|selfcheck' | head
8

Add probes for your own targets

Cloudprober is configured entirely in /etc/cloudprober.cfg. Each probe block sets a type, a set of targets and an interval.

The following example adds an HTTP probe that checks a website you own. The same pattern works for PING, DNS, TCP and GRPC probes. Edit the config, then reload.

# append a probe to /etc/cloudprober.cfg, for example an HTTP check of your own site:
# probe {
# name: "my_website"
# type: HTTP
# targets { host_names: "<your-domain>" }
# http_probe { protocol: HTTPS }
# interval_msec: 15000
# timeout_msec: 5000
# }
# then apply the change (Cloudprober re-reads its config on restart):
sudo systemctl restart cloudprober

Cloudprober re-reads its config on reload. The new probe appears on the status page, and its success, total and latency series appear on /metrics within one interval. See the Cloudprober documentation for the full set of probe types and options.

9

Scrape the metrics into Prometheus

To collect the metrics centrally, point a Prometheus server at this instance's authenticated metrics endpoint. Replace <vm-ip> with the instance's address, and use the per-instance credentials from /root/cloudprober-credentials.txt.

# prometheus.yml scrape config scrape_configs: - job_name: cloudprober scheme: https tls_config: insecure_skip_verify: true
# or provide the per instance CA certificate basic_auth: username: <user> password: <password> static_configs: - targets: ['<vm-ip>']

For production, replace the self-signed certificate with a CA-signed certificate and a DNS name. Prometheus can then trust the connection without insecure_skip_verify.

10

Security recommendations

Restrict the NSG. Allow TCP 443 only from the operators and monitoring systems that reach the status page and metrics, and TCP 22 only from your administration network. A monitoring appliance rarely needs to be public.

Protect the console password. It lives in /root/cloudprober-credentials.txt (0600 root:root). The status page and metrics are reachable only through nginx and only with this password. To rotate it, update /etc/nginx/cloudprober.htpasswd with htpasswd and reload nginx.

Keep the web surface on loopback. Cloudprober's built-in server is bound to 127.0.0.1:9313. Leave it that way so that nginx and its basic auth remain the only path to the monitoring data.

Use a real certificate in production. The per-instance certificate is self-signed. Put a CA-signed certificate and a DNS name in front of the instance so that clients and scrapers trust the connection without extra configuration.

Keep the OS patched. Unattended security upgrades remain enabled on the running VM.

11

Support and Licensing

Cloudprober is open-source software distributed under the Apache License 2.0. This SecureAnyCloud image bundles the unmodified official Cloudprober release binary.

SecureAnyCloud provides the packaging, the systemd hardening, the nginx TLS front, the loopback-only web surface with per-instance basic auth, the per-instance credential automation, the paired deployment guide, and 24/7 support with a guaranteed 24-hour response SLA.

SecureAnyCloud is not affiliated with or endorsed by the Cloudprober project. Cloudprober is a mark of its respective owner and is used here only to identify the software.

Deploy on Azure

Find Cloudprober on Ubuntu 24.04 LTS in the Azure Marketplace, published by SecureAnyCloud. Deploy from the Azure Portal or the Azure CLI as shown above.

Need Help?

Email sales@secureanycloud.com for deployment help, configuration questions or licensing enquiries.

Deploy on Azure

Launch Cloudprober 0.14.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