Skip to content

blissful-infra tenant

A tenant is the top level of the hierarchy. It maps to an organization and owns the shared platform services: Jenkins, Prometheus, Grafana, Tempo, Loki and optionally a local Kubernetes cluster.

Terminal window
blissful-infra tenant create acme
blissful-infra tenant up
CommandWhat it does
tenant create <name>Create a new tenant
tenant listList all tenants
tenant status [name]Show tenant detail: projects, services, ports
tenant up [name]Start the tenant’s infrastructure
tenant down [name]Stop the tenant’s infrastructure
tenant remove [name]Remove a tenant and all its projects and services

Where [name] is optional, the tenant resolves from your use context.

Terminal window
blissful-infra tenant create <name>

The name must be lowercase alphanumeric with hyphens.

FlagWhat it does
-y, --skip-promptsSkip prompts, use defaults
--no-jenkinsDo not run Jenkins
--no-prometheusDo not run Prometheus
--no-grafanaDo not run Grafana
--no-tempoDo not run Tempo
--no-lokiDo not run Loki

A slimmer tenant for when you only care about the app:

Terminal window
blissful-infra tenant create acme --no-jenkins --no-tempo --no-loki
Terminal window
blissful-infra tenant up acme
blissful-infra tenant down acme

Starts or stops the tenant’s own compose stack (docker-compose.tenant.yaml): Jenkins and observability. This does not start the projects inside it; use project up for those.

Terminal window
blissful-infra tenant remove acme

Destructive. Stops the tenant’s containers and deletes its directory under ~/.blissful-infra/tenants/, including every project and service inside it.

Each tenant gets a deterministic port block derived from its index, so tenants never collide. The first tenant lands on:

ServicePort
Grafana3000
Loki3100
Tempo3200
Gitea (kubernetes runtime)3300
Kubernetes API (kubernetes runtime)6550
Jenkins8081
ArgoCD (kubernetes runtime)8440
Prometheus9090

The second tenant gets 3001, 3101, 3201 and so on. blissful-infra tenant status prints the real allocation.

The dashboard is not in this table because it is host-level, not per-tenant. One dashboard on localhost:3002 manages every tenant.

  • project: the next level down
  • cluster: give a tenant a Kubernetes cluster
  • use: set a default tenant