# Configuration reference

The Crucible agent reads `/etc/glassmkr/crucible.yaml` (legacy installs may have it at `/etc/glassmkr/collector.yaml`; the agent reads either, preferring the new name). This page documents every option for Crucible v0.13.6.

After editing the configuration, restart the service:

```
sudo systemctl restart glassmkr-crucible
```

You can validate the configuration without restarting:

```
glassmkr-crucible config check
```

## Full example

Below is a complete file with all options at their default values. You only need to include the fields you want to change.

```
server_name: "my-server"

collection:
  interval_seconds: 60
  ipmi: true
  smart: true

dashboard:
  enabled: true
  url: "https://app.glassmkr.com"
  api_key: "gmk_cru_live_your_key_here"
  tags:
    - production
    - web
  location: "eu-west"

collectors:
  interval: 60
  cpu:
    enabled: true
    per_core: false
  memory:
    enabled: true
  disk:
    enabled: true
    include_mounts:
      - /
      - /home
      - /var
    exclude_mounts:
      - /mnt/backup
    exclude_fs_types:
      - tmpfs
      - devtmpfs
      - squashfs
  network:
    enabled: true
    include_interfaces: []
    exclude_interfaces:
      - lo
      - docker0
      - veth*
  smart:
    enabled: true
    devices: []
    ignore_devices:
      - /dev/loop*
  thermal:
    enabled: true
    source: auto
  raid:
    enabled: true
    arrays: []
  ipmi:
    enabled: auto
    tool: ipmitool
  gpu:
    enabled: auto

alerts:
  ram_high:
    enabled: true
    threshold: 90
    duration: 300
  cpu_high:
    enabled: true
    threshold: 90
    duration: 300
  disk_space_high:
    enabled: true
    threshold: 90
    critical_threshold: 95
    exclude_mounts: []
  cpu_iowait_high:
    enabled: true
    threshold: 20
    duration: 180
  oom_kills:
    enabled: true
    threshold: 1
  smart_failing:
    enabled: true
    ignore_disks: []
  nvme_wear_high:
    enabled: true
    threshold: 80
  raid_degraded:
    enabled: true
    arrays: []
  disk_latency_high:
    enabled: true
    threshold: 50
    duration: 120
    exclude_devices: []
  interface_errors:
    enabled: true
    threshold: 10
    exclude_interfaces: []
  link_speed_mismatch:
    enabled: true
    interfaces: {}
  interface_saturation:
    enabled: true
    threshold: 80
    duration: 60
    exclude_interfaces: []
  cpu_temperature_high:
    enabled: true
    threshold: 85
    critical_threshold: 95
    sensor: ""
  ecc_errors:
    enabled: true
    correctable_rate_warning: 10
    rate_window_hours: 24
    critical_on_uncorrectable: true
  psu_redundancy_loss:
    enabled: true
    source: ""
  ipmi_fan_failure:
    enabled: true
    min_rpm: 500
  ipmi_sel_critical:
    enabled: true
  load_high:
    enabled: true
    threshold: 0
    duration: 300
  filesystem_readonly:
    enabled: true
    exclude_mounts: []
  inode_high:
    enabled: true
    threshold: 90
    exclude_mounts: []
  clock_drift:
    enabled: true
    threshold: 5
  ssh_root_password:
    enabled: true
  no_firewall:
    enabled: true
  pending_security_updates:
    enabled: true
  kernel_vulnerabilities:
    enabled: true
  kernel_needs_reboot:
    enabled: true
  unattended_upgrades_disabled:
    enabled: true
  muted_rules: []
  global:
    cooldown: 3600
    resolve_notify: true
    channels:
      - telegram
      - email

logging:
  level: info
  file: /var/log/glassmkr/crucible.log
  max_size: 50
  max_files: 5

proxy:
  http: ""
  https: ""
  no_proxy: ""

tls:
  ca_cert: ""
  skip_verify: false
```

## `dashboard`

Connection settings for the Dashboard API.

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `enabled` | boolean | `false` | Enable pushing data to the Dashboard. |
| `url` | string | `https://app.glassmkr.com` | Dashboard API base URL. |
| `api_key` | string | *required* | Server collector key (`gmk_cru_live_xxx`; older agents may still have `col_xxx`). Created when you add a server via + Add Server. Rotate via `POST /api/v1/servers/{id}/rotate-key`. |
| `timeout` | int | `30` | HTTP request timeout in seconds. |
| `retry_count` | int | `3` | Number of retries on failed pushes before giving up. |
| `retry_delay` | int | `5` | Seconds between retries. Uses exponential backoff (delay * attempt). |

## `server`

Server identity and metadata.

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `name` | string | system hostname | Display name for this server in the Dashboard. If empty, the system hostname is used. |
| `tags` | list | `[]` | Arbitrary tags for organizing servers. Use these to filter servers in the dashboard. |
| `location` | string | `""` | Freeform location label (e.g., `eu-west`, `dc3-rack14`). |

## `collectors`

Controls which metrics are collected and how.

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `interval` | int | `60` | Collection interval in seconds. Default 60 (Crucible v0.10.0+). Minimum 10, maximum 600. The previous 300-second default predates v0.10.0. |

