OrientDB 3.2
Overview
OrientDB is a multi-model database released under the Apache License 2.0. One engine stores graph data (vertices and edges, traversed natively) and document data (schema-less records with nested embedded documents), and you query both with a single SQL dialect that has graph extensions such as MATCH, TRAVERSE and out() / in() / both(). OrientDB Studio, a browser workbench for schema, queries and graph visualisation, is included.
This guide covers the deployment and operation of OrientDB 3.2 Community Edition on Ubuntu 24.04 on Azure, using the SecureAnyCloud Azure Marketplace image. The image installs the official OrientDB Community server distribution (version 3.2.56 at build time) to /opt/orientdb and runs it under OpenJDK 21. Both OrientDB listeners, the binary protocol on 2424 and the HTTP/Studio listener on 2480, are bound to loopback only. nginx terminates TLS on port 443 in front of them, so the appliance exposes exactly two ports to the network: 22 (SSH) and 443 (HTTPS). Nothing is served in plaintext, and every path behind the gateway requires authentication.
At first boot, orientdb-firstboot.service generates a unique per-VM credential (the image contains no default login) and a per-VM TLS certificate. It then creates the Demo database with sample graph and document data, proves an authenticated round trip, and writes the credential to /root/orientdb-credentials.txt (mode 0600, root only).
What you get:
- The OrientDB 3.2 Community server from Maven Central, with the version pinned and the sha256 verified
- OpenJDK 21 JRE (headless). OrientDB 3.2.56 is tested upstream on JDK 11, 17, 19 and 21
- An
orientdb.servicesystemd unit that runs the server as the unprivilegedorientdbuser - An
orientdb-firstboot.servicesystemd oneshot that creates the per-VM credential, the TLS certificate and theDemodatabase - nginx on port 443 with a per-VM certificate, reverse proxying to the loopback-bound OrientDB HTTP listener
- OrientDB Studio, the graph and document workbench, at
https://<vm-ip>/studio/index.html - An Ubuntu 24.04 LTS base, patched at build time
- The Azure Linux Agent for cloud integration and SSH key injection
- 24/7 SecureAnyCloud support with a 24-hour response SLA
Query languages. OrientDB 3.2 Community answers SQL, including its graph extensions. Gremlin and Cypher are not available in this edition at this version. This was measured against the shipped build, not taken from documentation. Every example in this guide uses SQL.
Prerequisites
You need the following:
- An active Azure subscription, an SSH public key, and a VNet with a subnet in the target region
- A subscription to the OrientDB 3.2 on Ubuntu 24.04 listing on the Azure Marketplace
Recommended virtual machine size: Standard_B2ms (2 vCPU, 8 GB RAM). The JVM is configured with a 2 GB maximum heap and uses roughly 230 MB resident at idle with the sample database loaded, so B2ms leaves substantial headroom for real working sets.
For production graph workloads, use Standard_E4s_v5 (4 vCPU, 32 GB RAM) or larger, and raise the heap in /etc/default/orientdb (ORIENTDB_OPTS_MEMORY=-Xms2G -Xmx16G).
Deploy from the Azure Portal
Search the Azure Marketplace for OrientDB, select the SecureAnyCloud publisher entry, and select Create.
Configure the network security group to allow TCP 22 from your management IP and TCP 443 from your client IPs. No other port needs to be open, and no other port is listening.
Deploy from the Azure CLI
RG="orientdb-prod"; LOCATION="eastus"; VM_NAME="orientdb-01" IMAGE_URN="sac1647283583153:orientdb-ubuntu-24-04:default:latest" az group create --name "$RG" --location "$LOCATION" az network vnet create -g "$RG" --name odb-vnet \
--address-prefix 10.90.0.0/16 --subnet-name odb-subnet --subnet-prefix 10.90.1.0/24 az network nsg create -g "$RG" --name odb-nsg az network nsg rule create -g "$RG" --nsg-name odb-nsg --name allow-ssh \
--priority 100 --destination-port-ranges 22 --access Allow --protocol Tcp \
--source-address-prefixes "<your-ip>/32" az network nsg rule create -g "$RG" --nsg-name odb-nsg --name allow-https \
--priority 110 --destination-port-ranges 443 --access Allow --protocol Tcp \
--source-address-prefixes "<your-ip>/32"
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:orientdb-ubuntu-24-04:default:latest
az vm create -g "$RG" --name "$VM_NAME" --image "$IMAGE_URN" \
--size Standard_B2ms --storage-sku StandardSSD_LRS \
--admin-username azureuser --ssh-key-values ~/.ssh/id_rsa.pub \
--vnet-name odb-vnet --subnet odb-subnet --nsg odb-nsg \
--public-ip-sku Standard --location "$LOCATION"Connect via SSH
ssh azureuser@<vm-ip>Verify the OrientDB Service
First boot takes roughly 30 to 60 seconds after the VM reports running. Confirm that both units are active:
sudo systemctl is-active orientdb.service nginx.serviceExpected output:
active activeTo confirm that first boot ran on this VM, rather than inheriting state from the image, check its sentinel file and the log it writes:
test -f /var/lib/sac/data/orientdb-firstboot.done && echo "first boot completed on this VM"
sudo grep -E 'Generated per-VM|Per-VM TLS|Rotating the built-in|Password stripped' /var/log/sac/sac-firstboot.logConfirm the Java Runtime
java -version 2>&1 | head -1Expected output:
openjdk version "21.0.12" 2026-07-21Inspect the Listeners
The OrientDB ports are bound to loopback, so only SSH and HTTPS are reachable from the network. List the listeners:
ss -lntH | awk '{for(i=1;i<=NF;i++) if($i ~ /:[0-9]+$/){print $i; break}}' | sort -uExpected output:
0.0.0.0:22 0.0.0.0:443 127.0.0.53%lo:53 127.0.0.54:53 [::]:22 [::]:443 [::ffff:127.0.0.1]:2424 [::ffff:127.0.0.1]:2480Port 2424 is the OrientDB binary protocol and 2480 is its HTTP listener. Both show a loopback address. 127.0.0.53 and 127.0.0.54 belong to the systemd resolver, also on loopback. Only 22 and 443 are reachable from outside the VM.
Confirm that an unauthenticated request to the console is refused:
curl -sk -o /dev/null -w 'unauthenticated -> HTTP %{http_code}\n' https://127.0.0.1/listDatabasesExpected output:
unauthenticated -> HTTP 401Retrieve the Per-VM Credential
This image has no default password. The credential is generated on your VM at first boot and exists nowhere else. Read it with:
sudo cat /root/orientdb-credentials.txtThe file has mode 0600 and is owned by root. It contains ORIENTDB_ROOT_USER, ORIENTDB_ROOT_PASSWORD, the Studio URL and the name of the sample database. The same credential works in two places: the browser's HTTPS prompt and the OrientDB Studio login.
To keep the password out of your shell history and off process command lines, pass it to curl on standard input, as every example below does.
Query the HTTPS Gateway
List the databases through the TLS gateway. The command needs -k because each VM uses its own self-signed certificate:
printf 'user = "root:<ORIENTDB_PASSWORD>"\n' | curl -sk -K - -w '\n' https://127.0.0.1/listDatabasesExpected output:
{"@type":"d","@version":0,"databases":["Demo"]}Traverse the Graph
The Demo database contains four Person vertices joined by four Knows edges. This query runs a two-hop graph traversal, not a join:
printf 'user = "root:<ORIENTDB_PASSWORD>"\n' | curl -s -K - -X POST --data-binary \
"MATCH {class: Person, as: a, where: (name = 'Alice')}.out('Knows'){as: b}.out('Knows'){as: c} RETURN a.name, b.name, c.name" \
http://127.0.0.1:2480/command/Demo/sql | python3 -m json.tool | head -9Expected output:
{ "result": [ { "a.name": "Alice", "b.name": "Bob", "c.name": "Carol" } ],The out() graph function follows edges directly:
printf 'user = "root:<ORIENTDB_PASSWORD>"\n' | curl -s -K - -X POST --data-binary \
"SELECT name, out('Knows').name AS knows FROM Person ORDER BY name" \
http://127.0.0.1:2480/command/Demo/sql \
| python3 -c " import json, sys for r in json.load(sys.stdin).get('result', []): print(r['name'], '->', r['knows']) "Expected output:
Alice -> ['Bob'] Bob -> ['Carol'] Carol -> ['Dave'] Dave -> ['Alice']Query the Document Side
The same database also holds schema-less document records with nested embedded documents. No schema is declared for meta, yet you can query its fields directly:
printf 'user = "root:<ORIENTDB_PASSWORD>"\n' | curl -s -K - -X POST --data-binary \
"SELECT title, meta.author AS author, meta.priority AS priority, tags FROM Note ORDER BY title" \
http://127.0.0.1:2480/command/Demo/sql | python3 -m json.tool | head -12Expected output:
{ "result": [ { "title": "Release plan", "author": "Alice", "priority": 1, "tags": [ "graph", "document" ] },Open OrientDB Studio
Browse to https://<vm-ip>/studio/index.html.
Your browser warns about the certificate because it is self-signed and generated on your VM. Accept it, or replace the certificate as described in Step 14. The browser then prompts for the HTTPS gateway credential. Enter user root and the password from Step 7.
On the Studio login form, choose database Demo, enter user root and the same password, and select CONNECT.
Explore the Schema
Open the SCHEMA tab to see the multi-model shape in one view. Person appears under Vertex Classes, Knows under Edge Classes, and Note, the schema-less document class, under Generic Classes.
Run a Traversal and Visualise the Graph
On the BROWSE tab, paste the MATCH query from Step 9 and select RUN. The result table shows the traversal path.
On the GRAPH tab, enter SELECT FROM Person and select the play button. Studio renders the vertices and the Knows edges between them.
Security Notes
Guessable credentials are refused. The historic OrientDB defaults do not work on this image. The upstream distribution ships a sample database with live admin/admin, reader/reader and writer/writer accounts. The build removes it, so it never reaches the image. Upstream also creates the built-in guest account with a published fixed password, and the image rotates that password at first boot. Verify both:
printf 'user = "guest:!!!TheGuestPw123"\n' | curl -s -K - -o /dev/null \
-w 'published guest default -> HTTP %{http_code}\n' \
-X POST --data-binary 'SELECT 1' http://127.0.0.1:2480/command/Demo/sql printf 'user = "admin:admin"\n' | curl -s -K - -o /dev/null \
-w 'admin/admin -> HTTP %{http_code}\n' \
-X POST --data-binary 'SELECT 1' http://127.0.0.1:2480/command/Demo/sqlExpected output:
published guest default -> HTTP 401 admin/admin -> HTTP 401The credential is not left in the service environment. First boot hands the password to the server as an environment variable. After the account is persisted into the OrientDB store, first boot removes the variable and restarts the server. Confirm that nothing remains:
if
sudo grep -q '^ORIENTDB_ROOT_PASSWORD=' /etc/default/orientdb; then echo "credential still present in the service environment" else echo "no credential in the service environment" fiExpected output:
no credential in the service environmentSSH is hardened. Confirm the settings:
sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication|clientaliveinterval) 'Expected output:
clientaliveinterval 120 permitrootlogin no passwordauthentication noKernel module mitigation. The image includes the Dirty Frag mitigation for CVE-2026-43284 and CVE-2026-43500:
sudo cat /etc/modprobe.d/dirtyfrag.confExpected output:
install esp4 /bin/false install esp6 /bin/false install ipcomp /bin/false install ipcomp4 /bin/false install ipcomp6 /bin/false install rxrpc /bin/falseIf this VM must terminate IPsec, remove the esp4 and esp6 lines and run sudo update-initramfs -u. Leave the other lines in place.
Recommended hardening
- Restrict TCP 443 in the NSG to known client IP ranges, because Studio is a database administration console.
- Replace the self-signed certificate with one issued for a hostname you control. Put the certificate and key at
/etc/ssl/sac-orientdb/server.crtandserver.key, keep the key at mode0600and owned by root, and reload nginx. - Create per-user OrientDB accounts for day-to-day work, and reserve
rootfor administration. - Take regular backups with
/opt/orientdb/bin/backup.sh, and store them off the VM.
Managing the Service
sudo systemctl status orientdb.service
sudo systemctl restart orientdb.service
sudo journalctl -u orientdb.service -n 100 --no-pagerThe configuration lives in /etc/default/orientdb (JVM heap and paths) and /opt/orientdb/config/orientdb-server-config.xml (listeners). Databases are stored under /var/lib/orientdb/databases.
Support and Licensing
OrientDB Community Edition is distributed under the Apache License 2.0. The licence text shipped in the image is at /opt/orientdb/license.txt.
SecureAnyCloud packages and supports this image; SecureAnyCloud is not affiliated with, and this image is not endorsed by, the OrientDB project or its trademark holders. OrientDB is a trademark of its respective owner and is used here only to identify the software included.
For support, contact SecureAnyCloud through the Azure Marketplace listing. Response SLA is 24 hours, 24/7.
Deploy on Azure
Launch OrientDB 3.2 Multi-Model Database 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