container-superposition 0.1.7 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -15
- package/dist/scripts/init.js +1 -1537
- package/dist/scripts/init.js.map +1 -1
- package/dist/tool/cli/args.d.ts +20 -0
- package/dist/tool/cli/args.d.ts.map +1 -0
- package/dist/tool/cli/args.js +325 -0
- package/dist/tool/cli/args.js.map +1 -0
- package/dist/tool/cli/run.d.ts +2 -0
- package/dist/tool/cli/run.d.ts.map +1 -0
- package/dist/tool/cli/run.js +318 -0
- package/dist/tool/cli/run.js.map +1 -0
- package/dist/tool/commands/adopt.js +1 -1
- package/dist/tool/commands/adopt.js.map +1 -1
- package/dist/tool/commands/doctor.d.ts +1 -0
- package/dist/tool/commands/doctor.d.ts.map +1 -1
- package/dist/tool/commands/doctor.js +1510 -78
- package/dist/tool/commands/doctor.js.map +1 -1
- package/dist/tool/commands/explain.d.ts.map +1 -1
- package/dist/tool/commands/explain.js +9 -0
- package/dist/tool/commands/explain.js.map +1 -1
- package/dist/tool/commands/migrate.d.ts +7 -0
- package/dist/tool/commands/migrate.d.ts.map +1 -0
- package/dist/tool/commands/migrate.js +52 -0
- package/dist/tool/commands/migrate.js.map +1 -0
- package/dist/tool/questionnaire/answers.d.ts +16 -0
- package/dist/tool/questionnaire/answers.d.ts.map +1 -0
- package/dist/tool/questionnaire/answers.js +102 -0
- package/dist/tool/questionnaire/answers.js.map +1 -0
- package/dist/tool/questionnaire/composer.d.ts +6 -4
- package/dist/tool/questionnaire/composer.d.ts.map +1 -1
- package/dist/tool/questionnaire/composer.js +778 -45
- package/dist/tool/questionnaire/composer.js.map +1 -1
- package/dist/tool/questionnaire/presets.d.ts +60 -0
- package/dist/tool/questionnaire/presets.d.ts.map +1 -0
- package/dist/tool/questionnaire/presets.js +165 -0
- package/dist/tool/questionnaire/presets.js.map +1 -0
- package/dist/tool/questionnaire/questionnaire.d.ts +10 -0
- package/dist/tool/questionnaire/questionnaire.d.ts.map +1 -0
- package/dist/tool/questionnaire/questionnaire.js +582 -0
- package/dist/tool/questionnaire/questionnaire.js.map +1 -0
- package/dist/tool/schema/manifest-migrations.d.ts +5 -0
- package/dist/tool/schema/manifest-migrations.d.ts.map +1 -1
- package/dist/tool/schema/manifest-migrations.js +45 -0
- package/dist/tool/schema/manifest-migrations.js.map +1 -1
- package/dist/tool/schema/overlay-loader.d.ts.map +1 -1
- package/dist/tool/schema/overlay-loader.js +24 -0
- package/dist/tool/schema/overlay-loader.js.map +1 -1
- package/dist/tool/schema/project-config.d.ts +13 -1
- package/dist/tool/schema/project-config.d.ts.map +1 -1
- package/dist/tool/schema/project-config.js +188 -10
- package/dist/tool/schema/project-config.js.map +1 -1
- package/dist/tool/schema/target-rules.d.ts +78 -0
- package/dist/tool/schema/target-rules.d.ts.map +1 -0
- package/dist/tool/schema/target-rules.js +367 -0
- package/dist/tool/schema/target-rules.js.map +1 -0
- package/dist/tool/schema/types.d.ts +42 -3
- package/dist/tool/schema/types.d.ts.map +1 -1
- package/dist/tool/utils/parameters.d.ts +76 -0
- package/dist/tool/utils/parameters.d.ts.map +1 -0
- package/dist/tool/utils/parameters.js +125 -0
- package/dist/tool/utils/parameters.js.map +1 -0
- package/dist/tool/utils/paths.d.ts +2 -0
- package/dist/tool/utils/paths.d.ts.map +1 -0
- package/dist/tool/utils/paths.js +31 -0
- package/dist/tool/utils/paths.js.map +1 -0
- package/docs/deployment-targets.md +88 -56
- package/docs/examples.md +20 -17
- package/docs/filesystem-contract.md +5 -0
- package/docs/minimal-and-editor.md +65 -5
- package/docs/overlay-imports.md +92 -14
- package/docs/overlays.md +231 -135
- package/docs/specs/001-verbose-plan-graph/spec.md +5 -12
- package/docs/specs/002-superposition-config-file/spec.md +5 -12
- package/docs/specs/003-mkdocs2-overlay/spec.md +2 -9
- package/docs/specs/004-doctor-fix/spec.md +1 -8
- package/docs/specs/005-cuda-overlay/spec.md +2 -9
- package/docs/specs/006-rocm-overlay/spec.md +3 -10
- package/docs/specs/007-target-aware-generation/spec.md +119 -0
- package/docs/specs/008-project-file-canonical/spec.md +82 -0
- package/docs/specs/009-project-env/spec.md +140 -0
- package/docs/specs/010-compose-env-materialization/spec.md +123 -0
- package/docs/specs/011-overlay-parameters/spec.md +228 -0
- package/docs/specs/012-ollama-cli-overlay/spec.md +47 -0
- package/docs/specs/013-doctor-dependency-check/spec.md +250 -0
- package/docs/specs/014-doctor-compose-port-cross-validation/spec.md +276 -0
- package/docs/specs/015-doctor-env-example-drift/spec.md +248 -0
- package/docs/specs/016-doctor-reproducibility-check/spec.md +276 -0
- package/docs/specs/017-doctor-dry-run/spec.md +276 -0
- package/docs/specs/018-init-project-file/spec.md +59 -0
- package/docs/specs/taxonomy.md +186 -0
- package/overlays/.presets/full-observability.yml +113 -0
- package/overlays/.presets/k8s-dev.yml +174 -0
- package/overlays/.presets/local-llm.yml +105 -0
- package/overlays/.presets/vector-ai.yml +150 -0
- package/overlays/.shared/README.md +27 -2
- package/overlays/.shared/compose/nvidia-gpu-devcontainer.yml +22 -0
- package/overlays/.shared/vscode/js-ts-settings.json +19 -0
- package/overlays/.shared/vscode/markdown-extensions.json +8 -0
- package/overlays/alertmanager/devcontainer.patch.json +0 -1
- package/overlays/alertmanager/docker-compose.yml +8 -0
- package/overlays/alertmanager/overlay.yml +1 -0
- package/overlays/amp/devcontainer.patch.json +4 -1
- package/overlays/bun/devcontainer.patch.json +1 -10
- package/overlays/bun/overlay.yml +8 -1
- package/overlays/claude-code/devcontainer.patch.json +6 -1
- package/overlays/codex/devcontainer.patch.json +5 -0
- package/overlays/comfyui/.env.example +34 -0
- package/overlays/comfyui/README.md +342 -0
- package/overlays/comfyui/devcontainer.patch.json +15 -0
- package/overlays/comfyui/docker-compose.yml +40 -0
- package/overlays/comfyui/overlay.yml +24 -0
- package/overlays/comfyui/setup.sh +36 -0
- package/overlays/comfyui/verify.sh +103 -0
- package/overlays/commitlint/devcontainer.patch.json +1 -6
- package/overlays/docker-sock/overlay.yml +1 -0
- package/overlays/dotnet/overlay.yml +4 -1
- package/overlays/fuseki/.env.example +5 -0
- package/overlays/fuseki/README.md +173 -0
- package/overlays/fuseki/devcontainer.patch.json +18 -0
- package/overlays/fuseki/docker-compose.yml +29 -0
- package/overlays/fuseki/overlay.yml +42 -0
- package/overlays/fuseki/verify.sh +58 -0
- package/overlays/gemini-cli/devcontainer.patch.json +4 -1
- package/overlays/go/overlay.yml +6 -1
- package/overlays/grafana/devcontainer.patch.json +0 -1
- package/overlays/grafana/docker-compose.yml +8 -2
- package/overlays/grafana/overlay.yml +6 -1
- package/overlays/jaeger/.env.example +11 -0
- package/overlays/jaeger/README.md +33 -4
- package/overlays/jaeger/devcontainer.patch.json +9 -1
- package/overlays/jaeger/docker-compose.yml +17 -0
- package/overlays/jaeger/overlay.yml +1 -12
- package/overlays/java/overlay.yml +6 -1
- package/overlays/jupyter/docker-compose.yml +1 -0
- package/overlays/jupyter/overlay.yml +1 -0
- package/overlays/k3d/README.md +201 -0
- package/overlays/k3d/devcontainer.patch.json +9 -0
- package/overlays/k3d/overlay.yml +19 -0
- package/overlays/k3d/setup.sh +34 -0
- package/overlays/k3d/verify.sh +38 -0
- package/overlays/keycloak/devcontainer.patch.json +0 -1
- package/overlays/keycloak/docker-compose.yml +1 -0
- package/overlays/keycloak/overlay.yml +15 -0
- package/overlays/localstack/docker-compose.yml +1 -0
- package/overlays/localstack/overlay.yml +19 -1
- package/overlays/loki/devcontainer.patch.json +0 -1
- package/overlays/loki/docker-compose.yml +8 -0
- package/overlays/loki/overlay.yml +1 -0
- package/overlays/mailpit/docker-compose.yml +1 -0
- package/overlays/mailpit/overlay.yml +1 -0
- package/overlays/minio/devcontainer.patch.json +1 -1
- package/overlays/minio/docker-compose.yml +1 -0
- package/overlays/minio/overlay.yml +23 -2
- package/overlays/mkdocs/devcontainer.patch.json +1 -5
- package/overlays/mkdocs/overlay.yml +3 -1
- package/overlays/mkdocs2/devcontainer.patch.json +1 -5
- package/overlays/mkdocs2/overlay.yml +2 -0
- package/overlays/mongodb/docker-compose.yml +2 -0
- package/overlays/mongodb/overlay.yml +26 -2
- package/overlays/mysql/docker-compose.yml +2 -0
- package/overlays/mysql/overlay.yml +36 -2
- package/overlays/nats/docker-compose.yml +1 -0
- package/overlays/nats/overlay.yml +18 -2
- package/overlays/nodejs/devcontainer.patch.json +1 -12
- package/overlays/nodejs/overlay.yml +8 -1
- package/overlays/ollama/.env.example +14 -0
- package/overlays/ollama/README.md +326 -0
- package/overlays/ollama/devcontainer.patch.json +14 -0
- package/overlays/ollama/docker-compose.yml +25 -0
- package/overlays/ollama/overlay.yml +27 -0
- package/overlays/ollama/verify.sh +76 -0
- package/overlays/ollama-cli/README.md +90 -0
- package/overlays/ollama-cli/devcontainer.patch.json +3 -0
- package/overlays/ollama-cli/overlay.yml +19 -0
- package/overlays/ollama-cli/setup.sh +103 -0
- package/overlays/ollama-cli/verify.sh +49 -0
- package/overlays/open-webui/.env.example +5 -0
- package/overlays/open-webui/README.md +162 -0
- package/overlays/open-webui/devcontainer.patch.json +14 -0
- package/overlays/open-webui/docker-compose.yml +24 -0
- package/overlays/open-webui/overlay.yml +45 -0
- package/overlays/opencode/devcontainer.patch.json +4 -1
- package/overlays/otel-collector/README.md +4 -0
- package/overlays/otel-collector/devcontainer.patch.json +4 -1
- package/overlays/otel-collector/docker-compose.yml +8 -4
- package/overlays/otel-collector/overlay.yml +1 -0
- package/overlays/otel-demo-nodejs/devcontainer.patch.json +0 -1
- package/overlays/otel-demo-nodejs/docker-compose.yml +1 -0
- package/overlays/otel-demo-nodejs/overlay.yml +9 -1
- package/overlays/otel-demo-python/devcontainer.patch.json +0 -1
- package/overlays/otel-demo-python/docker-compose.yml +1 -0
- package/overlays/otel-demo-python/overlay.yml +6 -1
- package/overlays/pandoc/README.md +10 -0
- package/overlays/pandoc/devcontainer.patch.json +0 -5
- package/overlays/pandoc/overlay.yml +2 -0
- package/overlays/pandoc/setup.sh +10 -0
- package/overlays/pgvector/.env.example +6 -0
- package/overlays/pgvector/README.md +215 -0
- package/overlays/pgvector/devcontainer.patch.json +29 -0
- package/overlays/pgvector/docker-compose.yml +33 -0
- package/overlays/pgvector/overlay.yml +47 -0
- package/overlays/playwright/devcontainer.patch.json +0 -5
- package/overlays/playwright/overlay.yml +2 -1
- package/overlays/postgres/.env.example +5 -5
- package/overlays/postgres/devcontainer.patch.json +4 -4
- package/overlays/postgres/docker-compose.yml +11 -6
- package/overlays/postgres/overlay.yml +23 -2
- package/overlays/pre-commit/devcontainer.patch.json +1 -7
- package/overlays/prometheus/devcontainer.patch.json +0 -1
- package/overlays/prometheus/docker-compose.yml +8 -0
- package/overlays/prometheus/overlay.yml +1 -0
- package/overlays/promtail/devcontainer.patch.json +1 -2
- package/overlays/promtail/docker-compose.yml +8 -0
- package/overlays/promtail/overlay.yml +1 -0
- package/overlays/qdrant/.env.example +4 -0
- package/overlays/qdrant/README.md +216 -0
- package/overlays/qdrant/devcontainer.patch.json +20 -0
- package/overlays/qdrant/docker-compose.yml +26 -0
- package/overlays/qdrant/overlay.yml +44 -0
- package/overlays/rabbitmq/docker-compose.yml +1 -0
- package/overlays/rabbitmq/overlay.yml +25 -2
- package/overlays/redis/docker-compose.yml +7 -0
- package/overlays/redis/overlay.yml +15 -1
- package/overlays/redpanda/docker-compose.yml +1 -0
- package/overlays/redpanda/overlay.yml +15 -3
- package/overlays/rocm/overlay.yml +2 -1
- package/overlays/rust/overlay.yml +3 -1
- package/overlays/skaffold/README.md +256 -0
- package/overlays/skaffold/devcontainer.patch.json +9 -0
- package/overlays/skaffold/overlay.yml +20 -0
- package/overlays/skaffold/setup.sh +33 -0
- package/overlays/skaffold/verify.sh +24 -0
- package/overlays/sqlserver/docker-compose.yml +1 -0
- package/overlays/sqlserver/overlay.yml +17 -0
- package/overlays/tempo/devcontainer.patch.json +0 -1
- package/overlays/tempo/docker-compose.yml +8 -0
- package/overlays/tempo/overlay.yml +1 -0
- package/overlays/windsurf-cli/devcontainer.patch.json +4 -1
- package/package.json +3 -2
- package/tool/schema/config.schema.json +31 -1
- package/tool/schema/overlay-manifest.schema.json +33 -0
- package/overlays/.shared/otel/otel-base-config.yaml +0 -30
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
# Apache Jena Fuseki Overlay
|
|
2
|
+
|
|
3
|
+
SPARQL 1.1 server and RDF triplestore powered by Apache Jena TDB2, with a built-in web administration UI.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Apache Jena Fuseki** — SPARQL 1.1 server supporting queries, updates, and the Graph Store Protocol
|
|
8
|
+
- **TDB2 triplestore** — High-performance persistent RDF storage with better concurrency than TDB1
|
|
9
|
+
- **Admin web UI** — Browser-based interface for managing datasets, running ad-hoc queries, and monitoring the server (port 3030)
|
|
10
|
+
- **REST management API** — Create, list, and delete datasets without restarting the server
|
|
11
|
+
- **Dataset auto-creation** — A default dataset is created automatically on first start
|
|
12
|
+
- **Persistent storage** — RDF data is stored in a named Docker volume (`fuseki-data`) and survives container restarts
|
|
13
|
+
- **Docker Compose service** — Runs as an isolated sidecar container accessible on the `devnet` network
|
|
14
|
+
|
|
15
|
+
## How It Works
|
|
16
|
+
|
|
17
|
+
This overlay adds Fuseki as a separate Docker Compose service. Fuseki runs inside its own container and is reachable from your development container using the hostname `fuseki`.
|
|
18
|
+
|
|
19
|
+
**Service configuration:**
|
|
20
|
+
|
|
21
|
+
- Image: `ghcr.io/stain/jena-fuseki`
|
|
22
|
+
- Network: `devnet` (shared with the dev container)
|
|
23
|
+
- Persistence: `fuseki-data` volume for TDB2 database files
|
|
24
|
+
- Port: 3030 (customizable via `FUSEKI_PORT` host mapping)
|
|
25
|
+
|
|
26
|
+
**Environment variables set in the dev container:**
|
|
27
|
+
|
|
28
|
+
| Variable | Value | Description |
|
|
29
|
+
| ----------------------- | -------------------- | ----------------------------------------- |
|
|
30
|
+
| `FUSEKI_HOST` | `fuseki` | Container hostname for internal access |
|
|
31
|
+
| `FUSEKI_PORT` | `3030` | Container-internal port for SPARQL access |
|
|
32
|
+
| `FUSEKI_URL` | `http://fuseki:3030` | Base URL for SPARQL requests |
|
|
33
|
+
| `FUSEKI_DATASET` | `ds` (default) | Name of the default dataset |
|
|
34
|
+
| `FUSEKI_ADMIN_PASSWORD` | see `.env` | Admin user password (set in `.env`) |
|
|
35
|
+
|
|
36
|
+
## Common Commands
|
|
37
|
+
|
|
38
|
+
### SPARQL Queries
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# Simple SELECT query
|
|
42
|
+
curl -X POST \
|
|
43
|
+
-H "Content-Type: application/sparql-query" \
|
|
44
|
+
-d "SELECT * WHERE { ?s ?p ?o } LIMIT 10" \
|
|
45
|
+
"$FUSEKI_URL/$FUSEKI_DATASET/query"
|
|
46
|
+
|
|
47
|
+
# Query with URL encoding (GET request)
|
|
48
|
+
curl -G "$FUSEKI_URL/$FUSEKI_DATASET/query" \
|
|
49
|
+
--data-urlencode "query=SELECT * WHERE { ?s ?p ?o } LIMIT 10"
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Loading RDF Data
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
# Load a Turtle file into the default graph
|
|
56
|
+
curl -X PUT \
|
|
57
|
+
-H "Content-Type: text/turtle" \
|
|
58
|
+
--data-binary @data.ttl \
|
|
59
|
+
"$FUSEKI_URL/$FUSEKI_DATASET/data"
|
|
60
|
+
|
|
61
|
+
# Add data without replacing existing triples (POST)
|
|
62
|
+
curl -X POST \
|
|
63
|
+
-H "Content-Type: text/turtle" \
|
|
64
|
+
--data-binary @more-data.ttl \
|
|
65
|
+
"$FUSEKI_URL/$FUSEKI_DATASET/data"
|
|
66
|
+
|
|
67
|
+
# Load into a named graph
|
|
68
|
+
curl -X PUT \
|
|
69
|
+
-H "Content-Type: text/turtle" \
|
|
70
|
+
--data-binary @data.ttl \
|
|
71
|
+
"$FUSEKI_URL/$FUSEKI_DATASET/data?graph=http://example.org/mygraph"
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### SPARQL Update
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
# Insert triples via SPARQL Update
|
|
78
|
+
curl -X POST \
|
|
79
|
+
-H "Content-Type: application/sparql-update" \
|
|
80
|
+
-d "INSERT DATA { <http://example.org/s> <http://example.org/p> \"o\" . }" \
|
|
81
|
+
"$FUSEKI_URL/$FUSEKI_DATASET/update"
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Dataset Management
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# List all datasets (requires admin credentials)
|
|
88
|
+
curl -u "admin:$FUSEKI_ADMIN_PASSWORD" "$FUSEKI_URL/\$/datasets"
|
|
89
|
+
|
|
90
|
+
# Create a new TDB2-backed dataset
|
|
91
|
+
curl -X POST \
|
|
92
|
+
-u "admin:$FUSEKI_ADMIN_PASSWORD" \
|
|
93
|
+
-H "Content-Type: application/x-www-form-urlencoded" \
|
|
94
|
+
-d "dbName=mydata&dbType=tdb2" \
|
|
95
|
+
"$FUSEKI_URL/\$/datasets"
|
|
96
|
+
|
|
97
|
+
# Delete a dataset
|
|
98
|
+
curl -X DELETE \
|
|
99
|
+
-u "admin:$FUSEKI_ADMIN_PASSWORD" \
|
|
100
|
+
"$FUSEKI_URL/\$/datasets/mydata"
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Admin UI
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
# Open in browser (from the host machine)
|
|
107
|
+
open http://localhost:3030
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Log in with username `admin` and the configured `FUSEKI_ADMIN_PASSWORD`. From the UI you can browse and query datasets, upload RDF files, create/delete datasets, and monitor server statistics.
|
|
111
|
+
|
|
112
|
+
## Use Cases
|
|
113
|
+
|
|
114
|
+
- **Semantic web development** — Prototype and test OWL/RDFS ontologies and SPARQL queries locally
|
|
115
|
+
- **Linked data applications** — Build applications that consume or publish RDF data
|
|
116
|
+
- **Knowledge graph projects** — Store, update, and query knowledge graphs during development
|
|
117
|
+
- **Data integration** — Use SPARQL Federation or CONSTRUCT queries to merge heterogeneous data sources
|
|
118
|
+
- **Research and education** — Run SPARQL 1.1 workloads without a cloud account
|
|
119
|
+
|
|
120
|
+
**Integrates well with:**
|
|
121
|
+
|
|
122
|
+
- `java` — Use Apache Jena client library (`jena-arq`) for typed SPARQL queries
|
|
123
|
+
- `python` — Use `SPARQLWrapper` or `rdflib-endpoint` for data science workflows
|
|
124
|
+
- `nodejs` — Use `n3` or `comunica` for JavaScript/TypeScript SPARQL clients
|
|
125
|
+
|
|
126
|
+
## Configuration
|
|
127
|
+
|
|
128
|
+
### Environment Variables
|
|
129
|
+
|
|
130
|
+
The overlay includes a `.env.example` file. Copy and customize:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
cd .devcontainer
|
|
134
|
+
cp .env.example .env
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**Default values (`.devcontainer/.env.example`):**
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
FUSEKI_VERSION=latest
|
|
141
|
+
FUSEKI_PORT=3030
|
|
142
|
+
FUSEKI_ADMIN_PASSWORD=admin # ⚠ Change this for any shared environment
|
|
143
|
+
FUSEKI_DATASET=ds
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
⚠️ **Security:** The default `FUSEKI_ADMIN_PASSWORD=admin` must be changed for any environment accessible beyond localhost.
|
|
147
|
+
|
|
148
|
+
### SPARQL Endpoints
|
|
149
|
+
|
|
150
|
+
Default dataset `ds` endpoints (from inside the dev container):
|
|
151
|
+
|
|
152
|
+
| Endpoint | URL |
|
|
153
|
+
| ----------------- | ------------------------------ |
|
|
154
|
+
| SPARQL Query | `http://fuseki:3030/ds/query` |
|
|
155
|
+
| SPARQL Update | `http://fuseki:3030/ds/update` |
|
|
156
|
+
| Graph Store (GSP) | `http://fuseki:3030/ds/data` |
|
|
157
|
+
| Admin UI | `http://fuseki:3030` |
|
|
158
|
+
|
|
159
|
+
All endpoints are also forwarded to `localhost:3030` on the host machine.
|
|
160
|
+
|
|
161
|
+
## References
|
|
162
|
+
|
|
163
|
+
- [Apache Jena Fuseki Documentation](https://jena.apache.org/documentation/fuseki2/)
|
|
164
|
+
- [SPARQL 1.1 Query Language](https://www.w3.org/TR/sparql11-query/)
|
|
165
|
+
- [SPARQL 1.1 Update](https://www.w3.org/TR/sparql11-update/)
|
|
166
|
+
- [Fuseki Docker Image (stain/jena-docker)](https://github.com/stain/jena-docker)
|
|
167
|
+
- [Apache Jena TDB2](https://jena.apache.org/documentation/tdb2/)
|
|
168
|
+
|
|
169
|
+
**Related Overlays:**
|
|
170
|
+
|
|
171
|
+
- `java` — Develop JVM applications using Apache Jena client libraries
|
|
172
|
+
- `python` — Use RDFLib or SPARQLWrapper for Python-based SPARQL workflows
|
|
173
|
+
- `nodejs` — Build JavaScript SPARQL clients with Comunica or N3.js
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.base.schema.json",
|
|
3
|
+
"runServices": ["fuseki"],
|
|
4
|
+
"forwardPorts": [3030],
|
|
5
|
+
"portsAttributes": {
|
|
6
|
+
"3030": {
|
|
7
|
+
"label": "Fuseki SPARQL Server",
|
|
8
|
+
"onAutoForward": "openBrowser"
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
"remoteEnv": {
|
|
12
|
+
"FUSEKI_HOST": "fuseki",
|
|
13
|
+
"FUSEKI_PORT": "3030",
|
|
14
|
+
"FUSEKI_DATASET": "{{cs.FUSEKI_DATASET}}",
|
|
15
|
+
"FUSEKI_ADMIN_PASSWORD": "{{cs.FUSEKI_ADMIN_PASSWORD}}",
|
|
16
|
+
"FUSEKI_URL": "http://fuseki:3030"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
version: '3.8'
|
|
2
|
+
|
|
3
|
+
services:
|
|
4
|
+
fuseki:
|
|
5
|
+
image: stain/jena-fuseki:${FUSEKI_VERSION:-{{cs.FUSEKI_VERSION}}}
|
|
6
|
+
restart: unless-stopped
|
|
7
|
+
volumes:
|
|
8
|
+
- fuseki-data:/fuseki
|
|
9
|
+
environment:
|
|
10
|
+
ADMIN_PASSWORD: ${FUSEKI_ADMIN_PASSWORD:-{{cs.FUSEKI_ADMIN_PASSWORD}}}
|
|
11
|
+
FUSEKI_DATASET_1: ${FUSEKI_DATASET:-{{cs.FUSEKI_DATASET}}}
|
|
12
|
+
TDB: '2'
|
|
13
|
+
ports:
|
|
14
|
+
- '${FUSEKI_PORT:-{{cs.FUSEKI_PORT}}}:3030'
|
|
15
|
+
networks:
|
|
16
|
+
- devnet
|
|
17
|
+
healthcheck:
|
|
18
|
+
test: ['CMD-SHELL', 'curl -sf http://localhost:3030/$/ping || exit 1']
|
|
19
|
+
interval: 10s
|
|
20
|
+
timeout: 5s
|
|
21
|
+
retries: 5
|
|
22
|
+
start_period: 20s
|
|
23
|
+
|
|
24
|
+
volumes:
|
|
25
|
+
fuseki-data:
|
|
26
|
+
|
|
27
|
+
networks:
|
|
28
|
+
devnet:
|
|
29
|
+
name: devnet
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
id: fuseki
|
|
2
|
+
name: Apache Jena Fuseki
|
|
3
|
+
description: SPARQL 1.1 server and triplestore backed by Apache Jena TDB
|
|
4
|
+
category: database
|
|
5
|
+
supports:
|
|
6
|
+
- compose
|
|
7
|
+
requires: []
|
|
8
|
+
suggests:
|
|
9
|
+
- java
|
|
10
|
+
- python
|
|
11
|
+
- nodejs
|
|
12
|
+
conflicts: []
|
|
13
|
+
serviceOrder: 0
|
|
14
|
+
tags:
|
|
15
|
+
- database
|
|
16
|
+
- rdf
|
|
17
|
+
- sparql
|
|
18
|
+
- triplestore
|
|
19
|
+
- semantic-web
|
|
20
|
+
- linked-data
|
|
21
|
+
- jena
|
|
22
|
+
ports:
|
|
23
|
+
- port: 3030
|
|
24
|
+
service: fuseki
|
|
25
|
+
protocol: http
|
|
26
|
+
description: Fuseki SPARQL server and admin UI
|
|
27
|
+
path: /
|
|
28
|
+
onAutoForward: openBrowser
|
|
29
|
+
parameters:
|
|
30
|
+
FUSEKI_VERSION:
|
|
31
|
+
description: Apache Jena Fuseki image version tag
|
|
32
|
+
default: latest
|
|
33
|
+
FUSEKI_PORT:
|
|
34
|
+
description: Host port mapped to Fuseki (3030 inside container)
|
|
35
|
+
default: '3030'
|
|
36
|
+
FUSEKI_ADMIN_PASSWORD:
|
|
37
|
+
description: Fuseki admin user password
|
|
38
|
+
default: admin
|
|
39
|
+
sensitive: true
|
|
40
|
+
FUSEKI_DATASET:
|
|
41
|
+
description: Name of the default dataset to create on first start
|
|
42
|
+
default: ds
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Verification script for Apache Jena Fuseki overlay
|
|
3
|
+
# Confirms Fuseki is running and responding to requests
|
|
4
|
+
|
|
5
|
+
set -e
|
|
6
|
+
|
|
7
|
+
FUSEKI_HOST="${FUSEKI_HOST:-fuseki}"
|
|
8
|
+
FUSEKI_PORT="${FUSEKI_PORT:-3030}"
|
|
9
|
+
FUSEKI_URL="http://${FUSEKI_HOST}:${FUSEKI_PORT}"
|
|
10
|
+
|
|
11
|
+
echo "Verifying Apache Jena Fuseki overlay..."
|
|
12
|
+
echo ""
|
|
13
|
+
|
|
14
|
+
# Check curl is available
|
|
15
|
+
echo "1. Checking curl availability..."
|
|
16
|
+
if command -v curl &> /dev/null; then
|
|
17
|
+
echo " curl found"
|
|
18
|
+
else
|
|
19
|
+
echo " curl not found - cannot verify Fuseki service"
|
|
20
|
+
exit 1
|
|
21
|
+
fi
|
|
22
|
+
|
|
23
|
+
# Check Fuseki ping endpoint
|
|
24
|
+
echo ""
|
|
25
|
+
echo "2. Checking Fuseki service at ${FUSEKI_URL}/\$/ping..."
|
|
26
|
+
FUSEKI_READY=false
|
|
27
|
+
for i in {1..15}; do
|
|
28
|
+
if curl -sf "${FUSEKI_URL}/\$/ping" &> /dev/null; then
|
|
29
|
+
echo " Fuseki service is ready"
|
|
30
|
+
FUSEKI_READY=true
|
|
31
|
+
break
|
|
32
|
+
fi
|
|
33
|
+
sleep 2
|
|
34
|
+
done
|
|
35
|
+
|
|
36
|
+
if [ "$FUSEKI_READY" = false ]; then
|
|
37
|
+
echo " Fuseki service not ready after 30 seconds"
|
|
38
|
+
exit 1
|
|
39
|
+
fi
|
|
40
|
+
|
|
41
|
+
# Check dataset exists
|
|
42
|
+
DATASET="${FUSEKI_DATASET:-ds}"
|
|
43
|
+
ADMIN_PASSWORD="${FUSEKI_ADMIN_PASSWORD:-admin}"
|
|
44
|
+
echo ""
|
|
45
|
+
echo "3. Checking dataset '${DATASET}' exists..."
|
|
46
|
+
HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" \
|
|
47
|
+
-u "admin:${ADMIN_PASSWORD}" \
|
|
48
|
+
"${FUSEKI_URL}/\$/datasets/${DATASET}")
|
|
49
|
+
|
|
50
|
+
if [ "$HTTP_STATUS" = "200" ]; then
|
|
51
|
+
echo " Dataset '${DATASET}' found"
|
|
52
|
+
else
|
|
53
|
+
echo " Dataset '${DATASET}' not found (HTTP ${HTTP_STATUS}) - it may still be initializing"
|
|
54
|
+
fi
|
|
55
|
+
|
|
56
|
+
echo ""
|
|
57
|
+
echo "Apache Jena Fuseki overlay verification complete"
|
|
58
|
+
echo "Admin UI: ${FUSEKI_URL}"
|
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.base.schema.json"
|
|
2
|
+
"$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.base.schema.json",
|
|
3
|
+
"postCreateCommand": {
|
|
4
|
+
"setup-gemini-cli": "bash .devcontainer/scripts/setup-gemini-cli.sh"
|
|
5
|
+
}
|
|
3
6
|
}
|
package/overlays/go/overlay.yml
CHANGED
|
@@ -2,6 +2,7 @@ version: '3.8'
|
|
|
2
2
|
services:
|
|
3
3
|
grafana:
|
|
4
4
|
image: grafana/grafana:${GRAFANA_VERSION:-latest}
|
|
5
|
+
restart: unless-stopped
|
|
5
6
|
environment:
|
|
6
7
|
- GF_SECURITY_ADMIN_USER=${GRAFANA_ADMIN_USER:-admin}
|
|
7
8
|
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD:-admin}
|
|
@@ -15,13 +16,18 @@ services:
|
|
|
15
16
|
- '${GRAFANA_PORT:-3000}:3000'
|
|
16
17
|
depends_on:
|
|
17
18
|
- prometheus
|
|
18
|
-
- loki
|
|
19
|
-
- jaeger
|
|
20
19
|
networks:
|
|
21
20
|
- devnet
|
|
21
|
+
healthcheck:
|
|
22
|
+
test: ['CMD', 'wget', '-qO-', 'http://localhost:3000/api/health']
|
|
23
|
+
interval: 10s
|
|
24
|
+
timeout: 5s
|
|
25
|
+
retries: 5
|
|
26
|
+
start_period: 20s
|
|
22
27
|
|
|
23
28
|
volumes:
|
|
24
29
|
grafana_data:
|
|
25
30
|
|
|
26
31
|
networks:
|
|
27
32
|
devnet:
|
|
33
|
+
name: devnet
|
|
@@ -11,7 +11,11 @@ suggests:
|
|
|
11
11
|
- jaeger
|
|
12
12
|
- tempo
|
|
13
13
|
- promtail
|
|
14
|
-
conflicts:
|
|
14
|
+
conflicts:
|
|
15
|
+
- open-webui
|
|
16
|
+
- nodejs
|
|
17
|
+
- bun
|
|
18
|
+
- rust
|
|
15
19
|
tags:
|
|
16
20
|
- observability
|
|
17
21
|
- ui
|
|
@@ -24,3 +28,4 @@ ports:
|
|
|
24
28
|
path: /
|
|
25
29
|
onAutoForward: openBrowser
|
|
26
30
|
order: 3
|
|
31
|
+
serviceOrder: 3
|
|
@@ -5,3 +5,14 @@ JAEGER_VERSION=latest
|
|
|
5
5
|
JAEGER_UI_PORT=16686
|
|
6
6
|
JAEGER_OTLP_GRPC_PORT=4317
|
|
7
7
|
JAEGER_OTLP_HTTP_PORT=4318
|
|
8
|
+
|
|
9
|
+
# OpenTelemetry SDK defaults for apps running in the devcontainer
|
|
10
|
+
# These are pre-set in the devcontainer via remoteEnv; see devcontainer.patch.json
|
|
11
|
+
# Customize after generation by editing remoteEnv in .devcontainer/devcontainer.json
|
|
12
|
+
OTEL_SERVICE_NAME=my-service
|
|
13
|
+
OTEL_SERVICE_VERSION=0.1.0
|
|
14
|
+
OTEL_EXPORTER_OTLP_ENDPOINT=http://jaeger:4317
|
|
15
|
+
OTEL_EXPORTER_OTLP_PROTOCOL=grpc
|
|
16
|
+
OTEL_RESOURCE_ATTRIBUTES=deployment.environment=development
|
|
17
|
+
OTEL_TRACES_SAMPLER=always_on
|
|
18
|
+
OTEL_TRACES_EXPORTER=otlp
|
|
@@ -33,10 +33,35 @@ graph TD
|
|
|
33
33
|
### Ports
|
|
34
34
|
|
|
35
35
|
- `16686` - Jaeger UI (web interface)
|
|
36
|
-
- `4317` - OTLP gRPC receiver (
|
|
37
|
-
- `4318` - OTLP HTTP receiver (
|
|
36
|
+
- `4317` - OTLP gRPC receiver (internal Docker network only; not published to host)
|
|
37
|
+
- `4318` - OTLP HTTP receiver (internal Docker network only; not published to host)
|
|
38
38
|
|
|
39
|
-
⚠️ **Note:** When using with **otel-collector**,
|
|
39
|
+
⚠️ **Note:** When using with **otel-collector**, send telemetry to `otel-collector:4317` instead — the collector forwards to Jaeger internally.
|
|
40
|
+
|
|
41
|
+
### Pre-configured OpenTelemetry Environment
|
|
42
|
+
|
|
43
|
+
The devcontainer is pre-configured with OTEL environment variables so that any properly-instrumented app running inside the devcontainer sends traces to Jaeger automatically:
|
|
44
|
+
|
|
45
|
+
| Variable | Default value | Purpose |
|
|
46
|
+
| ----------------------------- | ------------------------------------ | -------------------------------------- |
|
|
47
|
+
| `OTEL_SERVICE_NAME` | `my-service` | Service name shown in Jaeger UI |
|
|
48
|
+
| `OTEL_SERVICE_VERSION` | `0.1.0` | Service version in resource attributes |
|
|
49
|
+
| `OTEL_EXPORTER_OTLP_ENDPOINT` | `http://jaeger:4317` | OTLP gRPC endpoint (Docker network) |
|
|
50
|
+
| `OTEL_EXPORTER_OTLP_PROTOCOL` | `grpc` | Transport protocol |
|
|
51
|
+
| `OTEL_RESOURCE_ATTRIBUTES` | `deployment.environment=development` | Additional resource metadata |
|
|
52
|
+
| `OTEL_TRACES_SAMPLER` | `always_on` | Capture every trace in development |
|
|
53
|
+
| `OTEL_TRACES_EXPORTER` | `otlp` | Export traces via OTLP |
|
|
54
|
+
|
|
55
|
+
These values are set via `remoteEnv` in `devcontainer.json`. To override them for your project, edit `.devcontainer/devcontainer.json` after generation and update the `remoteEnv` block, then rebuild the container:
|
|
56
|
+
|
|
57
|
+
```json
|
|
58
|
+
"remoteEnv": {
|
|
59
|
+
"OTEL_SERVICE_NAME": "my-app",
|
|
60
|
+
"OTEL_SERVICE_VERSION": "1.0.0"
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
When the **otel-collector** overlay is also selected, `OTEL_EXPORTER_OTLP_ENDPOINT` is automatically set to `http://otel-collector:4317` (otel-collector overlay is applied after jaeger and overrides this value).
|
|
40
65
|
|
|
41
66
|
### Environment Variables
|
|
42
67
|
|
|
@@ -74,12 +99,16 @@ container-superposition --port-offset 100
|
|
|
74
99
|
|
|
75
100
|
## Accessing Jaeger UI
|
|
76
101
|
|
|
77
|
-
Once your devcontainer starts,
|
|
102
|
+
Once your devcontainer starts, VS Code automatically opens <http://localhost:16686> in your browser (via `onAutoForward: openBrowser`). You can also open it manually:
|
|
78
103
|
|
|
79
104
|
```
|
|
80
105
|
http://localhost:16686
|
|
81
106
|
```
|
|
82
107
|
|
|
108
|
+
Port `16686` is published by the `jaeger` Docker Compose service to your local machine, so it is accessible both from the host and from within the devcontainer via `http://jaeger:16686`.
|
|
109
|
+
|
|
110
|
+
The `devcontainer` service has `depends_on: jaeger: condition: service_healthy`, so Docker Compose waits for Jaeger to pass its healthcheck before starting the devcontainer. This ensures the UI is reachable by the time VS Code opens the browser.
|
|
111
|
+
|
|
83
112
|
### UI Features
|
|
84
113
|
|
|
85
114
|
**1. Search Traces**
|
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.base.schema.json",
|
|
3
3
|
"runServices": ["jaeger"],
|
|
4
|
-
"_serviceOrder": 1,
|
|
5
4
|
"forwardPorts": [16686],
|
|
6
5
|
"portsAttributes": {
|
|
7
6
|
"16686": {
|
|
8
7
|
"label": "Jaeger UI",
|
|
9
8
|
"onAutoForward": "openBrowser"
|
|
10
9
|
}
|
|
10
|
+
},
|
|
11
|
+
"remoteEnv": {
|
|
12
|
+
"OTEL_SERVICE_NAME": "my-service",
|
|
13
|
+
"OTEL_SERVICE_VERSION": "0.1.0",
|
|
14
|
+
"OTEL_EXPORTER_OTLP_ENDPOINT": "http://jaeger:4317",
|
|
15
|
+
"OTEL_EXPORTER_OTLP_PROTOCOL": "grpc",
|
|
16
|
+
"OTEL_RESOURCE_ATTRIBUTES": "deployment.environment=development",
|
|
17
|
+
"OTEL_TRACES_SAMPLER": "always_on",
|
|
18
|
+
"OTEL_TRACES_EXPORTER": "otlp"
|
|
11
19
|
}
|
|
12
20
|
}
|
|
@@ -2,6 +2,7 @@ version: '3.8'
|
|
|
2
2
|
services:
|
|
3
3
|
jaeger:
|
|
4
4
|
image: jaegertracing/all-in-one:${JAEGER_VERSION:-latest}
|
|
5
|
+
restart: unless-stopped
|
|
5
6
|
environment:
|
|
6
7
|
- COLLECTOR_OTLP_ENABLED=true
|
|
7
8
|
ports:
|
|
@@ -12,6 +13,22 @@ services:
|
|
|
12
13
|
# Apps should send telemetry to otel-collector, which forwards to Jaeger if both are used
|
|
13
14
|
networks:
|
|
14
15
|
- devnet
|
|
16
|
+
healthcheck:
|
|
17
|
+
test:
|
|
18
|
+
[
|
|
19
|
+
'CMD-SHELL',
|
|
20
|
+
'wget --no-verbose --tries=1 --spider http://localhost:14269/ || exit 1',
|
|
21
|
+
]
|
|
22
|
+
interval: 5s
|
|
23
|
+
timeout: 5s
|
|
24
|
+
retries: 10
|
|
25
|
+
start_period: 10s
|
|
26
|
+
|
|
27
|
+
devcontainer:
|
|
28
|
+
depends_on:
|
|
29
|
+
jaeger:
|
|
30
|
+
condition: service_healthy
|
|
15
31
|
|
|
16
32
|
networks:
|
|
17
33
|
devnet:
|
|
34
|
+
name: devnet
|
|
@@ -19,16 +19,5 @@ ports:
|
|
|
19
19
|
description: Jaeger UI
|
|
20
20
|
path: /
|
|
21
21
|
onAutoForward: openBrowser
|
|
22
|
-
- port: 14250
|
|
23
|
-
service: jaeger
|
|
24
|
-
protocol: grpc
|
|
25
|
-
description: Jaeger gRPC receiver
|
|
26
|
-
onAutoForward: ignore
|
|
27
|
-
- port: 14268
|
|
28
|
-
service: jaeger
|
|
29
|
-
protocol: http
|
|
30
|
-
description: Jaeger HTTP receiver
|
|
31
|
-
onAutoForward: ignore
|
|
32
22
|
order: 1
|
|
33
|
-
|
|
34
|
-
- .shared/otel/instrumentation.env
|
|
23
|
+
serviceOrder: 1
|