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.
Files changed (242) hide show
  1. package/README.md +24 -15
  2. package/dist/scripts/init.js +1 -1537
  3. package/dist/scripts/init.js.map +1 -1
  4. package/dist/tool/cli/args.d.ts +20 -0
  5. package/dist/tool/cli/args.d.ts.map +1 -0
  6. package/dist/tool/cli/args.js +325 -0
  7. package/dist/tool/cli/args.js.map +1 -0
  8. package/dist/tool/cli/run.d.ts +2 -0
  9. package/dist/tool/cli/run.d.ts.map +1 -0
  10. package/dist/tool/cli/run.js +318 -0
  11. package/dist/tool/cli/run.js.map +1 -0
  12. package/dist/tool/commands/adopt.js +1 -1
  13. package/dist/tool/commands/adopt.js.map +1 -1
  14. package/dist/tool/commands/doctor.d.ts +1 -0
  15. package/dist/tool/commands/doctor.d.ts.map +1 -1
  16. package/dist/tool/commands/doctor.js +1510 -78
  17. package/dist/tool/commands/doctor.js.map +1 -1
  18. package/dist/tool/commands/explain.d.ts.map +1 -1
  19. package/dist/tool/commands/explain.js +9 -0
  20. package/dist/tool/commands/explain.js.map +1 -1
  21. package/dist/tool/commands/migrate.d.ts +7 -0
  22. package/dist/tool/commands/migrate.d.ts.map +1 -0
  23. package/dist/tool/commands/migrate.js +52 -0
  24. package/dist/tool/commands/migrate.js.map +1 -0
  25. package/dist/tool/questionnaire/answers.d.ts +16 -0
  26. package/dist/tool/questionnaire/answers.d.ts.map +1 -0
  27. package/dist/tool/questionnaire/answers.js +102 -0
  28. package/dist/tool/questionnaire/answers.js.map +1 -0
  29. package/dist/tool/questionnaire/composer.d.ts +6 -4
  30. package/dist/tool/questionnaire/composer.d.ts.map +1 -1
  31. package/dist/tool/questionnaire/composer.js +778 -45
  32. package/dist/tool/questionnaire/composer.js.map +1 -1
  33. package/dist/tool/questionnaire/presets.d.ts +60 -0
  34. package/dist/tool/questionnaire/presets.d.ts.map +1 -0
  35. package/dist/tool/questionnaire/presets.js +165 -0
  36. package/dist/tool/questionnaire/presets.js.map +1 -0
  37. package/dist/tool/questionnaire/questionnaire.d.ts +10 -0
  38. package/dist/tool/questionnaire/questionnaire.d.ts.map +1 -0
  39. package/dist/tool/questionnaire/questionnaire.js +582 -0
  40. package/dist/tool/questionnaire/questionnaire.js.map +1 -0
  41. package/dist/tool/schema/manifest-migrations.d.ts +5 -0
  42. package/dist/tool/schema/manifest-migrations.d.ts.map +1 -1
  43. package/dist/tool/schema/manifest-migrations.js +45 -0
  44. package/dist/tool/schema/manifest-migrations.js.map +1 -1
  45. package/dist/tool/schema/overlay-loader.d.ts.map +1 -1
  46. package/dist/tool/schema/overlay-loader.js +24 -0
  47. package/dist/tool/schema/overlay-loader.js.map +1 -1
  48. package/dist/tool/schema/project-config.d.ts +13 -1
  49. package/dist/tool/schema/project-config.d.ts.map +1 -1
  50. package/dist/tool/schema/project-config.js +188 -10
  51. package/dist/tool/schema/project-config.js.map +1 -1
  52. package/dist/tool/schema/target-rules.d.ts +78 -0
  53. package/dist/tool/schema/target-rules.d.ts.map +1 -0
  54. package/dist/tool/schema/target-rules.js +367 -0
  55. package/dist/tool/schema/target-rules.js.map +1 -0
  56. package/dist/tool/schema/types.d.ts +42 -3
  57. package/dist/tool/schema/types.d.ts.map +1 -1
  58. package/dist/tool/utils/parameters.d.ts +76 -0
  59. package/dist/tool/utils/parameters.d.ts.map +1 -0
  60. package/dist/tool/utils/parameters.js +125 -0
  61. package/dist/tool/utils/parameters.js.map +1 -0
  62. package/dist/tool/utils/paths.d.ts +2 -0
  63. package/dist/tool/utils/paths.d.ts.map +1 -0
  64. package/dist/tool/utils/paths.js +31 -0
  65. package/dist/tool/utils/paths.js.map +1 -0
  66. package/docs/deployment-targets.md +88 -56
  67. package/docs/examples.md +20 -17
  68. package/docs/filesystem-contract.md +5 -0
  69. package/docs/minimal-and-editor.md +65 -5
  70. package/docs/overlay-imports.md +92 -14
  71. package/docs/overlays.md +231 -135
  72. package/docs/specs/001-verbose-plan-graph/spec.md +5 -12
  73. package/docs/specs/002-superposition-config-file/spec.md +5 -12
  74. package/docs/specs/003-mkdocs2-overlay/spec.md +2 -9
  75. package/docs/specs/004-doctor-fix/spec.md +1 -8
  76. package/docs/specs/005-cuda-overlay/spec.md +2 -9
  77. package/docs/specs/006-rocm-overlay/spec.md +3 -10
  78. package/docs/specs/007-target-aware-generation/spec.md +119 -0
  79. package/docs/specs/008-project-file-canonical/spec.md +82 -0
  80. package/docs/specs/009-project-env/spec.md +140 -0
  81. package/docs/specs/010-compose-env-materialization/spec.md +123 -0
  82. package/docs/specs/011-overlay-parameters/spec.md +228 -0
  83. package/docs/specs/012-ollama-cli-overlay/spec.md +47 -0
  84. package/docs/specs/013-doctor-dependency-check/spec.md +250 -0
  85. package/docs/specs/014-doctor-compose-port-cross-validation/spec.md +276 -0
  86. package/docs/specs/015-doctor-env-example-drift/spec.md +248 -0
  87. package/docs/specs/016-doctor-reproducibility-check/spec.md +276 -0
  88. package/docs/specs/017-doctor-dry-run/spec.md +276 -0
  89. package/docs/specs/018-init-project-file/spec.md +59 -0
  90. package/docs/specs/taxonomy.md +186 -0
  91. package/overlays/.presets/full-observability.yml +113 -0
  92. package/overlays/.presets/k8s-dev.yml +174 -0
  93. package/overlays/.presets/local-llm.yml +105 -0
  94. package/overlays/.presets/vector-ai.yml +150 -0
  95. package/overlays/.shared/README.md +27 -2
  96. package/overlays/.shared/compose/nvidia-gpu-devcontainer.yml +22 -0
  97. package/overlays/.shared/vscode/js-ts-settings.json +19 -0
  98. package/overlays/.shared/vscode/markdown-extensions.json +8 -0
  99. package/overlays/alertmanager/devcontainer.patch.json +0 -1
  100. package/overlays/alertmanager/docker-compose.yml +8 -0
  101. package/overlays/alertmanager/overlay.yml +1 -0
  102. package/overlays/amp/devcontainer.patch.json +4 -1
  103. package/overlays/bun/devcontainer.patch.json +1 -10
  104. package/overlays/bun/overlay.yml +8 -1
  105. package/overlays/claude-code/devcontainer.patch.json +6 -1
  106. package/overlays/codex/devcontainer.patch.json +5 -0
  107. package/overlays/comfyui/.env.example +34 -0
  108. package/overlays/comfyui/README.md +342 -0
  109. package/overlays/comfyui/devcontainer.patch.json +15 -0
  110. package/overlays/comfyui/docker-compose.yml +40 -0
  111. package/overlays/comfyui/overlay.yml +24 -0
  112. package/overlays/comfyui/setup.sh +36 -0
  113. package/overlays/comfyui/verify.sh +103 -0
  114. package/overlays/commitlint/devcontainer.patch.json +1 -6
  115. package/overlays/docker-sock/overlay.yml +1 -0
  116. package/overlays/dotnet/overlay.yml +4 -1
  117. package/overlays/fuseki/.env.example +5 -0
  118. package/overlays/fuseki/README.md +173 -0
  119. package/overlays/fuseki/devcontainer.patch.json +18 -0
  120. package/overlays/fuseki/docker-compose.yml +29 -0
  121. package/overlays/fuseki/overlay.yml +42 -0
  122. package/overlays/fuseki/verify.sh +58 -0
  123. package/overlays/gemini-cli/devcontainer.patch.json +4 -1
  124. package/overlays/go/overlay.yml +6 -1
  125. package/overlays/grafana/devcontainer.patch.json +0 -1
  126. package/overlays/grafana/docker-compose.yml +8 -2
  127. package/overlays/grafana/overlay.yml +6 -1
  128. package/overlays/jaeger/.env.example +11 -0
  129. package/overlays/jaeger/README.md +33 -4
  130. package/overlays/jaeger/devcontainer.patch.json +9 -1
  131. package/overlays/jaeger/docker-compose.yml +17 -0
  132. package/overlays/jaeger/overlay.yml +1 -12
  133. package/overlays/java/overlay.yml +6 -1
  134. package/overlays/jupyter/docker-compose.yml +1 -0
  135. package/overlays/jupyter/overlay.yml +1 -0
  136. package/overlays/k3d/README.md +201 -0
  137. package/overlays/k3d/devcontainer.patch.json +9 -0
  138. package/overlays/k3d/overlay.yml +19 -0
  139. package/overlays/k3d/setup.sh +34 -0
  140. package/overlays/k3d/verify.sh +38 -0
  141. package/overlays/keycloak/devcontainer.patch.json +0 -1
  142. package/overlays/keycloak/docker-compose.yml +1 -0
  143. package/overlays/keycloak/overlay.yml +15 -0
  144. package/overlays/localstack/docker-compose.yml +1 -0
  145. package/overlays/localstack/overlay.yml +19 -1
  146. package/overlays/loki/devcontainer.patch.json +0 -1
  147. package/overlays/loki/docker-compose.yml +8 -0
  148. package/overlays/loki/overlay.yml +1 -0
  149. package/overlays/mailpit/docker-compose.yml +1 -0
  150. package/overlays/mailpit/overlay.yml +1 -0
  151. package/overlays/minio/devcontainer.patch.json +1 -1
  152. package/overlays/minio/docker-compose.yml +1 -0
  153. package/overlays/minio/overlay.yml +23 -2
  154. package/overlays/mkdocs/devcontainer.patch.json +1 -5
  155. package/overlays/mkdocs/overlay.yml +3 -1
  156. package/overlays/mkdocs2/devcontainer.patch.json +1 -5
  157. package/overlays/mkdocs2/overlay.yml +2 -0
  158. package/overlays/mongodb/docker-compose.yml +2 -0
  159. package/overlays/mongodb/overlay.yml +26 -2
  160. package/overlays/mysql/docker-compose.yml +2 -0
  161. package/overlays/mysql/overlay.yml +36 -2
  162. package/overlays/nats/docker-compose.yml +1 -0
  163. package/overlays/nats/overlay.yml +18 -2
  164. package/overlays/nodejs/devcontainer.patch.json +1 -12
  165. package/overlays/nodejs/overlay.yml +8 -1
  166. package/overlays/ollama/.env.example +14 -0
  167. package/overlays/ollama/README.md +326 -0
  168. package/overlays/ollama/devcontainer.patch.json +14 -0
  169. package/overlays/ollama/docker-compose.yml +25 -0
  170. package/overlays/ollama/overlay.yml +27 -0
  171. package/overlays/ollama/verify.sh +76 -0
  172. package/overlays/ollama-cli/README.md +90 -0
  173. package/overlays/ollama-cli/devcontainer.patch.json +3 -0
  174. package/overlays/ollama-cli/overlay.yml +19 -0
  175. package/overlays/ollama-cli/setup.sh +103 -0
  176. package/overlays/ollama-cli/verify.sh +49 -0
  177. package/overlays/open-webui/.env.example +5 -0
  178. package/overlays/open-webui/README.md +162 -0
  179. package/overlays/open-webui/devcontainer.patch.json +14 -0
  180. package/overlays/open-webui/docker-compose.yml +24 -0
  181. package/overlays/open-webui/overlay.yml +45 -0
  182. package/overlays/opencode/devcontainer.patch.json +4 -1
  183. package/overlays/otel-collector/README.md +4 -0
  184. package/overlays/otel-collector/devcontainer.patch.json +4 -1
  185. package/overlays/otel-collector/docker-compose.yml +8 -4
  186. package/overlays/otel-collector/overlay.yml +1 -0
  187. package/overlays/otel-demo-nodejs/devcontainer.patch.json +0 -1
  188. package/overlays/otel-demo-nodejs/docker-compose.yml +1 -0
  189. package/overlays/otel-demo-nodejs/overlay.yml +9 -1
  190. package/overlays/otel-demo-python/devcontainer.patch.json +0 -1
  191. package/overlays/otel-demo-python/docker-compose.yml +1 -0
  192. package/overlays/otel-demo-python/overlay.yml +6 -1
  193. package/overlays/pandoc/README.md +10 -0
  194. package/overlays/pandoc/devcontainer.patch.json +0 -5
  195. package/overlays/pandoc/overlay.yml +2 -0
  196. package/overlays/pandoc/setup.sh +10 -0
  197. package/overlays/pgvector/.env.example +6 -0
  198. package/overlays/pgvector/README.md +215 -0
  199. package/overlays/pgvector/devcontainer.patch.json +29 -0
  200. package/overlays/pgvector/docker-compose.yml +33 -0
  201. package/overlays/pgvector/overlay.yml +47 -0
  202. package/overlays/playwright/devcontainer.patch.json +0 -5
  203. package/overlays/playwright/overlay.yml +2 -1
  204. package/overlays/postgres/.env.example +5 -5
  205. package/overlays/postgres/devcontainer.patch.json +4 -4
  206. package/overlays/postgres/docker-compose.yml +11 -6
  207. package/overlays/postgres/overlay.yml +23 -2
  208. package/overlays/pre-commit/devcontainer.patch.json +1 -7
  209. package/overlays/prometheus/devcontainer.patch.json +0 -1
  210. package/overlays/prometheus/docker-compose.yml +8 -0
  211. package/overlays/prometheus/overlay.yml +1 -0
  212. package/overlays/promtail/devcontainer.patch.json +1 -2
  213. package/overlays/promtail/docker-compose.yml +8 -0
  214. package/overlays/promtail/overlay.yml +1 -0
  215. package/overlays/qdrant/.env.example +4 -0
  216. package/overlays/qdrant/README.md +216 -0
  217. package/overlays/qdrant/devcontainer.patch.json +20 -0
  218. package/overlays/qdrant/docker-compose.yml +26 -0
  219. package/overlays/qdrant/overlay.yml +44 -0
  220. package/overlays/rabbitmq/docker-compose.yml +1 -0
  221. package/overlays/rabbitmq/overlay.yml +25 -2
  222. package/overlays/redis/docker-compose.yml +7 -0
  223. package/overlays/redis/overlay.yml +15 -1
  224. package/overlays/redpanda/docker-compose.yml +1 -0
  225. package/overlays/redpanda/overlay.yml +15 -3
  226. package/overlays/rocm/overlay.yml +2 -1
  227. package/overlays/rust/overlay.yml +3 -1
  228. package/overlays/skaffold/README.md +256 -0
  229. package/overlays/skaffold/devcontainer.patch.json +9 -0
  230. package/overlays/skaffold/overlay.yml +20 -0
  231. package/overlays/skaffold/setup.sh +33 -0
  232. package/overlays/skaffold/verify.sh +24 -0
  233. package/overlays/sqlserver/docker-compose.yml +1 -0
  234. package/overlays/sqlserver/overlay.yml +17 -0
  235. package/overlays/tempo/devcontainer.patch.json +0 -1
  236. package/overlays/tempo/docker-compose.yml +8 -0
  237. package/overlays/tempo/overlay.yml +1 -0
  238. package/overlays/windsurf-cli/devcontainer.patch.json +4 -1
  239. package/package.json +3 -2
  240. package/tool/schema/config.schema.json +31 -1
  241. package/tool/schema/overlay-manifest.schema.json +33 -0
  242. 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
  }
