container-superposition 0.1.1

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 (327) hide show
  1. package/README.md +843 -0
  2. package/dist/scripts/init.d.ts +3 -0
  3. package/dist/scripts/init.d.ts.map +1 -0
  4. package/dist/scripts/init.js +1190 -0
  5. package/dist/scripts/init.js.map +1 -0
  6. package/dist/scripts/migrate-to-manifests.d.ts +12 -0
  7. package/dist/scripts/migrate-to-manifests.d.ts.map +1 -0
  8. package/dist/scripts/migrate-to-manifests.js +230 -0
  9. package/dist/scripts/migrate-to-manifests.js.map +1 -0
  10. package/dist/tool/questionnaire/composer.d.ts +6 -0
  11. package/dist/tool/questionnaire/composer.d.ts.map +1 -0
  12. package/dist/tool/questionnaire/composer.js +1232 -0
  13. package/dist/tool/questionnaire/composer.js.map +1 -0
  14. package/dist/tool/readme/markdown-parser.d.ts +30 -0
  15. package/dist/tool/readme/markdown-parser.d.ts.map +1 -0
  16. package/dist/tool/readme/markdown-parser.js +139 -0
  17. package/dist/tool/readme/markdown-parser.js.map +1 -0
  18. package/dist/tool/readme/readme-generator.d.ts +9 -0
  19. package/dist/tool/readme/readme-generator.d.ts.map +1 -0
  20. package/dist/tool/readme/readme-generator.js +422 -0
  21. package/dist/tool/readme/readme-generator.js.map +1 -0
  22. package/dist/tool/schema/custom-loader.d.ts +17 -0
  23. package/dist/tool/schema/custom-loader.d.ts.map +1 -0
  24. package/dist/tool/schema/custom-loader.js +149 -0
  25. package/dist/tool/schema/custom-loader.js.map +1 -0
  26. package/dist/tool/schema/overlay-loader.d.ts +47 -0
  27. package/dist/tool/schema/overlay-loader.d.ts.map +1 -0
  28. package/dist/tool/schema/overlay-loader.js +252 -0
  29. package/dist/tool/schema/overlay-loader.js.map +1 -0
  30. package/dist/tool/schema/types.d.ts +212 -0
  31. package/dist/tool/schema/types.d.ts.map +1 -0
  32. package/dist/tool/schema/types.js +5 -0
  33. package/dist/tool/schema/types.js.map +1 -0
  34. package/docs/README.md +308 -0
  35. package/docs/architecture.md +233 -0
  36. package/docs/creating-overlays.md +549 -0
  37. package/docs/custom-patches.md +540 -0
  38. package/docs/dependencies.md +279 -0
  39. package/docs/examples/custom-patches-example.md +85 -0
  40. package/docs/examples.md +576 -0
  41. package/docs/messaging-comparison.md +265 -0
  42. package/docs/messaging-quick-start.md +385 -0
  43. package/docs/observability-workflow.md +537 -0
  44. package/docs/overlay-manifest-refactoring.md +214 -0
  45. package/docs/overlay-metadata-archive.md +54 -0
  46. package/docs/overlays.md +523 -0
  47. package/docs/presets-architecture.md +498 -0
  48. package/docs/presets.md +366 -0
  49. package/docs/publishing.md +476 -0
  50. package/docs/quick-reference.md +326 -0
  51. package/docs/ux.md +170 -0
  52. package/features/README.md +85 -0
  53. package/features/cross-distro-packages/README.md +146 -0
  54. package/features/cross-distro-packages/devcontainer-feature.json +20 -0
  55. package/features/cross-distro-packages/install.sh +58 -0
  56. package/features/local-secrets-manager/devcontainer-feature.json +18 -0
  57. package/features/local-secrets-manager/install.sh +127 -0
  58. package/features/project-scaffolder/devcontainer-feature.json +24 -0
  59. package/features/project-scaffolder/install.sh +100 -0
  60. package/features/team-conventions/devcontainer-feature.json +24 -0
  61. package/features/team-conventions/install.sh +93 -0
  62. package/overlays/.registry/README.md +14 -0
  63. package/overlays/.registry/base-images.yml +26 -0
  64. package/overlays/.registry/base-templates.yml +7 -0
  65. package/overlays/README.md +155 -0
  66. package/overlays/alertmanager/.env.example +5 -0
  67. package/overlays/alertmanager/README.md +465 -0
  68. package/overlays/alertmanager/alert-rules.yml +56 -0
  69. package/overlays/alertmanager/alertmanager.yml +42 -0
  70. package/overlays/alertmanager/devcontainer.patch.json +12 -0
  71. package/overlays/alertmanager/docker-compose.yml +20 -0
  72. package/overlays/alertmanager/overlay.yml +17 -0
  73. package/overlays/alertmanager/setup.sh +53 -0
  74. package/overlays/alertmanager/verify.sh +31 -0
  75. package/overlays/aws-cli/README.md +473 -0
  76. package/overlays/aws-cli/devcontainer.patch.json +13 -0
  77. package/overlays/aws-cli/overlay.yml +13 -0
  78. package/overlays/azure-cli/README.md +551 -0
  79. package/overlays/azure-cli/devcontainer.patch.json +8 -0
  80. package/overlays/azure-cli/overlay.yml +13 -0
  81. package/overlays/bun/README.md +312 -0
  82. package/overlays/bun/devcontainer.patch.json +41 -0
  83. package/overlays/bun/overlay.yml +16 -0
  84. package/overlays/bun/setup.sh +79 -0
  85. package/overlays/bun/verify.sh +30 -0
  86. package/overlays/codex/README.md +128 -0
  87. package/overlays/codex/devcontainer.patch.json +3 -0
  88. package/overlays/codex/overlay.yml +14 -0
  89. package/overlays/codex/setup.sh +24 -0
  90. package/overlays/codex/verify.sh +30 -0
  91. package/overlays/commitlint/README.md +333 -0
  92. package/overlays/commitlint/devcontainer.patch.json +8 -0
  93. package/overlays/commitlint/overlay.yml +16 -0
  94. package/overlays/commitlint/setup.sh +234 -0
  95. package/overlays/direnv/README.md +504 -0
  96. package/overlays/direnv/devcontainer.patch.json +6 -0
  97. package/overlays/direnv/overlay.yml +13 -0
  98. package/overlays/direnv/setup.sh +139 -0
  99. package/overlays/docker-in-docker/README.md +534 -0
  100. package/overlays/docker-in-docker/devcontainer.patch.json +10 -0
  101. package/overlays/docker-in-docker/overlay.yml +13 -0
  102. package/overlays/docker-sock/README.md +256 -0
  103. package/overlays/docker-sock/devcontainer.patch.json +9 -0
  104. package/overlays/docker-sock/docker-compose.yml +8 -0
  105. package/overlays/docker-sock/overlay.yml +13 -0
  106. package/overlays/dotnet/README.md +147 -0
  107. package/overlays/dotnet/devcontainer.patch.json +51 -0
  108. package/overlays/dotnet/global-tools.txt +24 -0
  109. package/overlays/dotnet/overlay.yml +13 -0
  110. package/overlays/dotnet/setup.sh +51 -0
  111. package/overlays/dotnet/verify.sh +26 -0
  112. package/overlays/gcloud/README.md +269 -0
  113. package/overlays/gcloud/devcontainer.patch.json +14 -0
  114. package/overlays/gcloud/overlay.yml +14 -0
  115. package/overlays/gcloud/verify.sh +52 -0
  116. package/overlays/git-helpers/README.md +168 -0
  117. package/overlays/git-helpers/devcontainer.patch.json +33 -0
  118. package/overlays/git-helpers/overlay.yml +15 -0
  119. package/overlays/git-helpers/setup.sh +91 -0
  120. package/overlays/go/README.md +293 -0
  121. package/overlays/go/devcontainer.patch.json +43 -0
  122. package/overlays/go/overlay.yml +15 -0
  123. package/overlays/go/setup.sh +33 -0
  124. package/overlays/go/verify.sh +40 -0
  125. package/overlays/grafana/.env.example +9 -0
  126. package/overlays/grafana/README.md +462 -0
  127. package/overlays/grafana/dashboard-provider.yml +11 -0
  128. package/overlays/grafana/dashboards/observability-overview.json +263 -0
  129. package/overlays/grafana/devcontainer.patch.json +12 -0
  130. package/overlays/grafana/docker-compose.yml +27 -0
  131. package/overlays/grafana/grafana-datasources.yml +57 -0
  132. package/overlays/grafana/overlay.yml +21 -0
  133. package/overlays/grafana/verify.sh +34 -0
  134. package/overlays/jaeger/.env.example +7 -0
  135. package/overlays/jaeger/README.md +867 -0
  136. package/overlays/jaeger/devcontainer.patch.json +12 -0
  137. package/overlays/jaeger/docker-compose.yml +17 -0
  138. package/overlays/jaeger/overlay.yml +19 -0
  139. package/overlays/java/README.md +267 -0
  140. package/overlays/java/devcontainer.patch.json +44 -0
  141. package/overlays/java/overlay.yml +16 -0
  142. package/overlays/java/setup.sh +41 -0
  143. package/overlays/java/verify.sh +42 -0
  144. package/overlays/just/README.md +443 -0
  145. package/overlays/just/devcontainer.patch.json +3 -0
  146. package/overlays/just/overlay.yml +13 -0
  147. package/overlays/just/setup.sh +182 -0
  148. package/overlays/kubectl-helm/README.md +660 -0
  149. package/overlays/kubectl-helm/devcontainer.patch.json +10 -0
  150. package/overlays/kubectl-helm/overlay.yml +13 -0
  151. package/overlays/loki/.env.example +5 -0
  152. package/overlays/loki/README.md +1156 -0
  153. package/overlays/loki/devcontainer.patch.json +12 -0
  154. package/overlays/loki/docker-compose.yml +18 -0
  155. package/overlays/loki/loki-config.yaml +45 -0
  156. package/overlays/loki/overlay.yml +17 -0
  157. package/overlays/minio/.env.example +9 -0
  158. package/overlays/minio/README.md +639 -0
  159. package/overlays/minio/devcontainer.patch.json +30 -0
  160. package/overlays/minio/docker-compose.yml +28 -0
  161. package/overlays/minio/overlay.yml +18 -0
  162. package/overlays/minio/setup.sh +61 -0
  163. package/overlays/minio/verify.sh +64 -0
  164. package/overlays/mkdocs/README.md +309 -0
  165. package/overlays/mkdocs/devcontainer.patch.json +24 -0
  166. package/overlays/mkdocs/overlay.yml +15 -0
  167. package/overlays/modern-cli-tools/README.md +556 -0
  168. package/overlays/modern-cli-tools/devcontainer.patch.json +3 -0
  169. package/overlays/modern-cli-tools/overlay.yml +13 -0
  170. package/overlays/modern-cli-tools/setup.sh +153 -0
  171. package/overlays/mongodb/.env.example +9 -0
  172. package/overlays/mongodb/README.md +481 -0
  173. package/overlays/mongodb/devcontainer.patch.json +32 -0
  174. package/overlays/mongodb/docker-compose.yml +44 -0
  175. package/overlays/mongodb/overlay.yml +17 -0
  176. package/overlays/mongodb/verify.sh +48 -0
  177. package/overlays/mysql/.env.example +11 -0
  178. package/overlays/mysql/README.md +542 -0
  179. package/overlays/mysql/devcontainer.patch.json +34 -0
  180. package/overlays/mysql/docker-compose.yml +55 -0
  181. package/overlays/mysql/overlay.yml +16 -0
  182. package/overlays/mysql/verify.sh +48 -0
  183. package/overlays/nats/.env.example +5 -0
  184. package/overlays/nats/README.md +762 -0
  185. package/overlays/nats/devcontainer.patch.json +24 -0
  186. package/overlays/nats/docker-compose.yml +31 -0
  187. package/overlays/nats/overlay.yml +18 -0
  188. package/overlays/nats/verify.sh +50 -0
  189. package/overlays/ngrok/README.md +503 -0
  190. package/overlays/ngrok/devcontainer.patch.json +3 -0
  191. package/overlays/ngrok/overlay.yml +14 -0
  192. package/overlays/ngrok/setup.sh +125 -0
  193. package/overlays/nodejs/README.md +192 -0
  194. package/overlays/nodejs/devcontainer.patch.json +49 -0
  195. package/overlays/nodejs/global-packages.txt +16 -0
  196. package/overlays/nodejs/overlay.yml +14 -0
  197. package/overlays/nodejs/setup.sh +46 -0
  198. package/overlays/nodejs/verify.sh +32 -0
  199. package/overlays/otel-collector/.env.example +9 -0
  200. package/overlays/otel-collector/README.md +1257 -0
  201. package/overlays/otel-collector/devcontainer.patch.json +28 -0
  202. package/overlays/otel-collector/docker-compose.yml +22 -0
  203. package/overlays/otel-collector/otel-collector-config.yaml +68 -0
  204. package/overlays/otel-collector/overlay.yml +21 -0
  205. package/overlays/otel-collector/setup.sh +49 -0
  206. package/overlays/otel-demo-nodejs/.env.example +2 -0
  207. package/overlays/otel-demo-nodejs/Dockerfile-otel-demo-nodejs +17 -0
  208. package/overlays/otel-demo-nodejs/README.md +409 -0
  209. package/overlays/otel-demo-nodejs/devcontainer.patch.json +12 -0
  210. package/overlays/otel-demo-nodejs/docker-compose.yml +19 -0
  211. package/overlays/otel-demo-nodejs/overlay.yml +23 -0
  212. package/overlays/otel-demo-nodejs/package-otel-demo-nodejs.json +20 -0
  213. package/overlays/otel-demo-nodejs/server-otel-demo-nodejs.js +259 -0
  214. package/overlays/otel-demo-nodejs/tracing-otel-demo-nodejs.js +57 -0
  215. package/overlays/otel-demo-nodejs/verify.sh +31 -0
  216. package/overlays/otel-demo-python/.env.example +2 -0
  217. package/overlays/otel-demo-python/Dockerfile-otel-demo-python +16 -0
  218. package/overlays/otel-demo-python/README.md +82 -0
  219. package/overlays/otel-demo-python/app-otel-demo-python.py +208 -0
  220. package/overlays/otel-demo-python/devcontainer.patch.json +12 -0
  221. package/overlays/otel-demo-python/docker-compose.yml +19 -0
  222. package/overlays/otel-demo-python/overlay.yml +23 -0
  223. package/overlays/otel-demo-python/requirements-otel-demo-python.txt +4 -0
  224. package/overlays/otel-demo-python/verify.sh +31 -0
  225. package/overlays/playwright/README.md +629 -0
  226. package/overlays/playwright/devcontainer.patch.json +9 -0
  227. package/overlays/playwright/overlay.yml +13 -0
  228. package/overlays/postgres/.env.example +6 -0
  229. package/overlays/postgres/README.md +602 -0
  230. package/overlays/postgres/devcontainer.patch.json +21 -0
  231. package/overlays/postgres/docker-compose.yml +22 -0
  232. package/overlays/postgres/overlay.yml +15 -0
  233. package/overlays/postgres/verify.sh +45 -0
  234. package/overlays/powershell/README.md +314 -0
  235. package/overlays/powershell/devcontainer.patch.json +22 -0
  236. package/overlays/powershell/overlay.yml +13 -0
  237. package/overlays/powershell/setup.sh +29 -0
  238. package/overlays/powershell/verify.sh +38 -0
  239. package/overlays/pre-commit/README.md +263 -0
  240. package/overlays/pre-commit/devcontainer.patch.json +9 -0
  241. package/overlays/pre-commit/overlay.yml +16 -0
  242. package/overlays/pre-commit/setup.sh +129 -0
  243. package/overlays/presets/docs-site.yml +118 -0
  244. package/overlays/presets/fullstack.yml +181 -0
  245. package/overlays/presets/microservice.yml +118 -0
  246. package/overlays/presets/web-api.yml +109 -0
  247. package/overlays/prometheus/.env.example +5 -0
  248. package/overlays/prometheus/README.md +1246 -0
  249. package/overlays/prometheus/devcontainer.patch.json +12 -0
  250. package/overlays/prometheus/docker-compose.yml +22 -0
  251. package/overlays/prometheus/overlay.yml +17 -0
  252. package/overlays/prometheus/prometheus.yml +12 -0
  253. package/overlays/prometheus/verify.sh +34 -0
  254. package/overlays/promtail/.env.example +2 -0
  255. package/overlays/promtail/README.md +357 -0
  256. package/overlays/promtail/devcontainer.patch.json +5 -0
  257. package/overlays/promtail/docker-compose.yml +16 -0
  258. package/overlays/promtail/overlay.yml +17 -0
  259. package/overlays/promtail/promtail-config.yaml +60 -0
  260. package/overlays/promtail/verify.sh +31 -0
  261. package/overlays/pulumi/README.md +472 -0
  262. package/overlays/pulumi/devcontainer.patch.json +13 -0
  263. package/overlays/pulumi/overlay.yml +14 -0
  264. package/overlays/pulumi/verify.sh +31 -0
  265. package/overlays/python/README.md +919 -0
  266. package/overlays/python/devcontainer.patch.json +41 -0
  267. package/overlays/python/overlay.yml +12 -0
  268. package/overlays/python/requirements-overlay.txt +13 -0
  269. package/overlays/python/setup.sh +47 -0
  270. package/overlays/python/verify.sh +32 -0
  271. package/overlays/rabbitmq/.env.example +7 -0
  272. package/overlays/rabbitmq/README.md +680 -0
  273. package/overlays/rabbitmq/devcontainer.patch.json +28 -0
  274. package/overlays/rabbitmq/docker-compose.yml +30 -0
  275. package/overlays/rabbitmq/overlay.yml +18 -0
  276. package/overlays/rabbitmq/verify.sh +41 -0
  277. package/overlays/redis/.env.example +4 -0
  278. package/overlays/redis/README.md +776 -0
  279. package/overlays/redis/devcontainer.patch.json +21 -0
  280. package/overlays/redis/docker-compose.yml +21 -0
  281. package/overlays/redis/overlay.yml +15 -0
  282. package/overlays/redis/verify.sh +41 -0
  283. package/overlays/redpanda/.env.example +10 -0
  284. package/overlays/redpanda/README.md +703 -0
  285. package/overlays/redpanda/devcontainer.patch.json +37 -0
  286. package/overlays/redpanda/docker-compose.yml +67 -0
  287. package/overlays/redpanda/overlay.yml +21 -0
  288. package/overlays/redpanda/verify.sh +48 -0
  289. package/overlays/rust/README.md +299 -0
  290. package/overlays/rust/devcontainer.patch.json +39 -0
  291. package/overlays/rust/overlay.yml +15 -0
  292. package/overlays/rust/setup.sh +36 -0
  293. package/overlays/rust/verify.sh +51 -0
  294. package/overlays/sqlite/README.md +584 -0
  295. package/overlays/sqlite/devcontainer.patch.json +14 -0
  296. package/overlays/sqlite/overlay.yml +15 -0
  297. package/overlays/sqlite/setup.sh +27 -0
  298. package/overlays/sqlite/verify.sh +43 -0
  299. package/overlays/sqlserver/.env.example +6 -0
  300. package/overlays/sqlserver/README.md +592 -0
  301. package/overlays/sqlserver/devcontainer.patch.json +22 -0
  302. package/overlays/sqlserver/docker-compose.yml +32 -0
  303. package/overlays/sqlserver/overlay.yml +17 -0
  304. package/overlays/sqlserver/verify.sh +30 -0
  305. package/overlays/tempo/.env.example +5 -0
  306. package/overlays/tempo/README.md +273 -0
  307. package/overlays/tempo/devcontainer.patch.json +12 -0
  308. package/overlays/tempo/docker-compose.yml +20 -0
  309. package/overlays/tempo/overlay.yml +20 -0
  310. package/overlays/tempo/tempo-config.yaml +32 -0
  311. package/overlays/tempo/verify.sh +31 -0
  312. package/overlays/terraform/README.md +389 -0
  313. package/overlays/terraform/devcontainer.patch.json +15 -0
  314. package/overlays/terraform/overlay.yml +14 -0
  315. package/overlays/terraform/verify.sh +63 -0
  316. package/package.json +74 -0
  317. package/templates/README.md +285 -0
  318. package/templates/compose/.devcontainer/devcontainer.json +46 -0
  319. package/templates/compose/.devcontainer/docker-compose.yml +12 -0
  320. package/templates/compose/README.md +20 -0
  321. package/templates/plain/.devcontainer/devcontainer.json +35 -0
  322. package/templates/plain/README.md +21 -0
  323. package/tool/README.md +281 -0
  324. package/tool/schema/base-images.schema.json +43 -0
  325. package/tool/schema/base-templates.schema.json +34 -0
  326. package/tool/schema/config.schema.json +71 -0
  327. package/tool/schema/overlay-manifest.schema.json +86 -0
