Skip to content

Конфигурация машины

Состояние машины описывается единым 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

Поля

ПолеТипОписание
enabledboolВключить защиту
max_retriesintСколько неудачных попыток допустимо в рамках window
windowdurationПериод, за который считаются попытки (например, 5m, 1h)
ban_durationdurationНа какое время IP блокируется после превышения лимита
max_tracked_ipsintМаксимальное число одновременно отслеживаемых 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"
ПолеТипОписание
enabledboolВключить/выключить NetBird
setup_keystringКлюч для подключения к 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"

Поля

ПолеТипОписание
enabledboolВключить мониторинг
prometheus.enabledboolВключить сбор и отправку метрик
prometheus.endpointstringАдрес для отправки метрик (обязателен при prometheus.enabled: true)
prometheus.auth.usernamestringИмя пользователя для basic auth (опционально)
prometheus.auth.passwordstringПароль для basic auth (опционально)
loki.enabledboolВключить отправку логов из journald
loki.endpointstringURL Loki push API (обязателен при loki.enabled: true)
loki.auth.usernamestringИмя пользователя для basic auth (опционально)
loki.auth.passwordstringПароль для basic auth (опционально)

Метки логов в Loki

Для каждой записи журнала автоматически проставляются метки:

МеткаИсточник
unitsystemd 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"