Capture the genesis template from mesh-host's branch of this package
mesh/merge-gate out of date: judged against trunk bfc79c64d989, the trunk is now 617881c3093d; judged again on a recheck or when it is merged
mesh/repo-check out of date: judged against trunk bfc79c64d989, the trunk is now 617881c3093d; judged again on a recheck or when it is merged
mesh/delivery superseded: a newer head of the same pull request
mesh/merge-gate out of date: judged against trunk bfc79c64d989, the trunk is now 617881c3093d; judged again on a recheck or when it is merged
mesh/repo-check out of date: judged against trunk bfc79c64d989, the trunk is now 617881c3093d; judged again on a recheck or when it is merged
mesh/delivery superseded: a newer head of the same pull request
The template at mesh-host c8920622 carries the controller's grant to write the two record mirrors and say their events; the genesis template test holds the controller's composition to it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
+79
-29
@@ -28,11 +28,12 @@
|
|||||||
// image, and this file is applied on a machine with no mesh to ask about anything (ADR 0006). The
|
// image, and this file is applied on a machine with no mesh to ask about anything (ADR 0006). The
|
||||||
// registry prefix is the lab's; the digests are upstream's.
|
// registry prefix is the lab's; the digests are upstream's.
|
||||||
//
|
//
|
||||||
// The store's data is a NAMED VOLUME, not a directory on the machine. A directory the host
|
// **The store is raised where the `postgres` module keeps it** (novox/hq ADR 0338): the container
|
||||||
// creates is owned by root, and the database runs as somebody else inside the container — so it
|
// `postgres`, on the module's pgvector image, its data in the directory /var/lib/mesh-store owned by
|
||||||
// could not write, and the container crash-looped. A named volume lets the image set up its own
|
// the image's postgres user, its superuser password read from the module's own-secret file — so the
|
||||||
// ownership, and outlives the container, which is what you want for the thing holding the mesh's
|
// store step adopts it as it runs. Pinned upstream by the module's own digest, not through the lab's
|
||||||
// state.
|
// registry prefix, because the two must be the same reference (mesh-host internal/bootstrap holds
|
||||||
|
// them to each other against the module's manifest).
|
||||||
|
|
||||||
{
|
{
|
||||||
"declaration": 1,
|
"declaration": 1,
|
||||||
@@ -83,17 +84,28 @@
|
|||||||
"boot": "enabled",
|
"boot": "enabled",
|
||||||
"restart-on": ["base-filter"]
|
"restart-on": ["base-filter"]
|
||||||
},
|
},
|
||||||
|
// The store's data is a directory owned by the image's postgres user (999), made before the
|
||||||
|
// container starts: a directory the runtime made would be root's, and the database could not
|
||||||
|
// write it. Measured on the module's image 2026-10-13: it initialises a new store on a directory
|
||||||
|
// made so (novox/hq ADR 0338 §5).
|
||||||
|
{
|
||||||
|
"id": "store-data",
|
||||||
|
"type": "directory",
|
||||||
|
"path": "/var/lib/mesh-store",
|
||||||
|
"mode": "0700",
|
||||||
|
"owner": "999:70"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "store",
|
"id": "store",
|
||||||
"type": "container",
|
"type": "container",
|
||||||
"name": "mesh-store",
|
"name": "postgres",
|
||||||
"image": "192.0.2.250:5000/postgres@sha256:7abf537131b66ed5af448d90653abf1679b0c7e9a1f07efdd4c3108a401b259a",
|
"image": "pgvector/pgvector@sha256:cf134a767f474095eeba57e0117be8e568e011a63f33fbf252f14c9b760f8e6f",
|
||||||
"env": {
|
"env": {
|
||||||
"POSTGRES_PASSWORD": "bootstrap",
|
"POSTGRES_PASSWORD": "bootstrap",
|
||||||
"PGDATA": "/var/lib/postgresql/data/pgdata"
|
"PGDATA": "/var/lib/postgresql/data/pgdata"
|
||||||
},
|
},
|
||||||
"ports": ["5432:5432"],
|
"ports": ["5432:5432"],
|
||||||
"volumes": ["mesh-store-data:/var/lib/postgresql/data"]
|
"volumes": ["/var/lib/mesh-store:/var/lib/postgresql/data"]
|
||||||
},
|
},
|
||||||
// Over TCP, not the socket. While the store initialises it runs a temporary server on the
|
// Over TCP, not the socket. While the store initialises it runs a temporary server on the
|
||||||
// socket ONLY, then stops it and starts the real one — so a socket check passes, the action
|
// socket ONLY, then stops it and starts the real one — so a socket check passes, the action
|
||||||
@@ -102,21 +114,21 @@
|
|||||||
{
|
{
|
||||||
"id": "store-ready",
|
"id": "store-ready",
|
||||||
"type": "action",
|
"type": "action",
|
||||||
"in": "mesh-store",
|
"in": "postgres",
|
||||||
"command": ["sh", "-c", "for i in $(seq 1 180); do pg_isready -h 127.0.0.1 -U postgres >/dev/null 2>&1 && exit 0; sleep 1; done; echo 'the store did not answer within 180s; its own last words follow'; pg_isready -h 127.0.0.1 -U postgres; tail -n 20 /var/lib/postgresql/data/log/*.log 2>/dev/null; exit 1"],
|
"command": ["sh", "-c", "for i in $(seq 1 180); do pg_isready -h 127.0.0.1 -U postgres >/dev/null 2>&1 && exit 0; sleep 1; done; echo 'the store did not answer within 180s; its own last words follow'; pg_isready -h 127.0.0.1 -U postgres; tail -n 20 /var/lib/postgresql/data/log/*.log 2>/dev/null; exit 1"],
|
||||||
"verify": ["pg_isready", "-h", "127.0.0.1", "-U", "postgres"]
|
"verify": ["pg_isready", "-h", "127.0.0.1", "-U", "postgres"]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "inventory-database",
|
"id": "inventory-database",
|
||||||
"type": "action",
|
"type": "action",
|
||||||
"in": "mesh-store",
|
"in": "postgres",
|
||||||
"command": ["sh", "-c", "psql -U postgres -c 'CREATE DATABASE inventory'"],
|
"command": ["sh", "-c", "psql -U postgres -c 'CREATE DATABASE inventory'"],
|
||||||
"verify": ["sh", "-c", "psql -U postgres -lqt | cut -d'|' -f1 | grep -qw inventory"]
|
"verify": ["sh", "-c", "psql -U postgres -lqt | cut -d'|' -f1 | grep -qw inventory"]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "identity-database",
|
"id": "identity-database",
|
||||||
"type": "action",
|
"type": "action",
|
||||||
"in": "mesh-store",
|
"in": "postgres",
|
||||||
"command": ["sh", "-c", "psql -U postgres -c 'CREATE DATABASE identity'"],
|
"command": ["sh", "-c", "psql -U postgres -c 'CREATE DATABASE identity'"],
|
||||||
"verify": ["sh", "-c", "psql -U postgres -lqt | cut -d'|' -f1 | grep -qw identity"]
|
"verify": ["sh", "-c", "psql -U postgres -lqt | cut -d'|' -f1 | grep -qw identity"]
|
||||||
},
|
},
|
||||||
@@ -126,20 +138,44 @@
|
|||||||
{
|
{
|
||||||
"id": "licences-database",
|
"id": "licences-database",
|
||||||
"type": "action",
|
"type": "action",
|
||||||
"in": "mesh-store",
|
"in": "postgres",
|
||||||
"command": ["sh", "-c", "psql -U postgres -c 'CREATE DATABASE licences'"],
|
"command": ["sh", "-c", "psql -U postgres -c 'CREATE DATABASE licences'"],
|
||||||
"verify": ["sh", "-c", "psql -U postgres -lqt | cut -d'|' -f1 | grep -qw licences"]
|
"verify": ["sh", "-c", "psql -U postgres -lqt | cut -d'|' -f1 | grep -qw licences"]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "context-schemas",
|
"id": "context-schemas",
|
||||||
"type": "action",
|
"type": "action",
|
||||||
"command": ["docker", "run", "--rm", "--network", "container:mesh-store",
|
"command": ["docker", "run", "--rm", "--network", "container:postgres",
|
||||||
"-e", "MESH_STORE_INVENTORY=postgres://postgres:bootstrap@127.0.0.1:5432/inventory?sslmode=disable",
|
"-e", "MESH_STORE_INVENTORY=postgres://postgres:bootstrap@127.0.0.1:5432/inventory?sslmode=disable",
|
||||||
"-e", "MESH_STORE_IDENTITY=postgres://postgres:bootstrap@127.0.0.1:5432/identity?sslmode=disable",
|
"-e", "MESH_STORE_IDENTITY=postgres://postgres:bootstrap@127.0.0.1:5432/identity?sslmode=disable",
|
||||||
"-e", "MESH_STORE_LICENCES=postgres://postgres:bootstrap@127.0.0.1:5432/licences?sslmode=disable",
|
"-e", "MESH_STORE_LICENCES=postgres://postgres:bootstrap@127.0.0.1:5432/licences?sslmode=disable",
|
||||||
"192.0.2.250:5000/mesh-controller@sha256:c67db38439ff0aee242b467486765467bb95801f52175fc5727cc4e437338ace",
|
"192.0.2.250:5000/mesh-controller@sha256:c67db38439ff0aee242b467486765467bb95801f52175fc5727cc4e437338ace",
|
||||||
"migrate"],
|
"migrate"],
|
||||||
"verify": ["sh", "-c", "docker exec mesh-store psql -U postgres -d inventory -tAc \"select to_regclass('public.node')\" | grep -qx node && docker exec mesh-store psql -U postgres -d identity -tAc \"select to_regclass('public.signing_key')\" | grep -qx signing_key && docker exec mesh-store psql -U postgres -d licences -tAc \"select to_regclass('public.licence')\" | grep -qx licence"]
|
"verify": ["sh", "-c", "docker exec postgres psql -U postgres -d inventory -tAc \"select to_regclass('public.node')\" | grep -qx node && docker exec postgres psql -U postgres -d identity -tAc \"select to_regclass('public.signing_key')\" | grep -qx signing_key && docker exec postgres psql -U postgres -d licences -tAc \"select to_regclass('public.licence')\" | grep -qx licence"]
|
||||||
|
},
|
||||||
|
// **The bus is raised where the `nats` module keeps it** (novox/hq ADR 0333 §1): the container
|
||||||
|
// `mesh-broker-nats`, its configuration and user list in /var/lib/nats-module/conf, its streams in
|
||||||
|
// /var/lib/mesh-broker-nats and its certificate in /var/lib/mesh-broker-tls — the names and paths the
|
||||||
|
// catalogue's module declares. So adopting it as that module at the broker step keeps it: the
|
||||||
|
// module's built image takes the place of the upstream one below, once, on the same streams, users
|
||||||
|
// and certificate, and nothing else moves. mesh-host's internal/bootstrap holds the two to each other
|
||||||
|
// against the module's own manifest (busLayout), at the broker step and in its tests.
|
||||||
|
//
|
||||||
|
// Directories on the machine, not volumes the runtime names: the module mounts these paths, and the
|
||||||
|
// control plane, once it runs as the mesh's process, reads the certificate at its path on the machine.
|
||||||
|
// The certificate's directory is readable by everyone because the certificate is public and the control
|
||||||
|
// plane runs as nobody; its key is written 0600 by the program that makes it.
|
||||||
|
{
|
||||||
|
"id": "bus-tls-dir",
|
||||||
|
"type": "directory",
|
||||||
|
"path": "/var/lib/mesh-broker-tls",
|
||||||
|
"mode": "0755"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "bus-data-dir",
|
||||||
|
"type": "directory",
|
||||||
|
"path": "/var/lib/mesh-broker-nats",
|
||||||
|
"mode": "0700"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "bus-certificate",
|
"id": "bus-certificate",
|
||||||
@@ -151,49 +187,63 @@
|
|||||||
// it, and asking nothing of the image it writes into. Self-signed on purpose: a host pins
|
// it, and asking nothing of the image it writes into. Self-signed on purpose: a host pins
|
||||||
// this server's exact certificate (novox/hq ADR 0004), and at this moment there is no mesh
|
// this server's exact certificate (novox/hq ADR 0004), and at this moment there is no mesh
|
||||||
// to ask an authority of.
|
// to ask an authority of.
|
||||||
// `--user 0:0` because the volume is root's and this image runs as nobody, which is right
|
// `--user 0:0` because the directory is root's and this image runs as nobody, which is right
|
||||||
// for the long-running control plane and wrong for a one-shot writing into a fresh volume.
|
// for the long-running control plane and wrong for a one-shot writing into a fresh directory.
|
||||||
"command": ["docker", "run", "--rm", "--user", "0:0", "-v", "mesh-broker-tls:/tls",
|
"command": ["docker", "run", "--rm", "--user", "0:0", "-v", "/var/lib/mesh-broker-tls:/tls",
|
||||||
"192.0.2.250:5000/mesh-controller@sha256:c67db38439ff0aee242b467486765467bb95801f52175fc5727cc4e437338ace",
|
"192.0.2.250:5000/mesh-controller@sha256:c67db38439ff0aee242b467486765467bb95801f52175fc5727cc4e437338ace",
|
||||||
"broker", "certificate", "--into", "/tls"],
|
"broker", "certificate", "--into", "/tls"],
|
||||||
"verify": ["docker", "run", "--rm", "--user", "0:0", "-v", "mesh-broker-tls:/tls",
|
"verify": ["docker", "run", "--rm", "--user", "0:0", "-v", "/var/lib/mesh-broker-tls:/tls",
|
||||||
"192.0.2.250:5000/mesh-controller@sha256:c67db38439ff0aee242b467486765467bb95801f52175fc5727cc4e437338ace",
|
"192.0.2.250:5000/mesh-controller@sha256:c67db38439ff0aee242b467486765467bb95801f52175fc5727cc4e437338ace",
|
||||||
"broker", "certificate", "--check", "--into", "/tls"]
|
"broker", "certificate", "--check", "--into", "/tls"]
|
||||||
},
|
},
|
||||||
|
// **Seeds, written only where nothing is** (create-once). The bus's configuration and user list are
|
||||||
|
// the bundle's until the bus is adopted, and the module's from then on (ADR 0333 §4): an installer
|
||||||
|
// run again after the adoption applies this bundle again, and an ordinary file would put the
|
||||||
|
// bundle's one user back over every user the mesh composed, and leave the node unable to reach its
|
||||||
|
// bus. Until the adoption the installer places the composed list over the seed (enrol.go).
|
||||||
{
|
{
|
||||||
"id": "bus-conf-dir",
|
"id": "bus-conf-dir",
|
||||||
"type": "directory",
|
"type": "directory",
|
||||||
"path": "/var/lib/mesh-bus-conf",
|
"path": "/var/lib/nats-module/conf",
|
||||||
"mode": "0700"
|
"mode": "0700"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "bus-conf",
|
"id": "bus-conf",
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"path": "/var/lib/mesh-bus-conf/nats.conf",
|
"path": "/var/lib/nats-module/conf/nats.conf",
|
||||||
"mode": "0644",
|
"mode": "0644",
|
||||||
"content": "port: 4222\nhttp: 127.0.0.1:8222\n\ntls {\n cert_file: \"/tls/tls.crt\"\n key_file: \"/tls/tls.key\"\n}\n\njetstream {\n store_dir: \"/data\"\n}\n\ninclude accounts.conf\n"
|
"create-once": true,
|
||||||
|
"content": "port: 4222\nhttp: 0.0.0.0:8222\n\ntls {\n cert_file: \"/tls/tls.crt\"\n key_file: \"/tls/tls.key\"\n}\n\njetstream {\n store_dir: \"/data\"\n}\n\ninclude accounts.conf\n"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "bus-accounts",
|
"id": "bus-accounts",
|
||||||
"type": "file",
|
"type": "file",
|
||||||
"path": "/var/lib/mesh-bus-conf/accounts.conf",
|
"path": "/var/lib/nats-module/conf/accounts.conf",
|
||||||
"mode": "0600",
|
"mode": "0600",
|
||||||
"content": "// The first user list, carried by the installer because at genesis there is no mesh to\n// compose one. A bootstrap credential, rotated with the store's and replaced by the\n// controller's own composition from its first start onward.\naccounts {\n MESH {\n jetstream: enabled\n users = [\n { user: \"controller\", password: \"$2a$10$AHqJgOifIVbU41KmATiMhuXFs8xa7Wl2HuN4UVBCXdN2jIQzjqApy\", permissions: {\n publish: { allow: [\"$JS.ACK.CONTROL.controller.>\", \"$JS.ACK.EVENTS.controller.>\", \"$JS.ACK.DEAD_LETTER_NOTICES.controller.>\", \"$JS.API.>\", \"$KV.mesh-controller_asked.>\", \"$KV.mesh-controller_calls.>\", \"$KV.mesh-controller_hand-acts.>\", \"$KV.mesh-controller_conditions.>\", \"$KV.mesh-controller_condition-history.>\", \"$KV.mesh-controller_lease.>\", \"$KV.SEAT_MESH_BUILD_MACHINE_cancelled.>\", \"$KV.SEAT_NODE_BUILD_AGENT_cancelled.>\", \"_INBOX.enrol.>\", \"mesh.assignment.>\", \"mesh.mod.*.tool.>\", \"mesh.node.>\", \"mesh.seat.mesh-build-machine.accept.>\", \"mesh.seat.node-build-agent.accept.>\", \"mesh.seat.mesh-build-machine.tool.>\", \"mesh.seat.node-build-agent.tool.>\", \"mesh.seat.mesh-controller.event.applied\", \"mesh.seat.mesh-controller.event.built-before\", \"mesh.seat.mesh-controller.event.refused\", \"mesh.seat.mesh-controller.event.rolled-back\", \"mesh.seat.mesh-controller.event.checked\", \"mesh.seat.mesh-controller.event.plan-moved\", \"mesh.seat.mesh-controller.event.condition-raised\", \"mesh.seat.mesh-controller.event.condition-changed\", \"mesh.seat.mesh-controller.event.condition-cleared\", \"mesh.seat.mesh-controller.event.doctor-heartbeat\", \"mesh.seat.mesh-controller.event.secret-replaced\", \"mesh.seat.mesh-controller.event.healer-acted\", \"$SRV.INFO\", \"mesh.seat.node-intrusion-prevention.tool.banned.*\", \"mesh.seat.node-backup.tool.backed-up.*\", \"mesh.seat.node-backup.tool.now.*\", \"mesh.seat.mesh-delivery.tool.stalled\", \"mesh.seat.mesh-delivery.tool.close\", \"mesh.seat.node-launcher.tool.secret.*\", \"mesh.seat.mesh-delivery.tool.release\", \"mesh.seat.mesh-delivery.tool.stop\", \"mesh.seat.mesh-delivery.tool.times\", \"mesh.seat.mesh-delivery.tool.groups\", \"mesh.seat.node-service-manager.tool.restart.*\", \"mesh.seat.mesh-controller.tool.plans\", \"mesh.events.dead.>\", \"mesh.again.>\"] }\n subscribe: { allow: [\"$JS.API.>\", \"$JS.EVENT.ADVISORY.CONSUMER.MAX_DELIVERIES.>\", \"$JS.EVENT.ADVISORY.CONSUMER.DELETED.>\", \"_DELIVER.controller\", \"_DELIVER.controller.>\", \"_INBOX.controller.>\", \"mesh.control.>\", \"mesh.mod.*.event.provisioner.failing\", \"mesh.mod.*.event.provisioner.recovered\", \"mesh.mod.*.event.provisioner.retirement\", \"mesh.mod.gitea.event.pull.merged\", \"mesh.mod.gitea.event.pull.updated\", \"mesh.mod.mesh-catalog.event.catching-up\", \"mesh.mod.mesh-catalog.event.upgraded\", \"mesh.seat.mesh-build-machine.event.built\", \"mesh.seat.node-build-agent.event.built\", \"mesh.seat.operator-channel.event.decided.mesh-controller\", \"mesh.seat.mesh-controller.tool.>\", \"$SRV.PING\", \"$SRV.INFO\", \"$SRV.PING.mesh-controller\", \"$SRV.PING.mesh-controller.>\", \"$SRV.INFO.mesh-controller\", \"$SRV.INFO.mesh-controller.>\", \"$SRV.STATS\", \"$SRV.STATS.mesh-controller\", \"$SRV.STATS.mesh-controller.>\"] }\n allow_responses: { max: 1, ttl: \"1m\" }\n } }\n ]\n }\n}\n"
|
"create-once": true,
|
||||||
|
"content": "// The first user list, carried by the installer because at genesis there is no mesh to\n// compose one. A bootstrap credential, rotated with the store's and replaced by the\n// controller's own composition from its first start onward.\naccounts {\n MESH {\n jetstream: enabled\n users = [\n { user: \"controller\", password: \"$2a$10$AHqJgOifIVbU41KmATiMhuXFs8xa7Wl2HuN4UVBCXdN2jIQzjqApy\", permissions: {\n publish: { allow: [\"$JS.ACK.CONTROL.controller.>\", \"$JS.ACK.EVENTS.controller.>\", \"$JS.ACK.DEAD_LETTER_NOTICES.controller.>\", \"$JS.API.>\", \"$KV.mesh-controller_asked.>\", \"$KV.mesh-controller_assignments.>\", \"$KV.mesh-controller_calls.>\", \"$KV.mesh-controller_hand-acts.>\", \"$KV.mesh-controller_conditions.>\", \"$KV.mesh-controller_condition-history.>\", \"$KV.mesh-controller_declared-config.>\", \"$KV.mesh-controller_lease.>\", \"$KV.SEAT_MESH_BUILD_MACHINE_cancelled.>\", \"$KV.SEAT_NODE_BUILD_AGENT_cancelled.>\", \"_INBOX.enrol.>\", \"mesh.assignment.>\", \"mesh.mod.*.tool.>\", \"mesh.node.>\", \"mesh.seat.mesh-build-machine.accept.>\", \"mesh.seat.node-build-agent.accept.>\", \"mesh.seat.mesh-build-machine.tool.>\", \"mesh.seat.node-build-agent.tool.>\", \"mesh.seat.mesh-controller.event.applied\", \"mesh.seat.mesh-controller.event.built-before\", \"mesh.seat.mesh-controller.event.refused\", \"mesh.seat.mesh-controller.event.rolled-back\", \"mesh.seat.mesh-controller.event.checked\", \"mesh.seat.mesh-controller.event.plan-moved\", \"mesh.seat.mesh-controller.event.assignment-changed\", \"mesh.seat.mesh-controller.event.declared-config-changed\", \"mesh.seat.mesh-controller.event.condition-raised\", \"mesh.seat.mesh-controller.event.condition-changed\", \"mesh.seat.mesh-controller.event.condition-cleared\", \"mesh.seat.mesh-controller.event.doctor-heartbeat\", \"mesh.seat.mesh-controller.event.secret-replaced\", \"mesh.seat.mesh-controller.event.healer-acted\", \"$SRV.INFO\", \"mesh.seat.node-intrusion-prevention.tool.banned.*\", \"mesh.seat.node-backup.tool.backed-up.*\", \"mesh.seat.node-backup.tool.now.*\", \"mesh.seat.mesh-delivery.tool.stalled\", \"mesh.seat.mesh-delivery.tool.close\", \"mesh.seat.node-launcher.tool.secret.*\", \"mesh.seat.mesh-delivery.tool.release\", \"mesh.seat.mesh-delivery.tool.stop\", \"mesh.seat.mesh-delivery.tool.times\", \"mesh.seat.mesh-delivery.tool.groups\", \"mesh.seat.node-service-manager.tool.restart.*\", \"mesh.seat.mesh-controller.tool.plans\", \"mesh.events.dead.>\", \"mesh.again.>\"] }\n subscribe: { allow: [\"$JS.API.>\", \"$JS.EVENT.ADVISORY.CONSUMER.MAX_DELIVERIES.>\", \"$JS.EVENT.ADVISORY.CONSUMER.DELETED.>\", \"_DELIVER.controller\", \"_DELIVER.controller.>\", \"_INBOX.controller.>\", \"mesh.control.>\", \"mesh.mod.*.event.provisioner.failing\", \"mesh.mod.*.event.provisioner.recovered\", \"mesh.mod.*.event.provisioner.retirement\", \"mesh.mod.gitea.event.pull.merged\", \"mesh.mod.gitea.event.pull.updated\", \"mesh.mod.mesh-catalog.event.catching-up\", \"mesh.mod.mesh-catalog.event.upgraded\", \"mesh.seat.mesh-build-machine.event.built\", \"mesh.seat.node-build-agent.event.built\", \"mesh.seat.operator-channel.event.decided.mesh-controller\", \"mesh.seat.mesh-controller.tool.>\", \"$SRV.PING\", \"$SRV.INFO\", \"$SRV.PING.mesh-controller\", \"$SRV.PING.mesh-controller.>\", \"$SRV.INFO.mesh-controller\", \"$SRV.INFO.mesh-controller.>\", \"$SRV.STATS\", \"$SRV.STATS.mesh-controller\", \"$SRV.STATS.mesh-controller.>\"] }\n allow_responses: { max: 1, ttl: \"1m\" }\n } }\n ]\n }\n}\n"
|
||||||
},
|
},
|
||||||
|
// The upstream server, until the broker step adopts it: the `nats` module's own image, built by the
|
||||||
|
// mesh, takes its place there once, on these same directories (ADR 0333 §3), as the bus's planned
|
||||||
|
// step (ADR 0236). The release is the one the module's image is built on (its NATS_BASE, 2.11.17),
|
||||||
|
// pinned upstream by that same digest: the adoption changes no server release, so it can be undone
|
||||||
|
// by putting the old image back and is said reversible. The published port is the
|
||||||
|
// node's bus port, 5671 unless given, which every enrolment token names; the installer gives the
|
||||||
|
// module the setting that maps its declared 4222 to it (ADR 0333 §2).
|
||||||
{
|
{
|
||||||
"id": "broker",
|
"id": "broker",
|
||||||
"type": "container",
|
"type": "container",
|
||||||
"name": "mesh-broker",
|
"name": "mesh-broker-nats",
|
||||||
"image": "192.0.2.250:5000/nats@sha256:b83efabe3e7def1e0a4a31ec6e078999bb17c80363f881df35edc70fcb6bb927",
|
"image": "nats@sha256:e4bf19f15fd3218814a4e3c9e0064e1334bd8aa20d5984b9f1a0afd084f8cc00",
|
||||||
"ports": ["5671:4222", "127.0.0.1:8222:8222"],
|
"ports": ["5671:4222", "127.0.0.1:8222:8222"],
|
||||||
"volumes": ["mesh-broker-data:/data", "mesh-broker-tls:/tls:ro", "/var/lib/mesh-bus-conf:/etc/nats:ro"],
|
"volumes": ["/var/lib/mesh-broker-nats:/data", "/var/lib/nats-module/conf:/etc/nats:ro", "/var/lib/mesh-broker-tls:/tls:ro"],
|
||||||
"args": ["-c", "/etc/nats/nats.conf", "-js"]
|
"args": ["-c", "/etc/nats/nats.conf", "-js"]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "broker-ready",
|
"id": "broker-ready",
|
||||||
"type": "action",
|
"type": "action",
|
||||||
"command": ["sh", "-c", "for i in $(seq 1 60); do docker run --rm --network host --entrypoint sh 192.0.2.250:5000/nats@sha256:b83efabe3e7def1e0a4a31ec6e078999bb17c80363f881df35edc70fcb6bb927 -c 'nc -z 127.0.0.1 5671' >/dev/null 2>&1 && exit 0; sleep 1; done; exit 1"],
|
"command": ["sh", "-c", "for i in $(seq 1 60); do docker run --rm --network host --entrypoint sh nats@sha256:e4bf19f15fd3218814a4e3c9e0064e1334bd8aa20d5984b9f1a0afd084f8cc00 -c 'nc -z 127.0.0.1 5671' >/dev/null 2>&1 && exit 0; sleep 1; done; exit 1"],
|
||||||
"verify": ["sh", "-c", "docker run --rm --network host --entrypoint sh 192.0.2.250:5000/nats@sha256:b83efabe3e7def1e0a4a31ec6e078999bb17c80363f881df35edc70fcb6bb927 -c 'nc -z 127.0.0.1 5671'"]
|
"verify": ["sh", "-c", "docker run --rm --network host --entrypoint sh nats@sha256:e4bf19f15fd3218814a4e3c9e0064e1334bd8aa20d5984b9f1a0afd084f8cc00 -c 'nc -z 127.0.0.1 5671'"]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "control-plane",
|
"id": "control-plane",
|
||||||
@@ -202,7 +252,7 @@
|
|||||||
"image": "192.0.2.250:5000/mesh-controller@sha256:c67db38439ff0aee242b467486765467bb95801f52175fc5727cc4e437338ace",
|
"image": "192.0.2.250:5000/mesh-controller@sha256:c67db38439ff0aee242b467486765467bb95801f52175fc5727cc4e437338ace",
|
||||||
"network": "host",
|
"network": "host",
|
||||||
"args": ["serve"],
|
"args": ["serve"],
|
||||||
"volumes": ["mesh-broker-tls:/broker-tls:ro"],
|
"volumes": ["/var/lib/mesh-broker-tls:/broker-tls:ro"],
|
||||||
"env": {
|
"env": {
|
||||||
"MESH_STORE_INVENTORY": "postgres://postgres:bootstrap@127.0.0.1:5432/inventory?sslmode=disable",
|
"MESH_STORE_INVENTORY": "postgres://postgres:bootstrap@127.0.0.1:5432/inventory?sslmode=disable",
|
||||||
"MESH_STORE_IDENTITY": "postgres://postgres:bootstrap@127.0.0.1:5432/identity?sslmode=disable",
|
"MESH_STORE_IDENTITY": "postgres://postgres:bootstrap@127.0.0.1:5432/identity?sslmode=disable",
|
||||||
|
|||||||
Reference in New Issue
Block a user