Skip to content

Configuring manent#

manent reads a YAML file given with -c (or the MANENT_CONFIG variable). Every value not set takes the default listed below; unknown keys are an error. The complete example file is configs/manent.yml.

Reference#

app#

Key Default Description
name manent Name of the DBOS application and APP-NAME of the messages sent to the SIEM.
version 0.2.0 Workflow version recorded by DBOS: a worker resumes only the workflows of its own version. It is not the binary version and should be changed only when the release notes say so. See Versions and upgrades.

dbos#

Key Default Description
database_url sqlite:manent.db DBOS system database. In production Postgres: postgres://user:pass@host:5432/manent.
executor_id hostname Worker ID: must be unique among nodes and stable across restarts. See Scalability.
queue deployments Name of the deploy queue.
concurrency 4 Deploys running concurrently on each worker.
global_concurrency 0 Deploys running across all workers (0 = no limit).
environment_concurrency 1 Concurrent deploys of the same application/environment across all workers. Cannot exceed global_concurrency.
schedule_poll_interval 30s How often workers reload recurring schedules.
region Worker region: with region_routing it runs the wave rollout passes for that region.
region_routing false Runs rollout passes on the workers of the targets' region, as child workflows. In multi-region setups it must be enabled on all workers.
tenants [] Restricts the worker to the deploy queues of these tenants (the default queue for those without one). Empty: every queue of the registry.
drain_timeout 2m On shutdown the worker stops picking up deploys and waits for those in progress up to this time (0 = does not wait). See drain.

http#

Key Default Description
listen :8080 API address (can be overridden with serve --listen).
ui.enabled true Serves the web interface at /.
trusted_proxies [] Addresses or CIDRs of the reverse proxies whose X-Forwarded-For gives the client address in logs and audit. Empty: the header is ignored, so nobody can forge the address.

logging and siem#

Key Default Description
logging.level info debug, info, warn, error.
logging.format text text or json.
siem.enabled false Forwards every log to the structured log destinations.
siem.destinations [] The destinations, at least one with enabled; each forwards every message.
siem.destinations[].network udp, tcp, unixgram (local syslog socket) or journald (native protocol).
siem.destinations[].address host:port of the collector; for unixgram and journald the socket path (default /dev/log and /run/systemd/journal/socket).

See Logs and SIEM.

workdir#

Default ./work. Local directory into which each deploy downloads the artifact (workdir/<deployment-id>). It does not need to be shared between workers.

tenants#

Key Default Description
file The tenant registry (tenants.yml). Empty: no registry, every application is untenanted.
cache 30s How long the registry is kept before reading it again.
untenanted allow The applications no tenant lists: allow deploys them as the tenant untenanted, reject refuses them (details).

envconfig#

