Virtuoso Open Source
Overview
Virtuoso Open Source Edition is a multi-model data server. A single self-contained daemon (virtuoso-t) acts as an RDF and SPARQL triplestore, a relational SQL engine and a built-in HTTP server, with the Conductor web console for administration. It is the same engine that powers DBpedia, and it is licensed under the GNU General Public License, version 2.
This SecureAnyCloud image deploys Virtuoso on Ubuntu 24.04 on Azure with unique per-VM credentials and no default logins. It runs Virtuoso as the unprivileged virtuoso system user. Both the SQL / ODBC server (127.0.0.1:1111) and the HTTP server that serves the Conductor and the SPARQL endpoint (127.0.0.1:8890) bind to loopback only, so neither is exposed directly to the network. nginx on port 80 reverse proxies the HTTP server.
At first boot, virtuoso-opensource-firstboot.service sets the dba and dav accounts to unique per-VM secrets. The dav password applies to both SQL and WebDAV. The service re-keys every other built-in account (such as __rdf_repl and nobody) to a random value that is never written down. It then seeds a small sample dataset, proves the whole authentication gate, and writes the secrets to /root/virtuoso-opensource-credentials.txt (mode 0600, root only). No default login such as dba/dba, dav/dav or dav/dba works on a deployed VM, over SQL or over WebDAV on port 80.
What you get:
- Virtuoso Open Source Edition 7.2.17: the official OpenLink
virtuoso-tserver andisqlclient, with the Conductor administration console pre-installed - A
virtuoso.servicesystemd unit that runs the singlevirtuoso-tdaemon in a hardened service sandbox, with the SQL server (127.0.0.1:1111) and HTTP server (127.0.0.1:8890) bound to loopback - A
virtuoso-opensource-firstboot.servicesystemd oneshot that generates the per-VMdbaanddavsecrets, initialises a fresh per-VM database, proves the authentication gate and a full SQL and SPARQL round trip, and writes/root/virtuoso-opensource-credentials.txt - nginx on port 80, reverse proxying to the loopback-bound HTTP server, with an unauthenticated
/healthzendpoint for load balancer probes - A small sample relational table (
DBA.DEMO_CUSTOMERS) and RDF graph (http://sac.example/catalog), so the Conductor schema browser and SPARQL editor have content to explore on first boot - Ubuntu 24.04 LTS base, patched at build time
- Azure Linux Agent for cloud integration and SSH key injection
- 24/7 SecureAnyCloud support with a 24-hour response SLA
Prerequisites
You need an active Azure subscription, an SSH public key, and a VNet with a subnet in the target region. You also need a subscription to the Virtuoso Open Source Edition on Ubuntu 24.04 listing on Azure Marketplace.
Recommended VM size: Standard_B2s (2 vCPU, 4 GB RAM) for evaluation, development and small workloads. For larger datasets, choose Standard_D2s_v5 or larger with more RAM, and raise NumberOfBuffers and MaxDirtyBuffers in /etc/virtuoso/virtuoso.ini.
Deploy from the Azure Portal
Search Azure Marketplace for Virtuoso, select the SecureAnyCloud publisher entry, then click Create.
Configure the network security group (NSG) to allow TCP 22 from your management IP and TCP 80 from your client IPs. The Virtuoso SQL server and HTTP server are bound to loopback, so only nginx on port 80 is exposed.
The Conductor authenticates with the dba account. For any deployment beyond a private network, put a TLS-terminating reverse proxy in front of port 80 so credentials and query traffic are encrypted in transit.
Deploy with the Azure CLI
RG="virtuoso-prod"; LOCATION="eastus"; VM_NAME="virtuoso-01" IMAGE_URN="sac1647283583153:virtuoso-opensource:default:latest" SSH_KEY="$(cat ~/.ssh/id_rsa.pub)" az group create --name "$RG" --location "$LOCATION" az network vnet create -g "$RG" --name virtuoso-vnet --address-prefix 10.90.0.0/16 --subnet-name virtuoso-subnet --subnet-prefix 10.90.1.0/24 az network nsg create -g "$RG" --name virtuoso-nsg az network nsg rule create -g "$RG" --nsg-name virtuoso-nsg --name allow-ssh --priority 100 \
--source-address-prefixes "<your-mgmt-cidr>" --destination-port-ranges 22 --access Allow --protocol Tcp az network nsg rule create -g "$RG" --nsg-name virtuoso-nsg --name allow-http --priority 110 \
--source-address-prefixes "<your-client-cidr>" --destination-port-ranges 80 --access Allow --protocol Tcp
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:virtuoso-opensource:default:latest
az vm create -g "$RG" --name "$VM_NAME" --image "$IMAGE_URN" \
--size Standard_B2s --admin-username azureuser --ssh-key-values "$SSH_KEY" \
--vnet-name virtuoso-vnet --subnet virtuoso-subnet --nsg virtuoso-nsg --public-ip-sku StandardConnect over SSH
Connect as the administrator account azureuser, using the SSH key you supplied at deployment:
ssh azureuser@<vm-ip>Verify the Virtuoso service
Confirm that Virtuoso and nginx are running:
systemctl is-active virtuoso nginxBoth units report active. virtuoso.service runs the single virtuoso-t daemon, which hosts the SQL server and the HTTP server. nginx fronts the HTTP server on port 80.
Inspect the listeners
Confirm that nginx owns the public port while Virtuoso stays on loopback:
sudo ss -tlnp | grep -E ':80 |:1111 |:8890 'nginx listens on 0.0.0.0:80. The Virtuoso SQL server (1111) and HTTP server (8890) listen on 127.0.0.1 only, so they are reachable from the network only through nginx.
Retrieve the credentials
The per-VM secrets are generated at first boot and stored in a root-only file. Read it with sudo:
sudo cat /root/virtuoso-opensource-credentials.txtThe file lists the Conductor URL, the dba administration password, the SPARQL endpoint URL and the dav WebDAV password:
VIRTUOSO_CONDUCTOR_URL=http://<vm-ip>/conductor/ VIRTUOSO_SPARQL_URL=http://<vm-ip>/sparql VIRTUOSO_ADMIN_USER=dba VIRTUOSO_DBA_PASSWORD=<VIRTUOSO_DBA_PASSWORD> VIRTUOSO_DAV_USER=dav VIRTUOSO_DAV_PASSWORD=<VIRTUOSO_DAV_PASSWORD>Next, confirm that the per-VM dba secret authenticates and that the shipped default credentials no longer work. The isql client is at /opt/virtuoso/bin/isql.
Run the positive check first. Virtuoso briefly locks the dba account after repeated bad logins, so always test the real password before the default one:
export LD_LIBRARY_PATH=/opt/virtuoso/lib
DBA=$(sudo grep '^VIRTUOSO_DBA_PASSWORD=' /root/virtuoso-opensource-credentials.txt | cut -d= -f2-) /opt/virtuoso/bin/isql 127.0.0.1:1111 dba "$DBA" exec="SELECT now();" /opt/virtuoso/bin/isql 127.0.0.1:1111 dba dba exec="SELECT 1;" 2>&1 | grep -m1 -o 'Bad login.*' || trueThe per-VM dba secret runs the query, while the default dba/dba login is rejected with Bad login.
You can also query the database from the command line with the bundled isql client and the per-VM dba password. The sample DBA.DEMO_CUSTOMERS table returns three rows:
DBA=$(sudo grep '^VIRTUOSO_DBA_PASSWORD=' /root/virtuoso-opensource-credentials.txt | cut -d= -f2-) /opt/virtuoso/bin/isql 127.0.0.1:1111 dba "$DBA" \
exec="SELECT ID, NAME, CITY FROM DBA.DEMO_CUSTOMERS ORDER BY ID;"Open the Conductor
From your workstation, open http://<vm-ip>/conductor/. This requires the NSG to allow TCP 80. The Virtuoso Conductor login page appears.
Sign in with the account dba and the VIRTUOSO_DBA_PASSWORD from the credentials file:
Browse the database schema
After you sign in, open the Database tab and then the SQL Database Objects sub-tab. The Schema Objects browser lists the SQL catalogs. It also lets you create tables, views and procedures without writing DDL by hand:
Run a SQL query
Open Database, then Interactive SQL. Type a statement into the editor and click Execute. The result grid appears below. In this example, the sample DBA.DEMO_CUSTOMERS table returns three rows:
Run a SPARQL query
Virtuoso is also an RDF triplestore. Open the Linked Data tab and then the SPARQL sub-tab. Set the Default Graph IRI to http://sac.example/catalog, enter a SPARQL query and click Execute. The sample RDF graph returns its labelled resources:
The same endpoint is available programmatically at http://<vm-ip>/sparql. As in DBpedia, read-only queries are open without authentication. Updates require the dba account or a SPARQL update role.
Administer the server
The System Admin tab shows the server dashboard. It covers uptime, HTTP server request counters, database space allocation, the transaction log and connected clients.
Sub-tabs cover Security, User Accounts, the Scheduler, Parameters, the Registry, installed Packages and Backup:
Connect over the SQL port
The Virtuoso SQL / ODBC server is bound to loopback for safety. An application running on the same VM connects directly to 127.0.0.1:1111 with the dba user and the per-VM password. To reach the server from your workstation, forward the port over SSH rather than exposing it:
ssh -L 1111:127.0.0.1:1111 azureuser@<vm-ip>Then point a local isql, ODBC or JDBC client at 127.0.0.1:1111.
For a production application tier, open TCP 1111 in the NSG restricted to your application subnets only. Prefer a TLS terminator in front of the Conductor on port 443.
Server components
virtuoso.service runs /opt/virtuoso/bin/virtuoso-t +configfile /etc/virtuoso/virtuoso.ini +foreground as the virtuoso user. virtuoso.ini binds ServerPort = 127.0.0.1:1111 (SQL) and HTTPServer ServerPort = 127.0.0.1:8890 (HTTP), so both accept only local connections.
virtuoso-opensource-firstboot.service is a oneshot that initialises a fresh per-VM database from the Conductor seed. It rotates dba to its per-VM secret offline with virtuoso-t +pwdold dba +pwddba ....
While Virtuoso still listens on loopback only, and before nginx starts, the service sets the dav password with USER_SET_PASSWORD. It re-keys every other built-in account to an unrecorded random value, seeds the sample content and proves the gate. It then writes the sentinel /var/lib/sac/data/virtuoso-opensource-firstboot.done.
nginx listens on port 80, serves an unauthenticated /healthz, and reverse proxies everything else to 127.0.0.1:8890. The database files live in /var/lib/virtuoso/db.
Manage the service
Check the status, restart the service and read recent logs with these commands:
systemctl status virtuoso
sudo systemctl restart virtuoso
sudo journalctl -u virtuoso -n 50 --no-pagerTo tune memory for larger datasets, edit NumberOfBuffers and MaxDirtyBuffers in /etc/virtuoso/virtuoso.ini. Then run sudo systemctl restart virtuoso.
Security recommendations
Keep the listeners on loopback. Do not change ServerPort in /etc/virtuoso/virtuoso.ini to a public address. nginx on port 80 is the only front door. Reach the SQL server on port 1111 only from the VM or over an SSH tunnel.
Add TLS. Put a TLS-terminating reverse proxy (or nginx with a certificate) in front of port 80 on port 443. This encrypts the dba password and query traffic in transit.
Restrict the NSG. Allow TCP 22 and TCP 80 only from the addresses that need them. If you must reach the SQL server from outside the VM, open TCP 1111 only to your application subnets.
Rotate secrets. The per-VM passwords in /root/virtuoso-opensource-credentials.txt are unique to this VM. To rotate the dba password from isql, run DB.DBA.USER_SET_PASSWORD('dba', '<new>'); and do the same for dav. Then update the credentials file.
Review the SPARQL endpoint. The /sparql endpoint answers read-only queries anonymously by design. If your data is not public, restrict access at the NSG or nginx layer, or remove the anonymous SPARQL read grant.
Support and licensing
Virtuoso Open Source Edition is licensed under the GNU General Public License, version 2. This image bundles the unmodified official OpenLink Virtuoso 7.2.17 server and its Conductor console. The separate Virtuoso Enterprise Edition is a commercial product and is not included.
SecureAnyCloud provides the packaging, hardening and first-boot automation, plus 24/7 support with a 24-hour response SLA. This listing is not affiliated with or endorsed by OpenLink Software.
Deploy on Azure
Find Virtuoso Open Source Edition on Ubuntu 24.04 LTS on the Azure Marketplace by SecureAnyCloud, or visit secureanycloud.com for the full catalogue.
Need Help?
Email sales@secureanycloud.com for deployment help, SPARQL and SQL integration questions, or anything else. SecureAnyCloud support responds within 24 hours.
Deploy on Azure
Launch Virtuoso Open Source Edition 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