Deployment guide

Apache Jena Fuseki

Overview

Apache Jena Fuseki is the SPARQL server from the Apache Jena project. It is a standards-compliant RDF triple store that serves the SPARQL 1.1 Query and Update protocols and the SPARQL Graph Store HTTP Protocol over an embedded Jetty web server. A bundled browser UI lets you run queries, load data and manage datasets.

The SecureAnyCloud image installs Fuseki 5.6.0 from the Apache archive with SHA-512 verification, alongside OpenJDK 17. A TDB2 persistent dataset named /ds is pre-configured, and its database files live on a dedicated Azure data disk mounted at /var/lib/fuseki, so your RDF data survives reboots and can be resized independently. An nginx reverse proxy fronts Fuseki on port 80. Apache Shiro protects the admin UI and dataset-management endpoints with a per-VM admin password, which is generated at first boot and written to a root-only file.

What you get:

  • Apache Jena Fuseki 5.6.0 at /opt/fuseki (FUSEKI_HOME), with the bundled SPARQL UI.
  • A headless OpenJDK 17 JRE from Ubuntu 24.04 noble main.
  • A TDB2 persistent dataset /ds, with database files on a dedicated 30 GiB Azure data disk mounted at /var/lib/fuseki (FUSEKI_BASE).
  • fuseki.service, running as the unprivileged fuseki service user and bound to 127.0.0.1:3030.
  • An nginx reverse proxy on port 80 with an unauthenticated /health endpoint.
  • Apache Shiro admin authentication (shiro.ini); the /$/ping server-liveness endpoint stays anonymous.
  • A per-VM admin password generated at first boot, with a plain copy in /root/fuseki-credentials.txt (mode 0600).
  • 24/7 SecureAnyCloud support.

Prerequisites

You need an active Azure subscription, an SSH key, and a VNet with a subnet. Standard_B2ms (8 GB RAM, 1024m default heap) is suitable for development, test and single-tenant production graphs. For larger graphs, raise the VM size and tune JVM_ARGS in /etc/fuseki.env.

In the NSG, allow inbound 22/tcp from your management CIDR and 80/tcp from any client CIDR that needs the Fuseki UI or SPARQL endpoints. Fuseki serves plain HTTP on port 80, so front it with TLS and your own domain, for example with an Azure Application Gateway, Front Door, or a reverse proxy with a certificate.

Step 1-3: Deploy + SSH (standard pattern)

Deploy the VM from the Azure Marketplace offer. Then connect over SSH as azureuser:

ssh azureuser@<vm-ip>
4

Service Status + Health

Confirm the services are active and the unauthenticated health and ping endpoints respond:

sudo systemctl is-active fuseki.service nginx.service curl -s -o /dev/null -w 'health: HTTP %{http_code}\n' http://127.0.0.1/health printf 'ping: '; curl -s 'http://127.0.0.1/$/ping'; echo

