Configuration
The Voxeltron daemon is configured via a single TOML file. Every setting has a sensible default, so you only need to specify what you want to change.
Overview
The daemon reads its configuration from /etc/voxeltron/config.toml at startup.
You can override the path with the --config flag:
voxeltrond --config /path/to/config.toml
Any setting in the config file can also be overridden via environment variables using the
VOXELTRON_ prefix. See Environment Variable Overrides below.
Core Settings
Top-level keys that control how the daemon binds and stores data.
bind_address = "0.0.0.0"
grpc_port = 7443
data_dir = "/var/lib/voxeltron"
log_level = "info" | Key | Type | Default | Description |
|---|---|---|---|
bind_address | string | "0.0.0.0" | IP address the gRPC server listens on. |
grpc_port | integer | 7443 | Port for the gRPC API. The TUI connects here. |
data_dir | string | "/var/lib/voxeltron" | Root directory for application data, build cache, and database volumes. |
log_level | string | "info" | Log verbosity: trace, debug, info, warn, error. |
[tls]
Controls automatic TLS certificate provisioning via ACME (Let's Encrypt).
[tls]
acme_email = "ops@example.com"
acme_directory = "https://acme-v02.api.letsencrypt.org/directory"
Set acme_email to a valid address. Certificates are automatically requested
and renewed via Let's Encrypt.
If acme_email is omitted, the daemon generates a self-signed certificate
on first startup. Useful for local development and air-gapped environments.
https://acme-staging-v02.api.letsencrypt.org/directory [database]
Docker images used when provisioning managed database instances.
[database]
postgres_image = "postgres:16-alpine"
mysql_image = "mysql:8.4"
redis_image = "redis:7-alpine"
mongo_image = "mongo:7" Override these to pin a specific version or use a private registry mirror. The daemon pulls the image on first database creation if it is not already present locally.
[backup]
Automated backup schedule and storage target.
[backup]
schedule = "0 3 * * *" # cron expression — daily at 03:00
target = "local" # "local" or "s3"
[backup.s3]
bucket = "my-voxeltron-backups"
region = "us-east-1"
endpoint = "" # custom S3-compatible endpoint (optional)
access_key_id = ""
secret_access_key = "" | Key | Default | Description |
|---|---|---|
schedule | "0 3 * * *" | Cron expression for backup frequency. |
target | "local" | Storage backend: local (writes to data_dir/backups/) or s3. |
s3.bucket | — | S3 bucket name. Required when target = "s3". |
s3.region | "us-east-1" | AWS region or S3-compatible region identifier. |
s3.endpoint | — | Custom endpoint for S3-compatible storage (MinIO, R2, etc.). |
s3.access_key_id | — | S3 access key. |
s3.secret_access_key | — | S3 secret key. Prefer VOXELTRON_BACKUP_S3_SECRET_ACCESS_KEY env var. |
[secrets]
Controls how application secrets (env vars marked as sensitive) are stored and retrieved.
[secrets]
provider = "local" # "local", "openbao", or "infisical"
[secrets.openbao]
address = "https://vault.internal:8200"
mount_path = "secret"
role_id = ""
secret_id = ""
Secrets are encrypted at rest in data_dir/secrets/. Good for single-node setups.
Connects to an OpenBao (or HashiCorp Vault) instance via AppRole auth. Recommended for production clusters.
Integrates with Infisical for team-based secrets management. Configure via environment variables.
[cluster]
Multi-node cluster settings. Omit this section entirely for single-server deployments.
[cluster]
node_id = "node-1"
seeds = ["10.0.0.2:7946", "10.0.0.3:7946"]
cloud_discovery_url = "" | Key | Default | Description |
|---|---|---|
node_id | hostname | Unique identifier for this node in the cluster. Defaults to the system hostname. |
seeds | [] | List of host:port addresses of existing cluster members to join on startup. |
cloud_discovery_url | — | URL for cloud-based node discovery (Voxeltron Cloud managed clusters only). |
[ai]
Configure the AI assistant that powers natural-language DevOps commands.
[ai]
provider = "anthropic" # "anthropic" or "openai"
model = "claude-sonnet-4-20250514"
api_key_env = "ANTHROPIC_API_KEY"
permission_level = "suggest" # "suggest", "confirm", or "auto" | Key | Default | Description |
|---|---|---|
provider | "anthropic" | AI backend: anthropic or openai. |
model | "claude-sonnet-4-20250514" | Model identifier. Must be supported by the chosen provider. |
api_key_env | "ANTHROPIC_API_KEY" | Name of the environment variable holding the API key. The key itself is never stored in config. |
permission_level | "suggest" | suggest — AI proposes commands, you approve.confirm — AI executes after explicit confirmation.auto — AI executes non-destructive commands automatically.
|
api_key_env, not from the config file.
This ensures secrets never touch disk in plain text.
Full Example
A complete config.toml with all sections:
# /etc/voxeltron/config.toml
bind_address = "0.0.0.0"
grpc_port = 7443
data_dir = "/var/lib/voxeltron"
log_level = "info"
[tls]
acme_email = "ops@example.com"
acme_directory = "https://acme-v02.api.letsencrypt.org/directory"
[database]
postgres_image = "postgres:16-alpine"
mysql_image = "mysql:8.4"
redis_image = "redis:7-alpine"
mongo_image = "mongo:7"
[backup]
schedule = "0 3 * * *"
target = "s3"
[backup.s3]
bucket = "my-voxeltron-backups"
region = "us-east-1"
endpoint = ""
access_key_id = "AKIA..."
secret_access_key = "" # prefer env var
[secrets]
provider = "openbao"
[secrets.openbao]
address = "https://vault.internal:8200"
mount_path = "secret"
role_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
secret_id = "" # prefer env var
[cluster]
node_id = "node-1"
seeds = ["10.0.0.2:7946", "10.0.0.3:7946"]
[ai]
provider = "anthropic"
model = "claude-sonnet-4-20250514"
api_key_env = "ANTHROPIC_API_KEY"
permission_level = "confirm" Environment Variable Overrides
Every config key can be overridden via an environment variable with the VOXELTRON_ prefix.
Nested keys use underscores to replace dots and section separators.
# Core settings
export VOXELTRON_BIND_ADDRESS="127.0.0.1"
export VOXELTRON_GRPC_PORT="8443"
export VOXELTRON_LOG_LEVEL="debug"
# Nested sections
export VOXELTRON_TLS_ACME_EMAIL="ops@example.com"
export VOXELTRON_BACKUP_S3_BUCKET="prod-backups"
export VOXELTRON_BACKUP_S3_SECRET_ACCESS_KEY="wJalr..."
export VOXELTRON_SECRETS_OPENBAO_SECRET_ID="xxxxxxxx"
export VOXELTRON_AI_PROVIDER="openai" config.toml. This makes it easy
to inject secrets via your init system, container orchestrator, or CI pipeline without modifying the config file.
Precedence order (highest to lowest):
- Environment variables (
VOXELTRON_*) - Config file (
/etc/voxeltron/config.toml) - Built-in defaults