@@ -0,0 +1,762 @@
1
+ # NATS Overlay
2
+
3
+ Lightweight, high-performance messaging system for microservices, IoT, and real-time applications.
4
+
5
+ ## Features
6
+
7
+ - **NATS Server** - Fast, simple pub/sub messaging
8
+ - **JetStream** - Persistence, streaming, and exactly-once delivery
9
+ - **Monitoring UI** - HTTP monitoring endpoint with JSON stats (port 8222)
10
+ - **Low Latency** - Microsecond-level message delivery
11
+ - **Simple Protocol** - Text-based protocol, easy debugging
12
+ - **Subject-based Messaging** - Hierarchical subject routing with wildcards
13
+ - **Docker Compose service** - Runs as separate container
14
+ - **Environment configuration** - Customizable via `.env` file
15
+
16
+ ## How It Works
17
+
18
+ This overlay adds NATS as a Docker Compose service with JetStream enabled for persistence and advanced features. NATS is optimized for speed and simplicity, making it ideal for microservices communication and real-time messaging.
19
+
20
+ **Architecture:**
21
+
22
+ ```mermaid
23
+ graph TD
24
+ A[Development Container<br/>Your application code<br/>NATS client libraries<br/>Connects to nats:4222] -->|Docker network devnet| B[NATS Container<br/>Client port 4222<br/>Monitoring 8222<br/>JetStream enabled<br/>Message persistence]
25
+ ```
26
+
27
+ ## Configuration
28
+
29
+ ### Environment Variables
30
+
31
+ The overlay includes a `.env.example` file. Copy it to `.env` and customize:
32
+
33
+ ```bash
34
+ cd .devcontainer
35
+ cp .env.example .env
36
+ ```
37
+
38
+ **Default values (.env.example):**
39
+
40
+ ```bash
41
+ # NATS Configuration
42
+ NATS_VERSION=latest
43
+ NATS_CLIENT_PORT=4222
44
+ NATS_HTTP_PORT=8222
45
+ NATS_CLUSTER_PORT=6222
46
+ ```
47
+
48
+ ### Port Configuration
49
+
50
+ Default ports can be changed via the `--port-offset` option:
51
+
52
+ ```bash
53
+ # Offset all ports by 100
54
+ container-superposition --port-offset 100
55
+
56
+ # NATS will be on:
57
+ # - Client: 4322 (instead of 4222)
58
+ # - Monitoring: 8322 (instead of 8222)
59
+ ```
60
+
61
+ ## Connection Information
62
+
63
+ ### From Development Container
64
+
65
+ **NATS Connection:**
66
+
67
+ ```bash
68
+ # Hostname: nats (Docker Compose service name)
69
+ # Port: 4222
70
+ # URL: nats://nats:4222
71
+
72
+ # Environment variable (pre-configured)
73
+ echo $NATS_URL
74
+ # Output: nats://nats:4222
75
+ ```
76
+
77
+ **Monitoring UI:**
78
+
79
+ ```
80
+ http://nats:8222
81
+ ```
82
+
83
+ ### From Host Machine
84
+
85
+ **NATS Connection:**
86
+
87
+ ```bash
88
+ # Hostname: localhost
89
+ # Port: 4222 (or 4222 + port-offset)
90
+ # URL: nats://localhost:4222
91
+ ```
92
+
93
+ **Monitoring UI:**
94
+
95
+ ```
96
+ http://localhost:8222
97
+ ```
98
+
99
+ Provides JSON endpoints:
100
+
101
+ - `/varz` - Server information
102
+ - `/connz` - Connection information
103
+ - `/routez` - Route information
104
+ - `/subsz` - Subscription information
105
+ - `/jsz` - JetStream information
106
+
107
+ ## Common Commands
108
+
109
+ ### Using NATS CLI (via docker exec)
110
+
111
+ ```bash
112
+ # Server info
113
+ docker exec nats nats-server --version
114
+
115
+ # Publish a message
116
+ docker exec nats nats pub test.subject "Hello NATS"
117
+
118
+ # Subscribe to subjects
119
+ docker exec -it nats nats sub test.subject
120
+ docker exec -it nats nats sub "test.>" # Wildcard
121
+
122
+ # Request/reply
123
+ docker exec -it nats nats reply test.request "response message"
124
+ docker exec nats nats request test.request "request message"
125
+ ```
126
+
127
+ ### JetStream Commands
128
+
129
+ ```bash
130
+ # Create a stream
131
+ docker exec nats nats stream add mystream \
132
+ --subjects "events.>" \
133
+ --storage file \
134
+ --retention limits
135
+
136
+ # List streams
137
+ docker exec nats nats stream list
138
+
139
+ # Stream info
140
+ docker exec nats nats stream info mystream
141
+
142
+ # Publish to stream
143
+ docker exec nats nats pub events.user.created '{"id": 1, "name": "Alice"}'
144
+
145
+ # Create consumer
146
+ docker exec nats nats consumer add mystream myconsumer \
147
+ --filter events.user.> \
148
+ --deliver all \
149
+ --replay instant
150
+
151
+ # Consume messages
152
+ docker exec -it nats nats consumer next mystream myconsumer
153
+
154
+ # Delete stream
155
+ docker exec nats nats stream rm mystream
156
+ ```
157
+
158
+ ### Monitoring
159
+
160
+ ```bash
161
+ # Get server stats
162
+ curl http://localhost:8222/varz | jq
163
+
164
+ # Check connections
165
+ curl http://localhost:8222/connz | jq
166
+
167
+ # JetStream stats
168
+ curl http://localhost:8222/jsz | jq
169
+
170
+ # Health check
171
+ curl http://localhost:8222/healthz
172
+ ```
173
+
174
+ ## Application Integration
175
+
176
+ ### Node.js Example
177
+
178
+ Install NATS client:
179
+
180
+ ```bash
181
+ npm install nats
182
+ ```
183
+
184
+ **Publisher (publisher.js):**
185
+
186
+ ```javascript
187
+ const { connect, StringCodec } = require('nats');
188
+
189
+ async function publish() {
190
+ const nc = await connect({ servers: 'nats://nats:4222' });
191
+ const sc = StringCodec();
192
+
193
+ // Simple publish
194
+ nc.publish('updates.user', sc.encode('User updated'));
195
+ console.log('Published message');
196
+
197
+ // Request/reply
198
+ const response = await nc.request('time', sc.encode(''), { timeout: 1000 });
199
+ console.log('Response:', sc.decode(response.data));
200
+
201
+ await nc.drain();
202
+ }
203
+
204
+ publish().catch(console.error);
205
+ ```
206
+
207
+ **Subscriber (subscriber.js):**
208
+
209
+ ```javascript
210
+ const { connect, StringCodec } = require('nats');
211
+
212
+ async function subscribe() {
213
+ const nc = await connect({ servers: 'nats://nats:4222' });
214
+ const sc = StringCodec();
215
+
216
+ // Subscribe to subject
217
+ const sub = nc.subscribe('updates.>');
218
+ console.log('Listening for messages...');
219
+
220
+ for await (const msg of sub) {
221
+ console.log(`[${msg.subject}]: ${sc.decode(msg.data)}`);
222
+ }
223
+ }
224
+
225
+ subscribe().catch(console.error);
226
+ ```
227
+
228
+ **JetStream Example (stream.js):**
229
+
230
+ ```javascript
231
+ const { connect, StringCodec } = require('nats');
232
+
233
+ async function jetstream() {
234
+ const nc = await connect({ servers: 'nats://nats:4222' });
235
+ const js = nc.jetstream();
236
+ const sc = StringCodec();
237
+
238
+ // Create stream
239
+ await js.streams.add({
240
+ name: 'EVENTS',
241
+ subjects: ['events.>'],
242
+ });
243
+
244
+ // Publish to stream
245
+ await js.publish('events.user.created', sc.encode('{"id": 1}'));
246
+ console.log('Published to stream');
247
+
248
+ // Create consumer
249
+ const consumer = await js.consumers.get('EVENTS', 'myconsumer');
250
+ const messages = await consumer.consume();
251
+
252
+ for await (const msg of messages) {
253
+ console.log(`Received: ${sc.decode(msg.data)}`);
254
+ msg.ack();
255
+ }
256
+
257
+ await nc.close();
258
+ }
259
+
260
+ jetstream().catch(console.error);
261
+ ```
262
+
263
+ ### Python Example
264
+
265
+ Install NATS client:
266
+
267
+ ```bash
268
+ pip install nats-py
269
+ ```
270
+
271
+ **Publisher (publisher.py):**
272
+
273
+ ```python
274
+ import asyncio
275
+ from nats.aio.client import Client as NATS
276
+
277
+ async def publish():
278
+ nc = NATS()
279
+ await nc.connect("nats://nats:4222")
280
+
281
+ # Simple publish
282
+ await nc.publish("updates.user", b"User updated")
283
+ print("Published message")
284
+
285
+ # Request/reply
286
+ response = await nc.request("time", b"", timeout=1)
287
+ print(f"Response: {response.data.decode()}")
288
+
289
+ await nc.close()
290
+
291
+ if __name__ == '__main__':
292
+ asyncio.run(publish())
293
+ ```
294
+
295
+ **Subscriber (subscriber.py):**
296
+
297
+ ```python
298
+ import asyncio
299
+ from nats.aio.client import Client as NATS
300
+
301
+ async def message_handler(msg):
302
+ subject = msg.subject
303
+ data = msg.data.decode()
304
+ print(f"[{subject}]: {data}")
305
+
306
+ async def subscribe():
307
+ nc = NATS()
308
+ await nc.connect("nats://nats:4222")
309
+
310
+ # Subscribe to subject
311
+ await nc.subscribe("updates.>", cb=message_handler)
312
+ print("Listening for messages...")
313
+
314
+ # Keep running
315
+ while True:
316
+ await asyncio.sleep(1)
317
+
318
+ if __name__ == '__main__':
319
+ asyncio.run(subscribe())
320
+ ```
321
+
322
+ **JetStream Example (stream.py):**
323
+
324
+ ```python
325
+ import asyncio
326
+ from nats.aio.client import Client as NATS
327
+
328
+ async def jetstream():
329
+ nc = NATS()
330
+ await nc.connect("nats://nats:4222")
331
+ js = nc.jetstream()
332
+
333
+ # Create stream
334
+ await js.add_stream(name="EVENTS", subjects=["events.>"])
335
+
336
+ # Publish to stream
337
+ await js.publish("events.user.created", b'{"id": 1}')
338
+ print("Published to stream")
339
+
340
+ # Subscribe to stream
341
+ sub = await js.subscribe("events.>", durable="myconsumer")
342
+
343
+ async for msg in sub.messages:
344
+ print(f"Received: {msg.data.decode()}")
345
+ await msg.ack()
346
+
347
+ await nc.close()
348
+
349
+ if __name__ == '__main__':
350
+ asyncio.run(jetstream())
351
+ ```
352
+
353
+ ### Go Example
354
+
355
+ Install NATS client:
356
+
357
+ ```bash
358
+ go get github.com/nats-io/nats.go
359
+ ```
360
+
361
+ **Publisher (publisher.go):**
362
+
363
+ ```go
364
+ package main
365
+
366
+ import (
367
+ "log"
368
+ "time"
369
+
370
+ "github.com/nats-io/nats.go"
371
+ )
372
+
373
+ func main() {
374
+ nc, err := nats.Connect("nats://nats:4222")
375
+ if err != nil {
376
+ log.Fatal(err)
377
+ }
378
+ defer nc.Close()
379
+
380
+ // Simple publish
381
+ nc.Publish("updates.user", []byte("User updated"))
382
+ log.Println("Published message")
383
+
384
+ // Request/reply
385
+ msg, err := nc.Request("time", []byte(""), 1*time.Second)
386
+ if err != nil {
387
+ log.Fatal(err)
388
+ }
389
+ log.Printf("Response: %s", string(msg.Data))
390
+ }
391
+ ```
392
+
393
+ **Subscriber (subscriber.go):**
394
+
395
+ ```go
396
+ package main
397
+
398
+ import (
399
+ "log"
400
+ "runtime"
401
+
402
+ "github.com/nats-io/nats.go"
403
+ )
404
+
405
+ func main() {
406
+ nc, err := nats.Connect("nats://nats:4222")
407
+ if err != nil {
408
+ log.Fatal(err)
409
+ }
410
+ defer nc.Close()
411
+
412
+ // Subscribe to subject
413
+ sub, err := nc.Subscribe("updates.>", func(msg *nats.Msg) {
414
+ log.Printf("[%s]: %s", msg.Subject, string(msg.Data))
415
+ })
416
+ if err != nil {
417
+ log.Fatal(err)
418
+ }
419
+ defer sub.Unsubscribe()
420
+
421
+ log.Println("Listening for messages...")
422
+ runtime.Goexit()
423
+ }
424
+ ```
425
+
426
+ **JetStream Example (stream.go):**
427
+
428
+ ```go
429
+ package main
430
+
431
+ import (
432
+ "context"
433
+ "log"
434
+
435
+ "github.com/nats-io/nats.go"
436
+ )
437
+
438
+ func main() {
439
+ nc, err := nats.Connect("nats://nats:4222")
440
+ if err != nil {
441
+ log.Fatal(err)
442
+ }
443
+ defer nc.Close()
444
+
445
+ js, err := nc.JetStream()
446
+ if err != nil {
447
+ log.Fatal(err)
448
+ }
449
+
450
+ // Create stream
451
+ _, err = js.AddStream(&nats.StreamConfig{
452
+ Name: "EVENTS",
453
+ Subjects: []string{"events.>"},
454
+ })
455
+ if err != nil {
456
+ log.Fatal(err)
457
+ }
458
+
459
+ // Publish to stream
460
+ _, err = js.Publish("events.user.created", []byte(`{"id": 1}`))
461
+ if err != nil {
462
+ log.Fatal(err)
463
+ }
464
+ log.Println("Published to stream")
465
+
466
+ // Subscribe to stream
467
+ sub, err := js.SubscribeSync("events.>", nats.Durable("myconsumer"))
468
+ if err != nil {
469
+ log.Fatal(err)
470
+ }
471
+
472
+ for {
473
+ msg, err := sub.NextMsg(context.Background())
474
+ if err != nil {
475
+ log.Fatal(err)
476
+ }
477
+ log.Printf("Received: %s", string(msg.Data))
478
+ msg.Ack()
479
+ }
480
+ }
481
+ ```
482
+
483
+ ### .NET Example
484
+
485
+ Install NATS client:
486
+
487
+ ```bash
488
+ dotnet add package NATS.Client
489
+ ```
490
+
491
+ **Publisher (Publisher.cs):**
492
+
493
+ ```csharp
494
+ using NATS.Client;
495
+ using System.Text;
496
+
497
+ var factory = new ConnectionFactory();
498
+ using var connection = factory.CreateConnection("nats://nats:4222");
499
+
500
+ // Simple publish
501
+ connection.Publish("updates.user", Encoding.UTF8.GetBytes("User updated"));
502
+ Console.WriteLine("Published message");
503
+
504
+ // Request/reply
505
+ var reply = connection.Request("time", Encoding.UTF8.GetBytes(""), 1000);
506
+ Console.WriteLine($"Response: {Encoding.UTF8.GetString(reply.Data)}");
507
+ ```
508
+
509
+ **Subscriber (Subscriber.cs):**
510
+
511
+ ```csharp
512
+ using NATS.Client;
513
+ using System.Text;
514
+
515
+ var factory = new ConnectionFactory();
516
+ using var connection = factory.CreateConnection("nats://nats:4222");
517
+
518
+ // Subscribe to subject
519
+ var subscription = connection.SubscribeAsync("updates.>", (sender, args) =>
520
+ {
521
+ var subject = args.Message.Subject;
522
+ var data = Encoding.UTF8.GetString(args.Message.Data);
523
+ Console.WriteLine($"[{subject}]: {data}");
524
+ });
525
+
526
+ Console.WriteLine("Listening for messages...");
527
+ Console.WriteLine("Press [enter] to exit.");
528
+ Console.ReadLine();
529
+ ```
530
+
531
+ ## Use Cases
532
+
533
+ - **Microservices Communication** - Fast, simple service-to-service messaging
534
+ - **Pub/Sub Messaging** - Broadcast events to multiple subscribers
535
+ - **Request/Reply** - Synchronous RPC-style communication
536
+ - **Event Streaming** - JetStream provides Kafka-like streaming
537
+ - **IoT Messaging** - Low overhead, high performance for edge devices
538
+ - **Real-Time Updates** - WebSocket/SSE alternative for live data
539
+ - **Command/Control** - Distribute commands to workers
540
+ - **Service Discovery** - Dynamic service registration and lookup
541
+
542
+ **Integrates well with:**
543
+
544
+ - Language overlays (Node.js, Python, Go, .NET, Java) with NATS clients
545
+ - Observability stack (OTEL Collector, Prometheus) for metrics
546
+ - Microservice architectures requiring fast messaging
547
+
548
+ ## NATS vs Other Messaging Systems
549
+
550
+ | Feature | NATS | RabbitMQ | Redpanda/Kafka |
551
+ | ------------------ | ------------------ | ---------------- | --------------- |
552
+ | **Latency** | ✅ Microseconds | ⚠️ Milliseconds | ⚠️ Milliseconds |
553
+ | **Throughput** | ✅ Very high | ✅ High | ✅ Very high |
554
+ | **Resource Usage** | ✅ Minimal | ⚠️ Moderate | ⚠️ High |
555
+ | **Complexity** | ✅ Simple | ⚠️ Moderate | ⚠️ Complex |
556
+ | **Persistence** | ✅ JetStream | ✅ Native | ✅ Native |
557
+ | **Protocol** | Text-based | AMQP (binary) | Binary |
558
+ | **Use Case** | Microservices, IoT | Task queues, RPC | Event streaming |
559
+ | **Setup** | ✅ Seconds | ⚠️ Minutes | ⚠️ Minutes |
560
+
561
+ **Recommendation:** Use NATS for microservices and real-time messaging where speed and simplicity matter. Use RabbitMQ for complex routing and task queues. Use Redpanda/Kafka for high-volume event streaming.
562
+
563
+ ## Messaging Patterns
564
+
565
+ ### Publish/Subscribe
566
+
567
+ ```
568
+ Publisher → Subject "updates.>" → Subscriber 1
569
+ → Subscriber 2
570
+ → Subscriber 3
571
+ ```
572
+
573
+ All subscribers receive every message on matching subjects.
574
+
575
+ ### Request/Reply
576
+
577
+ ```
578
+ Client → Request "api.user.get" → Service
579
+ ← Reply ─────────────────────┘
580
+ ```
581
+
582
+ Synchronous RPC-style communication.
583
+
584
+ ### Queue Groups
585
+
586
+ ```
587
+ Publisher → Subject → Queue Group "workers"
588
+ → Worker 1 (gets msg 1, 3, 5...)
589
+ → Worker 2 (gets msg 2, 4, 6...)
590
+ ```
591
+
592
+ Load balancing across workers.
593
+
594
+ ### Subject Hierarchy
595
+
596
+ ```
597
+ events.user.created
598
+ events.user.updated
599
+ events.order.created
600
+ events.order.shipped
601
+
602
+ Subscribe to:
603
+ - "events.user.*" → user events only
604
+ - "events.>" → all events
605
+ - "events.*.created" → all created events
606
+ ```
607
+
608
+ ## Troubleshooting
609
+
610
+ ### Service Not Starting
611
+
612
+ **Check logs:**
613
+
614
+ ```bash
615
+ docker logs nats
616
+ ```
617
+
618
+ **Common issues:**
619
+
620
+ - Port conflicts (4222 or 8222 already in use)
621
+ - Volume permission issues
622
+ - Insufficient disk space for JetStream
623
+
624
+ ### Cannot Connect to NATS
625
+
626
+ **Verify service is running:**
627
+
628
+ ```bash
629
+ docker ps | grep nats
630
+ ```
631
+
632
+ **Check health:**
633
+
634
+ ```bash
635
+ curl http://localhost:8222/healthz
636
+ ```
637
+
638
+ **Test connectivity:**
639
+
640
+ ```bash
641
+ # From dev container
642
+ curl http://nats:8222/varz
643
+ ```
644
+
645
+ ### Messages Not Being Received
646
+
647
+ **Check subscriptions:**
648
+
649
+ ```bash
650
+ curl http://localhost:8222/subsz | jq
651
+ ```
652
+
653
+ **Verify subject matches:**
654
+ NATS subjects are case-sensitive and must match exactly.
655
+
656
+ **Check queue group:**
657
+ If using queue groups, only one member receives each message.
658
+
659
+ ### JetStream Issues
660
+
661
+ **Check JetStream is enabled:**
662
+
663
+ ```bash
664
+ curl http://localhost:8222/jsz | jq
665
+ ```
666
+
667
+ **Verify stream exists:**
668
+
669
+ ```bash
670
+ docker exec nats nats stream list
671
+ ```
672
+
673
+ **Check consumer status:**
674
+
675
+ ```bash
676
+ docker exec nats nats consumer info STREAMNAME CONSUMERNAME
677
+ ```
678
+
679
+ ### Performance Issues
680
+
681
+ **Monitor server stats:**
682
+
683
+ ```bash
684
+ curl http://localhost:8222/varz | jq
685
+ ```
686
+
687
+ **Check memory usage:**
688
+
689
+ ```bash
690
+ docker stats nats
691
+ ```
692
+
693
+ **Review slow consumers:**
694
+
695
+ ```bash
696
+ curl http://localhost:8222/connz?state=slow_consumer | jq
697
+ ```
698
+
699
+ ## Security Considerations
700
+
701
+ ⚠️ **Development Configuration:**
702
+
703
+ - No authentication enabled by default
704
+ - Suitable for local development only
705
+ - Do not expose ports publicly
706
+
707
+ **Production Recommendations:**
708
+
709
+ - Enable user authentication
710
+ - Use TLS for encryption
711
+ - Configure authorization rules
712
+ - Enable accounts for multi-tenancy
713
+ - Monitor security logs
714
+ - Regularly update NATS version
715
+
716
+ **Enabling Authentication (production):**
717
+
718
+ ```bash
719
+ # Create nats.conf
720
+ authentication {
721
+ users = [
722
+ {user: "app", password: "secret"}
723
+ ]
724
+ }
725
+ ```
726
+
727
+ See [NATS Security Documentation](https://docs.nats.io/running-a-nats-service/configuration/securing_nats) for details.
728
+
729
+ ## Related Overlays
730
+
731
+ **Alternative Messaging Systems:**
732
+
733
+ - `rabbitmq` - AMQP message broker (better for complex routing)
734
+ - `redpanda` - Kafka-compatible streaming (better for high-volume logs)
735
+
736
+ **Complementary Overlays:**
737
+
738
+ - Language overlays - Application development with NATS clients
739
+ - `otel-collector` - Distributed tracing and metrics
740
+ - `prometheus` - Metrics collection from NATS
741
+ - `grafana` - Visualization of messaging metrics
742
+
743
+ ## Additional Resources
744
+
745
+ - [Official NATS Documentation](https://docs.nats.io/)
746
+ - [NATS by Example](https://natsbyexample.com/)
747
+ - [JetStream Documentation](https://docs.nats.io/nats-concepts/jetstream)
748
+ - [NATS Client Libraries](https://docs.nats.io/using-nats/developer)
749
+ - [NATS Design Philosophy](https://docs.nats.io/nats-concepts/overview)
750
+
751
+ ## Notes
752
+
753
+ - NATS is written in Go for high performance
754
+ - Subject names are hierarchical and case-sensitive
755
+ - Wildcards: `*` matches one token, `>` matches multiple tokens
756
+ - JetStream provides persistence and exactly-once delivery
757
+ - Core NATS is fire-and-forget (at-most-once delivery)
758
+ - Maximum message size is 1 MB by default
759
+ - Supports both binary and JSON message formats
760
+ - Monitoring endpoint provides JSON stats
761
+ - Can run in cluster mode for high availability
762
+ - Very low memory and CPU footprint