Documentation

`vectron.stack.toml` reference

Exhaustive reference for the stack configuration file, including defaults and required fields.

This page is the normative reference for vectron.stack.toml.

For copyable configurations that combine multiple plugin sections, see the stack examples.

Unlike vectron.toml, many stack fields are plugin-specific. This page documents which fields are required, which have fixed defaults, and which are derived at provision time.

Resolution rules

  • schema_version, tld, and enabled are required top-level fields.
  • Relative paths are resolved from the directory containing vectron.stack.toml.
  • Plugin-specific sections are optional unless their plugin requires them.
  • vectron stack check and vectron stack provision validate the same file model before side effects.

Top-level fields

FieldTypeRequiredDefault / Inherits / DerivedNotes
schema_versionintegerYesNoneCurrently must be 1
tldstringYesNoneLowercase DNS-like root domain
enabledarray of stringsYesNoneNon-empty unique plugin ID list; see accepted values below
brewtableNoDefault: noneExtra Homebrew dependencies
monitoringtableNoDefault: noneMonitoring group behavior
kubernetestableNoDefault: noneLocal cluster provisioning
nginxtableNoDefault: noneReverse proxy configuration
grafanatableNoDefault: noneGrafana provisioning
prometheustableNoDefault: nonePrometheus provisioning
alloytableNoDefault: noneAlloy provisioning
rabbitmqtableNoDefault: noneRabbitMQ provisioning
neo4jtableNoDefault: noneNeo4j provisioning

Plugin IDs

enabled accepts these plugin IDs:

IDCategory
certificatesFoundation
dnsmasqFoundation
sshFoundation
nginxReverse proxy
prometheusObservability
lokiObservability
alloyObservability
grafanaObservability
mongodbDatastore
rabbitmqMessaging
redisDatastore
neo4jDatastore
minioDatastore
qdrantDatastore
postgresqlDatastore
influxdbDatastore
mosquittoMessaging and IoT
zigbee2mqttMessaging and IoT
dockerContainers
kubernetesContainers and clusters

Rules:

  • enabled must be non-empty.
  • Plugin IDs must be unique after trimming.
  • Empty plugin IDs are invalid.
  • nginx implicitly adds certificates.
  • alloy implicitly adds loki.
  • vectron stack provision/check/landing-ids --only replaces the initial enabled selection with the requested plugin IDs before implicit dependencies are added.
  • vectron stack provision/check/landing-ids --skip removes plugin IDs from the selected set.

See the built-in plugins page for roles and plugin-specific configuration sections.

[brew]

FieldTypeRequiredDefault / Inherits / DerivedNotes
tapsarray of stringsNoDefault: []Additional Homebrew taps
formulaearray of stringsNoDefault: []Additional formulae to install

[monitoring]

FieldTypeRequiredDefault / Inherits / DerivedNotes
autostartbooleanNoDefault: falseWhen false, generated monitoring processes stay disabled by default

[kubernetes]

FieldTypeRequiredDefault / Inherits / DerivedNotes
driverenumNoDefault: k3dAllowed: kind, k3d, minikube
cluster_namestringNoDefault: vectronLowercased during normalization
control_planesintegerNoDefault: 1Must be >= 1; driver-specific limits apply
workersintegerNoDefault: 0Driver-specific limits apply
wait_secondsintegerNoDefault: 120Cluster operation timeout
kubeconfig_pathpathNoDefault: .vectron_stack/generated/kubernetes/kubeconfigMust stay under the workspace root
kubernetes_versionstringNoDefault: noneOnly valid for minikube
node_imagestringNoDefault: noneValid for kind and k3d, not minikube
api_server_addressstringNoDefault: 127.0.0.1Driver-specific restrictions apply
api_server_portintegerNoDefault: 6443Must be in 1..=65535
local_registry_portintegerNoDefault: 5001Must be in 1..=65535
recreate_existingbooleanNoDefault: falseRecreates an existing cluster with the same name
stop_after_initbooleanNoDefault: trueRelevant for stoppable drivers
stop_on_vectron_stopbooleanNoDefault: trueRelevant for stoppable drivers

[nginx]

FieldTypeRequiredDefault / Inherits / DerivedNotes
https_portintegerYesNoneHTTPS listen port
landingtableNoDefault: noneOptional landing page config
serverarray of tablesNoDefault: []Declarative server blocks

