No definition names this installation
keycloak, minio and n8n are told their names from their route bindings; mailu takes its domain, site name, website and proxy address as settings and its front's name from its route, and the provisioner reads the domain from the merged config; builder and route-proxy package the controller from the git seat; the applications built outside the mesh say so per container; matrix says which of the world's servers it means; the site module is named website, and the why prose no longer names a name (novox/hq ADR 0155, issues 122 and 134). module check passes over all 77.
This commit is contained in:
@@ -13,17 +13,32 @@
|
||||
// it to both ends; mailu sets exactly that password every run — so a rotation takes — and seals
|
||||
// nothing: the consumer already has its copy through the mesh's own channel.
|
||||
|
||||
import { readFileSync } from "node:fs";
|
||||
import { runProvisioner, type Provision } from "@novox/mesh-sdk/provisioner";
|
||||
import { MailuClient } from "../client.js";
|
||||
|
||||
const mailu = MailuClient.fromEnv();
|
||||
|
||||
// The mail server's own domain. From the environment the manifest composes, because the client's
|
||||
// config file carries the admin API's coordinates, not the mail domain.
|
||||
// The mail server's own domain: the operator's value, from the settings the mesh merges into this
|
||||
// module's config file (`settings set mailu` with {"domain": …}; novox/hq ADR 0112, ADR 0155). A
|
||||
// definition names no mesh, so it is never a literal in the manifest — and it used to be, as
|
||||
// MESH_MAILU_DOMAIN, which is still read for a mesh that has not re-registered the manifest.
|
||||
function domain(): string {
|
||||
const file = process.env.MESH_MAILU_CONFIG_FILE;
|
||||
if (file) {
|
||||
try {
|
||||
const config = JSON.parse(readFileSync(file, "utf8")) as { domain?: unknown };
|
||||
if (typeof config.domain === "string" && config.domain.trim() !== "") return config.domain.trim();
|
||||
} catch {
|
||||
// Unreadable or not JSON: fall through to the environment, and the error below names both.
|
||||
}
|
||||
}
|
||||
const named = (process.env.MESH_MAILU_DOMAIN ?? "").trim();
|
||||
if (named === "") {
|
||||
throw new Error("MESH_MAILU_DOMAIN is not set, so a consumer's address cannot be composed");
|
||||
throw new Error(
|
||||
"no mail domain is set, so a consumer's address cannot be composed — `settings set mailu <file>` " +
|
||||
'with {"domain": "<the mail domain>"}',
|
||||
);
|
||||
}
|
||||
return named;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user