The most optimized, lightweight, and efficient Apache Jena Fuseki Docker container available.
- β Web UI Included: Full Vue 3 admin interface with SPARQL query editor
- β Multi-arch Support: linux/amd64 and linux/arm64
- β Minimal Size: ~150MB Alpine Linux base with custom JDK via jlink
- β Latest Version: Based on Apache Jena Fuseki 5.6.0 (October 2025)
- β Security First: Shiro authentication, runs as non-root user, minimal attack surface
- β Production Ready: Health checks, proper logging, configurable resources
- β Helm Chart: Community Helm chart for Kubernetes deployments (by ConceptKernel)
- β Fast Builds: Optimized layer caching and multi-stage builds
- β Verified Downloads: SHA1 checksum verification of all artifacts
- β Inference Support: Built-in RDFS and OWL reasoners with preset configurations
- β Extensions: Auto-download official Apache Jena modules (text search, GeoSPARQL, SHACL, ShEx)
This project provides optimized Docker images and Kubernetes Helm charts for Apache Jena Fuseki, the industry-standard SPARQL server and triple store.
Apache Jena Fuseki is a SPARQL 1.1 server that provides:
- SPARQL query and update endpoints
- RESTful HTTP interface for RDF data management
- Web-based admin UI for dataset management
- Support for TDB2 persistent storage and in-memory datasets
- Integration with Apache Jena's semantic web toolkit
Repository: github.com/ConceptKernel/jena-fuseki-dockerfile Docker Hub: hub.docker.com/r/conceptkernel/jena-fuseki License: Apache License 2.0
This repository maintains:
- Optimized multi-stage Dockerfile for minimal image size
- Production-ready Kubernetes Helm chart
- Documentation and deployment examples
- Automated builds for both amd64 and arm64 architectures
Current Release: v5.6.0-2
We follow a modified semantic versioning scheme:
v5.6.0-1
βββ ββ Build number (incremented for jena-fuseki-dockerfile changes)
βββ
ββ΄β΄β Apache Jena Fuseki version (5.6.0)
- First three numbers (
5.6.0): Match the upstream Apache Jena Fuseki release version - Build number after dash (
-1): Incremented for patches, documentation updates, or Helm chart changes in this repository - This ensures version alignment with Apache Jena while allowing independent updates
Example:
v5.6.0-1: Initial release based on Fuseki 5.6.0v5.6.0-2: Updated Helm chart for same Fuseki versionv5.7.0-1: New Fuseki upstream release
- Apache Jena Homepage: https://jena.apache.org/
- Fuseki Documentation: https://jena.apache.org/documentation/fuseki2/
- Fuseki GitHub: https://github.com/apache/jena (see
jena-fuseki2/directory) - Fuseki Docker Guide: https://jena.apache.org/documentation/fuseki2/fuseki-docker
- SPARQL 1.1 Specification: https://www.w3.org/TR/sparql11-query/
- Apache Jena Releases: https://jena.apache.org/download/
Apache Jena provides excellent binary distributions - this repository simply containerizes them for easier deployment. We add:
- π³ Production-ready Docker images - Pre-built, optimized, multi-arch containers
- βΈοΈ Kubernetes Helm chart - Community-maintained deployment for K8s (by ConceptKernel)
- π¦ Minimal size - ~150MB using Alpine Linux and jlink-optimized JDK
- π Zero-config deployment - UI auto-extraction, health checks included
- π Security defaults - Non-root user, Shiro auth pre-configured
- π Documentation - Deployment examples, configuration guides
All credit to Apache Jena for the outstanding SPARQL server - we just make it easier to deploy in containerized environments.
The simplest way to get started:
# Pull the latest image
docker pull conceptkernel/jena-fuseki:5.6.0
# Run Fuseki server with UI
docker run -d \
--name jena-fuseki \
-p 3030:3030 \
conceptkernel/jena-fuseki:5.6.0
# Access the UI in your browser
open http://localhost:3030The UI will be immediately available at http://localhost:3030 with full admin capabilities.
For persistent data across container restarts:
# Create a volume for persistent storage
docker volume create fuseki-data
# Run with mounted volume
docker run -d \
--name jena-fuseki \
-p 3030:3030 \
-v fuseki-data:/fuseki/databases \
-e JAVA_OPTIONS="-Xmx4g -Xms2g" \
conceptkernel/jena-fuseki:5.6.0
# View logs
docker logs -f jena-fuseki
# Access the UI
open http://localhost:3030Create a docker-compose.yml:
version: '3.8'
services:
fuseki:
image: conceptkernel/jena-fuseki:latest
container_name: jena-fuseki
ports:
- "3030:3030"
volumes:
- fuseki-data:/fuseki/databases
- fuseki-backups:/fuseki/backups
- fuseki-config:/fuseki/configuration
environment:
- JAVA_OPTIONS=-Xmx4g -Xms2g
restart: unless-stopped
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3030/$/ping"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
volumes:
fuseki-data:
fuseki-backups:
fuseki-config:Run:
docker-compose up -dHelm Chart Version: 1.1.0 | App Version: 5.6.0
The ConceptKernel Helm chart provides a production-ready, configurable deployment with extensive options for security, storage, networking, and advanced features.
Option 1: Install from OCI Registry (Recommended)
# Install directly from GitHub Container Registry
helm install fuseki oci://ghcr.io/conceptkernel/charts/jena-fuseki --version 1.1.0
# Get the admin password
kubectl get secret fuseki-jena-fuseki-admin -o jsonpath='{.data.password}' | base64 -d
# Port forward to access locally
kubectl port-forward svc/fuseki-jena-fuseki 3030:3030Option 2: Install from Git Repository
# Clone and install from source
git clone https://github.com/ConceptKernel/jena-fuseki-dockerfile.git
cd jena-fuseki-dockerfile/helm
helm install fuseki ./jena-fuseki# Install minikube
brew install minikube # macOS
# Or follow: https://minikube.sigs.k8s.io/docs/start/
# Start minikube cluster
minikube start --cpus=4 --memory=8192
# Deploy Fuseki
cd jena-fuseki-dockerfile/helm
helm install fuseki ./jena-fuseki
# Access via port-forward
kubectl port-forward svc/fuseki-jena-fuseki 3030:3030
open http://localhost:3030# Install colima (lightweight alternative to Docker Desktop)
brew install colima
# Start colima with Kubernetes enabled
colima start --cpu 4 --memory 8 --kubernetes
# Set kubectl context
kubectl config use-context colima
# Deploy Fuseki
cd jena-fuseki-dockerfile/helm
helm install fuseki ./jena-fuseki
# Access locally
kubectl port-forward svc/fuseki-jena-fuseki 3030:3030The Helm chart supports extensive configuration options across multiple categories:
| Category | Feature | Supported | Configuration |
|---|---|---|---|
| UI & Interface | Web UI Enable/Disable | β | ui.enabled: true/false |
| SPARQL Query Editor | β | Included with UI | |
| Dataset Management | β | Included with UI | |
| Security | No Authentication (Open) | β | security.mode: open |
| Public Read Only | β | security.mode: public-read |
|
| Full Authentication | β | security.mode: full-auth (default) |
|
| Localhost Only | β | security.mode: localhost |
|
| Custom Shiro Config | β | security.customShiroConfig |
|
| Storage | Persistent Volume | β | persistence.enabled: true |
| Storage Size | β | persistence.size: "10Gi" |
|
| Storage Class | β | persistence.storageClass: "default" |
|
| Custom Mount Path | β | persistence.mountPath |
|
| Inference | RDFS Reasoner | β | inference.preset: "rdfs" |
| OWL Reasoner | β | inference.preset: "owl" |
|
| OWL Micro | β | inference.preset: "owlmicro" |
|
| OWL Mini | β | inference.preset: "owlmini" |
|
| Custom Assembler | β | inference.customConfig |
|
| Extensions | jena-text (Full-text) | β | extensions.text.enabled: true |
| jena-geosparql | β | extensions.geosparql.enabled: true |
|
| jena-shacl | β | extensions.shacl.enabled: true |
|
| jena-shex | β | extensions.shex.enabled: true |
|
| Auto-download | β | Automatic from Maven Central | |
| Networking | ClusterIP Service | β | service.type: ClusterIP (default) |
| LoadBalancer Service | β | service.type: LoadBalancer |
|
| NodePort Service | β | service.type: NodePort |
|
| Traditional Ingress | β | ingress.enabled: true |
|
| Gateway API HTTPRoute | β | gateway.enabled: true |
|
| Multi-domain Routing | β | gateway.listeners[].name |
|
| TLS/HTTPS | β | Via Ingress/Gateway | |
| Resources | CPU Requests/Limits | β | resources.requests/limits.cpu |
| Memory Requests/Limits | β | resources.requests/limits.memory |
|
| JVM Heap Size | β | javaOptions: "-Xmx4g" |
|
| High Availability | Multiple Replicas | replicas: 2 (read-only replicas) |
|
| Pod Disruption Budget | β | Not yet implemented | |
| Auto-scaling (HPA) | β | Not yet implemented | |
| Monitoring | Liveness Probe | β | livenessProbe |
| Readiness Probe | β | readinessProbe |
|
| Health Endpoint | β | /$/ping |
|
| Prometheus Metrics | Via /$/stats (basic) |
||
| Deployment | Rolling Updates | β | Default strategy |
| Pod Security Context | β | Non-root UID 1000 | |
| Image Pull Policy | β | image.pullPolicy |
|
| Node Selector | β | nodeSelector |
|
| Tolerations | β | tolerations |
|
| Affinity Rules | β | affinity |
Legend:
- β Fully Supported - Production-ready feature
β οΈ Partial Support - Available with limitations- β Not Available - Planned for future release
Open Access (No Authentication):
security:
mode: open
enabled: falseProduction with Full-Text Search:
security:
mode: full-auth
username: admin
password: "YourSecurePassword"
persistence:
enabled: true
size: "50Gi"
storageClass: "premium-rwo"
extensions:
text:
enabled: true
indexDir: /fuseki/text-index
resources:
requests:
cpu: "2000m"
memory: "8Gi"
limits:
cpu: "4000m"
memory: "16Gi"
javaOptions: "-Xmx12g -Xms4g"With RDFS Inference:
inference:
enabled: true
preset: rdfsGateway API with Multi-Domain:
gateway:
enabled: true
className: "eg" # Envoy Gateway
listeners:
- name: "https"
namespace: "gateway-system"
gateway: "main-gateway"
hosts:
- "sparql.example.com"# Production deployment with inference and extensions (from OCI registry)
helm install fuseki oci://ghcr.io/conceptkernel/charts/jena-fuseki \
--version 1.1.0 \
--set image.tag=5.6.0-2 \
--set security.password="SecurePass123" \
--set inference.enabled=true \
--set inference.preset=rdfs \
--set extensions.text.enabled=true \
--set persistence.size=100Gi \
--set resources.limits.memory=16Gi \
--set javaOptions="-Xmx12g"
# Or install from local clone with custom values file
helm install fuseki ./jena-fuseki -f my-values.yaml
# Upgrade existing release
helm upgrade fuseki oci://ghcr.io/conceptkernel/charts/jena-fuseki \
--version 1.1.0 \
--reuse-values \
--set image.tag=5.6.0-2
# Uninstall
helm uninstall fusekiFor complete Helm chart documentation, see helm/jena-fuseki/README.md.
- Docker 20.10+ with BuildKit enabled
- Docker Buildx for multi-arch builds
# Clone the repository
git clone https://github.com/ConceptKernel/jena-fuseki-dockerfile.git
cd jena-fuseki-dockerfile
# Build for your platform
docker build --build-arg JENA_VERSION=5.6.0 -t jena-fuseki:local .
# Build multi-arch (requires buildx)
docker buildx build \
--platform linux/amd64,linux/arm64 \
--build-arg JENA_VERSION=5.6.0 \
-t conceptkernel/jena-fuseki:5.6.0 \
--push \
.The container includes the full Fuseki web UI with:
- Admin Interface: Create/manage datasets, view server stats
- SPARQL Query Editor: YASGUI-powered query interface with syntax highlighting
- Shiro Authentication: Configurable user authentication and authorization
- Default Credentials:
admin/pw(change via Shiro config or Helm chart)
The UI is automatically extracted from the JAR on first startup and served from $FUSEKI_BASE/webapp.
| Variable | Default | Description |
|---|---|---|
JAVA_OPTIONS |
-Xmx2048m -Xms2048m |
JVM memory settings |
JENA_VERSION |
5.6.0 |
Apache Jena version (build-time) |
FUSEKI_DIR |
/fuseki |
Fuseki installation directory |
FUSEKI_BASE |
/fuseki/run |
Runtime directory (config, logs, UI files) |
| Path | Purpose |
|---|---|
/fuseki/databases |
Persistent RDF databases (recommended for production) |
/fuseki/run |
Runtime files (config, logs, UI, system state) |
/fuseki/backups |
Database backups |
/fuseki/configuration |
Fuseki configuration files |
/fuseki/logs |
Application logs |
Note: For production deployments with persistent data, mount /fuseki/databases to preserve your datasets across container restarts.
| Port | Description |
|---|---|
3030 |
Fuseki HTTP endpoint |
This image includes support for official Apache Jena extension modules that add powerful capabilities to your SPARQL server. All extensions are official Apache Jena Foundation components.
Apache Jena includes built-in reasoners for RDFS and OWL inference. No additional JARs required - all reasoners are included in the base distribution.
When deploying with the Helm chart, enable inference via values.yaml:
inference:
enabled: true
preset: "rdfs" # Options: rdfs, owl, owlmicro, owlmini, customAvailable Reasoners:
- RDFS: Subclass, subproperty, domain, range inference - fast and efficient
- OWL: Full OWL DL reasoning - computationally expensive
- OWL Micro: Performance-optimized OWL subset
- OWL Mini: Minimal OWL subset - fastest
Documentation: Jena Inference
Official Apache Jena extension modules for advanced functionality. When using the Helm chart, extensions are automatically downloaded from Maven Central at pod initialization.
Lucene-based full-text search for SPARQL queries:
extensions:
text:
enabled: true
indexDir: /fuseki/text-indexUse cases: Search large text corpora, multilingual search, fuzzy matching
Documentation: Jena Text Query
GeoSPARQL 1.0 support for geospatial queries:
extensions:
geosparql:
enabled: true
indexDir: /fuseki/spatial-indexUse cases: Location-based queries, spatial relationships, geographic data
Documentation: Jena GeoSPARQL
Shape constraint validation for RDF data quality:
extensions:
shacl:
enabled: trueUse cases: Data validation, quality constraints, schema enforcement
Documentation: Jena SHACL
Shape expressions for RDF validation:
extensions:
shex:
enabled: trueUse cases: Alternative to SHACL, schema validation, data quality
Documentation: Jena ShEx
- β Zero Configuration: Extensions auto-download from Maven Central
- β Version Aligned: Extension versions match Jena version (e.g., 5.6.0)
- β Classpath Integration: Automatically added to Java classpath
- β Container Optimized: Cached in ephemeral storage, no image bloat
For detailed configuration, see the Helm Chart README.
# Using the Fuseki UI
open http://localhost:3030
# Using CLI
docker exec -it jena-fuseki /fuseki/fuseki-server \
--update \
--mem \
/mydataset# Query via curl
curl -X POST http://localhost:3030/mydataset/query \
-H "Content-Type: application/sparql-query" \
--data 'SELECT * WHERE { ?s ?p ?o } LIMIT 10'
# Update via curl
curl -X POST http://localhost:3030/mydataset/update \
-H "Content-Type: application/sparql-update" \
--data 'INSERT DATA { <http://example.org/subject> <http://example.org/predicate> "object" }'# Load RDF file
curl -X POST http://localhost:3030/mydataset/data \
-H "Content-Type: text/turtle" \
--data-binary @data.ttlFor production Kubernetes deployments, use the ConceptKernel Helm chart:
# Install from OCI registry (recommended)
helm install fuseki oci://ghcr.io/conceptkernel/charts/jena-fuseki \
--version 1.1.0 \
--set persistence.size=50Gi \
--set resources.limits.memory=8Gi \
--set security.password=your-secure-password
# Or use a custom values file
helm install fuseki oci://ghcr.io/conceptkernel/charts/jena-fuseki \
--version 1.1.0 \
-f production-values.yaml
# Or install from local clone
git clone https://github.com/ConceptKernel/jena-fuseki-dockerfile.git
helm install fuseki ./jena-fuseki-dockerfile/helm/jena-fuseki \
-f production-values.yamlThe Helm chart includes:
- π Shiro authentication with auto-generated passwords
- πΎ Persistent volume claims for data
- π Gateway API HTTPRoute support
- π Health checks and monitoring
- βοΈ Configurable resources and security policies
See helm/jena-fuseki/README.md for complete documentation.
For manual deployments without Helm:
# Create namespace
kubectl create namespace fuseki
# Create PVC
kubectl apply -f - <<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: fuseki-data
namespace: fuseki
spec:
accessModes: [ReadWriteOnce]
resources:
requests:
storage: 20Gi
EOF
# Deploy Fuseki
kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: jena-fuseki
namespace: fuseki
spec:
replicas: 1
selector:
matchLabels:
app: jena-fuseki
template:
metadata:
labels:
app: jena-fuseki
spec:
containers:
- name: fuseki
image: conceptkernel/jena-fuseki:latest
ports:
- containerPort: 3030
env:
- name: JAVA_OPTIONS
value: "-Xmx4g -Xms2g"
volumeMounts:
- name: data
mountPath: /fuseki/databases
livenessProbe:
httpGet:
path: /$/ping
port: 3030
initialDelaySeconds: 60
periodSeconds: 30
readinessProbe:
httpGet:
path: /$/ping
port: 3030
initialDelaySeconds: 30
periodSeconds: 10
resources:
requests:
memory: "2Gi"
cpu: "500m"
limits:
memory: "6Gi"
cpu: "2000m"
volumes:
- name: data
persistentVolumeClaim:
claimName: fuseki-data
---
apiVersion: v1
kind: Service
metadata:
name: jena-fuseki
namespace: fuseki
spec:
selector:
app: jena-fuseki
ports:
- port: 3030
targetPort: 3030
type: ClusterIP
EOFβββββββββββββββββββββββββββββββββββ
β Stage 1: Builder β
β - eclipse-temurin:21-alpine β
β - Download Fuseki JAR β
β - Verify SHA1 checksum β
β - Create minimal JDK (jlink) β
βββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββ
β Stage 2: Runtime β
β - alpine:3.21 β
β - Minimal JDK only β
β - Fuseki JAR + config β
β - Non-root user (UID 1000) β
β - Health check enabled β
βββββββββββββββββββββββββββββββββββ
| Image | Size | Notes |
|---|---|---|
| conceptkernel/jena-fuseki | ~150MB | This image - optimized |
| stain/jena-fuseki | ~350MB | Community image |
| Official WAR | N/A | No official Docker image |
- β
Runs as non-root user (
fuseki:fusekiUID/GID 1000) - β No unnecessary packages installed
- β Minimal attack surface (Alpine + jlink JDK)
- β SHA1 checksum verification of downloads
- β Regular security updates via automated builds
- Apache Jena Documentation
- Fuseki Server Documentation
- SPARQL 1.1 Specification
- Helm Chart Documentation
This container uses jena-fuseki-server-5.6.0.jar (55.9MB fat JAR) which includes:
- The full Fuseki server with UI and admin functionality
- Apache Shiro security framework
- Prometheus metrics endpoint
- YASGUI SPARQL query editor (Vue 3 application)
The UI files are embedded in the JAR at /webapp/*. On first startup, the entrypoint script extracts them to $FUSEKI_BASE/webapp where Fuseki's FMod_UI module can serve them.
Main Class: org.apache.jena.fuseki.main.cmds.FusekiServerCmd
UI Module: org.apache.jena.fuseki.mod.ui.FMod_UI
For headless deployments without UI, the alternative main class org.apache.jena.fuseki.main.cmds.FusekiMainCmd can be used.
There are two Fuseki JARs available:
jena-fuseki-server-*.jar(55.9MB) - Full server with UI, admin, metrics (this image)jena-fuseki-main-*.jar(183KB) - Library JAR, not executable
This image uses the server JAR for complete functionality.
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
Apache Jena Fuseki is licensed under the Apache License 2.0 by the Apache Software Foundation.
- Apache Software Foundation for Apache Jena and Fuseki
- The Jena community for their excellent work
- ConceptKernel team for optimization and maintenance
- π Issues
- π¬ Discussions
- π³ Docker Hub
Built with β€οΈ by ConceptKernel