Chroma or VecturaDB on an Azure VM

One server in your own Azure subscription, with its data on a managed disk, HTTPS, allowed IP addresses and backups. From about 14 USD a month on your Azure bill.

Disclaimer. This template and its scripts are provided as is, without warranty of any kind, as stated in the Apache License 2.0. The numbers on this page are what we measured on 25, 26 and 27 October 2026 in westeurope: your region, sizes, data and versions may behave differently. You are responsible for your data: back it up, and test a restore on a copy before you rely on it.

Not sure about your case? Open an issue in the VecturaDB repository, describe your data and your setup, and we will take a look on a best-effort basis.

What it creates

The template runs one of two servers:

Both keep the Chroma API: the Chroma clients connect with the URL of the deployment. In our tests the Python (chromadb 1.5.9) and JavaScript (chromadb 3.5.0) clients and a .NET client gave the same results on the two servers.

ResourceNotes
Ubuntu 24.04 VMDocker runs the server; Caddy serves HTTPS in front of it
Data disk, Standard SSDMounted at /var/lib/chroma; 16 GiB by default
Network security groupOpens only what the access mode needs
Virtual network and network interface10.42.0.0/16
Public IP, StandardOnly with HTTPS access
Backup vaultOnly with backups on: Azure Disk Backup of the data disk

Deploy

Deploy to Azure

The button opens the form of the Azure portal with the template of the tag azure-v1.1.0. When the portal shows “Your deployment is complete”, open Outputs in the menu on the left: url is the address of the server, for the clients.

In our testsTime
Deployment from zero157-220 s
New deployment of an existing VM36-68 s

With the Azure CLI:

az group create -n my-chroma -l westeurope
az deployment group create -g my-chroma \
  --template-uri https://raw.githubusercontent.com/VecturaDB/VecturaDB.Deploy/azure-v1.1.0/azure/vm/azuredeploy.json \
  -p access=allowed-ips allowedIpRanges='["203.0.113.10/32"]' \
     adminPublicKey="$(cat ~/.ssh/id_ed25519.pub)"

For VecturaDB with an API key, add engine=vecturadb apiKey=<your key>. The template, its scripts and its README are in the VecturaDB.Deploy repository, under azure/vm.

Access and HTTPS

AccessWhat is openAddress
Allowed IP addresses443 from your IP ranges; 80 for the certificate onlyhttps://, with the Azure name of the public IP or your domain
Public443 and 80 from anywhere; VecturaDB with an API key onlyhttps://
InternalNothing from the internet; port 8000 inside the virtual networkhttp://, on the private address
Over HTTPS, from a VM in the same region (median, Standard_B2pts_v2)Time
Heartbeat1.1 ms
Query2.6 ms

Cost

The sizes we tested, with the list prices of westeurope in USD for 730 hours a month, on 26 October 2026:

SizeCPU, memoryVMDisks (OS E4, data E3)Public IPTotal a month
Standard_B2pts_v2 (default, Arm)2, 1 GiB7.013.603.6514.26
Standard_B1s1, 1 GiB8.763.603.6516.01
Standard_B1ms1, 2 GiB17.523.603.6524.77

Backups and restore

Restore

  1. In the backup vault, restore a recovery point to a new disk in the same resource group: Backup instances, then Restore.
  2. Attach the new disk at LUN 1 and run restore.sh: it copies the data of the backup over the data disk and starts the server again.
  3. Detach and delete the new disk.
az vm disk attach -g my-chroma --vm-name chroma --name <restored disk> --lun 1
az vm run-command invoke -g my-chroma -n chroma --command-id RunShellScript --scripts @restore.sh
az vm disk detach -g my-chroma --vm-name chroma --name <restored disk>
az disk delete -g my-chroma -n <restored disk>

The data written after the backup is lost: take an on-demand backup first if you may want it back. The data disk stays the same, so the backups go on.

In our testsTime
On-demand backup, until the recovery point175-179 s
Restore to a new disk50 s
Attach at LUN 18-40 s
restore.sh32-33 s
Detach and delete11-73 s

After the restore the server held the data of the backup, and not the data written after it.

Updates

In our testsTime
Switch from Chroma 1.5.9 to VecturaDB, which read the collections written by Chroma67-68 s
Restart of the VM (az vm restart)73 s
From the restart to the first answer of the server11 s

Delete everything

Deleting the resource group deletes the deployment, the snapshots of the backups included. With backups on, two things stop it first: the backup instance of the data disk, and the soft delete of the vault, on by default. So turn soft delete off, delete the backup instance, then delete the group. Without backups, delete the group.

In the portal

  1. Open the backup vault, <name>-backup. Under Manage, open Properties. In Cyber recovery settings, on the Soft delete row, select Update, clear Enable Soft Delete, and select Update.
  2. Under Manage, open Backup instances. The filter starts on another datasource type, so the list looks empty: set Datasource type to Azure Disks, and open <name>-data.
  3. Select Delete. Type the name of the instance, choose a reason and write a comment: all three are required. Select Delete, then Confirm.
  4. Open the resource group and select Delete resource group. Type the name of the group, select Delete, then Delete again to confirm.

With the Azure CLI

SUB=$(az account show --query id -o tsv); RG=my-chroma; NAME=chroma
VAULT="https://management.azure.com/subscriptions/$SUB/resourceGroups/$RG/providers/Microsoft.DataProtection/backupVaults/$NAME-backup"
az rest --method patch --url "$VAULT?api-version=2024-04-01"   --body '{"properties":{"securitySettings":{"softDeleteSettings":{"state":"Off","retentionDurationInDays":14}}}}'
az rest --method delete --url "$VAULT/backupInstances/$NAME-data?api-version=2024-04-01"
# The deletion goes on in the background: wait until the backup instance is gone.
while az rest --method get --url "$VAULT/backupInstances/$NAME-data?api-version=2024-04-01" -o none 2>/dev/null; do sleep 10; done
az group delete -n $RG --yes
In our tests, in the portal and with the CLITime
Soft delete offat once
Backup instance gone70-103 s
Resource group gone126-190 s

Then nothing was left: no resource, no snapshot, no deleted vault.

If you skip these steps

The README of the template also says how to get out of the soft-deleted state before the 14 days.

Limits

VecturaDB is an independent fork of Chroma, under the Apache License 2.0. The original code is copyright Chroma Inc. and its contributors.

Not affiliated with, endorsed by or sponsored by Chroma Inc. CHROMA is a registered trademark of Chroma Inc., used here only to describe compatibility.