Documentation

Full local platform

Combine reverse proxy, services, observability, and Kubernetes in one stack.

Use this pattern when you want a compact end-to-end local platform. It combines the smaller examples into one vectron.stack.toml source file.

This is still an example, not a reference. Start smaller when possible, then add the blocks your workspace actually needs.

schema_version = 1
tld = "local.dev.test"

enabled = [
  "dnsmasq",
  "nginx",
  "mongodb",
  "rabbitmq",
  "redis",
  "minio",
  "qdrant",
  "docker",
  "prometheus",
  "loki",
  "alloy",
  "grafana",
  "kubernetes",
]

[nginx]
https_port = 54443

[[nginx.server]]
server_names = ["app.local.dev.test"]
link = { label = "App", path = "/" }
upstreams = { web = "http://127.0.0.1:3000", api = "http://127.0.0.1:4000" }

[[nginx.server.route]]
match = { prefix = "/api/ws" }
to = { upstream = "api", websocket = true }

[[nginx.server.route]]
match = { prefix = "/api/" }
to = { upstream = "api" }

[[nginx.server.route]]
match = { prefix = "/" }
to = { upstream = "web", websocket = true }

[[rabbitmq.vhost]]
name = "platform"
queues = [
  "jobs.default",
  "jobs.priority",
  "events.outbox",
]

[prometheus]
scrape_config_files = ["./monitoring/prometheus.yml"]

[alloy]
import_files = [
  { name = "app", path = "./monitoring/config.alloy" },
]
blocks = [
  'app.logs "local_app_logs" { forward_to = loki.write.default.receiver }',
]

[alloy.docker_logs]
enabled = true
refresh_interval = "5s"

[alloy.docker_logs.labels]
environment = "local"
origin = "docker"

[[alloy.docker_logs.relabel]]
source_labels = ["__meta_docker_container_label_service"]
target_label = "service"

[[alloy.docker_logs.relabel]]
source_labels = ["__meta_docker_container_name"]
target_label = "container"

[grafana]

[[grafana.dashboard_dirs]]
dir = "./grafana/dashboards"
folder = "Apps"

[kubernetes]
driver = "minikube"
cluster_name = "local-dev"
control_planes = 1
workers = 0
wait_seconds = 120
kubeconfig_path = ".vectron_stack/generated/kubernetes/kubeconfig"
api_server_address = "127.0.0.1"
api_server_port = 6443
local_registry_port = 5001
stop_after_init = true
stop_on_vectron_stop = true

How to evolve it

  • Remove plugins your project does not need.
  • Split monitoring files under ./monitoring/ and dashboards under ./grafana/dashboards.
  • Keep domains, ports, queues, and Docker labels project-specific.
  • Run vectron stack check after each change.

Use the smaller examples when you need to understand one part of the stack in isolation.