Skip to content

Tenants, Domains and Host Names

A Muppy client (a company running its own Muppy instance) gets two domains: a private one and a public one. Both are sub-domains of zones the Muppy operator runs, both are served to the client through Muppy Built-in DNS, and each App Server the client creates gets one host name on each.

Private domain Public domain
Example dome.muppy.io dome.muppy.cloud
Zone a flat OVH zone, muppy.io a Cloudflare zone, muppy.cloud, prepared as in Preparing a Cloudflare Zone for Public URLs
Reached through the host's public IP, the host firewall, Sunray Cloudflare's proxy, then the origin
Host name of an App Server <server>-<host>.dome.muppy.io <server>.dome.muppy.cloud

What a tenant is

A tenant is a client, a company, and one MBD domain per zone. On the operator's Muppy (the MBD Server), the tenant is a DNS Domain of provider MBD Server: dome.muppy.cloud, backed by the Cloudflare domain muppy.cloud, with its own SigV4 token. On the client's Muppy (the MBD Client), the same name is a DNS Domain of provider MBD Client, connected to the operator's instance with that token. The private domain works the same way over the OVH zone.

The MBD domain is the tenant. Nothing marks it as such: a domain of provider MBD Client is, by construction, a sub-domain reserved to one client. The operator creates the tenant once; the client configures its two MBD Client domains once; every host name after that is generated.

How host names are built

A Traefik application's host name comes from a FQDN generator, chosen on the App Definition for the private URL and on the Traefik Application Definition for a public one. Three generators ship, and the choice follows the domain:

Generator Produces For
App Server Tenant Private FQDN Generator <server>-<host> a private MBD Client domain
App Server Tenant Public FQDN Generator <server> a public MBD Client domain
App Server Public FQDN Generator <server>-<company>-<host> a flat zone shared between companies

<server> is the App Server name (pubcf-main-dev-cyril: code, branch, qualifier, owner), <host> the LXD host that runs it, <company> a slug of the company name. The same three exist for Code Servers with a codr- prefix.

The private name keeps the host. Two App Servers of one name on two hosts get two names: the private name is collision-proof by construction. It changes when the server moves to another host.

The public name drops the host and the company. The domain already names the company, and the host is an infrastructure detail that has no business in a public DNS. The name survives a host move. In exchange, two App Servers cannot share a public name: when a second server would take a name already served for another one, the proxy configuration refuses it and names the holder. The wizard that creates an App Server warns before provisioning when the name it previews is already taken. Choosing the public names is the client's responsibility: a public definition whose generator keeps the host is the escape hatch when two servers must carry one name.

The company slug only matters on a flat zone, where every company's servers sit side by side under the same domain. On an MBD domain it would repeat what the domain says.

Pretty names and full control

The generated public name is meant to be readable and traceable to the server it serves, not pretty. A client who wants erp.acme.com in front of erp-prod.dome.muppy.cloud gets it with a custom hostname: a CNAME on their own zone, served by the same Cloudflare chain. A client who wants full control buys a domain of their own and points it wherever they like.