Warp 10 on Ubuntu 24.04 on Azure User Guide
Overview
Warp 10 is a high-performance open-source time-series platform from SenX that combines a time-series database with the WarpScript analytics language, purpose-built for sensor, IoT, industrial and monitoring data. The cloudimg image installs Warp 10 3.5.0 in the Standalone edition (a single Java process backed by LevelDB), runs it as a dedicated warp10 system user, stores its data on a dedicated Azure data disk, and puts the WarpStudio web IDE behind nginx on port 80. Every VM generates its own cryptographic keys and read/write tokens on first boot, so no shipped token is ever reusable. Backed by 24/7 cloudimg support.
What is included:
- Warp 10 3.5.0 Standalone (a single Java process + LevelDB storage)
- OpenJDK 11 (Warp 10 3.5.0 targets Java 8+; the launcher adds the exports newer JDKs need)
- Unique per-VM cryptographic keys and read/write tokens generated on first boot (no default token is ever shipped)
- The WarpStudio web IDE, reverse-proxied by nginx on port 80
- LevelDB storage on a dedicated 30 GiB Azure data disk at
/var/lib/warp10 - The Warp 10 HTTP API bound to
127.0.0.1:8080(loopback), reachable publicly only through nginx and only with a valid token - 24/7 cloudimg support
The Warp 10 security model is token-based: a write token authorizes ingesting (and deleting) datapoints, and a read token authorizes fetching them. These tokens are unique to your VM and are printed to a root-only credentials file on first boot.
Prerequisites
An active Azure subscription, an SSH key pair, and a VNet + subnet in the target region. Standard_B2s (2 vCPU / 4 GiB RAM) is a comfortable starting point; Warp 10 Standalone is light. NSG inbound: allow 22/tcp from your management network and 80/tcp from the clients that will use the WarpStudio UI and the API. The Warp 10 API on 8080 is loopback-only and is never opened directly.
Step 1 - Deploy from the Azure Marketplace
In the Azure Portal, choose Create a resource, search for Warp 10 on Ubuntu 24.04 LTS by cloudimg, and select Create. Pick your subscription, resource group and region, choose the Standard_B2s size, and provide your SSH public key for the azureuser account. Under Networking, attach an NSG that allows inbound 22/tcp (SSH) and 80/tcp (WarpStudio + API). Review and create.
Step 2 - Deploy from the Azure CLI
Alternatively, deploy from the Azure CLI. Replace the image URN, resource group and SSH key path with your own:
az group create --name warp10-rg --location eastus
az vm create \
--resource-group warp10-rg \
--name warp10 \
--image cloudimg:warp10:warp10-ubuntu-24-04:latest \
--size Standard_B2s \
--admin-username azureuser \
--ssh-key-values ~/.ssh/id_rsa.pub \
--public-ip-sku Standard
az vm open-port --resource-group warp10-rg --name warp10 --port 80 --priority 900
Step 3 - Connect to your VM
SSH in as azureuser using the public IP shown by az vm create (or the Portal):
ssh azureuser@<vm-ip>
Step 4 - Confirm Warp 10 is installed and running
Check that Warp 10 and nginx are active and that the ports are as expected: nginx public on 80, the Warp 10 API and the WarpStudio UI bound to loopback:
sudo systemctl is-active warp10.service nginx.service
sudo ss -tln | grep -E ':80 |:8080|:8081'
curl -s -o /dev/null -w 'nginx /health -> HTTP %{http_code}\n' http://127.0.0.1/health
Expected output:
active
active
LISTEN 0 50 127.0.0.1:8080 0.0.0.0:*
LISTEN 0 50 127.0.0.1:8081 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
nginx /health -> HTTP 200

Step 5 - Retrieve your per-VM tokens
Your VM's read and write tokens (and the application name) are written to a root-only file on first boot. Retrieve them:
sudo cat /root/warp10-credentials.txt
You will see your unique application name, warp10.read.token, warp10.write.token, and the API and WarpStudio URLs. Keep these tokens secret - the write token can ingest and delete data, and the read token can fetch it.

