Тема
Конфигурация машины
Состояние машины описывается единым YAML-файлом и применяется командой machine config apply.
Применение конфигурации
bash
# Применить конфиг из файла
ssh server machine config apply < config.yml
# Применить и сразу перезагрузить
ssh server machine config apply --reboot < config.ymlПолная схема
yaml
access:
users:
- name: <string> # имя пользователя
roles: [<string>, ...] # список ролей
keys:
- <authorized_key> # публичный ключ в формате authorized_keys
roles:
- name: <string> # имя роли
rules:
- resources: [<string>, ...] # ресурсы (поддерживает *)
verbs: [<string>, ...] # действия (поддерживает *)
auth_guard:
enabled: <bool> # включить защиту от брутфорса
max_retries: <int> # максимум неудачных попыток до бана
window: <duration> # окно подсчёта попыток (например, 5m)
ban_duration: <duration> # длительность бана (например, 15m)
max_tracked_ips: <int> # максимальное число отслеживаемых IP
sysctl:
params:
<key>: "<value>" # параметры ядра
netbird:
enabled: <bool> # включить NetBird
setup_key: <string> # ключ установки NetBird
monitoring:
enabled: <bool>
prometheus:
enabled: <bool>
endpoint: <string>
auth:
username: <string> # basic auth (опционально)
password: <string>
loki:
enabled: <bool>
endpoint: <string>
auth:
username: <string> # basic auth (опционально)
password: <string>Секция access
Управляет пользователями и их правами.
Пользователи
yaml
access:
users:
- name: alice
roles: [admin]
keys:
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... alice@laptop
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... alice@desktopОдин пользователь может иметь несколько ключей (например, с разных устройств) и несколько ролей.
Роли
yaml
access:
roles:
- name: admin
rules:
- resources: ["*"]
verbs: ["*"]
- name: operator
rules:
- resources: ["stack/*"]
verbs: ["get", "list", "create", "update", "delete"]
- resources: ["machine/info"]
verbs: ["get"]
- name: viewer
rules:
- resources: ["stack"]
verbs: ["list"]
- resources: ["stack/*"]
verbs: ["get"]
- resources: ["machine/info"]
verbs: ["get"]Встроенная роль root всегда имеет полный доступ (* на всё). Она доступна без явного объявления в roles.
AuthGuard
Механизм защиты SSH-API от перебора ключей. Фиксирует неудачные попытки аутентификации с одного IP-адреса и временно блокирует при превышении лимита.
yaml
access:
auth_guard:
enabled: true
max_retries: 5
window: 5m
ban_duration: 15m
max_tracked_ips: 1000Поля
| Поле | Тип | Описание |
|---|---|---|
enabled | bool | Включить защиту |
max_retries | int | Сколько неудачных попыток допустимо в рамках window |
window | duration | Период, за который считаются попытки (например, 5m, 1h) |
ban_duration | duration | На какое время IP блокируется после превышения лимита |
max_tracked_ips | int | Максимальное число одновременно отслеживаемых IP-адресов |
Секция sysctl
Позволяет декларативно задать параметры ядра, которые применяются при старте.
yaml
sysctl:
params:
net.ipv4.ip_forward: 1
net.ipv4.ip_unprivileged_port_start: 80Параметры применяются через sysctl -w при каждом machine config apply.
Секция netbird
Управляет интеграцией с NetBird — mesh VPN на базе WireGuard.
yaml
netbird:
enabled: true
setup_key: "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"| Поле | Тип | Описание |
|---|---|---|
enabled | bool | Включить/выключить NetBird |
setup_key | string | Ключ для подключения к NetBird-серверу |
При enabled: true машина автоматически подключается к NetBird-сети используя указанный ключ.
Секция monitoring
Управляет сбором метрик и логов через Grafana Alloy.
При включении автоматически запускается системный сервис alloy, который:
- собирает метрики узла и отправляет их в Prometheus-совместимое хранилище;
- читает системный журнал и отправляет логи в Loki.
Должен быть активирован хотя бы один из подрежимов (prometheus или loki).
yaml
monitoring:
enabled: true
prometheus:
enabled: true
endpoint: "https://mimir.example.com/api/prom/push"
auth:
username: "user"
password: "secret"
loki:
enabled: true
endpoint: "https://loki.example.com/loki/api/v1/push"
auth:
username: "user"
password: "secret"Поля
| Поле | Тип | Описание |
|---|---|---|
enabled | bool | Включить мониторинг |
prometheus.enabled | bool | Включить сбор и отправку метрик |
prometheus.endpoint | string | Адрес для отправки метрик (обязателен при prometheus.enabled: true) |
prometheus.auth.username | string | Имя пользователя для basic auth (опционально) |
prometheus.auth.password | string | Пароль для basic auth (опционально) |
loki.enabled | bool | Включить отправку логов из journald |
loki.endpoint | string | URL Loki push API (обязателен при loki.enabled: true) |
loki.auth.username | string | Имя пользователя для basic auth (опционально) |
loki.auth.password | string | Пароль для basic auth (опционально) |
Метки логов в Loki
Для каждой записи журнала автоматически проставляются метки:
| Метка | Источник |
|---|---|
unit | systemd unit (_SYSTEMD_UNIT) |
container | имя контейнера Podman |
image | образ контейнера |
compose_project | имя Compose-проекта (извлекается из имени контейнера) |
compose_service | имя Compose-сервиса (извлекается из имени контейнера) |
host | имя хоста (применяется ко всем записям) |
Полный пример конфигурации
yaml
access:
users:
- name: alice
roles: [admin]
keys:
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... alice@example.com
- name: ci-bot
roles: [deployer]
keys:
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... ci@github-actions
- name: bob
roles: [viewer]
keys:
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... bob@example.com
roles:
- name: admin
rules:
- resources: ["*"]
verbs: ["*"]
- name: deployer
rules:
- resources: ["stack/*"]
verbs: ["create", "update"]
- resources: ["stack"]
verbs: ["list"]
- name: viewer
rules:
- resources: ["stack"]
verbs: ["list"]
- resources: ["stack/*"]
verbs: ["get"]
- resources: ["machine/info"]
verbs: ["get"]
auth_guard:
enabled: true
max_retries: 5
window: 5m
ban_duration: 1d
max_tracked_ips: 10000
sysctl:
params:
net.ipv4.ip_forward: 1
net.ipv4.ip_unprivileged_port_start: 80
netbird:
enabled: true
setup_key: "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
monitoring:
enabled: true
prometheus:
enabled: true
endpoint: "https://mimir.example.com/api/prom/push"
auth:
username: "user"
password: "secret"
loki:
enabled: true
endpoint: "https://loki.example.com/loki/api/v1/push"
auth:
username: "user"
password: "secret"