Single Fuseki with a dataset per dataspace as the default stack - #389
Merged
Merged
Conversation
… stack. fuseki-admin and fuseki-end-user become a single fuseki service mounting ./fuseki, whose config/fuseki/config.ttl declares an end-user and an admin dataset per dataspace over their own TDB2 folders - named after the dataspace origin with the deployment host dropped and the role appended: end-user, admin, northwind-traders.demo.end-user, northwind-traders.demo.admin. system.trig gives northwind-traders its own services in place of reusing root's, and points every service at fuseki:3030/<dataset>/; each dataset carries the 60 s query timeout on its query endpoint. The heap and mem_limit are the former two combined (2304m in 4608m). No entrypoint change: it already loads each app into the store URL its own service declares, and CI/dev start empty and load fixtures. varnish-admin and varnish-end-user are kept, both now fronting the single fuseki (their VCL .host default becomes fuseki): the admin/end-user split is a boundary the platform already routes on, the two role VCLs stay cohesive (admin xkey/XKEY-PURGE, end-user query-ban) and their separate storage pools keep end-user query churn from evicting the hot admin cache - merging would rebuild that isolation inside one container by parsing dataset names. egress is unchanged; both stores already route SERVICE/LOAD through it. The tests follow the single server. http-tests/config/system.trig points root and the test dataspace at fuseki:3030/end-user/ and /admin/ - test keeps sharing root's datasets, so the acl/* tests still exercise the platform's base-URI filtering of a fake admin.test.localhost authorization rather than relying on physical separation. run.sh, the http-tests and debug compose overrides, ui-tests/lib/stack.mjs and bin/sitemap/generate-sitemap.sh drop the 3031 end-user port and address datasets by path on the one 3030; the internal-SERVICE tests (GET/POST-sparql-service-internal, PATCH-service-internal, import-rdf-service-internal, GET-proxied-internal-403) target fuseki:3030/admin/ so they still prove an internal dataset is refused. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
namedgraph
force-pushed
the
ft-single-fuseki-datasets
branch
from
September 17, 2026 21:45
5e567cf to
08b51e5
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Makes the single-Fuseki, dataset-per-dataspace layout the default stack — mirroring linkeddatahub.com (AtomGraph/linkeddatahub.com#8) so open-source deployments get the same per-dataspace isolation, and matching the docs (AtomGraph/LinkedDataHub-Apps#61).
One Fuseki, a dataset per dataspace role
fuseki-adminandfuseki-end-userbecome a singlefusekiservice mounting./fuseki.config/fuseki/config.ttldeclares anend-userand anadmindataset per dataspace, named after the dataspace origin (deployment host dropped, role appended):end-user,admin,northwind-traders.demo.end-user,northwind-traders.demo.admin, each in its own TDB2 folder, each with the 60 s query timeout on its query endpoint.config/system.triggives northwind-traders its own services (no longer reusing root's) and points every service athttp://fuseki:3030/<dataset>/.mem_limitare the former two combined (2304m in 4608m).sd:Servicedeclares, and CI/dev start empty and load fixtures — so no data migration.Two Varnish, kept
varnish-adminandvarnish-end-userare unchanged, both now fronting the singlefuseki(VCL.hostdefault →fuseki). The admin/end-user split is a boundary the platform already routes on (BACKEND_PROXY_ADMIN/_END_USER); the two role VCLs stay cohesive (adminxkey/XKEY-PURGE, end-user query-ban), and their separate storage pools keep end-user query churn from evicting the small hot admin cache. Merging into one cache would rebuild that isolation inside a single container via dataset-name parsing — the less principled choice — so they are left separate.egressis unchanged; both stores already routeSERVICE/LOADthrough it.Tests follow the single server
http-tests/config/system.trig: root and thetestdataspace both point atfuseki:3030/end-user/and…/admin/.testkeeps sharing root's datasets — theadmin/acl/*tests write a fakeadmin.test.localhostauthorization and assert root filters it out by base URI; givingtestits own dataset would make them pass for the wrong reason and stop exercising the filter.http-tests/run.sh, the http-tests and debug compose overrides,ui-tests/lib/stack.mjs,bin/sitemap/generate-sitemap.sh: drop the3031end-user port; datasets are addressed by path on the one3030.SERVICEtests (GET/POST-sparql-service-internal,PATCH-service-internal,import-rdf-service-internal,GET-proxied-internal-403) now targetfuseki:3030/admin/, so they still prove an internal dataset is refused.Verification
riot --validatepasses forconfig/fuseki/config.ttl,config/system.trig,http-tests/config/system.trig;bash -nclean for the changed scripts.docker compose configrenders base+override, base+debug and base+http-tests — onefuseki, two Varnish,egress,sef-compiler.atomgraph/fuseki:6.1.0on the newconfig.ttlserves all four datasets (query/update/OPTIONS) and creates the four./fuseki/<name>/DB2folders.acl/*filtering and internal-SERVICEtests.Not in scope
develop.docker-compose.override.ymlis a per-developer, gitignored file; not committed (bump its fuseki port mapping locally).🤖 Generated with Claude Code