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 unprivilegedfusekiservice user and bound to127.0.0.1:3030.- An nginx reverse proxy on port 80 with an unauthenticated
/healthendpoint. - Apache Shiro admin authentication (
shiro.ini); the/$/pingserver-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>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'; echofuseki.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).
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.txtThis 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.
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'returns401.
- With the per-VM password it returns the datasets JSON:
curl -s -u admin:<FUSEKI_ADMIN_PASSWORD> 'http://127.0.0.1/$/datasets'returns200and lists the TDB2-backed/dsdataset.
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.
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.
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 ?labelThe results table renders below the editor with the matching rows and the query timing.
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.
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).
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.
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.serviceTune 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.serviceLogs 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
Overview
This image runs Apache Jena Fuseki, the SPARQL 1.1 server from the Apache Jena project. Fuseki serves a persistent RDF triplestore backed by TDB2 over HTTP, with a built-in web query and admin UI, SPARQL 1.1 Query and Update, and the SPARQL Graph Store HTTP Protocol.
Fuseki is installed under /opt/fuseki (FUSEKI_HOME) and its runtime area is /var/lib/fuseki (FUSEKI_BASE), which is a dedicated, independently resizable EBS data volume holding the Shiro security configuration, the dataset definitions, the persistent TDB2 databases and the Fuseki system directory. The server runs as a dedicated unprivileged fuseki system account under a systemd service that starts it on boot and restarts it on failure.
The web UI is served on port 80 by an nginx reverse proxy in front of Fuseki on port 3030. A persistent TDB2 dataset named ds is pre-created, so you can load RDF and run SPARQL immediately after launch. Fuseki also listens directly on port 3030.
This image is secure by default. The upstream Fuseki default leaves every dataset endpoint open and the admin area reachable only from localhost, which is unsafe behind a reverse proxy. Instead, this image ships a hardened Apache Shiro policy: the health endpoints stay open, but the admin UI and API and every dataset write endpoint (SPARQL Update, Graph Store Protocol data and file upload) require HTTP basic authentication as the admin user. The administrator password is generated on the first boot of every deployed instance, so two instances launched from the same AMI never share a password. It is written to /root/apache-jena-fuseki-credentials.txt with mode 0600 so that only the root user can read it.
Prerequisites
Before you deploy this image you need:
- An Amazon Web Services account where you can launch EC2 instances
- IAM permissions to launch instances, create security groups, and subscribe to AWS Marketplace products
- An EC2 key pair in the target Region for SSH access to the instance
- A VPC and subnet in the target Region, with a security group allowing inbound port 22 from your management network, port 80 for the web UI, and optionally port 3030 for direct Fuseki access from the networks your applications use
- The AWS CLI (version 2) installed locally if you plan to deploy from the command line
Launch the Instance from the AWS Marketplace
Sign in to the AWS Management Console, open the EC2 service, and select Launch instance. Under Application and OS Images choose AWS Marketplace AMIs and search for Apache Jena Fuseki. Select the SecureAnyCloud listing and choose Select, then Continue on the subscription summary.
Pick an instance type of m5.large or larger. Fuseki is a JVM workload, so size the instance for your dataset and query concurrency.
Choose your EC2 key pair under Key pair (login). Under Network settings, select your VPC and subnet, and either create or select a security group. The group must open port 22 from your management network and port 80 for the web UI. Leave the root volume at the default size or larger, and keep the attached data volume that holds the triplestore.
Select Launch instance. First-boot initialisation takes approximately one minute after the instance state becomes Running and the status checks pass.
Launch the Instance from the AWS CLI
The following block launches an instance from the SecureAnyCloud Apache Jena Fuseki Marketplace AMI into an existing subnet and security group. Replace <ami-id> with the AMI ID shown on the Marketplace listing, <key-name> with your EC2 key pair name, <subnet-id> with your subnet ID, and <security-group-id> with a security group that opens ports 22 and 80 as described above.
aws ec2 run-instances \
--image-id <ami-id> \
--instance-type m5.large \
--key-name <key-name> \
--subnet-id <subnet-id> \
--security-group-ids <security-group-id> \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=jena-fuseki}]'When the instance reaches the Running state and its status checks pass, note its public IP address or DNS name from the EC2 console or with aws ec2 describe-instances.
Connect to Your Instance
Connect over SSH using your key pair and the login user for your operating system variant.
OS variant SSH login user
Ubuntu 24.04 ubuntu
ssh -i <key-name>.pem ubuntu@<public-ip>Retrieve the Administrator Password
The Fuseki administrator password is unique to your instance and was generated on first boot. Read it as root:
sudo cat /root/apache-jena-fuseki-credentials.txtThe file lists the web UI URL, the administrator user (admin) and the generated password, and the SPARQL endpoints for the pre-created ds dataset. It is mode 0600 and owned by root, so only the root user can read it.
Confirm the Services Are Running
Fuseki and nginx run as systemd services. Confirm both are active:
systemctl is-active fuseki.service nginx.serviceFuseki listens on port 3030 and nginx proxies port 80 to it. Confirm the health endpoint answers (this endpoint is public and is ideal for load-balancer health checks):
curl -fsS 'http://127.0.0.1:3030/$/ping'Open the Web Query and Admin UI
Browse to http://<public-ip>/ to open the Fuseki web UI. The datasets page lists the pre-created ds dataset with buttons to query, add data, edit and view info.
Open the query tab to run SPARQL against your dataset using the built-in editor.
The info tab lists the dataset endpoints and shows live per-endpoint request statistics.
Administrative functions, such as the manage page where you create, back up and remove datasets, require the administrator credentials from Step 4.
Run a Public SPARQL Query
SPARQL query and read endpoints are open by default so applications can read without credentials. Count the triples in the ds dataset:
curl -s 'http://127.0.0.1:3030/ds/sparql' --data-urlencode 'query=SELECT (COUNT(*) AS ?count) WHERE { ?s ?p ?o }' -H 'Accept: application/sparql-results+json'You can point any SPARQL client or your application at http://<public-ip>/ds/query (or the equivalent http://<public-ip>/ds/sparql).
Load RDF with an Authenticated Update
SPARQL Update and the other write endpoints require authentication. The following block reads the per-instance administrator password from the credentials file and inserts a triple into the ds dataset. It then reads the triple back with a public query:
PASS=$(sudo grep '^fuseki.admin.pass=' /root/apache-jena-fuseki-credentials.txt | cut -d= -f2-)
curl -s -u "admin:${PASS}" -H 'Content-Type: application/sparql-update' \
--data 'INSERT DATA { <urn:sac:example> <http://www.w3.org/2000/01/rdf-schema#label> "Hello from sac" }' \
'http://127.0.0.1:3030/ds/update'
curl -s 'http://127.0.0.1:3030/ds/query' \
--data-urlencode 'query=SELECT ?label WHERE { <urn:sac:example> <http://www.w3.org/2000/01/rdf-schema#label> ?label }' \
-H 'Accept: application/sparql-results+json'You can also load an RDF file (Turtle, N-Triples, RDF/XML, JSON-LD and more) through the add data tab in the UI, or with the Graph Store Protocol endpoint http://<public-ip>/ds/data using the same administrator credentials.
Confirm that an anonymous write is correctly rejected (secure by default):
curl -s -o /dev/null -w '%{http_code}\n' -H 'Content-Type: application/sparql-update' \
--data 'INSERT DATA { <urn:x> <urn:p> "y" }' 'http://127.0.0.1:3030/ds/update'This returns 401, confirming that dataset writes require authentication.
The Dedicated Data Volume
The triplestore lives on a dedicated EBS data volume mounted at /var/lib/fuseki, separate from the operating system disk, so you can resize it independently for capacity and IOPS. Confirm the mount and its contents:
findmnt /var/lib/fuseki ls /var/lib/fusekiThe configuration/ directory holds the ds.ttl dataset definition, databases/ holds the persistent TDB2 store, and shiro.ini holds the security policy.
Adjust the Security Policy
The Shiro policy is at /var/lib/fuseki/shiro.ini. By default the SPARQL query and read endpoints are open and the admin plus write endpoints require the admin user. To require authentication for reads as well, change the final /** = anon rule and add a rule for the query endpoints, then restart Fuseki:
sudo systemctl restart fuseki.service for i in $(seq 1 60); do curl -fsS -o /dev/null 'http://127.0.0.1:3030/$/ping' && break; sleep 1; done echo "Fuseki restarted and ready"To change the password of the admin user, edit the admin line under [users] in shiro.ini (keep the file mode 0640 and owner fuseki) and restart the service. To serve the UI over HTTPS, terminate TLS at the nginx reverse proxy with your own certificate.
Back Up a Dataset
Use the admin API to trigger a backup of the ds dataset. Backups are written under /var/lib/fuseki/backups:
PASS=$(sudo grep '^fuseki.admin.pass=' /root/apache-jena-fuseki-credentials.txt | cut -d= -f2-)
curl -s -u "admin:${PASS}" -X POST 'http://127.0.0.1:3030/$/backup/ds'You can also back up and restore datasets from the manage page in the UI.
Maintenance
- Service management:
sudo systemctl {status,restart,stop,start} fuseki.servicecontrols the server; nginx issudo systemctl restart nginx.service.
- Logs:
sudo journalctl -u fuseki.serviceshows the server log.
- JVM heap: the service sets
JVM_ARGS=-Xmx2Gin/etc/systemd/system/fuseki.service. Increase it for larger datasets and runsudo systemctl daemon-reloadthen restart.
- Data volume: grow the EBS volume in the AWS console, then extend the filesystem on
/var/lib/fuseki.
Support
SecureAnyCloud provides 24/7 technical support for this image via email and live chat. Contact sales@secureanycloud.com for deployment help, dataset and endpoint configuration, TDB2 tuning and backups, Shiro authentication and TLS setup, or any issues including refund requests.
All product and company names are trademarks or registered trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them.
Deploy on AWS
Launch Apache Jena Fuseki on AWS with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com