fuseki.service and nginx.service report active, /health returns HTTP 200 (the nginx-served liveness check), and /$/ping returns a timestamp (Fuseki's own anonymous liveness endpoint).

5

Read the Per-VM Admin Credentials

The admin password is unique to this VM and is written to a root-only file at first boot:

sudo cat /root/fuseki-credentials.txt

This prints FUSEKI_ADMIN_USER (admin), FUSEKI_ADMIN_PASSWORD (the per-VM password), and the FUSEKI_URL. Keep this password safe, because it unlocks the admin UI and dataset management.

6

Admin Auth Round-Trip

The server-management endpoints under /$/ are protected by Apache Shiro. Read the password into a shell variable first, then confirm that authentication is enforced. Run these commands from your SSH session. If you copy a single line, replace <FUSEKI_ADMIN_PASSWORD> with the value from Step 5:

  • Without auth or with a wrong password, the datasets endpoint is rejected: curl -s -o /dev/null -w '%{http_code}\n' -u admin:wrong 'http://127.0.0.1/$/datasets' returns 401.
  • With the per-VM password it returns the datasets JSON: curl -s -u admin:<FUSEKI_ADMIN_PASSWORD> 'http://127.0.0.1/$/datasets' returns 200 and lists the TDB2-backed /ds dataset.
7

Version, Data Disk, and a SPARQL Round-Trip

Confirm the Fuseki version, that the /ds TDB2 dataset lives on the dedicated Azure data disk, and run an anonymous SPARQL SELECT that counts the triples in /ds:

df -h /var/lib/fuseki | awk 'NR==1 || /fuseki/'
sudo ls -1 /var/lib/fuseki/databases/ds/ | head curl -s -G 'http://127.0.0.1/ds/query' \
  --data-urlencode 'query=SELECT (COUNT(*) AS ?n) WHERE { ?s ?p ?o }' \
  -H 'Accept: application/sparql-results+json'

The data disk is mounted at /var/lib/fuseki, the TDB2 database files (Data-0001, tdb.lock) back the /ds dataset, and the SPARQL query returns the current triple count.

8

Fuseki UI: Dashboard and Datasets

Open http://<vm-ip>/ in a browser. The Fuseki dashboard lists your datasets. The bundled /ds dataset is shown with query, add data, edit, and info actions. When prompted, sign in as admin with the per-VM password from Step 5.

9

Run a SPARQL Query in the UI

Click query on the /ds dataset to open the SPARQL query editor (YASGUI). Paste a SELECT and run it with the play button. The example below lists every resource that has an rdfs:label:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT ?s ?label WHERE { ?s rdfs:label ?label } ORDER BY ?label

The results table renders below the editor with the matching rows and the query timing.

10

Load Data via the UI

Click add data on the /ds dataset to open the upload page. Choose one or more RDF files (Turtle, RDF/XML, TriG, N-Triples, JSON-LD), optionally name a target graph, and click upload all to load them into the dataset. You can also load data over HTTP with the SPARQL Graph Store Protocol at http://<vm-ip>/ds/data.

11

Server Info and Statistics

Click info on the /ds dataset to see the available services (the SPARQL Query, Update, and Graph Store Protocol endpoints), per-endpoint request statistics, and the dataset size (use count triples in all graphs to tally the graphs).

12

Load Triples over SPARQL Update

You can insert data programmatically with SPARQL Update against http://<vm-ip>/ds/update. The update endpoint is part of the dataset service. Send an INSERT DATA request with Content-Type: application/sparql-update, then read it back with a SELECT against http://<vm-ip>/ds/query. For example, posting INSERT DATA { <http://example.org/a> <http://www.w3.org/2000/01/rdf-schema#label> "Example" } adds one triple, and a SELECT * WHERE { ?s ?p ?o } returns it.

13

Configure a New Dataset

Create additional datasets from the dashboard's manage tab, then new dataset. Choose a name and a dataset type: Persistent (TDB2) for durable storage on the data disk, or In-memory for scratch data. Persistent datasets are written under /var/lib/fuseki/databases/. You can also drop a .ttl assembler file into /var/lib/fuseki/configuration/ and restart the service:

sudo systemctl restart fuseki.service
14

Tune the JVM Heap

Fuseki's heap is set in /etc/fuseki.env (JVM_ARGS=-Xms512m -Xmx1024m by default). For larger graphs increase the maximum heap and restart:

sudo sed -i 's/-Xmx1024m/-Xmx2048m/' /etc/fuseki.env
sudo systemctl restart fuseki.service
15

Logs and Troubleshooting

Fuseki logs to the systemd journal. Tail the service logs and check the listening socket:

sudo journalctl -u fuseki.service --no-pager | tail -30 sudo ss -tln | grep -E ':80 |:3030 '

The Shiro auth configuration is at /var/lib/fuseki/shiro.ini; the dataset assembler files are in /var/lib/fuseki/configuration/. If a query fails with a 500, check the journal for the underlying SPARQL parse or TDB2 error.

Security

The admin UI and all /$/ server-management endpoints require the per-VM admin password (Apache Shiro, authcBasic). The /$/ping liveness endpoint and the nginx /health endpoint are intentionally anonymous so load balancers can probe them. The read query path on /ds is open by default for convenience. If you need authenticated reads, tighten the [urls] section of /var/lib/fuseki/shiro.ini to require admin on /ds/**, then restart the service. Fuseki serves plain HTTP on port 80, so terminate TLS upstream (Application Gateway, Front Door, or a TLS-terminating reverse proxy). Restrict the NSG to known client CIDRs before you expose the VM to the internet. The per-VM password is rotated automatically on the first boot of every VM, so no two deployments share a credential.

Support

SecureAnyCloud provides 24/7 support for this image. Email sales@secureanycloud.com. The $0.04 per vCPU hour SecureAnyCloud charge covers packaging, security patching, image maintenance and expert support. Apache Jena Fuseki is licensed under the Apache License 2.0 and is free. The SecureAnyCloud charge is for the managed, patched, support-backed image.

Deploy on Azure

Launch Apache Jena Fuseki 5.6.0 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