novox/hq 04-ISSUES/025. Every image reference in every example module was sixty-four zeros — eighteen of them across five modules. Each parsed, resolved, and composed into a declaration a host accepts, and none could ever have started: the machine reaches `docker pull` and stops. That is why those modules were written and not running, and no check saw it because every check passed. The host validates the shape of a reference and nothing more, which is correct: verifying a digest exists means reaching a registry, and that is the one thing a host must never have to do. So the last place that could catch this is the wrong place to try. The guard therefore sits where a declaration is composed, not where a manifest is parsed. A file in a repository is allowed to await a pin — the design already says the manifest in a repository names artifacts while the manifest the mesh holds names digests, and the bundle works exactly that way. What must never happen is a placeholder reaching a machine, and composing is the last moment before one does. Twelve third-party images resolved to real digests without pulling anything, which is also the mechanism the open issue needs. Two discoveries came free: mailu publishes to ghcr rather than Docker Hub, so seven references named repositories that do not exist at all; and it renamed roundcube to webmail, so that one would have failed even with the right registry. What stays a placeholder is the mesh's own provisioner images, which genuinely have no digest until built and pushed — the bundle's problem, legitimately unresolved here. The stand-in consumer now stands in with a real image rather than an invented one.
56 lines
2.1 KiB
JSON
56 lines
2.1 KiB
JSON
{
|
|
"module": "postgres",
|
|
"version": "1",
|
|
|
|
"provides": [{"name": "postgres-database", "scope": "mesh"}],
|
|
"capabilities": ["container-runtime"],
|
|
|
|
"listens": [
|
|
{"port": 5432, "protocol": "tcp", "from": "mesh",
|
|
"why": "modules on any machine that were granted a database"}
|
|
],
|
|
|
|
"serves": {
|
|
"postgres-database": {"port": 5432}
|
|
},
|
|
|
|
"receives": {"postgres-database": "/var/lib/postgres/grants/mesh.json"},
|
|
"grants": {"postgres-database": "/var/lib/postgres/grants"},
|
|
|
|
"own-secrets": {"superuser": "/var/lib/postgres/superuser.secret"},
|
|
|
|
"resources": [
|
|
{"id": "state", "type": "directory", "path": "/var/lib/postgres", "mode": "0700"},
|
|
{"id": "grants", "type": "directory", "path": "/var/lib/postgres/grants", "mode": "0700"},
|
|
|
|
{"id": "superuser-env", "type": "file", "path": "/var/lib/postgres/superuser.env",
|
|
"mode": "0600",
|
|
"content": "POSTGRES_PASSWORD=${secret:superuser}\n"},
|
|
|
|
{"id": "net", "type": "network", "name": "postgres"},
|
|
|
|
{"id": "server", "type": "container", "name": "postgres",
|
|
"image": "postgres@sha256:7456ef82e5f5bc43d997f4781bbd7c0d6389bff397564649a356e206ba473aee",
|
|
"network": "postgres",
|
|
"env": {"POSTGRES_USER": "postgres", "POSTGRES_DB": "postgres"},
|
|
"env-file": ["/var/lib/postgres/superuser.env"],
|
|
"ports": ["5432:5432"],
|
|
"volumes": ["/services/postgres/db-data:/var/lib/postgresql/data"],
|
|
"restart-on": ["superuser-env"]},
|
|
|
|
{"id": "provisioner", "type": "container", "name": "mesh-provision-postgres",
|
|
"image": "mesh-provision-postgres@sha256:0000000000000000000000000000000000000000000000000000000000000000",
|
|
"network": "postgres",
|
|
"env": {
|
|
"GRANTS": "/var/lib/postgres/grants",
|
|
"MESH_PROVISION_POSTGRES": "postgres://postgres@postgres:5432/postgres?sslmode=disable",
|
|
"MESH_PROVISION_PASSWORD_FILE": "/run/secrets/superuser"
|
|
},
|
|
"volumes": [
|
|
"/var/lib/postgres/grants:/var/lib/postgres/grants:ro",
|
|
"/var/lib/postgres/superuser.secret:/run/secrets/superuser:ro"
|
|
],
|
|
"restart-on": ["grants", "superuser-env"]}
|
|
]
|
|
}
|