[nginx.landing]

FieldTypeRequiredDefault / Inherits / DerivedNotes
quick_linksarray of stringsNoDefault: []Ordered landing-page links

[[nginx.server]]

FieldTypeRequiredDefault / Inherits / DerivedNotes
server_namesarray of stringsYesNoneHostnames served by this block
linktableNoDefault: noneOptional landing-page link
upstreamsstring mapNoDefault: {}Upstream name to URL
routearray of tablesNoDefault: []Evaluated in order
FieldTypeRequiredDefault / Inherits / DerivedNotes
labelstringYesNoneHuman-facing link label
pathstringNoDefault: /Must start with /

[[nginx.server]].route

FieldTypeRequiredDefault / Inherits / DerivedNotes
match.prefixstringYesNoneMust start with /
to.upstreamstringYesNoneMust exist in upstreams
to.pass_pathstringNoDefault: noneOptional upstream path rewrite
to.websocketbooleanNoDefault: falseEnables WebSocket proxy mode
to.grpcbooleanNoDefault: falseEnables gRPC proxy mode

[grafana]

FieldTypeRequiredDefault / Inherits / DerivedNotes
dashboard_dirsarray of tablesNoDefault: []Dashboard import sources

[[grafana.dashboard_dirs]]

FieldTypeRequiredDefault / Inherits / DerivedNotes
dirpathYesNoneDirectory containing *.json dashboards
folderstringYesNoneGrafana folder name

[prometheus]

FieldTypeRequiredDefault / Inherits / DerivedNotes
scrape_config_filesarray of pathsNoDefault: []Extra YAML scrape configs

[alloy]

FieldTypeRequiredDefault / Inherits / DerivedNotes
import_filesarray of tablesNoDefault: []Imported Alloy modules
blocksarray of stringsNoDefault: []Raw Alloy blocks appended to generated config
docker_logstableNoDefault: noneOptional Docker logs ingestion

[[alloy.import_files]]

FieldTypeRequiredDefault / Inherits / DerivedNotes
namestringYesNoneImport namespace
pathpathYesNoneMust point to a .alloy file

[alloy.docker_logs]

FieldTypeRequiredDefault / Inherits / DerivedNotes
enabledbooleanNoDefault: falseEnables Docker log ingestion into Loki
hoststringNoDerivedPrimary: unix://$HOME/.docker/run/docker.sock; fallback: unix:///var/run/docker.sock
refresh_intervalduration stringNoDefault: 5sUsed by loki.source.docker
labelsstring mapNoDefault: {}Static labels applied to all Docker log entries
relabelarray of tablesNoDefault: []Docker metadata relabel rules

[[alloy.docker_logs.relabel]]

FieldTypeRequiredDefault / Inherits / DerivedNotes
source_labelsarray of stringsNoDefault: []Metadata labels to read
target_labelstringYesNoneDestination Loki label

[rabbitmq]

FieldTypeRequiredDefault / Inherits / DerivedNotes
vhostarray of tablesYesNoneMust contain at least one entry
dead_letter_exchangestringNoDefault: dead-letter-exchangeCreated per vhost
dead_letter_queuestringNoDefault: dead-letterCreated per vhost
policy_namestringNoDefault: allRabbitMQ policy name
policy_patternstringNoDefault: .*RabbitMQ policy regex
consumer_timeout_msintegerNoDefault: 7200000Must be > 0

[[rabbitmq.vhost]]

FieldTypeRequiredDefault / Inherits / DerivedNotes
namestringYesNoneVhost name
queuesarray of stringsNoDefault: []Queues created in the vhost

[neo4j]

FieldTypeRequiredDefault / Inherits / DerivedNotes
schema_filesarray of pathsNoDefault: []Cypher schema files applied during provisioning

Validation rules

Validation includes checks for:

  • schema_version == 1
  • non-empty enabled
  • known, unique, non-empty plugin IDs
  • valid driver-specific Kubernetes constraints
  • valid relative workspace-safe kubeconfig_path
  • non-empty required strings in plugin config
  • deduplicated names and paths where required
  • valid Alloy Docker logs scheme and interval
  • valid RabbitMQ provisioning config before side effects

Recommendation

Use vectron.stack.example.toml as the onboarding example, then use this page when you need exact field behavior.

Platform note

Stack mode is currently macOS-only.