{ "module": "nats", "version": "1", "provides": [ { "name": "mesh-bus", "scope": "mesh" } ], "claims": [ { "name": "mesh-broker", "scope": "mesh" } ], "bus-users": "/var/lib/nats-module/conf/accounts.conf", "capabilities": [ "container-runtime" ], "emits": [], "consumes": [], "listens": [ { "port": 4222, "protocol": "tcp", "from": "mesh", "why": "the mesh bus \u2014 every link the mesh has, over TLS, reached across the overlay" } ], "guards": [ 8222 ], "resources": [ { "id": "jetstream-data", "type": "directory", "path": "/var/lib/mesh-broker-nats", "mode": "0700" }, { "id": "conf-dir", "type": "directory", "path": "/var/lib/nats-module/conf", "mode": "0700" }, { "id": "server-conf", "type": "file", "path": "/var/lib/nats-module/conf/nats.conf", "content": "# The nats module's own server settings. Declared by the module, because a port, a TLS path\n# and a store directory are properties of the container this module raises: they live in its\n# image and its mounts and change when it does.\n#\n# The mesh writes accounts.conf beside this one and nothing else. A controller that wrote the\n# whole file would have to be kept in step with a Dockerfile it never sees.\n\nport: 4222\nhttp: 127.0.0.1:8222\n\n# The mesh's own broker certificate \u2014 the one every machine already pins by fingerprint and the\n# controller already trusts (MESH_BROKER_CERTIFICATE). Serving the new bus with it means no\n# machine's pin changes when it moves, and no second certificate exists to be wrong about.\ntls {\n cert_file: \"/tls/tls.crt\"\n key_file: \"/tls/tls.key\"\n}\n\n# **No `verify`, deliberately, and it was `verify: true` until a probe ran this image.** That\n# setting makes the server demand a *client* certificate, and nothing in the mesh presents one: a\n# host pins this server's exact certificate and authenticates with the password the mesh minted\n# (novox/hq ADR 0004, design 25 \u00a74), and so does a module's runtime. With it on, every connection\n# in the mesh is refused at the TLS handshake, before any password is looked at \u2014 and the error is\n# \"client didn't provide a certificate\", which reads as a client fault.\n#\n# TLS is still required: a tls block is what makes it required, and verify only decides whether\n# client certificates are checked. What is given up is a second factor the mesh has no machinery\n# to issue or rotate \u2014 a certificate per module per node \u2014 and what is kept is stronger than a\n# name check in both directions: an exact pin outward, a per-user password inward.\n\njetstream {\n store_dir: \"/data\"\n}\n\n# Every user of the mesh, composed by the controller and rewritten whenever a module is\n# assigned, a node enrols or a person's access changes.\n#\n# **Relative, and in this same directory, because it has to be.** An absolute include path is\n# resolved relative to the including file's directory, not from the root: nats-server given\n# `include /etc/nats/accounts.conf` from /etc/nats-server/nats.conf looks for\n# /etc/nats-server/etc/nats/accounts.conf and refuses to start. Verified against the server.\ninclude accounts.conf\n", "mode": "0644" }, { "id": "server", "type": "container", "name": "mesh-broker-nats", "ports": [ "4222:4222", "127.0.0.1:8222:8222" ], "volumes": [ "/var/lib/mesh-broker-nats:/data", "/var/lib/nats-module/conf:/etc/nats:ro", "/var/lib/mesh-broker-tls:/tls:ro" ], "artifact": "server" } ], "accesses": [ { "path": "/var/lib/mesh-broker-tls", "mode": "read" } ], "build": { "on": [ { "arg": "NATS_BASE", "image": "nats@sha256:b83efabe3e7def1e0a4a31ec6e078999bb17c80363f881df35edc70fcb6bb927" } ], "artifacts": [ { "name": "server", "kind": "image", "from": "Dockerfile" } ] } }