Step 6 - Push and fetch datapoints over the HTTP API
Warp 10 ingests datapoints over POST /api/v0/update (write token) and runs WarpScript, including FETCH, over POST /api/v0/exec (read token). Push one datapoint and read it back. The commands below use your per-VM tokens:
WRITE_TOKEN=$(sudo grep '^warp10.write.token=' /root/warp10-credentials.txt | cut -d= -f2-)
READ_TOKEN=$(sudo grep '^warp10.read.token=' /root/warp10-credentials.txt | cut -d= -f2-)
# write one datapoint (timestamp in microseconds, class demo.temp)
curl -H "X-Warp10-Token: $WRITE_TOKEN" \
--data-binary "$(( $(date +%s) * 1000000 ))// demo.temp{host=vm} 42.7" \
http://127.0.0.1:8080/api/v0/update
# fetch it back with a WarpScript FETCH
curl -H "X-Warp10-Token: $READ_TOKEN" \
--data-binary "[ '$READ_TOKEN' 'demo.temp' {} NOW -5 ] FETCH" \
http://127.0.0.1:8080/api/v0/exec
The FETCH returns the datapoint you just wrote:
[[{"c":"demo.temp","l":{"host":"vm",".app":"cloudimg-..."},"a":{},"la":0,"v":[[1786444381000000,42.7]]}]]
A request with a missing or invalid token is rejected, so no data can be read or written without your per-VM token.

Step 7 - Explore and chart data in WarpStudio
Warp 10 ships with the WarpStudio web IDE, reverse-proxied by nginx on port 80. Open it in your browser at http://<vm-ip>/. WarpStudio provides a WarpScript editor with syntax highlighting, code completion, and result visualisations.

In the backend selector at the top, point WarpStudio at this VM's Warp 10 endpoint - either add http://<vm-ip>/api/v0 (served through nginx) or use the built-in Localhost entry over an SSH tunnel (ssh -L 8080:127.0.0.1:8080 azureuser@<vm-ip>). Then enter a WarpScript and run it. The example below generates a 48-hour temperature series and returns it:
NEWGTS 'sensor.temperature' RENAME { 'site' 'cloudimg' } RELABEL
1 48 <% 'i' STORE NOW $i 3600000000 * - NaN NaN NaN 20.0 $i 6.0 / SIN 8.0 * + ADDVALUE %> FOR
Click Execute (the play button). The Results panel shows the returned time-series (the class, labels and every timestamp/value pair):

Switch to the Dataviz tab to plot the series as an interactive chart:

The Tabular View tab lists the same datapoints as a date/value table:

Step 8 - Version and data-disk persistence
Confirm the pinned Warp 10 version and that LevelDB lives on the dedicated Azure data disk (so your time-series survives restarts and the volume is independently resizable):
ls /opt/warp10/bin/ | grep -E 'warp10-[0-9].*jar'
java -version 2>&1 | head -1
df -h /var/lib/warp10
readlink -f /opt/warp10/leveldb
Expected output:
warp10-3.5.0.jar
openjdk version "11.0.31" 2026-04-21
Filesystem Size Used Avail Use% Mounted on
/dev/sda 30G 148K 28G 1% /var/lib/warp10
/var/lib/warp10/leveldb

Step 9 - Remote access and security
- The Warp 10 HTTP API binds to
127.0.0.1:8080(loopback) and is reachable from outside the VM only through nginx on port 80, under/api/(for examplehttp://<vm-ip>/api/v0/exec), and only with a valid per-VM token. - To reach the API on
8080directly from your workstation without exposing it, open an SSH tunnel:ssh -L 8080:127.0.0.1:8080 azureuser@<vm-ip>, then usehttp://127.0.0.1:8080/api/v0. - Keep your read and write tokens secret. The write token can ingest and delete data; rotate tokens by minting new ones with
sudo -u warp10 /opt/warp10/bin/warp10.sh tokengen <envelope.mc2>and revoking old ones as needed. - For production, front nginx with TLS (for example a reverse proxy or the Azure Application Gateway) before exposing port 80 to untrusted networks.
Support
This image is maintained by cloudimg and backed by 24/7 support. For help, visit www.cloudimg.co.uk or contact the cloudimg support team.