### `collectors.cpu`

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `enabled` | bool | `true` | Collect CPU metrics (user, system, iowait, idle, steal). |
| `per_core` | bool | `false` | Report per-core metrics in addition to aggregate. Requires Crucible 0.3.0+. Enables the per-core CPU chart in the dashboard expanded view and gives AI analysis per-core awareness. Increases data volume on high-core-count machines. |

### `collectors.memory`

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `enabled` | bool | `true` | Collect memory metrics (total, available, used, buffers, cache, swap). |

### `collectors.disk`

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `enabled` | bool | `true` | Collect disk space and I/O metrics. |
| `include_mounts` | list | `[]` | If set, only these mount points are monitored. Empty means all mounts (after exclusions). |
| `exclude_mounts` | list | `[]` | Mount points to skip. |
| `exclude_fs_types` | list | `[tmpfs, devtmpfs, squashfs]` | Filesystem types to skip. |

### `collectors.network`

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `enabled` | bool | `true` | Collect network interface metrics (bytes, packets, errors, drops). |
| `include_interfaces` | list | `[]` | If set, only these interfaces are monitored. Supports glob patterns. |
| `exclude_interfaces` | list | `[lo, docker0, veth*]` | Interfaces to skip. Supports glob patterns. |

### `collectors.smart`

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `enabled` | bool | `true` | Collect SMART health data from disks. Requires `smartctl`. |
| `devices` | list | `[]` | Specific devices to monitor. Empty means auto-detect all block devices. |
| `ignore_devices` | list | `[/dev/loop*]` | Devices to skip. Supports glob patterns. |

### `collectors.thermal`

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `enabled` | bool | `true` | Collect temperature readings from CPU and other sensors. |
| `source` | string | `auto` | Temperature source: `auto`, `hwmon`, or `ipmi`. `auto` prefers hwmon and falls back to IPMI. |

### `collectors.raid`

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `enabled` | bool | `true` | Monitor RAID array health. Supports mdadm, MegaCLI, and storcli. |
| `arrays` | list | `[]` | Specific arrays to monitor. Empty means auto-detect. |

### `collectors.ipmi`

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `enabled` | string | `auto` | IPMI sensor collection: `auto` (detect), `true`, or `false`. |
| `tool` | string | `ipmitool` | IPMI tool: `ipmitool` or `freeipmi`. |

### `collectors.gpu`

Three-tier GPU collection (nvidia-smi, DCGM exporter, Redfish OEM). Validated on NVIDIA L4, A4000, and A16. See [the rule catalog](/docs/rules) for the 8 GPU rules.

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `enabled` | string | `auto` | GPU collection: `auto` (detect any available tier), `true`, or `false`. |

## `alerts`

Per-rule threshold overrides. See the [alert rules catalog](/docs/rules) for detailed documentation of each of the 65 rules.

Every alert rule supports at minimum:

| Key | Type | Description |
| --- | --- | --- |
| `enabled` | bool | Enable or disable this rule. |
| `threshold` | number | The value at which the alert fires (unit depends on the rule). |

Some rules also support `duration` (seconds the condition must persist), `critical_threshold` (a second, higher threshold), and exclusion lists. See the full example above for all options.

### `alerts.muted_rules`

A list of rule names to mute on this server. Muted rules are not evaluated and do not fire notifications. Changes take effect on the next ingest cycle after restarting Crucible.

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `muted_rules` | list | `[]` | List of rule names to mute (e.g., `[disk_space_high, cpu_iowait_high]`). Can also be managed from the Dashboard. |

### `alerts.global`

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `cooldown` | int | `3600` | Seconds between repeated notifications for the same active alert. |
| `resolve_notify` | bool | `true` | Send a notification when an alert condition resolves. |
| `channels` | list | `[]` | Default notification channels. Override per-rule if needed. |

## `logging`

Controls Crucible's own log output.

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `level` | string | `info` | Log level: `debug`, `info`, `warn`, `error`. |
| `file` | string | `/var/log/glassmkr/crucible.log` | Log file path. Set to `stdout` to log to standard output. |
| `max_size` | int | `50` | Maximum log file size in MB before rotation. |
| `max_files` | int | `5` | Number of rotated log files to keep. |

## `proxy`

HTTP proxy settings for environments where outbound internet access requires a proxy.

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `http` | string | `""` | HTTP proxy URL (e.g., `http://proxy.internal:3128`). |
| `https` | string | `""` | HTTPS proxy URL. If empty, the HTTP proxy is used for HTTPS as well. |
| `no_proxy` | string | `""` | Comma-separated list of hosts to bypass the proxy. |

## `tls`

TLS settings for the connection to the Dashboard API.

| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `ca_cert` | string | `""` | Path to a custom CA certificate bundle. Use this if your proxy performs TLS inspection. |
| `skip_verify` | bool | `false` | Skip TLS certificate verification. Not recommended for production. |

## Environment variables

The running agent is configured by `crucible.yaml` only; it does not read configuration overrides from the environment. Two variables exist around the edges of the install flow:

- `GLASSMKR_API_KEY`: read by the install script as an alternative to passing `--api-key` (`curl -sf https://glassmkr.com/install.sh | sudo GLASSMKR_API_KEY=... bash`). The script hands it to `glassmkr-crucible init`, which writes it into `crucible.yaml`; the agent then reads the file.
- `GLASSMKR_UBUNTU_PRO_TOKEN`: optional; read by the agent's CVE collector to query the Ubuntu Pro security feed.

Last verified: 2026-06-11 against Crucible v0.13.9.