@@ -5,7 +5,12 @@ category: language
5
5
  supports: []
6
6
  requires: []
7
7
  suggests: []
8
- conflicts: []
8
+ conflicts:
9
+ - mysql
10
+ - redpanda
11
+ - mongodb
12
+ - otel-demo-nodejs
13
+ - otel-demo-python
9
14
  tags:
10
15
  - language
11
16
  - go
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.base.schema.json",
3
3
  "runServices": ["grafana"],
4
- "_serviceOrder": 3,
5
4
  "forwardPorts": [3000],
6
5
  "portsAttributes": {
7
6
  "3000": {
@@ -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 (when used without otel-collector)
37
- - `4318` - OTLP HTTP receiver (when used without otel-collector)
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**, OTLP ports (4317/4318) are not exposed to avoid conflicts. Send telemetry to otel-collector, which forwards to Jaeger.
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, open your browser to:
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
- imports:
34
- - .shared/otel/instrumentation.env
23
+ serviceOrder: 1
@@ -5,7 +5,12 @@ category: language
5
5
  supports: []
6
6
  requires: []
7
7
  suggests: []
8
- conflicts: []
8
+ conflicts:
9
+ - mysql
10
+ - redpanda
11
+ - mongodb
12
+ - otel-demo-nodejs
13
+ - otel-demo-python
9
14
  tags:
10
15
  - language
11
16
  - java
@@ -21,3 +21,4 @@ volumes:
21
21
 
22
22
  networks:
23
23
  devnet:
24
+ name: devnet
@@ -8,6 +8,7 @@ requires:
8
8
  - python
9
9
  suggests: []
10
10
  conflicts: []
11
+ serviceOrder: 3
11
12
  tags:
12
13
  - language
13
14
  - jupyter