Key Default Description
providers [] The named providers, none = no environment configuration (Several providers): name, type (consul, file, git), the section of the type with the keys below, match (applications, artifacts, environments) or tenant_only, and on_missing (fail, next).
required false Makes the deploy fail if there is no configuration for the environment.
max_retries 3 Additional read attempts.
providers[].consul.address CONSUL_HTTP_ADDR or http://127.0.0.1:8500 Address of the Consul agent.
providers[].consul.datacenter Consul datacenter.
providers[].consul.key manent/{tenant}/{application}/{artifact}/{environment} KV key template.
providers[].consul.token_file File with the ACL token (alternative to CONSUL_HTTP_TOKEN).
providers[].file.path ./envconfig/{tenant}/{application}/{artifact}/{environment}.yml Path template for the file provider.
providers[].git.repository Git repository of the configurations (https://, ssh://, git://, file:// or a path). See Git repository.
providers[].git.ref refs/heads/main Default ref.
providers[].git.path {tenant}/{application}/{artifact}/{environment}.yml File template in the repository.
providers[].git.allowed_refs [] Other refs (patterns with *) config.ref may name; a SHA must be reachable from them or from providers[].git.ref.
providers[].git.username, providers[].git.password_ref HTTPS credentials (the password is a secret reference).
providers[].git.ssh_key_ref, providers[].git.known_hosts SSH key (secret reference) and known hosts file, required together.
providers[].git.ca_file Additional CA bundle for HTTPS.
providers[].git.require_signed false Refuses commits without a valid signature of providers[].git.signers (openpgp_keyring, ssh_allowed_signers).
providers[].git.max_age 0 Maximum age of a commit (0 = none); manual rollbacks are exempt.
providers[].git.cache_dir <workdir>/.git-cache Local copies of the repository.
providers[].git.ref_ttl 30s How long a ref resolution is reused before fetching again.

See Environment configuration.

callbacks#

Key Default Description
timeout 10s Timeout of each call.
max_retries 3 Additional attempts of each delivery.
allow_http false Allows http callbacks.
allowed_hosts [] Allowed hosts, including *.domain; empty = all.

See Callbacks.

rollback#

Key Default Description
locator plugin Default strategy to find the release to go back to.
artifact_types.<type>.allowed application, container, kubernetes, ecs, lambda, cloudrun: true; migration: false Rollback is possible for the type. Types not listed do not allow it.
artifact_types.<type>.enabled false Default for deploys of the type. Requires allowed.
artifact_types.<type>.on [deploy, post-test, activation] Steps whose failure triggers rollback.
artifact_types.<type>.locator Type-specific locator.

See Rollback.

auth, rbac, audit#

Key Default Description
auth.mode none none: no authentication or permissions (development only). enabled: bearer token required and RBAC.
auth.oidc issuer, audience, username_claim, groups_claim, ca_file, policy_claims (default [email, name]: claims exposed to the permission policy).
auth.tokens [] Static tokens: name, sha256 (never the token), groups, expires_at.
auth.tokens_file YAML file with more tokens (same format, tokens key), reloaded when it changes: revocation without restart.
rbac.engine builtin builtin (the bindings below) or opa (the permission policy of the revisions; requires governance.engine: opa). policy.* always come from rbac.bindings.
rbac.opa.cache 30s How long the grants of an identity are reused with opa.
rbac.opa.cache_size 10000 Identities in the grants cache.
rbac.roles {} Additional roles: name → list of actions.
rbac.bindings [] subjects or groups, role, applications (qualified patterns: shop only untenanted, payments/*, */* every tenant), environments (patterns with *), artifacts, tenants (selector on the owner tenant) and selector (selector on the application tags).
rbac.tenant_roles {members: deployer, admins: admin} Implicit roles of the members and admins of a tenant on its applications. Never policy.*.
rbac.selector_keys [] Keys the selector of bindings and grants can read (empty: no selector in permissions).
rbac.cross_tenant_inventory true Whoever belongs to a tenant reads the inventory of every tenant.
audit.file JSON Lines file of audit entries, with a hash chain, in addition to the log and the SIEM.
audit.max_size_mb 0 Size beyond which the file is rotated (0 = no rotation).
audit.hmac_key_ref Reference to the key (at least 16 bytes) that turns the chain into an HMAC.

See Authentication, permissions and audit.

governance#

Key Default Description
governance.engine builtin builtin: the rules and windows of this file. opa: Rego policies evaluated by OPA, changeable at runtime.
governance.rules [] Rules per application and environment (the first match applies): name, applications, environments, requires (environments to promote from), approvals (required, allow_self, timeout, default 72h, when, approvers with groups and subjects), change (approval, timeout, default 72h: change ticket, see Chat and change management). With opa they are the data of the default policy.
governance.freezes [] Freeze windows: name, reason, applications, environments and from/to or cron (5 fields), duration, timezone, hard. Windows can also be created at runtime (manent freeze add).
governance.refresh 10s How often every process reads policy and runtime freezes again.
governance.max_staleness 10m Beyond this without a successful read, real deploys are refused (503).
governance.start deny What the deploy start checks again: deny (denials and freezes) or strict (also approvals and change grown after the submission).
governance.opa.source store Revisions: store (managed with manent policy), file, bundle, consul.
governance.opa.store.review false A draft is approved by an identity other than its author.
governance.opa.store.tests run run: the revision's tests run if present; required: revisions without tests are refused.
governance.opa.file.dir Directory of the policy with source: file.
governance.opa.bundle.* url, ca_file, credentials_ref, signing (public_key_ref, algorithm, key_id, scope), insecure_skip_verify.
governance.opa.consul.prefix manent/policies KV prefix with source: consul (address and token of governance.opa.consul.address/token_file, otherwise of the first consul provider of envconfig.providers).
governance.opa.consul.address, datacenter, token_file Consul agent of the policies; empty: that of the first consul provider of envconfig.providers.
governance.opa.query data.manent.governance.decision Query of the decision.
governance.opa.eval_timeout 200ms Limit of one evaluation.

See Release governance and Policies in Rego.

descriptor_policy#

Key Default Description
params {"*": ["*"]} Parameters the descriptor may set, per plugin.
secret_refs ["*"] Secret references the descriptor may declare.
targets true Targets given by the descriptor.
post_test_hosts ["*"] Hosts the descriptor's postTest.http checks may reach (patterns).
step_params {} Parameters of custom steps the descriptor may set, per step ("*" = all). Default: none.
config_ref none Revision of the environment configuration the descriptor may choose with config.ref (git provider): none, ref (allowed refs only) or sha (also commit SHAs).
max_parallel 0 (no limit) Maximum parallelism a descriptor may ask for (deploy.parallel, rollout.waves[].parallel); a percentage is resolved against all the targets. The environment configuration is not subject to it.

See Security.

secrets and artifacts#

Key Default Description
secrets.vault.enabled false Enables the vault: scheme.
secrets.vault.address, namespace, auth, token_file, approle, kubernetes, ca_file, timeout Vault connection and login.
artifacts.timeout 30m Maximum duration of a download.
artifacts.allow_unlisted true Allows sources not listed in artifacts.sources.
artifacts.sources [] prefix, auth (type, username, header, secret_ref), ca_file.

See Secrets and artifact sources.

pipeline#

Ordered list of steps, with name, mode (mandatory or optional), enabled (default of optional steps) and max_retries. See Pipeline and steps.

A step with type (command or http) is a custom step, defined by timeout, secrets, params, outputs, ssh, run and dry_run. They are configured by pipeline.custom:

Key Default Description
pipeline.custom.spec_key_refs [] HMAC keys (at least 32 bytes) that sign the specifications stored in plans; the first signs, all verify.
pipeline.custom.revoked_specs [] SHA-256 of specifications that must not run any more.
pipeline.custom.known_hosts ~/.ssh/known_hosts Host keys of the targets for command steps.
pipeline.custom.insecure_ignore_host_key false Skips the host key check: development only.
pipeline.custom.secrets_dir /dev/shm/manent Secrets directory on the targets.
pipeline.custom.allow_http false Allows http URLs in HTTP steps.

plugins#

Plugins to enable, each with its own configuration:

plugins:
  remote-copy:                       # plugin compiled into manent
    known_hosts: ~/.ssh/known_hosts
    artifact_types: [application]
  k8s-deploy:                        # external plugin
    external:
      command: /opt/manent/plugins/k8s-deploy
      sha256: "3f1c…"
    artifact_types: [container]

Two keys are read by manent and not passed to the plugin: queue (the plugin's own queue) and max_parallel, the cap on the targets of a batch the plugin updates at the same time, whatever the deploy asks for (default 16): it protects workers and destinations, such as SSH connections or the rate limits of a cloud API. See parallel targets.

Plugins compiled into manent: remote-copy, container, kubernetes, ecs, lambda, cloudrun, jboss, windows. See also External plugins.

rollout#

Health gate of wave rollouts.

Key Default Description
prometheus_url Prometheus API for rollout.health.metrics (e.g. http://prometheus:9090). Without it, a rollout with Prometheus metrics is rejected; the same holds for the other systems.
alertmanager_url Alertmanager API for rollout.health.alerts.
datadog Datadog for metrics with provider: datadog: url (API site, default https://api.datadoghq.com), api_key_ref, app_key_ref.
newrelic New Relic NerdGraph: url (default https://api.newrelic.com/graphql), account_id, api_key_ref (user key).
elastic Elasticsearch ES|QL: url, api_key_ref or username and password_ref, ca_file.
cloudwatch Amazon CloudWatch: region, endpoint (optional), credentials from the SDK chain or access_key_id_ref and secret_access_key_ref, role_arn and external_id to assume a role.
azure_monitor Azure Monitor Logs (provider: azure-monitor): workspace_id, a service principal with tenant_id, client_id and client_secret_ref or, without them, the identity of the worker (workload or managed identity); endpoint and authority for sovereign clouds.
check_timeout 30s Maximum time of each gate reading.

integrations#

Notifications in Slack and Teams, approvals from Slack and change tickets. See Chat and change management.

Key Default Description
integrations.public_url Address of the web interface, for links in messages and tickets.
integrations.language en Message language: en or it.
integrations.timeout 15s Timeout of calls to Slack, Teams and the ITSM.
integrations.slack.bot_token_ref, signing_secret_ref Secrets of the Slack app: updatable messages and approval buttons.
integrations.slack.identities Slack user ID → subject (oidc:alice) and groups of the manent identity.
integrations.slack.email_identity Identity of unlisted users from their email, e.g. oidc:{email}.
integrations.notifications [] Destinations: name, applications, environments, events, dry_run and slack (channel or webhook_ref) or teams (webhook_ref).
integrations.change.provider servicenow or jira.
integrations.change.poll_interval 1m Initial interval for reading the change approval (up to 5 minutes).
integrations.change.servicenow, jira Connection and fields of the ITSM system.

chains#

Deploy chains: dependencies between deploys and composite releases.

Key Default Description
poll_interval 5s First interval at which a waiting deploy or a release reads the state of the deploys it waits for again; it doubles at each reading up to 5 minutes. Usually the reading happens earlier, because a deploy that ends notifies whoever waits for it.

observability#

Key Default Description
listen Address of a server with /metrics, /healthz and /readyz (e.g. :9090). Needed by workers, which have no API.
metrics true Prometheus metrics.
tracing.enabled false Exports OpenTelemetry traces over OTLP/HTTP.
tracing.endpoint Collector, e.g. otel-collector:4318; empty: OTEL_EXPORTER_OTLP_ENDPOINT.
tracing.insecure false Uses http instead of https (endpoint without scheme).
tracing.sample_ratio 1 Fraction of traces sampled, if the request does not already carry a decision.

See Observability.

recovery#

Key Default Description
heartbeat_interval 15s How often a worker updates the registry.
stale_after 1m Heartbeat delay beyond which a worker is considered lost (at least twice heartbeat_interval).
auto_recover_after 0s If greater than zero, the pending workflows of a worker of the same version that has stopped, or has sent no heartbeat for this long, are resumed by another worker. At least stale_after.

See Recovery, shutdown and retention.

retention#

Like all durations in the configuration, values are written with the unit (0s, 10m, 2160h): a number without a unit is not valid.

Key Default Description
max_age 0s Workflows finished more than this long ago are deleted (0s = never; otherwise at least 24h).
keep_releases 10 Successful deploys always kept per application and environment.
interval 1h How often a worker runs the cleanup.

reconcile#

Periodic reading of the release in service on the targets, to report in the inventory those changed outside manent (see real state of the targets).

Key Default Description
interval 0s How often the workers read the targets of every environment (0s = disabled; otherwise at least 10s).
timeout 30s Maximum time to read one target.
concurrency 8 Targets of an environment read together.

Environment variables#

Variable Effect
MANENT_CONFIG Configuration file, alternative to -c.
DBOS_SYSTEM_DATABASE_URL Overrides dbos.database_url.
DBOS__VMID Overrides dbos.executor_id.
CONSUL_HTTP_ADDR Consul address, if the address of a Consul provider is empty.
CONSUL_HTTP_TOKEN Consul ACL token.
OTEL_EXPORTER_OTLP_ENDPOINT Trace collector, if observability.tracing.endpoint is empty. The other OTEL_EXPORTER_OTLP_* variables (headers, certificates) also apply.

Secrets with an env:NAME reference are read from the worker's environment variables.