Руководство администратора Mockarty
Это руководство охватывает все действия, которые необходимо выполнить администратору после первого запуска Mockarty. Предполагается, что вы уже установили и развернули Mockarty согласно руководству по установке и развёртыванию.



URL-адреса в примерах: Во всех примерах используется
localhost:5770как адрес Mockarty по умолчанию. Если ваш экземпляр работает на удалённом сервере, заменитеlocalhost:5770на реальный адрес (например,https://mockarty.company.comилиhttp://192.168.1.50:5770). Подробнее — в разделе Полезные функции и советы.
Содержание
- Первый запуск
- Публичный URL для внешних ссылок
- Настройка аутентификации
- Управление пользователями
- Системные роли
- Управление пространствами имён
- Роли в пространстве имён
- Назначение пользователей в пространства имён
- Настройка уведомлений по электронной почте
- Резервное копирование и восстановление
- Политики очистки
- Журнал аудита
- Диагностический пакет
- Настройка LLM / AI-ассистента
- Рекомендации по безопасности
Первый запуск
При первом запуске Mockarty автоматически выполняются следующие действия:
- Миграции базы данных — создаются все необходимые таблицы и индексы.
- Создаётся пространство имён по умолчанию с названием
sandbox. - Создаётся встроенная учётная запись администратора со стандартными учётными данными.
Если настройка задана неверно — например, порт вне диапазона 1–65535, DB_USE не pg и не sqlite, CACHE_TYPE=redis без REPO_REDIS_HOST или CLUSTER_MODE=true вместе с SQLite, — Mockarty не запускается. В сообщении при запуске названы переменная и допустимые значения: исправьте эту строку и запустите снова.
Учётные данные по умолчанию
| Поле | Значение |
|---|---|
| Имя пользователя | admin |
| Пароль | admin |
Внимание: Смените пароль по умолчанию сразу после первого входа. Использование стандартных учётных данных в продакшене — критическая угроза безопасности.
Пробная лицензия: При первом запуске Mockarty работает с 7-дневной пробной лицензией. Ограничения пробной версии: небольшой пул мест на каждую функцию (3 места для базовых функций — мокирование и тестирование API, меньше для продвинутых) и доступно только пространство имён
sandbox. Для разблокировки полных возможностей примените лицензионный ключ в разделе Администрирование → Лицензия.
Доступ к веб-интерфейсу
Откройте браузер и перейдите по адресу:
http://localhost:5770/ui/
Вы увидите страницу входа. Введите учётные данные по умолчанию для авторизации.

Вход и изменение учётной записи защищены от частых повторных запросов. Если
запрос вернул 429, перед повтором подождите время из заголовка Retry-After.
После входа обычная навигация и проверка сессии не расходуют лимит анонимного
входа. Лимиты API-токенов продолжают действовать.
Смена пароля по умолчанию
- Войдите с учётными данными
admin/admin. - Перейдите в Настройки (значок шестерёнки в боковой панели).
- Откройте раздел Профиль.
- Нажмите Изменить пароль.
- Введите новый надёжный пароль (минимум 8 символов).
- Нажмите Сохранить.

Публичный URL для внешних ссылок (MOCKARTY_PUBLIC_URL)
Mockarty формирует абсолютные ссылки, которые открывает не тот, кто кликает внутри приложения, — и эти ссылки должны вести на host, куда получатель реально может достучаться:
- ссылки в письмах и уведомлениях мессенджера,
- ссылки-инвайты в комнаты агентов, которые вы передаёте коллеге,
- ссылки на встречу в календарном файле (
.ics), - подключение устройств companion (QR / сигнальный релей) для телефонов,
- ссылки на скачивание мобильного приложения и браузерного расширения.
За обратным прокси, Ingress или в Kubernetes собственный request-host сервера — это внутренний адрес (например 127.0.0.1:5770 или IP пода в кластере), и ссылка из него недостижима снаружи. Задайте MOCKARTY_PUBLIC_URL равным URL, который ваши пользователи вводят в браузере, — все ссылки будут использовать его.
| Переменная | По умолчанию | Описание |
|---|---|---|
MOCKARTY_PUBLIC_URL |
(пусто) | Достижимый снаружи базовый URL этого экземпляра, напр. https://mockarty.example.com. Используется для всех внешних ссылок выше. |
MOCKARTY_PUBLIC_URL=https://mockarty.example.com
Примечания:
- Если не задано, Mockarty берёт host входящего запроса и учитывает заголовки обратного прокси
X-Forwarded-Host/X-Forwarded-Proto— то есть правильно настроенный прокси, пробрасывающий их, может работать и без этой переменной. В Kubernetes, где request-host — внутрикластерный адрес и forwarded-host отсутствует, задание этой переменной — единственный надёжный способ получить корректные ссылки. MOCKARTY_ADVERTISE_URLиPUBLIC_BASE_URLпринимаются как псевдонимы (выигрывает первое непустое из трёх).- На старте Mockarty пишет предупреждение в лог, если публичный базовый URL не настроен, — ссылки в уведомлениях будут недостижимы для получателей.
Настройка аутентификации
Mockarty поддерживает несколько методов аутентификации. Базовые настройки аутентификации задаются переменными окружения, а внешние провайдеры идентификации (OAuth, LDAP) настраиваются через веб-интерфейс панели администратора с поддержкой hot-reload — перезапуск не требуется.
Основные понятия
Если вы не знакомы с терминологией аутентификации, ниже приведены краткие определения:
- OAuth 2.0 — стандартный протокол, позволяющий пользователям входить в Mockarty с использованием существующих аккаунтов внешних сервисов (Google, GitHub и т. д.) вместо создания отдельного пароля. Кнопки «Войти через Google» — это и есть OAuth.
- LDAP / Active Directory — служба каталогов, которая часто применяется в корпоративных средах для централизованного хранения учётных записей. Если в вашей компании используется доменный вход Windows, скорее всего, это Active Directory, работающая по протоколу LDAP.
- SAML — корпоративный протокол Single Sign-On (SSO), используемый сервисами вроде Okta, Azure AD и OneLogin. Позволяет пользователю войти один раз и получить доступ ко множеству приложений без повторного ввода учётных данных.
- RBAC — управление доступом на основе ролей. Вместо назначения прав отдельным пользователям им выдают роли (например, Owner, User, Viewer), и каждая роль имеет заранее определённый набор разрешений.
- 2FA / MFA — двух- или многофакторная аутентификация. После ввода пароля пользователь должен предоставить второе подтверждение — например, код из приложения-аутентификатора или электронной почты.
Режим аутентификации (AUTH_MODE)
Переменная окружения AUTH_MODE управляет общей стратегией аутентификации:
| Значение | Описание |
|---|---|
full |
(По умолчанию) Стандартный многопользовательский режим с аутентификацией на основе БД, поддержкой OAuth, LDAP, SAML и 2FA. Используется для серверных развёртываний. |
local |
Однопользовательский режим. Все внешние провайдеры аутентификации отключаются. Локальный администратор создаётся автоматически со случайным паролем, экран входа пропускается. Подходит для локальной разработки или однопользовательских инсталляций. |
Установите переменную в окружении или .env файле:
AUTH_MODE=full # по умолчанию, многопользовательский серверный режим
AUTH_MODE=local # однопользовательский режим (без экрана входа)
Базовый URL для OAuth-редиректов (AUTH_BASE_URL)
При использовании OAuth-провайдеров Mockarty должен знать свой публичный URL, чтобы корректно формировать redirect URI (адрес, на который провайдер возвращает пользователя после входа).
AUTH_BASE_URL=https://mockarty.yourcompany.com
| Переменная | По умолчанию | Описание |
|---|---|---|
AUTH_BASE_URL |
http://localhost:5770 |
Публичный базовый URL вашего экземпляра Mockarty. Должен в точности совпадать с redirect URI, зарегистрированным в консоли разработчика OAuth-провайдера. |
Важно: Если
AUTH_BASE_URLне совпадает с redirect URI, зарегистрированным у OAuth-провайдера, авторизация завершится с ошибкой «redirect_uri_mismatch».
Первый администратор
При первом запуске Mockarty создаёт учётную запись администратора с использованием следующих переменных окружения:
| Переменная | По умолчанию | Описание |
|---|---|---|
FIRST_ADMIN_LOGIN |
admin |
Логин начального администратора |
FIRST_ADMIN_PASSWORD |
admin |
Пароль начального администратора |
FIRST_ADMIN_EMAIL |
(пусто) | Email администратора (по умолчанию <login>@localhost) |
SHARED_NODE |
false |
Этот узел — общий узел Mockarty Cloud (namespace на каждое облачное Пространство): CLI-доказательство лицензии не выдаётся, cloud-личности не получают общий sandbox |
CLOUD_NODE_URL |
— | Подключить узел к Mockarty Cloud (origin его API). Требует трёх настроек ниже; полунастроенный контракт не даёт запуститься |
CLOUD_NODE_HANDOFF_PUBLIC_KEY |
— | Публичный ключ Ed25519 (base64), которым облако подписывает handoff входа |
CLOUD_NODE_TENANT_HMAC_KEY_ID |
— | Идентификатор общего секрета ниже |
CLOUD_NODE_TENANT_HMAC |
— | Общий секрет (base64, 32+ байта), которым облако подписывает запросы тенанта |
Если используются стандартные учётные данные admin/admin, система потребует сменить пароль при первом входе.
Совет: Для автоматизированных развёртываний задайте собственные значения, чтобы избежать запроса смены пароля:
FIRST_ADMIN_LOGIN=myadmin FIRST_ADMIN_PASSWORD=MyStr0ngP@ssword! FIRST_ADMIN_EMAIL=admin@yourcompany.com
Время жизни сессии (AUTH_SESSION_EXPIRATION)
Контролирует, как долго длится сессия пользователя до повторной аутентификации:
| Переменная | По умолчанию | Описание |
|---|---|---|
AUTH_SESSION_EXPIRATION |
24 |
Время жизни сессии в часах |
AUTH_SESSION_SLIDING |
false |
Если true, активная сессия продлевается при использовании — пользователь, работающий непрерывно, не разлогинивается на фиксированной отметке. По умолчанию выключено: срок истечения фиксирован (вход + AUTH_SESSION_EXPIRATION). |
AUTH_SESSION_ABSOLUTE_MAX_HOURS |
0 |
При включённом sliding — жёсткий потолок (часов от входа), после которого сессия больше не продлевается и требуется повторный вход. 0 = без потолка. Задайте, чтобы ограничить максимальный интервал релогина. |
AUTH_SESSION_EXPIRATION=48 # сессии живут 2 дня
AUTH_SESSION_SLIDING=true # активные пользователи остаются в системе
AUTH_SESSION_ABSOLUTE_MAX_HOURS=168 # ...но релогин принудительно через 7 дней
Локальная аутентификация (по умолчанию)
Если внешний провайдер идентификации не настроен, Mockarty использует встроенную систему локальной аутентификации. Пользователи входят с логином и паролем, хранящимися в базе данных Mockarty.
Требования к паролям:
- Минимум 8 символов

Настройка OAuth 2.0
OAuth 2.0 позволяет пользователям входить с использованием существующих аккаунтов внешних сервисов вместо создания отдельного пароля Mockarty. Mockarty поддерживает следующих OAuth-провайдеров:
- Yandex
- VK
- GitHub
- GitLab
- Generic / Custom OAuth — любой провайдер, совместимый с OAuth 2.0
Настройка OAuth-провайдеров через панель администратора
Все OAuth-провайдеры настраиваются через веб-интерфейс панели администратора. Переменные окружения для отдельных провайдеров не требуются.
- Перейдите в Панель администратора > Identity Providers.
- Нажмите Add Identity Provider.
- Выберите тип провайдера (например, Google, GitHub, GitLab, Generic).
- Заполните обязательные поля:
- Client ID — получен из консоли разработчика провайдера.
- Client Secret — получен из консоли разработчика провайдера.
- Для Generic/Custom провайдеров дополнительно нужно указать: Authorization URL, Token URL, UserInfo URL и Scopes.
- Включите переключатель Enabled для активации провайдера.
- Нажмите Save.

Hot-reload: Изменения вступают в силу немедленно. После добавления, изменения или удаления провайдера перезапуск Mockarty не требуется.
Redirect URI: При регистрации приложения в консоли разработчика провайдера используйте следующий redirect URI:
{AUTH_BASE_URL}/api/v1/auth/oauth/callbackНапример:
https://mockarty.yourcompany.com/api/v1/auth/oauth/callback
Когда OAuth-провайдеры включены, на странице входа автоматически появляются кнопки «Войти через…» для каждого активного провайдера.

LDAP / Active Directory
LDAP (Lightweight Directory Access Protocol) позволяет Mockarty аутентифицировать пользователей через существующий каталог пользователей вашей организации, например Microsoft Active Directory. Это значит, что пользователи могут входить с теми же учётными данными, которые используют для корпоративной сети.
Настройка LDAP через панель администратора
LDAP настраивается через веб-интерфейс панели администратора, аналогично OAuth-провайдерам.
- Перейдите в Панель администратора > Identity Providers.
- Нажмите Add Identity Provider.
- Выберите тип LDAP / Active Directory.
- Заполните параметры подключения:
- LDAP URL — адрес сервера каталога (например,
ldap://ldap.example.com:389илиldaps://ldap.example.com:636для TLS). - Base DN — отправная точка для поиска пользователей (например,
dc=example,dc=com). - Bind DN — учётная запись, используемая для подключения и поиска в каталоге (например,
cn=admin,dc=example,dc=com). - Bind Password — пароль учётной записи bind.
- User Filter — LDAP-фильтр для поиска пользователей. Используйте
%sкак плейсхолдер для логина (например,(sAMAccountName=%s)для Active Directory,(uid=%s)для OpenLDAP).
- LDAP URL — адрес сервера каталога (например,
- Нажмите Test Connection, чтобы проверить, что Mockarty может подключиться к серверу каталога и аутентифицироваться с учётной записью bind.
- Включите переключатель Enabled и нажмите Save.

Hot-reload: Как и OAuth, изменения настроек LDAP вступают в силу немедленно без перезапуска Mockarty.
Когда LDAP включён, пользователи могут входить с учётными данными каталога. При первом входе автоматически создаётся учётная запись Mockarty с системной ролью User. Затем администратор может назначить роли в пространствах имён по необходимости.
SAML SSO
Mockarty поддерживает SAML 2.0 для интеграции Single Sign-On с корпоративными провайдерами идентификации (Okta, Azure AD, OneLogin и т. д.).
Настройка выполняется через панель администратора:
- Перейдите в Панель администратора > Authentication > SAML.
- Загрузите или вставьте XML метаданных провайдера идентификации (IdP).
- Скопируйте URL метаданных Service Provider (SP) Mockarty и зарегистрируйте его в вашем IdP.
- Настройте сопоставление атрибутов (email, отображаемое имя, группы).
- Включите SAML-аутентификацию.

Двухфакторная аутентификация (2FA)
Mockarty поддерживает два типа двухфакторной аутентификации:
TOTP (одноразовые пароли на основе времени):
- Работает с любым приложением-аутентификатором (Google Authenticator, Authy, Microsoft Authenticator и т. д.).
- Пользователи включают её в Settings > Security > Two-Factor Authentication.
- Отображается QR-код для сканирования приложением-аутентификатором.
- Предоставляются коды восстановления для резервного доступа.
Коды по электронной почте:
- Одноразовые коды отправляются на зарегистрированный email пользователя.
- Требуется настроенная отправка email (см. Настройка уведомлений по электронной почте).
- Пользователи включают её в Settings > Security > Two-Factor Authentication.
Управление 2FA для пользователей:
Администраторы могут управлять 2FA для каждого пользователя отдельно:
- Отключить 2FA для пользователя: Перейдите в Панель администратора > Users, выберите пользователя и нажмите Disable 2FA. Это удалит как TOTP, так и email 2FA для данного пользователя.
- Рекомендация: Настоятельно рекомендуется (либо обяжите через организационную политику), чтобы все пользователи с ролями Admin и Support включили 2FA для своих учётных записей.
Примечание: 2FA включается самими пользователями в разделе Settings > Security > Two-Factor Authentication. Глобального переключателя принудительного включения нет — внедрение 2FA управляется через организационную политику.
Управление пользователями
Создание пользователей
- Перейдите в Панель администратора > Users.
- Нажмите Create User.
- Заполните обязательные поля:
- Username — уникальный логин.
- Email — адрес электронной почты (используется для уведомлений и сброса пароля).
- Password — начальный пароль (пользователь сможет изменить его позже).
- System Role — выберите Admin, Support, Auditor или User (см. Системные роли).
- Нажмите Create.

Приглашение пользователей
Вместо того чтобы придумывать пароль за человека, пригласите его — он настроит вход сам.
Если сменить язык интерфейса в открытом окне приглашения, подписи обновятся, а email, выбранные роли и пространство имён сохранятся.
- Откройте Панель администратора > Пользователи и нажмите Пригласить.
- Укажите email и системную роль. При желании выберите пространство имён и роль в нём — участник, наблюдатель или владелец.
- Нажмите Отправить приглашение. Если отправка почты настроена, письмо уходит сразу. Окно также показывает ссылку-приглашение — скопируйте её и передайте сами, если установка не отправляет почту.
Человек открывает ссылку, видит, кто и с какими ролями его пригласил, выбирает логин и пароль — и сразу входит в систему. Каждая ссылка срабатывает один раз и действует три дня. В разделе Ожидающие приглашения под таблицей пользователей видны только действующие ссылки, которые ещё не приняты и не отозваны (до 200, сначала новые); кнопка Отозвать отключает ссылку.
Если список приглашений не удалось прочитать, количество показывается как неизвестное. Нажмите Повторить, чтобы загрузить список снова; ошибка не означает, что приглашений нет.
Для отзыва требуется явное подтверждение. При отмене ссылка продолжает работать; повторные нажатия во время подтверждения или отзыва не отправляют новый запрос.
Если список пространств не загрузился, нажмите Повторить или явно пригласите без пространства. Если создание не удалось подтвердить, в том числе после таймаута или ошибки сервера, перед повторной отправкой проверьте Ожидающие приглашения: приглашение уже могло быть создано. Приложение не отправляет запрос повторно автоматически.
Установка паролей и email
- Для сброса пароля пользователя: Панель администратора > Users > (выберите пользователя) > Reset Password.
- Для смены email пользователя: Панель администратора > Users > (выберите пользователя) > Edit > Email.
- Ссылки для сброса пароля могут отправляться по email, если настроены email-уведомления.
Отключение / включение учётных записей
Отключённые учётные записи не могут войти в систему, но их данные и назначения в пространствах имён сохраняются.
- Перейдите в Панель администратора > Users.
- Найдите пользователя в списке.
- Нажмите переключатель рядом с его именем для отключения или включения учётной записи.
Удаление пользователей
- Перейдите в Панель администратора > Users.
- Найдите пользователя в списке.
- Нажмите Delete.
- Подтвердите удаление.
Примечание: Удаление пользователя удаляет его учётную запись и все назначения ролей в пространствах имён. Моки и другие ресурсы, созданные пользователем, сохраняются.
Самостоятельная регистрация пользователей
Когда включены OAuth или LDAP, пользователи могут регистрироваться самостоятельно, входя через внешний провайдер идентификации. Учётная запись Mockarty создаётся автоматически с системной ролью User. Затем администратор может назначить роли в пространствах имён по необходимости.
Системные роли
В Mockarty есть четыре системных роли, определяющих, к чему пользователь имеет доступ на уровне всей платформы.
Описание ролей
Admin
Полный доступ к системе. Администраторы могут управлять всеми пользователями, всеми пространствами имён, системными настройками, журналами аудита, резервными копиями, настройками email, профилями LLM, телеметрией и состоянием базы данных. Эта роль должна быть выдана небольшому числу доверенных лиц.
Support
Полный доступ к ресурсам пространств имён (моки, хранилища, API-тесты, фаззинг, рекордер, коллекции) во всех пространствах имён. В панели администратора пользователи Support могут просматривать учётные записи, сбрасывать пароли и просматривать журналы аудита, но не могут создавать или удалять пользователей, изменять системные настройки или получать доступ к чувствительной конфигурации. Пользователи Support не могут создавать или удалять пространства имён.
Auditor
Доступ только для чтения к журналам аудита и системным метрикам. Аудиторы не могут изменять ресурсы и не могут экспортировать журналы аудита. В боковой панели они видят: Dashboard, Mocks (только просмотр), Test Runs, Recorder (только просмотр), Fuzzing (только просмотр), Utils, Settings (только просмотр) и Admin Panel (только просмотр журналов аудита).
User
Стандартная учётная запись пользователя. Права полностью определяются назначениями ролей в пространствах имён (см. Роли в пространстве имён). Доступа к панели администратора нет.
Матрица разрешений
| Возможность | Admin | Support | Auditor | User |
|---|---|---|---|---|
| Просмотр Dashboard | Да | Да | Да | Да |
| Управление собственным профилем | Да | Да | Да | Да |
| Доступ к панели администратора | Да | Частично | Частично | Нет |
| Создание / удаление пользователей | Да | Нет | Нет | Нет |
| Просмотр списка пользователей | Да | Да | Нет | Нет |
| Сброс паролей пользователей | Да | Да | Нет | Нет |
| Отключение / включение учётных записей | Да | Нет | Нет | Нет |
| Управление системными настройками | Да | Нет | Нет | Нет |
| Создание / удаление пространств имён | Да | Нет | Нет | Нет |
| Просмотр журналов аудита | Да | Да | Да | Нет |
| Экспорт журналов аудита | Да | Да | Нет | Нет |
| Управление резервными копиями | Да | Нет | Нет | Нет |
| Настройка email | Да | Нет | Нет | Нет |
| Управление профилями LLM | Да | Нет | Нет | Нет |
| Просмотр телеметрии / метрик | Да | Нет | Да | Нет |
| Состояние базы данных | Да | Нет | Нет | Нет |
| Управление API-токенами | Да | Нет | Нет | Нет |
| Просмотр моков (все пространства) | Да | Да | Да | Нет |
| Работа с ресурсами пространства имён | Да | Да | Нет | По роли |
Управление пространствами имён
Что такое пространство имён
Пространство имён — это изолированная рабочая область внутри Mockarty. Каждое пространство имён содержит собственные:
- Моки и маршруты
- Хранилища Global, Chain и Mock
- Коллекции API-тестов и окружения
- Результаты запусков тестов
- Сессии рекордера
- Конфигурации фаззинга
- API-токены
Пространства имён обеспечивают изоляцию между командами, сервисами или средами. Ресурсы одного пространства имён невидимы для пользователей другого пространства (если у них нет ролей в обоих).
Создание пространств имён
Через панель администратора:
- Перейдите в Панель администратора > Namespaces.
- Нажмите Create Namespace.
- Введите имя и (опционально) описание.
- Нажмите Create.
Через страницу настроек:
- Перейдите в Settings > Namespaces (доступно пользователям с ролью Admin).
- Нажмите Create Namespace.
- Введите имя и (опционально) описание.
- Нажмите Create.

Соглашения об именовании и лучшие практики
Выберите соглашение об именовании, подходящее вашей организации:
| Стратегия | Пример пространств имён | Подходит для |
|---|---|---|
| По командам | backend-team, mobile-team, qa-team |
Небольшие организации |
| По сервисам | payment-service, user-service, orders |
Микросервисная архитектура |
| По средам | dev, staging, qa, demo |
Workflow по средам |
| Комбинированные | payments-dev, payments-staging |
Крупные организации |
Советы:
- Используйте имена в нижнем регистре с дефисами (например,
user-service). - Делайте имена короткими, но информативными.
- Избегайте общих имён вроде
testилиtempдля постоянных пространств имён. - Задокументируйте соглашение об именовании, чтобы все команды следовали ему единообразно.
Пространство имён по умолчанию
Пространство имён sandbox создаётся автоматически при первом запуске. Его нельзя удалить. Все пользователи имеют доступ к пространству имён по умолчанию, если их явно не исключили.
Удаление / восстановление пространств имён
- Перейдите в Панель администратора > Namespaces.
- Найдите пространство имён и нажмите Delete.
- Подтвердите удаление.
Закрытие пространства имён деактивирует его ресурсы. Чтобы открыть его снова, нажмите Restore в списке пространств имён.
Безвозвратное удаление через корзину или API администратора отменить нельзя. Оно также ставит в очередь удаление сохранённых файлов управления тест-кейсами и артефактов тест-планов; при временной недоступности хранилища очистка продолжится после перезапуска сервера. Пространство с файлами под legal hold или с действующим сроком хранения безвозвратно удалить нельзя.
После безвозвратного удаления создание пространства с тем же именем может временно отклоняться, пока физическая очистка не завершена. Повторите попытку после восстановления доступа к хранилищу. Новое пространство не наследует файлы или права удалённого пространства.
API администратора использует DELETE /api/v1/admin/namespaces/{namespace}?hard=true; для роли поддержки доступен соответствующий маршрут /api/v1/support/namespaces/{namespace}. Если удаление запрещено из-за удержания файлов, срока хранения или изменения namespace во время операции, API возвращает 409. Ошибка базы данных возвращает 500. Успешное удаление возвращает 200; очистка сохранённых файлов может продолжаться после ответа.
Роли в пространстве имён
Внутри каждого пространства имён пользователю может быть назначена одна из трёх ролей, определяющих, что он может делать с ресурсами пространства.
Описание ролей
Owner
Полный контроль над пространством имён. Владельцы могут управлять настройками пространства, добавлять и удалять пользователей и выполнять все операции с ресурсами (моки, хранилища, коллекции, тесты). Владельцы пространства имён не могут удалить пространство имён — это доступно только пользователям с системной ролью Admin или Support.
User
Могут создавать, редактировать и удалять моки, хранилища, коллекции и запускать тесты. Не могут управлять настройками пространства или добавлять/удалять пользователей.
Viewer
Доступ только для чтения ко всем ресурсам пространства имён. Наблюдатели могут просматривать моки, результаты тестов и значения хранилищ, но не могут создавать, редактировать или удалять что-либо.
Матрица возможностей в пространстве имён
| Возможность | Owner | User | Viewer |
|---|---|---|---|
| Просмотр моков | Да | Да | Да |
| Создание / редактирование / удаление моков | Да | Да | Нет |
| Импорт моков (OpenAPI, HAR и т. д.) | Да | Да | Нет |
| Просмотр хранилищ | Да | Да | Да |
| Создание / редактирование / удаление хранилищ | Да | Да | Нет |
| Просмотр коллекций API-тестов | Да | Да | Да |
| Создание / редактирование / удаление коллекций | Да | Да | Нет |
| Запуск тестов | Да | Да | Нет |
| Просмотр результатов тестов | Да | Да | Да |
| Использование API Tester | Да | Да | Нет |
| Просмотр сессий рекордера | Да | Да | Да |
| Запуск / остановка рекордера | Да | Да | Нет |
| Настройка фаззинга | Да | Да | Нет |
| Просмотр результатов фаззинга | Да | Да | Да |
| Управление API-токенами пространства | Да | Нет | Нет |
| Добавление / удаление пользователей | Да | Нет | Нет |
| Изменение настроек пространства | Да | Нет | Нет |
| Удаление пространства имён | Нет | Нет | Нет |
| Использование Agent Chat | Да | Да | Да |
Назначение пользователей в пространства имён
Добавление пользователя в пространство имён
- Переключитесь в целевое пространство имён с помощью селектора в боковой панели.
- Перейдите в Settings > Users.
- Нажмите Add User.
- Выберите учётную запись из выпадающего списка.
- Выберите роль: Owner, User или Viewer.
- Нажмите Add.

Клиентские пространства имён наследуют роли
Интеграции, которые подключают свои продукты (например, система приёмки), создают по одному пространству имён на продукт с именем c-<client>-p-<project>. Добавлять пользователя в каждое из них не нужно: роль, выданная в родительском клиентском пространстве c-<client>, действует во всех c-<client>-p-* с той же ролью. Если пользователю выдана отдельная роль в продуктовом пространстве, она имеет приоритет.
Пример: выдайте сервисной учётной записи интеграции роль Viewer в c-acme, и она сможет читать c-acme-p-web, c-acme-p-checkout и любое продуктовое пространство, которое интеграция создаст позже, без отдельной выдачи.
Изменение роли пользователя в пространстве имён
- Перейдите в Settings > Users в целевом пространстве имён.
- Найдите пользователя в списке.
- Нажмите выпадающий список роли рядом с его именем.
- Выберите новую роль.
- Изменение вступает в силу немедленно.
Удаление пользователя из пространства имён
- Перейдите в Settings > Users в целевом пространстве имён.
- Найдите пользователя в списке.
- Нажмите Remove.
- Подтвердите действие.
Примечание: Удаление пользователя из пространства имён не удаляет его учётную запись. Он просто теряет доступ к ресурсам этого пространства.
Настройка уведомлений по электронной почте
Email-уведомления используются для сброса паролей, доставки кодов 2FA, пригласительных ссылок и уведомлений о результатах тестов.
Включение email
Настройки email задаются через веб-интерфейс панели администратора (перезапуск не требуется):
- Перейдите в Панель администратора > Email Settings.
- Заполните параметры подключения SMTP:
- SMTP Host — ваш SMTP-сервер (например,
smtp.gmail.com) - SMTP Port — обычно
587для STARTTLS или465для Implicit TLS - Username / Password — учётные данные SMTP-аутентификации
- From Address — адрес отправителя, отображаемый получателям
- From Name — имя отправителя (например,
Mockarty) - Reply-To — необязательный адрес для ответов
- SMTP Host — ваш SMTP-сервер (например,
- Включите переключатель Enabled и нажмите Save.
Альтернатива: переменные окружения. Настройки SMTP также можно задать через переменные окружения при запуске (
EMAIL_ENABLED,SMTP_HOST,SMTP_PORT,SMTP_USERNAME,SMTP_PASSWORD,EMAIL_FROM,EMAIL_FROM_NAME,EMAIL_REPLY_TO,SMTP_USE_IMPLICIT_TLS). Полный справочник — в Руководстве по установке и развёртыванию. Настройки в UI имеют приоритет над переменными окружения после первого сохранения.
Проверка настроек email
- Перейдите в Панель администратора > Email Settings.
- Нажмите Send Test Email.
- Введите адрес получателя.
- Нажмите Send.
- Убедитесь, что тестовое письмо пришло в почтовый ящик получателя.

Пользовательские шаблоны писем
Mockarty использует встроенные HTML-шаблоны для всех email-уведомлений. Их можно настроить:
- Перейдите в Панель администратора > Email, затем переключитесь на под-вкладку Templates.
- Выберите шаблон для настройки (например, «Password Reset», «2FA Code», «Welcome», «Invite», «Email Verify»).
- Отредактируйте тему, HTML-шаблон и текстовый шаблон. Доступные переменные перечислены на странице.
- Нажмите Save.
- Используйте Preview для просмотра внешнего вида письма.
- Используйте Reset to Default для восстановления встроенного шаблона.
Что отправляется
| Событие | Содержание письма |
|---|---|
| Запрос сброса пароля | Ссылка для сброса пароля (истекает через 1 час) |
| Код 2FA (метод email) | 6-значный код подтверждения (истекает через 10 минут) |
| Приглашение пользователя | Ссылка для присоединения к Mockarty с заранее назначенной ролью |
| Подтверждение email | Ссылка для подтверждения адреса email |
| Завершение запуска тестов | Сводка результатов тестов с количеством успехов/неудач |
Резервное копирование и восстановление
В Mockarty встроена система резервного копирования, использующая pg_dump / pg_restore для PostgreSQL и согласованный снимок базы для SQLite, чтобы создавать и восстанавливать резервные копии БД. Управление выполняется через панель администратора или API. Эти копии содержат базу данных; полное резервное копирование узла для аварийного восстановления описано в разделе Резервное копирование и восстановление.
Опциональный режим PostgreSQL с минимальными привилегиями
По умолчанию Mockarty сохраняет обратно совместимое поведение запуска и применяет ожидающие миграции через DB_DSN. Для усиленной установки нужны выделенная база Mockarty, maintenance credential владельца схемы, serving-роль и, если включается управление delivery policy, отдельная non-owner authority-роль. Выполните переход в таком порядке:
- Задайте стабильный
CHAOS_ENCRYPTION_KEYдо смены учётных данных БД. Так ранее сохранённые chaos-credentials останутся читаемыми после смены DSN. - Создайте runtime- и authority-роли с атрибутами
NOSUPERUSER NOBYPASSRLS NOCREATEDB NOCREATEROLE NOINHERIT NOREPLICATION, без memberships и принадлежащих им объектов БД. Не выдавайте им управление параметрами, replication, DDL или default privileges. - В первом одноразовом maintenance-проходе оставьте
DB_AUTHORITY_ROLEпустым, задайтеDB_DSNбудущего runtime-подключения,DB_RUNTIME_ROLEс именем serving-роли иDB_MIGRATION_DSNс DSN владельца схемы. Запустите./mockarty --migrate upбез--migrate-steps. - От имени администратора БД удалите эффективный доступ
PUBLICк выделенной базе и всем non-system application schemas и objects: databaseCONNECT/TEMP, создание схем, tables, sequences, functions, types, procedural languages, parameters, foreign-data objects, tablespaces и large objects. Для схемыpublicоставьте толькоUSAGE. Настройте database-wide default privileges владельца миграций так, чтобы будущие functions не давалиEXECUTE, а будущие types —USAGEролиPUBLIC. Явно выдайте databaseCONNECTruntime- и authority-ролям. Не применяйте этот strict-профиль в БД, совместно используемой другим приложением. - Повторите
./mockarty --migrate upс тем же owner credential и добавьтеDB_AUTHORITY_ROLE. Даже если ожидающих миграций нет, maintenance-команда вызывает оба owner-only grant binder и завершится с ошибкой, если dedicated-database posture подготовлен не полностью. - Полностью удалите
DB_MIGRATION_DSNиз serving-окружения. Запустите serving-процесс с runtimeDB_DSN,DB_RUNTIME_ROLEи стабильнымCHAOS_ENCRYPTION_KEY. Чтобы включить управление delivery policy, задайте authority credential паройDB_AUTHORITY_DSNиDB_AUTHORITY_ROLE; его DSN должен устанавливать sessionsearch_pathточно вpg_catalog,public,pg_temp.
Для production Compose задайте runtime-подключение в MOCKARTY_RUNTIME_DB_DSN; встроенный POSTGRES_USER остаётся владельцем БД и не должен использоваться как DB_RUNTIME_ROLE. Сначала создайте runtime-роль своим административным процессом PostgreSQL. Strict mode — это явный operator cutover, а не автоматическое создание роли.
Serving-процесс завершает запуск с ошибкой, если любая настроенная роль может владеть или создавать объекты схемы, имеет membership, replication или parameter authority, если изменились PUBLIC, default или критические права и объекты схемы, если runtime-, authority- и migration-обязанности используют общие credentials либо owner-подключение маскируется через SET ROLE. Оставьте обе authority-переменные пустыми, чтобы управление было недоступно без отключения runtime policy enforcement. DB_MIGRATION_DSN намеренно запрещён в serving-процессе и не должен храниться в serving Pod, Compose-сервисе или systemd environment.
В SQLite нет разделения PostgreSQL-ролей. Поэтому единственный локальный процесс и владелец файла БД входят в доверенную локальную границу; PostgreSQL authority-переменные в SQLite-режиме задавать нельзя. Legacy PostgreSQL сохраняет такую же owner-trust совместимость через существующее подключение.
Владелец PostgreSQL-миграций также является доверенной maintenance authority: по определению он может менять объекты схемы и триггеры. Строгая гарантия защищает обычную serving-роль от этих возможностей, но не заявляет защиту от скомпрометированного migration owner.
Автоматическое резервное копирование
Mockarty автоматически выполняет резервное копирование по расписанию. Расписание по умолчанию — ежедневно в 2:00 ночи (настраивается через cron-выражение). В распределённых развёртываниях резервное копирование выполняется только на лидер-ноде во избежание дублирования.
Настройка резервного копирования
- Перейдите в Панель администратора > Backup.
- Нажмите Create Backup Config (или отредактируйте конфигурацию по умолчанию).
- Настройте:
- Schedule — cron-выражение (например,
0 0 2 * * *для ежедневного запуска в 2:00). - Retention — число дней хранения старых копий (0 = без ограничений).
- Compression — включить сжатие для уменьшения размера файлов.
- Format —
custom(рекомендуется, поддерживаетpg_restore),plain(текстовый SQL),tarилиdirectory. - Include schema / Include data — выбрать, что включать.
- Schedule — cron-выражение (например,
- Включите переключатель Enabled и нажмите Save.
Ручное резервное копирование
Через панель администратора:
- Перейдите в Панель администратора > Backup.
- Нажмите Create Backup.
- Дождитесь завершения процесса.
- Нажмите Download для сохранения файла резервной копии.
Через API:
# Create a backup
curl -X POST http://localhost:5770/api/v1/admin/backups/create \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"config_id": "your-config-id"}'
# Download the backup
curl http://localhost:5770/api/v1/admin/backups/download?file_path=backup_file.dump \
-H "Authorization: Bearer $TOKEN" \
-o backup.dump
Восстановление из резервной копии
В режиме по умолчанию восстановление доступно, как описано ниже. В строгом PostgreSQL-режиме (задан DB_RUNTIME_ROLE) restore-endpoints намеренно не регистрируются: serving-роль не может заменять схему или содержимое БД. Остановите трафик, выполните восстановление как явную maintenance-операцию с owner credential, проверьте восстановленную схему, повторно примените полную цепочку миграций и только затем запускайте процесс с runtime-ролью. Не добавляйте owner credential в работающий сервер ради доступности кнопки.
Через панель администратора:
- Перейдите в Панель администратора > Backup.
- Нажмите Restore.
- Загрузите файл резервной копии.
- Подтвердите операцию восстановления.
- Дождитесь завершения процесса. Кэш лицензий будет перезагружен автоматически.
Через API:
# Restore from uploaded file
curl -X POST http://localhost:5770/api/v1/admin/backups/restore-from-file \
-H "Authorization: Bearer $TOKEN" \
-F "file=@backup.dump"
Внимание: Восстановление заменяет все текущие данные. Эта операция необратима.
Что входит в резервную копию
- Полная база данных (все моки, хранилища, пользователи, пространства имён, результаты тестов, журналы аудита, конфигурации)
- Формат зависит от настроек (рекомендуется формат
customдля самого быстрого восстановления)
Docker и Kubernetes
Официальный Docker-образ Mockarty включает клиентские инструменты PostgreSQL 18 (pg_dump, pg_restore, psql), поэтому резервное копирование работает из коробки в Docker- и Kubernetes-окружениях для серверов PostgreSQL до версии 18 включительно.
Смонтируйте постоянный том для каталога резервных копий:
docker run -v /host/path/data:/app/data mockarty:latest
Резервное копирование SQLite
Для развёртываний с SQLite Mockarty делает согласованный снимок базы — это безопасно, пока люди продолжают работать. Используется тот же интерфейс панели администратора — дополнительные инструменты не требуются.
Работающий узел не может заменить файл SQLite, с которым работает, поэтому резервная копия SQLite восстанавливается при остановленном сервисе: скачайте файл копии, остановите Mockarty, выполните mockarty --restore <файл копии> с теми же настройками, что у сервера, и снова запустите Mockarty. Прежняя база сохраняется рядом.
Полное резервное копирование для аварийного восстановления — база, вложения и файлы отчётов, с проверкой ключей шифрования при восстановлении — описано в разделе Резервное копирование и восстановление.
Диагностический пакет
Если что-то работает не так и вы обращаетесь в поддержку, скачайте диагностический пакет: панель администратора → Настройки (статус системы и логи) → «Скачать диагностический пакет». Кнопка доступна только администраторам.
В архиве:
| Файл | Содержимое |
|---|---|
version.txt |
Версия продукта |
config.json |
Факты конфигурации без секретов: тип базы и кэша, режим кластера, порты, включённые интеграции |
database.json |
Тип базы, текущая версия миграций, проверка связи и снимок SQL-пула этого узла (max_open_connections, open_connections, in_use_connections, idle_connections, wait_count, wait_duration_ms) |
health.json |
Состояние процесса: нагрузка, память, доступность базы; при отсутствии подключения явно указано unavailable |
cache-cluster.json |
Кэш и режим кластера |
recent-errors.log |
До 200 последних сообщений об ошибках этого узла, не более 8 КиБ каждое; очень большие сообщения опускаются, пароли, токены и ключи маскируются |
manifest.json |
Когда пакет сформирован |
Архив никогда не содержит пароли, токены, API-ключи и строки подключения к базе. Каждое скачивание фиксируется в журнале аудита.
Показатели пула относятся только к узлу, создавшему архив. В кластере скачайте пакет с каждого затронутого узла и сравните его с метриками по узлам на обзорном дашборде. Максимум пула 0 означает отсутствие заданного лимита подключений, поэтому долю занятых соединений для него не вычислить. На дашборде также показаны ошибки записи в кэш и ограниченная выборка audit outbox; насыщение выборки не является точным размером очереди. После смены лидера, ошибки чтения или 90 секунд без нового замера выборка скрывается; если пропали все выборки, проверьте часы узлов.
Тот же архив доступен через API:
curl -H "Authorization: Bearer <ADMIN_TOKEN>" \
-o support-bundle.zip \
http://localhost:5770/api/v1/admin/support-bundle
Политики очистки
Политики очистки управляют сроком хранения исторических данных. Их настройка предотвращает неограниченный рост базы данных.
Настройка очистки
Перейдите в Панель администратора > Cleanup или Settings > Cleanup внутри пространства имён.
Доступные политики
| Политика | Описание | По умолчанию |
|---|---|---|
| Хранение журналов запросов | Срок хранения записанных логов запросов/ответов | 30 дней |
| Хранение неопределённых запросов | Срок хранения логов несопоставленных запросов | 14 дней |
| Хранение отчётов о тестах | Срок хранения отчётов о запусках тестов | 90 дней |
| Обработка истёкших моков | Что делать с моками, у которых истёк TTL | Архивировать |
Варианты обработки истёкших моков:
- Архивировать — пометить истёкшие моки как неактивные. Они перестают сопоставляться с запросами, но остаются видимыми в интерфейсе для справки.
- Автоудаление — окончательно удалять истёкшие моки после настраиваемого льготного периода.
- Ничего не делать — оставить истёкшие моки как есть (не рекомендуется для продакшена).

Журнал аудита
Журнал аудита ведёт подробную запись всех значимых действий, выполненных в системе.
Что регистрируется
- События аутентификации — входы пользователей (успешные и неудачные), выходы, запросы 2FA.
- Операции с моками — создание, обновление, удаление, импорт, экспорт.
- Изменения пространств имён — создание, удаление, назначения ролей пользователей.
- Административные действия — управление пользователями, изменение системных настроек, резервное копирование/восстановление.
- Использование API-токенов — создание, удаление и паттерны использования токенов.
- Операции с хранилищами — изменения в Global-хранилище.
Просмотр журнала аудита
- Перейдите в Панель администратора > Audit Logs.
- Просматривайте хронологический список событий.

Фильтрация
Используйте элементы управления фильтрацией в верхней части страницы:
- User — фильтр по конкретной учётной записи.
- Event type — фильтр по типу действия (login, mock.create, namespace.delete и т. д.).
- Date range — задать начальную и конечную дату.
- Namespace — фильтр по пространству имён (для событий, связанных с пространством).
Экспорт журнала аудита
- Примените нужные фильтры.
- Нажмите Export.
- Выберите формат:
- CSV — значения, разделённые запятыми, удобно для анализа в электронных таблицах.
- JSON — структурированные данные, удобно для программной обработки.
- Файл загружается в браузер.
Настройка LLM / AI-ассистента
Mockarty включает AI-ассистента (Agent Chat), помогающего пользователям создавать моки, диагностировать проблемы и исследовать систему на естественном языке.
Включение AI-ассистента
Установите следующую переменную окружения:
ENABLE_LLM=true
MCP-сервер
Если вы хотите предоставить инструменты Mockarty через MCP (Model Context Protocol) для внешних AI-агентов, включите встроенный MCP-сервер:
ENABLE_MCP=true
| Переменная окружения | Описание | По умолчанию |
|---|---|---|
ENABLE_MCP |
Включить MCP-сервер | false |
MCP_PORT |
Порт MCP-сервера | 5772 |
Параллелизм агента
Подсистема AI-агента (ADK) управляет тем, сколько задач агента могут выполняться одновременно и как долго живут сессии:
| Переменная окружения | Описание | По умолчанию |
|---|---|---|
ADK_ENABLED |
Включить подсистему агента ADK | true |
ADK_MAX_CONCURRENT_TASKS |
Максимум одновременных задач AI-агента | 3 |
ADK_SESSION_TTL_HOURS |
Время жизни сессии агента в часах | 24 |
ADK_MAX_TOOL_ITERATIONS |
Максимум итераций вызова инструментов на запрос | 50 |
MOCKARTY_AGENT_LLM_CALL_TIMEOUT_SEC |
Жёсткий лимит одной попытки обращения к LLM-провайдеру, включая поток. Допустимый диапазон: 30–540 секунд |
180 |
MOCKARTY_AGENT_LLM_STALL_TIMEOUT_SEC |
Максимальное ожидание токена в потоке. Допустимый диапазон: 5–120 секунд; значение должно быть меньше общего таймаута |
90 |
MOCKARTY_LLM_CONTEXT_WINDOW |
Окно контекста (в токенах), которое агент предполагает для незнакомых моделей. Уменьшайте только при работе с маленькой локальной моделью; длинные прогоны агента хранят историю до этого размера | 262144 |
A2A_ENABLED |
Включить протокол A2A (Agent-to-Agent) | true |
Задайте эти переменные до запуска admin-узла и перезапустите узел после изменения. Если хотя бы одно значение имеет неверный формат, выходит за допустимый диапазон или таймаут простоя не меньше общего таймаута, Mockarty применяет оба безопасных значения по умолчанию (180 и 90). Более короткий таймаут вызывающей операции по-прежнему имеет приоритет.
Конфигурация по умолчанию
При включении без дополнительной настройки Mockarty подключается к локальному экземпляру Ollama:
| Параметр | Значение по умолчанию |
|---|---|
| Провайдер | Ollama |
| URL | http://localhost:11434 |
| Модель | qwen3:0.6b |
Локальная Ollama (для разработчиков)
Ollama позволяет запускать open-source LLM локально. Это удобно для разработки и тестирования, когда не нужно использовать облачный LLM-провайдер.
Установка Ollama:
# macOS
brew install ollama
# Linux
curl -fsSL https://ollama.com/install.sh | sh
Запуск Ollama и загрузка модели:
# Start the Ollama server
ollama serve &
# Pull a model (choose size based on available RAM)
ollama pull qwen3:0.6b # ~1 GB RAM — smallest, fast
ollama pull qwen3:1.7b # ~2 GB RAM — вариант с большей моделью
ollama pull qwen3:4b # ~3.5 GB RAM — better quality
Настройка Mockarty для работы с Ollama:
Установите ENABLE_LLM=true и создайте профиль Ollama в Панели администратора > LLM Profiles со следующими параметрами:
- Provider: Ollama
- URL:
http://localhost:11434 - Model: загруженная вами модель (например,
qwen3:1.7b)
Альтернативно — передайте URL и модель Ollama как переменные окружения при запуске. Они служат значениями по умолчанию, если профиль LLM не настроен:
ENABLE_LLM=true OLLAMA_URL=http://localhost:11434 OLLAMA_MODEL=qwen3:1.7b ./mockarty
Примечание: Для продакшена настраивайте провайдеров LLM через панель администратора. Переменные
OLLAMA_URLиOLLAMA_MODEL— это удобные значения по умолчанию, которые переопределяются активным профилем LLM.
Настройка профилей LLM
Через панель администратора можно настроить несколько профилей LLM:
- Перейдите в Панель администратора > LLM Profiles.
- Нажмите Create Profile.
- Заполните:
- Name — отображаемое имя профиля.
- Provider — OpenAI, Anthropic (Claude), OpenRouter, Google (Gemini), Mistral, Groq, Ollama (локальный) или Custom (любой OpenAI-совместимый эндпоинт).
- URL — URL API-эндпоинта.
- API Key — ключ аутентификации (если требуется провайдером).
- Model — идентификатор модели.
- Нажмите Save.
- Установите один профиль как Default для всех пользователей.

Потребление ИИ и процессов
Откройте Admin → AI & LLM → Потребление, чтобы посмотреть вызовы LLM,
надёжно сохранённые диспатчи инструментов агентов и время завершённых
runner-задач с группировкой по профилю, пространству имён, пользователю,
агенту, продукту, миссии, компоненту, исходу или модулю.
Стоимость провайдера и стоимость для клиента показываются отдельно по каждой
валюте. События без действующей цены остаются в отчёте и считаются как События
без цены: Mockarty не подставляет нулевую стоимость и не смешивает валюты.
Прайсбук хранит неизменяемые версии с датой вступления в силу. Укажите
провайдера, модель, трёхбуквенный код валюты, дату и цены входа, выхода, чтения и
записи кеша за один миллион токенов. Модель * задаёт резервную цену для всего
провайдера. Для исправления тарифа добавьте новую версию с правильной датой —
историческая версия и уже зафиксированные снимки цен не изменяются.
Та же форма тарифицирует реальные ресурсы процесса. Для Вызовов инструментов
укажите провайдер mockarty-agent и имя инструмента, например run_api_test
(или * как резервный тариф). Для Секунд раннера укажите mockarty-runner и тип
runner-задачи (или *). Стоимость провайдера и цена для клиента задаются за вызов или
секунду работы раннера; интерфейс автоматически выбирает нужную единицу.
Цены вводятся в обычных единицах валюты (например, 0.15 USD за миллион
токенов). Поддерживается шесть знаков после запятой. Перед сохранением новой
версии тарифа проверьте сумму и валюту в интерфейсе.
Учёт хранилища и трафика
Кроме токенов, вызовов инструментов и времени раннеров Mockarty учитывает два
физических ресурса по каждому пространству:
- Байт-секунды хранилища — раз в час замеряется объём хранимых файлов
пространства (вложения, артефакты, записи) и записывается в байт-секундах:
один байт, хранившийся час, — это 3600 байт-секунд. В кластере замер делает
ровно один узел, поэтому ничего не считается дважды. - Исходящие байты — исходящий трафик, отданный админ-узлом, агрегируется
поминутными окнами. Колонкаresourceразличает источник:proxy— байты
ответов, которые проксирующий мок отдал своим клиентам,blob-download—
скачивания файлов. В кластере каждый админ-узел записывает свои байты, а
колонка узла в выписке показывает, кто их отдал. Трафик выделенных
resolver-узлов не учитывается.
Оба ресурса видны в итогах панели Потребление и в экспорте
mockarty economics statement (event_kind storage_byte_seconds /
egress_bytes, unit byte_seconds / bytes). Чтобы назначить тариф,
выберите в форме прайс-листа Байт-секунды хранилища или Исходящие
байты, оставьте провайдера mockarty и укажите ресурс — blobs для
хранилища; proxy, blob-download или * для трафика. События без тарифа
остаются видимыми и никогда не тарифицируются нулём.
Учёт включён по умолчанию и практически бесплатен (наносекунды на запрос).
Полностью выключить его — например, на контуре, где учёт ресурсов не нужен, —
можно переменной окружения MOCKARTY_RESOURCE_METERING=off с перезапуском.
Коммерческие условия
Карточка Коммерческие условия на той же вкладке Потребление задаёт, что
вы берёте поверх себестоимости провайдера за каждый учтённый вызов LLM:
- Наценка, % — прибавляется к себестоимости (может быть больше 100 %).
- Платформенный сбор за вызов — фиксированная сумма за вызов в своей валюте.
Берётся только с вызовов, оценённых в этой валюте. - Скидка, % — вычитается из промежуточной суммы.
- Налог, % — начисляется на сумму после скидки.
Стоимость для клиента = себестоимость + наценка + сбор − скидка + налог. Если
пространство работает со своим ключом провайдера, себестоимость не ваша, поэтому
она и наценка считаются нулём; сбор и налог применяются.
Оставьте Пространство имён пустым, чтобы задать условия для всей инсталляции;
укажите пространство имён, чтобы переопределить их для него. По умолчанию ничего
не задано: каждый вызов идёт по себестоимости, и панель Потребление так и
пишет. Новые условия действуют для вызовов с момента сохранения; уже
выставленные строки не меняются. Каждое изменение попадает в журнал аудита.
Четыре составляющие видны отдельными колонками в выгрузке выписки, в итогах
панели Потребление и — для администраторов — в карточке экономики каждой
миссии. Агент читает и задаёт условия инструментами llm_commercial_terms_get и
llm_commercial_terms_set.
Бюджеты до вызова и сверка
На той же вкладке Потребление создайте бюджет рабочего пространства,
продукта или миссии. До обращения к провайдеру Mockarty оценивает и атомарно
резервирует стоимость. Вызов отклоняется до расхода, если он пересекает жёсткий
лимит, выходит за включённую сумму и предоплату без разрешённого перерасхода
или не имеет действующей цены при включённом флаге Блокировать вызовы без
цены.
Те же бюджеты допускают до обращения к провайдеру вызовы LLM и поддерживаемые
платные физические эффекты: инструменты агентов, работу раннеров, внешнюю
транскрибацию и вызовы удалённых security-раннеров. Байт-секунды хранения и
исходящие байты измеряются после фактического потребления, поэтому учитываются
без потерь, но не резервируются заранее по оценке.
После ответа провайдера резерв закрывается по фактическим токенам. Интерфейс
разделяет включённую сумму, предоплату и перерасход, показывает открытые и
истёкшие резервы, расхождения реестра, текущий расход в день и прогноз на 30
дней. Нулевой жёсткий лимит отключает только отдельный потолок; он не означает
нулевой допустимый расход.
Бюджет сам сообщает, когда он достигнут. Срабатывают два события, каждое один
раз за период бюджета: LLM-бюджет — пройден мягкий предел, когда резерв
впервые выводит зафиксированный расход за мягкий предел (вызовы продолжаются),
и LLM-бюджет — жёсткий предел остановил вызов, когда жёсткий предел или
лимит без овердрафта отклоняет вызов (все следующие вызовы отклоняются, пока
бюджет не поднимут или не закончится период). Оба видны в колокольчике, их
можно привязать к личному каналу, доставить подпиской командного канала
(Настройки → Колбэки пространства → Командные каналы, группа Система) или
отправить в вебхук; сообщение называет бюджет, суммы и период и открывает
настройки бюджета. Повторный отказ сообщение не повторяет.
Участники пространства имён — и агенты, работающие в нём, — видят, сколько их
область ещё может потратить, без страницы администратора: MCP-инструмент
llm_budget_headroom (или GET /api/v1/namespaces/{namespace}/llm-budget,
при необходимости ?missionId=<id>) показывает действующие бюджеты пространства,
сколько каждый ещё допускает до отказа платного вызова и не исчерпана ли область
уже. Автономный агент проверяет это перед дорогой работой и останавливается у
предела, а не узнаёт о нём из отказа.
Если платный физический эффект был отправлен, но окончательный ответ провайдера
потерялся, он появляется в списке Неоднозначные исходы. Администратор может
нажать Сверить, выбрать авторитетный источник подтверждения и указать
уникальный идентификатор эффекта или строки инвойса провайдера. Выберите
Эффект произошёл и задайте точный объём для списания резерва либо
Эффекта не было только при наличии подтверждения, что провайдер не выполнил
платное действие. Связь с подтверждением и списание или освобождение резерва
фиксируются одной транзакцией; противоречащее решение их не заменяет. Если
инвойс показывает объём выше допущенного, Mockarty учитывает полный фактический
расход и отмечает превышение лимита, а не скрывает стоимость провайдера.
Команда mockarty economics statement выгружает воспроизводимые строки единого
реестра. Помимо событий с токенами LLM, выписка содержит надёжно сохранённые
диспатчи инструментов (tool_call / calls) и время завершённых runner-задач
(runner_seconds / seconds), хранение (storage_byte_seconds /
byte_seconds) и исходящий трафик (egress_bytes / bytes). В столбце
resource указан конкретный ресурс; прежний столбец model продолжает заполняться для совместимости.
Разные ресурсы нужно агрегировать по event_kind, quantity и unit.
Полный возврат клиенту добавляется через mockarty economics refund --event-id ... --reason ...: исходное событие и расход провайдера не стираются. Повторный запрос
идемпотентен. CSV защищён от формул табличного редактора и ограничен 50 000 строками за запрос.
Клиентская LLM
Пользователи также могут подключить собственного LLM-провайдера напрямую из браузера, без маршрутизации API-вызовов через сервер Mockarty. Это полезно, когда:
- У пользователей есть собственные API-ключи для OpenAI, Claude или других провайдеров
- Вы хотите избежать прохождения LLM-трафика через сервер Mockarty
- Разным пользователям нужны разные LLM-провайдеры
В клиентском режиме API-вызовы к LLM выполняются напрямую из браузера к провайдеру, а выполнение инструментов (создание моков, обновление хранилищ и т. д.) по-прежнему происходит на сервере.
Чтобы использовать клиентскую LLM, пользователь выбирает свой профиль в настройках Agent Chat со своим API-ключом и URL провайдера.
Лимиты запросов по пространствам имён
Чтобы предотвратить чрезмерное использование LLM, настройте лимиты запросов на пространство имён:
- Перейдите в Панель администратора > LLM Profiles.
- В разделе Rate Limits установите:
- Requests per minute на пространство имён.
- Requests per day на пространство имён.
- Нажмите Save.
Agent Chat
Когда AI-ассистент включён, на каждой странице веб-интерфейса появляется плавающая кнопка чата. Пользователи могут:
- Задавать вопросы об использовании Mockarty.
- Запрашивать создание моков на естественном языке.
- Получать помощь с выражениями JsonPath, функциями Faker и условиями.
- Диагностировать проблемы сопоставления моков.
Режим автоматического одобрения
По умолчанию Agent Chat требует ручного одобрения каждого вызова инструмента (кнопки Accept/Decline). Вы можете включить режим автоматического одобрения, чтобы вызовы инструментов выполнялись без подтверждения:
- Откройте Agent Chat.
- Найдите выпадающий список Auto Approve в верхней части панели чата.
- Переключите с Manual на Auto Approve.
Эта настройка хранится локально в браузере и сохраняется между сессиями. Используйте автоматическое одобрение, когда доверяете AI-агенту выполнять операции без проверки — например, при быстром прототипировании моков в sandbox-пространстве.
Внимание: В продакшен-пространствах рекомендуется оставлять ручное одобрение, чтобы проверять каждый вызов инструмента перед выполнением.
OpenTelemetry: трассы и метрики
Админ → Мониторинг. Один раз укажите свой OTel-коллектор
(адрес, gRPC или HTTP, при необходимости заголовки) и включите то, что нужно
отправлять.
- Трассы — спаны запросов на пути резолва моков (видно, как запрос прошёл
через ответивший стаб), а также спаны доставки webhook’ов и LLM-вызовов
(провайдер, модель, счётчики токенов — никогда не содержимое промпта или
ответа). - Также отправлять метрики (OTLP) — раз в минуту отправляет по тому же
соединению те же ряды, что отдаёт/metrics.
Отправка метрик нужна в одном случае: сеть, где этот узел никто не может
опрашивать (контуры только на исходящие, VPC заказчика с единственным
исходящим маршрутом). Если ваш коллектор уже скрейпит /metrics своим
prometheus-receiver’ом — оставьте выключенным, иначе те же числа поедут дважды.
Отправляются ровно те ряды, что и на /metrics, без изменений: метрики читаются
из того же реестра, а не инструментируются второй раз, поэтому скрейп и push не
могут разойтись. Отправка работает независимо от того, обслуживает ли узел
трафик, — простаивающий узел это как раз тот случай, когда важно видеть, что он
жив.
Выключение телеметрии останавливает оба сигнала.
Фоновые чистки — тоже метрики. Каждая запланированная чистка (retention-развёртки
из Админ → Хранение данных) отчитывается на /metrics, так что остановившаяся
чистка видна без чтения логов:
mockarty_background_sweep_runs_total{sweep=<тип настройки>,outcome=completed|panicked}
— один инкремент на запуск (panicked— паника, которую чистка сама не перехватила);
ряд, который перестал двигаться, — чистка, которая перестала запускаться.mockarty_background_sweep_duration_seconds{sweep=<тип настройки>}— длительность
каждого запуска.
Метка sweep — тип retention-настройки, то же имя, что на странице хранения данных.
Такт обслуживания памяти проекта (приём фактов, индексация, компакция) отчитывается в том
же семействе как sweep="project_memory_runtime"; такт, завершившийся ошибкой, считается
отдельно в mockarty_project_memory_tick_failures_total — постоянно падающий цикл виден
как растущий счётчик, а не как тихо остановившийся ряд. Запись, принятая, когда проект
уже за мягким лимитом бюджета памяти, увеличивает
mockarty_project_memory_degraded_admissions_total (жёсткий потолок по-прежнему
отказывает): рост этого счётчика — предупреждение, что дальше начнутся отказы.
Парк раннеров измеряется на той же странице. Каждая задача, которую узел отдаёт
раннеру, оставляет на /metrics своё ожидание и время выполнения, а глубина очереди
публикуется каждые 15 секунд — так что «парк слишком мал» или «один тип задач
медленный» становится числом, а не ощущением:
mockarty_runner_demand_pending{capability=<тип задачи>}— задачи в очереди на
capability, которые раннер ещё не взял;mockarty_runner_demand_busyи
mockarty_runner_demand_capacity— число выполняющихся задач и суммарное число
параллельных слотов у раннеров, объявивших эту capability.mockarty_runner_task_queue_wait_seconds{task_type=<тип задачи>}— сколько задача
ждала от создания до того, как раннер её запустил.mockarty_runner_task_duration_seconds{task_type=<тип задачи>,outcome=completed|failed}
— сколько затем занял сам запуск, от старта до отчёта о результате.mockarty_runner_tasks_completed_total{task_type=<тип задачи>,outcome=completed|failed}
— один инкремент на задачу, которую раннер закончил: доложен результат или запуск
потерян на середине (считается какfailed). Задачи, отменённые пользователем, не
считаются.
Обе задержки считаются по собственным отметкам времени задачи на узле, а не по тому,
что раннер сообщает о себе. Задача, которая так и не стартовала (таймаут в очереди),
учитывается в счётчике, но задержек не даёт — ожидание, которое никто не обслужил, не
сойдёт за быстрый запуск.
UI-прогоны (браузерные и мобильные) отчитываются так же. Когда прогон UI-теста
завершается, узел записывает его вердикт и каждое воспроизведённое действие:
mockarty_ui_runs_total{platform=web|android|ios,engine=<движок>,outcome=passed|failed|broken|skipped}
— один инкремент на завершённый прогон.mockarty_ui_run_steps_total{platform,engine,status=passed|failed|broken|skipped}
— один инкремент на воспроизведённое действие.mockarty_ui_run_step_duration_seconds{platform,engine}— сколько заняло каждое
действие; шаг, о котором раннер отчитался без времени, считается, но не измеряется.
engine — браузерный движок (chromium, firefox, webkit, lightpanda, cdp)
или мобильный драйвер (adb, maestro). Значения, которые узел не распознаёт,
сворачиваются в other, чтобы раннер не мог раздуть страницу метрик произвольными
метками.
Рекомендации по безопасности
Следуйте этим рекомендациям, чтобы поддерживать безопасность вашей инсталляции Mockarty.
Немедленные действия после установки
-
Смените пароль администратора по умолчанию. Учётные данные
admin/adminописаны в публичной документации. Смените пароль до того, как экземпляр станет доступен по сети. -
Включите 2FA для учётных записей администраторов. Двухфакторная аутентификация добавляет критически важный уровень защиты для привилегированных учётных записей.
Сетевая безопасность и шифрование
-
Используйте HTTPS. Настройте TLS-сертификаты (автоматически сгенерированные или собственные), чтобы шифровать весь трафик. Установите
COOKIE_SECURE=true(значение по умолчанию), чтобы session cookies отправлялись только по HTTPS. -
Оставьте защиту от SSRF включённой. Параметр
ALLOW_PROXY_TO_PRIVATE_IPSпо умолчанию равенfalse, что предотвращает доступ модулей прокси/тестирования к сервисам внутренней сети. Не меняйте значение, если не понимаете рисков. Когда Mockarty работает в том же кластере, что и тестируемые сервисы, предпочтительнееMOCKARTY_TARGET_ALLOWLISTвместо грубого флага: он разрешает только перечисленные диапазоны/хосты (через запятую/пробел — CIDR вида10.0.0.0/8и суффиксы хостов вида.svc.cluster.local), оставляя все остальные приватные адреса заблокированными. Cloud-metadata и link-local блокируются независимо от обеих настроек. -
Ограничьте сетевой доступ. Используйте файрволы или сетевые политики, чтобы ограничить доступ к портам Mockarty:
Порт Протокол Назначение Кому открывать 5770 HTTP Веб-интерфейс, REST API, мок-трафик Пользователи / команды 5771 HTTPS Зашифрованный веб-интерфейс, REST API, мок-трафик Пользователи / команды (рекомендуется) 5772 HTTP/SSE MCP-сервер (только если ENABLE_MCP=true)AI-агенты / доверенные клиенты 5773 gRPC Координатор (регистрация resolver/runner) Внутри сети: только resolver- и runner-ноды
Контроль доступа
-
Используйте изоляцию пространств имён. Назначьте каждой команде собственное пространство имён с подходящими ролями. Это предотвращает случайное взаимное влияние между командами.
-
Соблюдайте принцип минимальных привилегий. Назначайте минимальную роль, соответствующую потребностям пользователя. Большинству пользователей подойдёт системная роль User с ролью User или Viewer в пространстве имён.
-
Регулярно ротируйте API-токены. API-токены дают программный доступ. Периодически ротируйте их и отзывайте те, что больше не нужны.
-
Просматривайте журналы аудита. Регулярно проверяйте журналы аудита на предмет неожиданной активности, особенно неудачных попыток входа и административных действий.
Операционная безопасность
-
Обновляйте Mockarty. Своевременно применяйте обновления, чтобы получать исправления безопасности.
-
Регулярно создавайте резервные копии. Настройте автоматическое резервное копирование в Панель администратора > Backup. Периодически проверяйте, что копии можно восстановить.
-
Мониторьте состояние системы. Используйте эндпоинты проверки состояния (
/health/liveдля liveness,/health/readyдля readiness) для мониторинга статуса системы. -
Включите контрактное тестирование. Используйте контрактное тестирование для обнаружения дрейфа моков и ломающих изменений. Это гарантирует, что моки остаются синхронизированы со спецификациями API, и предотвращает молчаливое расхождение тестовых окружений с продакшен-поведением.
-
Тестируйте устойчивость через chaos engineering. Используйте chaos engineering, чтобы убедиться, что ваши системы корректно обрабатывают сбои, когда зависящие от Mockarty сервисы испытывают неисправности (требуется PRO-лицензия).
Ограничение частоты запросов
Rate Limiting: Лимиты частоты запросов API настраиваются через базу данных. Лимиты по умолчанию: 10 запросов/секунду, 60/минуту, 1000/час на каждую область (пользователь/пространство имён/глобально), с burst-лимитом 20. Управление лимитами доступно через admin API.
Сводка переменных окружения
Базовая защита (рекомендуемые значения для продакшена):
| Переменная | Рекомендуется | Назначение |
|---|---|---|
COOKIE_SECURE |
true (по умолчанию) |
Session cookies только по HTTPS |
ALLOW_PROXY_TO_PRIVATE_IPS |
false (по умолчанию) |
Защита от SSRF (грубое отключение — открывает все приватные диапазоны) |
MOCKARTY_AQC_MATERIAL_BROKER_URL |
пусто | Полный операторский POST endpoint для получения оригинальных материалов, привязанных к заявке и namespace, при визуальном AQC-ревью. Брокер должен разрешать идемпотентное чтение для той же активной заявки и отклонять использование из другой заявки. Пустое значение отключает получение. |
MOCKARTY_AQC_MATERIAL_BROKER_TOKEN |
пусто | Необязательный Bearer service token этого брокера. Передавайте через Secret, а не через ConfigMap или payload заявки. |
MOCKARTY_AQC_MATERIAL_BROKER_ROUTES |
пусто | JSON-массив точных reader-маршрутов для нескольких шин: transport, url и необязательный token_env. Имена transport берутся из операторской конфигурации шин; неизвестная шина fail-closed. В JSON хранится только имя переменной токена, а её значение подаётся из Secret. |
MOCKARTY_TARGET_ALLOWLIST |
пусто (по умолчанию) | Точечное исключение SSRF: CIDR + суффиксы хостов через запятую/пробел (напр. 10.0.0.0/8,.svc.cluster.local), разрешённые как цели без открытия всех приватных адресов |
MOCKARTY_TARGET_CA_BUNDLE |
пусто (по умолчанию) | Дополнительный удостоверяющий центр, которому нужно доверять при проверке продукта на HTTPS с внутренним или самоподписанным сертификатом. Принимает как путь к PEM-файлу, так и сам текст PEM. Проверка сертификата остаётся включённой — вы добавляете доверенный центр, а не отключаете проверку |
MOCKARTY_TLS_SKIP_VERIFY |
false (по умолчанию) |
Крайняя мера, когда удостоверяющего центра нет: отключает проверку TLS для запросов к проверяемому продукту. Снимает защиту от перехвата трафика, поэтому применимо только в доверенной тестовой сети. Если задан и CA bundle, приоритет у него, и проверка остаётся включённой |
MCP_TLS_INSECURE_SKIP_VERIFY |
false (по умолчанию) |
Проверка TLS-сертификатов в клиентских вызовах MCP |
HTTPS_ENABLED |
true (по умолчанию) |
Включить HTTPS-листенер на порту 5771 |
Задайте эти переменные и на раннерах. Наборы проверок выполняются на раннере, а не на
административном узле, поэтомуMOCKARTY_TARGET_CA_BUNDLE,MOCKARTY_TLS_SKIP_VERIFYи
MOCKARTY_TARGET_ALLOWLISTдолжны присутствовать и в окружении раннера. Сертификат, которому
доверяет только административный узел, на раннере всё равно не пройдёт проверку, а выглядеть это
будет как недоступный продукт, а не как проблема с сертификатом.
Как читать внешнюю проверку качества (AQC): отчёт показывает, что проверено, а что проверить не удалось. Отсутствие результата не означает успешную проверку.
- AQC
a11y_score— доля от0до1:0.92означает 92%. В отчёте аудита доступности для человека сохраняется оценка из 100. - Браузерные метрики описывают загрузку страницы, а не нагрузочный тест. Отсутствующее измерение не означает успешный результат с нулевой длительностью; нагрузочной проверке по-прежнему нужны отдельно объявленные цели и разрешение.
- Визуальная оценка адаптивности требует кадра с подтверждённым viewport и доступной vision-модели. Отсутствие кадра или поддержки модели отражается как непроведённая проверка.
- При запрете записи в продукт наблюдение ссылок и DOM-свойств фокуса не доказывает работу кликов или клавиатурной навигации. Для read-only наблюдения нужен совместимый браузерный раннер; старый раннер сообщает о недостающей проверке и не получает разрешения активировать элементы.
- Сохранённые в каталоге сценарии могут быть ручными. Их наличие не доказывает выполнение; автоматической регрессии нужны исполнимые шаги.
HTTP / HTTPS листенер:
| Переменная | По умолчанию | Описание |
|---|---|---|
HTTP_PORT |
5770 |
Основной порт HTTP API/UI |
HTTP_BIND_ADDR |
0.0.0.0 |
По умолчанию HTTP слушает все интерфейсы. Для доступа только с этого хоста задайте 127.0.0.1; при внешнем доступе настройте файрвол или обратный прокси. |
HTTPS_ENABLED |
true |
Включить HTTPS-листенер |
HTTPS_PORT |
5771 |
Порт HTTPS |
HTTPS_BIND_ADDR |
"" |
Интерфейс для HTTPS-листенера. Пусто = совпадает с HTTP_BIND_ADDR |
HTTPS_CERT_FILE |
"" |
Путь к TLS-сертификату. При пустом значении Mockarty автоматически генерирует self-signed сертификат в HTTPS_TLS_DIR |
HTTPS_KEY_FILE |
"" |
Путь к приватному TLS-ключу |
HTTPS_TLS_DIR |
.mockarty/tls |
Каталог для автоматически сгенерированных self-signed сертификатов |
HTTP_REQUEST_BODY_SIZE_LIMIT_MB |
5 |
Максимальный размер тела запроса (МБ). Увеличьте при импорте больших наборов моков |
MOCKARTY_HTTP_MATCH_MODE |
off |
Режим ввода HTTP-матчера: off, shadow или on. В shadow скомпилированный индекс сравнивается, но ответы по-прежнему отдаёт старый матчер; на одном узле в on ответы отдаёт скомпилированный индекс. Кластер может запуститься в off или shadow; для shadow нужна межузловая инвалидация моков. Кластерный on отвергается до появления согласованного ввода. |
MOCKARTY_HTTP_MATCH_SAMPLE_EVERY |
100 |
В режиме shadow сравнивать каждый N-й запрос. Значение должно быть больше нуля. |
Ввод HTTP-матчера. Переменная окружения задаёт режим при запуске. Администратор может
переключить отдельное пространство имён в shadow или off без перезапуска. Перед сменой
режима обслуживания запросов проверьте собранные результаты.
- Запустите с
shadowили включите его для одного пространства имён. Каждый N-й запрос оценивают оба матчера, каждое расхождение
записывается; ответы по-прежнему отдаёт старый матчер. - Прочитайте записанное (
$TOKEN— токен администратора):
curl -H "Authorization: Bearer $TOKEN" \
http://localhost:5770/api/v1/admin/http-matcher/status
По каждому пространству имён видно режим, ревизию снимка и находки: winner_mismatch
(скомпилированный индекс ответил бы другим моком), no_candidates (в индексе нет маршрута для
этого запроса), selection_error или evaluation_error. Отсутствие находок означает, что
в проверенных запросах расхождения не записаны; это не доказывает согласованность всех
маршрутов. Узел, на котором
скомпилированный матчер не запущен, отвечает wired: false — это другое утверждение, чем
матчер, который работает и которому нечего сообщить.
Для смены режима одного пространства имён передайте его последнюю ревизию из
modeAuthority.records[].revision в поле expectedRevision. Для первого изменения
используйте 0:
curl -X PUT -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"mode":"shadow","expectedRevision":0}' \
http://localhost:5770/api/v1/admin/http-matcher/modes/my-namespace
После изменения снова прочитайте статус. Ответ 409 означает, что ревизия изменилась:
перед повтором получите текущую ревизию. Ответ 202 означает, что изменение сохранено, но
его распространение не подтверждено; перед следующей сменой проверьте
ответ. Пока modeAuthority.available равно false, этот узел обслуживает
запросы через прежний матчер до получения актуального режима.
- На одном узле переключите режим в
onпосле проверки результатов выборочного сравнения. С этого момента
ответ отдаёт скомпилированный индекс, а запрос, который он не смог обработать, обслуживает
старый матчер — и это записывается находкой. Перед сменой режима обслуживания проверьте
результаты выборочного сравнения. - Для отката одного пространства имён отправьте в тот же эндпоинт режим
offи последнюю
ревизию, либо выберитеoffдля этого пространства имён в карточке админ-панели (ниже).
Изменение исходного режима в переменной окружения по-прежнему требует перезапуска.
Смена режима и наблюдение за вводом в админ-панели
То же состояние видно без API, и там же можно сменить режим. Откройте
Админ-панель > Настройки и найдите карточку HTTP-матчер: она показывает текущий режим
по вашим пространствам имён, последнюю ревизию снапшота, общее число записанных находок и
таблицу по пространствам имён (десять с наибольшим числом находок; кнопка Показать все
раскрывает остальные). Карточка обновляется каждые 30 секунд. На узле, где скомпилированный
матчер не запущен, карточка показывает Не подключён — тот же смысл, что wired: false в
ответе API выше.
В конце каждой строки — селектор режима. Выбор режима применяет его к этому пространству имён
с ревизией из той же строки, поэтому изменение, сделанное тем временем кем-то другим, будет
отклонено, а карточка перечитает текущее значение вместо того, чтобы затереть чужую правку.
Переход в on и из on меняет то, какой матчер отвечает на живые запросы, поэтому он сначала
спрашивает подтверждение; off и shadow оба отвечают старым матчером, поэтому такое
переключение применяется сразу. Если изменение сохранено, но его подтвердили ещё не все узлы,
карточка об этом скажет — перечитайте режим перед следующей сменой.
Пространство имён появляется в таблице только после того, как матчер собрал для него снимок,
поэтому на свежем узле таблица пуста. Строка под ней задаёт режим пространству имён ПО ИМЕНИ:
впишите имя, выберите режим и примените. Отправляется ревизия из строки таблицы, а если
пространства там нет — ревизия первой установки; пространство, у которого режим уже есть,
ответит тем же конфликтом, что и любая устаревшая ревизия, вместо перезаписи, и дальше таблица
покажет его с настоящей ревизией.
В кластере эндпоинт переключения пока принимает только shadow и off. Переключение в on
во время работы возвращает 409, а запуск с MOCKARTY_HTTP_MATCH_MODE=on завершается
ошибкой до появления согласованного ввода.
База данных:
| Переменная | По умолчанию | Описание |
|---|---|---|
DB_USE |
pg |
Драйвер БД: pg (PostgreSQL, рекомендуется для продакшена), sqlite (однофайловая, dev/desktop), mysql (экспериментально) |
DB_DSN |
— | Строка подключения к БД (обязательна для pg/mysql) |
DB_ENABLE_AUDIT |
true |
Включить таблицу аудита (требуется для комплаенса — оставьте true в продакшене) |
DB_ENABLE_VERSIONING |
true |
Включить историю версий моков |
DB_MAX_OPEN_CONNS |
25 |
Размер основного пула к PostgreSQL (матчинг моков, админ-запросы). В кластере суммарно ≈ узлов × значение — держите запас относительно PostgreSQL max_connections. |
BOOTSTRAP_DB_MAX_OPEN_CONNS |
авто (4 на CPU, от 16 до 30) | Размер пула админ/bootstrap к PostgreSQL (license status, шедулеры, нотификации). «CPU» — лимит процессора контейнера; переопределяйте в multi-node кластере, чтобы не упереться в PostgreSQL max_connections, — см. Планирование ресурсов. |
Кэш:
| Переменная | По умолчанию | Описание |
|---|---|---|
USE_CACHE |
true |
Включить слой кэша для резолвинга моков |
CACHE_TYPE |
inmemory |
Бэкенд кэша: inmemory (in-memory, single-node) или redis (multi-node) |
CACHE_REDIS_POOL_SIZE |
авто (max(20, 10 × CPU)) |
Размер пула соединений к Redis. Поднимайте для >100 тыс. одновременных пользователей; снижайте, если узким местом оказывается maxclients на Redis. |
CACHE_REDIS_MIN_IDLE_CONNS |
авто (max(4, CPU)) |
Минимум «прогретых» соединений к Redis. Компромисс между idle-ресурсами и латентностью первого запроса после пауз. |
MOCKARTY_SECRETS_CACHE_TTL_SECONDS |
60 |
TTL внутрипроцессного кэша секретов, используемого шагами TCM при резолве {{secret.X}}. Предотвращает перегрузку upstream-хранилищ (Vault, AWS SM, GCP SM, Azure KV) при высоконагруженных прогонах тест-планов. -1 — кэш отключён. Ротация/обновление/удаление в secrets инвалидируют запись немедленно по всему кластеру через PG NOTIFY. |
MOCKARTY_SECRETS_CACHE_MAX_ENTRIES |
4096 |
LRU-лимит записей в кэше секретов. Свыше лимита вытесняются самые старые. Увеличивайте при множестве namespaces × ключей; уменьшайте при ограничениях по RAM. |
MOCKARTY_PREVIEW_ALLOW_PRIVATE_HOSTS |
(не задано, запрещено) | Установите 1 (или true), чтобы TCM-эндпоинт preview-step-request мог отправлять HTTP-запросы на loopback / RFC1918 / link-local / cloud-metadata адреса. По умолчанию ВЫКЛЮЧЕНО, потому что preview, нацеленный на внутренние сервисы, — классический SSRF-вектор. Включайте ТОЛЬКО на dev-машинах, где upstream сознательно живёт на 127.0.0.1. |
PDF-движок для отчётов Test Plan (опционально):
Эндпоинт экспорта прогона Test Plan может отдавать PDF, если в системе доступен внешний рендерер. Mockarty при старте сам ищет бинарь wkhtmltopdf и подключает его автоматически — в большинстве случаев никаких env-vars выставлять не нужно. Если бинарь не установлен, эндпоинт возвращает 501 Not Implemented с JSON-конвертом, объясняющим как его поставить.
| Переменная | По умолчанию | Описание |
|---|---|---|
MOCKARTY_PDF_ENGINE |
auto |
Какой рендерер использовать для /test-plan-runs/:id/export?format=pdf. Значения: auto (попытаться wkhtmltopdf из PATH, при отсутствии — заглушка; рекомендуется); none / stub (PDF осознанно выключен — эндпоинт отвечает 501); wkhtmltopdf (явно — то же что auto, но при отсутствии бинаря пишет в лог предупреждение, а не информационное сообщение); chromium (лучшая поддержка CSS, эмодзи и CJK-шрифтов, но требуется Chromium-вариант сборки Mockarty — см. ниже). |
MOCKARTY_PDF_WKHTMLTOPDF_BIN |
wkhtmltopdf |
Путь к бинарю wkhtmltopdf. Передайте абсолютный путь (например /usr/local/bin/wkhtmltopdf) либо имя, разрешимое через PATH. Если бинарь не найден при старте, Mockarty пишет уведомление в лог и оставляет PDF выключенным (без падения сервиса). |
MOCKARTY_PDF_CHROMIUM_BIN |
chromium-headless |
Путь к бинарю Chromium / Chrome. Селектор пробует поочерёдно chromium-headless → chromium → google-chrome, поэтому стандартные имена дистрибутивов работают без переопределения. Используется только при MOCKARTY_PDF_ENGINE=chromium И запущенном Chromium-варианте сборки Mockarty. |
MOCKARTY_PDF_MAX_BYTES |
26214400 (25 МиБ) |
Максимальный размер PDF на выходе. Если рендерер выдаёт больше, запрос отвечает 413 Request Entity Too Large с кодом pdf_too_large. Поднимайте для планов с большим количеством скриншотов; снижайте, чтобы защитить RAM admin-ноды. |
MOCKARTY_PDF_TIMEOUT_SECONDS |
60 |
Жёсткий таймаут на один PDF-рендер. При превышении запрос отвечает 504 Gateway Timeout с кодом pdf_timeout. Поднимайте для очень больших планов, снижайте если экспорт зависает за подвисшим бинарём. |
Chromium-вариант сборки. Стандартный release-бинарь distroless-дружелюбный и содержит только путь
wkhtmltopdf. Для Chromium-качества PDF нужен Chromium-вариант сборки Mockarty — запросите его у поставщика Mockarty — и Chromium-бинарь, доступный в PATH (или черезMOCKARTY_PDF_CHROMIUM_BIN). Для большинства операторовwkhtmltopdf— более простой выбор: установите его пакетным менеджером дистрибутива, и всё готово.
Установка wkhtmltopdf:
Рендерер — это один статический бинарь от wkhtmltopdf.org. Выберите команду под вашу платформу:
- Debian / Ubuntu —
sudo apt-get update && sudo apt-get install -y wkhtmltopdf - Alpine —
apk add --no-cache wkhtmltopdf(плюсttf-dejavu, если в отчётах есть не-ASCII текст) - macOS —
brew install --cask wkhtmltopdf(на старых Homebrew работаетbrew install wkhtmltopdf) - CentOS / Rocky / RHEL — скачайте RPM с официальной страницы релизов и установите
rpm -i …. Дистрибутивная версия часто старше 0.12.6 и спотыкается на flex-CSS. - Windows — скачайте
.exe-инсталлятор с официальной страницы и укажите путь к нему вMOCKARTY_PDF_WKHTMLTOPDF_BIN.
После установки перезапустите Mockarty. В startup-логе появится test-plan PDF engine selected engine=wkhtmltopdf если детектор сработал. Кнопка «Скачать PDF» в отчёте о прогоне тест-плана начнёт работать без выставления env-vars.
Траблшутинг: если экспорт всё ещё возвращает 501 после установки — проверьте, что бинарь в $PATH admin-ноды (which wkhtmltopdf) и что он исполняется (wkhtmltopdf --version). Если установили в нестандартный путь — выставьте MOCKARTY_PDF_WKHTMLTOPDF_BIN=/полный/путь/к/wkhtmltopdf и перезапустите. Установите MOCKARTY_DEBUG=1, чтобы Mockarty писал упавший HTML в /tmp/mockarty-pdf-*.html для локального воспроизведения.
Кластерный режим (multi-node развёртывания):
| Переменная | По умолчанию | Описание |
|---|---|---|
CLUSTER_MODE |
false |
Включить leader election через advisory-lock PostgreSQL. Установите true, когда запускаете больше одной административной ноды. При false каждая нода считает себя лидером (singleton-джобы будут дублироваться) |
NODE_ID |
автогенерация | Уникальный идентификатор ноды. Задавайте явно, только если нужна стабильная идентификация ноды в логах/метриках |
MOCKARTY_CLUSTER_ADVERTISE_HOST |
автоопределение | Адрес, по которому другие ноды обращаются к этой, — для работы, которая должна выполняться на ноде с живым соединением (телефон в сетке устройств, поток управления раннера, звонок через сервер). По умолчанию POD_IP, затем частный адрес машины. Helm-чарт ставит IP пода |
Правило для multi-node.
CLUSTER_MODE=trueтребует PostgreSQL (DB_USE=pg). SQLite не поддерживает advisory-lock, используемые для leader election.
Event bus (асинхронная обработка событий):
| Переменная | По умолчанию | Описание |
|---|---|---|
EVENT_BUS_QUEUE_SIZE |
1000 |
Глубина in-memory очереди для асинхронных событий |
EVENT_BUS_RETRY_MAX |
3 |
Максимум повторов на событие |
EVENT_BUS_WORKER_COUNT |
2 |
Число фоновых воркеров, обрабатывающих очередь |
Аналитика (opt-in, анонимная):
| Переменная | По умолчанию | Описание |
|---|---|---|
ANALYTICS_ENABLED |
false |
Opt-in на анонимные метрики использования. Собираются только агрегированные счётчики — без PII, без содержимого моков, без ID пользователей |
ANALYTICS_LEVEL |
full |
full — все метрики; minimal — только счётчики ресурсов |
ANALYTICS_REPORT_HOUR |
1 |
UTC-час (0–23) для ежедневной агрегации |
ANALYTICS_DATA_DIR |
"" |
Каталог для air-gapped экспортов (по умолчанию: ./data) |
Test Plans (живые логи и долговременный архив):
Движок Test Plans пишет каждую строку лога элемента через sink, который раздваивает запись на основное хранилище (таблица test_plan_item_logs — используется для повторного воспроизведения в UI) и опциональный вторичный архив (локальный файл или S3-совместимое хранилище — используется для длительного хранения или экспорта в SIEM). Если вторичная запись недоступна, основной путь продолжает работать — логи не теряются из-за временной недоступности S3.
| Переменная | По умолчанию | Описание |
|---|---|---|
TESTPLAN_LOGSINK_SECONDARY |
"" (выкл.) |
Вторичный архивный backend. Установите file для зеркалирования логов в каталог либо s3 — для зеркалирования в S3-совместимое объектное хранилище. Пустое значение полностью отключает вторичный путь. |
TESTPLAN_LOGSINK_FILE_BASE |
"" |
Обязательно при TESTPLAN_LOGSINK_SECONDARY=file. Абсолютный путь к каталогу, куда дописывается по одному файлу на каждый запуск. Каталог должен быть доступен на запись процессу Mockarty. |
TESTPLAN_LOGSINK_S3_BUCKET |
"" |
Обязательно при TESTPLAN_LOGSINK_SECONDARY=s3. Имя S3-бакета. Креденшелы AWS считываются из стандартной цепочки переменных окружения / IRSA. |
TESTPLAN_LOGSINK_S3_PREFIX |
"" |
Опциональный префикс ключа, дописываемый к каждому загружаемому объекту (например, mockarty/prod/). Удобно для разделения тенантов или окружений в общем бакете. |
Совет для air-gapped. В изолированных от интернета установках оставляйте
TESTPLAN_LOGSINK_SECONDARYпустым. Основной sink в БД всё равно сохраняет каждую строку лога, и живой UI-tail продолжает работать.
Общие:
| Переменная | По умолчанию | Описание |
|---|---|---|
ENV |
development |
Имя окружения (development или production). Влияет на формат логов и поведение по умолчанию |
LOG_LEVEL |
info |
debug, info, warn, error |
Переходное окно лицензирования (выделение модуля):
Когда модуль выделяется из существующего лицензионного ключа, старый ключ
некоторое время продолжает открывать новый модуль — чтобы обновление уже
работающей установки не отнимало модуль у пользователей. Текущий переходный
режим касается модуля Обработка и коммуникации (processing): его по-прежнему
удовлетворяет ключ Управление тест-кейсами (tcm).
| Переменная | По умолчанию | Описание |
|---|---|---|
MOCKARTY_PROCESSING_TCM_FALLBACK |
true |
Пока включено, активная лицензия или персональный грант tcm также удовлетворяет processing. Значения 0/false/off/no требуют наличия именно ключа processing. |
Значение читается на каждой проверке лицензии, поэтому срезы, выводимые из
лицензии (гейт маршрутов, фильтр MCP-инструментов, гейт субагентов), реагируют
на изменение сразу. Персональные наборы модулей кешируются на 30 секунд
и подхватывают изменение при следующем обновлении или после
перезапуска.
Как безопасно закрыть окно. Перед переключением посмотрите доказательства в
/metrics на административном узле:
mockarty_license_transition_shim_reliant_licenses{feature="processing",parent="tcm"}
— сколько активных лицензий несутtcmи не несутprocessing, то есть
сколько лицензий на этом экземпляре зависит от переходного режима. Значение
обновляется при каждой перезагрузке лицензий.mockarty_license_transition_shim_satisfied_total{feature="processing",parent="tcm",surface=...}
— сколько проверок прошло только благодаря окну, с разбивкой поsurface
(licence_gate,licence_seats,licence_list,grant_view).
Нулевой gauge вместе с неизменным счётчиком, наблюдаемые в течение окна,
покрывающего рабочие часы ваших пользователей, — это и есть доказательство,
что окно больше никому не нужно. В многоузловом кластере каждый узел публикует
собственный снимок лицензий, поэтому читайте эти серии по узлам (их различает
постоянная метка node_id), а не суммируйте — сумма посчитает одного клиента
по разу на узел. Закрытие окна не влияет на данные: то, что было создано при
открытом окне, остаётся доступным для чтения навсегда, а ключ processing
требуется только для редактирования и запусков.
Администрирование Kubernetes
При запуске Mockarty в Kubernetes административная нода может управлять жизненным циклом кластера напрямую через Admin API и CLI. Оператор отслеживает Custom Resource MockartyCluster и автоматически приводит resolver-ноды, runner-агенты и интеграции к желаемому состоянию.
Переменные окружения для управления K8s
| Переменная | По умолчанию | Описание |
|---|---|---|
K8S_MANAGEMENT |
auto |
auto — определять автоматически, запущен ли сервис в кластере; true — принудительно включить; false — отключить |
K8S_NAMESPACE |
(пусто) | Пространство имён, в котором находится CR MockartyCluster. Пусто = использовать namespace из in-cluster ServiceAccount |
K8S_CLUSTER_NAME |
mockarty |
Имя Custom Resource MockartyCluster |
K8S_KUBECONFIG |
(пусто) | Путь к файлу kubeconfig. Если пусто — используется ServiceAccount внутри кластера |
K8S_MAX_RUNNERS_PER_NS |
5 |
Максимальное количество runner-подов на пространство имён (квота ресурсов) |
K8S_MAX_RESOLVERS_PER_NS |
3 |
Максимальное количество resolver-подов на пространство имён (квота ресурсов) |
Эндпоинты Admin API
Эти эндпоинты существуют только когда включено управление Kubernetes — то
есть когда Mockarty работает внутри кластера (K8S_MANAGEMENT=auto определяет
это сам) или вы включили его принудительно через K8S_MANAGEMENT=true. На
обычной установке они не регистрируются вовсе и отвечают 404 — это ожидаемо,
а не поломка.
Чтобы проверить без догадок, спросите саму ноду:
curl http://localhost:5770/api/v1/k8s/enabled \
-H "X-API-Key: $MOCKARTY_API_TOKEN"
# {"enabled":true,"namespace":"mockarty"}
Все Kubernetes-эндпоинты требуют аутентификации и доступны только на административной ноде.
| Метод | Эндпоинт | Описание |
|---|---|---|
GET |
/api/v1/k8s/status |
Возвращает статус кластера: поды, версии, состояние, использование ресурсов |
POST |
/api/v1/k8s/scale |
Масштабирование компонента (resolver/runner) до заданного количества реплик |
POST |
/api/v1/k8s/upgrade |
Обновление образов компонента до целевой версии |
POST |
/api/v1/k8s/restart |
Выполнение rolling restart компонента |
GET |
/api/v1/k8s/pods/:name/logs |
Потоковая передача логов конкретного пода (поддерживает query-параметры follow и tailLines) |
POST |
/api/v1/k8s/integrations |
Создание новой интеграции пространства имён |
DELETE |
/api/v1/k8s/integrations/:name |
Удаление интеграции пространства имён по имени |
GET |
/api/v1/k8s/integrations |
Список всех настроенных интеграций |
Пример масштабирования:
curl -X POST http://localhost:5770/api/v1/k8s/scale \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"component": "resolver", "replicas": 5}'
Пример обновления:
curl -X POST http://localhost:5770/api/v1/k8s/upgrade \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"component": "runner", "version": "1.3.0"}'
RBAC
- Операции с кластером (
scale,upgrade,restart,status,logs) доступны только пользователям с ролью Admin или Support. - Интеграции пространств имён (
/api/v1/k8s/integrations) доступны владельцам пространств имён для своих пространств и администраторам — для любых.
Команды CLI
CLI предоставляет сокращённые команды, вызывающие Admin API под капотом:
# View cluster status
mockarty-cli cluster status
# Scale a component
mockarty-cli cluster scale resolver --replicas 5
# Upgrade cluster image tag (upgrades all components at once)
mockarty-cli cluster upgrade --tag 1.3.0
# Rolling restart
mockarty-cli cluster restart resolver
# Stream pod logs
mockarty-cli cluster logs <pod-name> --follow --tail 100
Экспорт журнала аудита и интеграция с SIEM
Mockarty ведёт неизменяемый журнал аудита всех событий аутентификации, изменений конфигурации и административных действий. Журнал можно экспортировать из Админ-панели или через REST API в одном из четырёх форматов, совместимых с основными SIEM-платформами.
Словарь событий аутентификации. Перечисленные ниже глаголы эмитируются подсистемой аутентификации автоматически и попадают в поток экспорта без дополнительной настройки:
| Глагол | Срабатывает |
|---|---|
failed_login |
Неверные учётные данные, попытка входа в заблокированный аккаунт |
account_lockout |
Переход аккаунта в заблокированное состояние (ровно один раз) |
oauth_login |
Успешный вход через OAuth / SSO |
oauth_login_failed |
Ошибка обмена токена / получения профиля / аутентификации |
ldap_login |
Успешный bind в LDAP / AD |
ldap_login_failed |
Ошибка bind в LDAP |
totp_enabled |
Первая успешная верификация TOTP (переход в 2FA-on) |
totp_disabled |
Самостоятельное отключение 2FA |
totp_verify_failed |
Неверный код TOTP (включение, отключение, step-up) |
recovery_codes_generated |
Перегенерация набора резервных кодов |
password_changed |
Смена пароля или первоначальная установка |
session_regenerated |
Повышение сессии после прохождения 2FA |
audit_logs_exported |
Экспорт журнала аудита (csv / json / syslog / cef). Metadata содержит формат, объём в байтах и использованные фильтры — SOC сможет воспроизвести, что именно покинуло систему. |
audit_legal_hold_applied |
Установлена юридическая блокировка журнала (SOX §802 / 719-П §6.4). Metadata содержит окно (from_ms, to_ms), опциональный namespace и сводку фильтра, указанную оператором. |
audit_legal_hold_released |
Действующая блокировка снята; ранее удержанные строки возвращаются под штатную политику хранения. Metadata содержит то же окно плюс released_by и released_ms. |
| Формат | Content-Type | Применение |
|---|---|---|
csv |
text/csv |
Просмотр в таблицах, ручные compliance-аудиты |
json |
application/json |
Структурированный архив, ETL |
syslog |
text/plain (RFC 5424) |
Передача в syslog-ng, rsyslog, любой SIEM-коллектор |
cef |
text/plain (CEF 0) |
ArcSight, QRadar, Splunk, MaxPatrol SIEM, KUMA, RuSIEM |
Каждая запись, созданная во время HTTP-запроса, несёт в metadata ещё и correlation_id — значение X-Request-Id этого запроса (или сгенерированный Mockarty идентификатор, если клиент его не прислал). Это то же значение, что несут строки лога данного запроса, поэтому запись аудита и логи вызвавшего её вызова можно соединить напрямую, а не сопоставлять по времени. Записи, созданные вне запроса — планировщиком, sweep’ом, раннером — correlation id не несут: выдуманный идентификатор соединял бы ничто.
REST API
# CSV-дамп за последние 24 часа (миллисекунды от эпохи)
curl -H "Authorization: Bearer $TOKEN" \
"$MOCKARTY_URL/api/v1/admin/audit/export?format=csv&from=$(date -u -d '1 day ago' +%s000)" \
> audit.csv
# Syslog RFC 5424 — поток в SIEM-коллектор
curl -H "Authorization: Bearer $TOKEN" \
"$MOCKARTY_URL/api/v1/admin/audit/export?format=syslog" \
| nc -u siem-collector.example.com 514
# ArcSight CEF для ingestion существующим SIEM-парсером
curl -H "Authorization: Bearer $TOKEN" \
"$MOCKARTY_URL/api/v1/admin/audit/export?format=cef" \
> audit.cef
Поддерживаемые фильтры: user_id, action, resource_type, resource_id, namespace, from, to, limit.
CLI
# Почасовой дамп syslog для SIEM
mockarty-cli audit export \
--format syslog \
--from $(date -u -d '1 hour ago' +%s000) \
--to $(date -u +%s000) \
> audit-$(date +%s).log
# CEF в файл
mockarty-cli audit export --format cef --output audit.cef
# Фильтр по пользователю
mockarty-cli audit export --format json --user-id u-42 --action login
Формат записей
- Syslog (RFC 5424) — одна запись на строку, facility 13 (security/authorization). Structured-data блок
[audit@<PEN> key="value" ...]содержит полную запись. Значение private-enterprise number по умолчанию — placeholder; фактический PEN задаётся на этапе сборки для production-развёртываний. - CEF 0 —
CEF:0|Mockarty|Mockarty|<версия>|<action>|<name>|<severity>|<ext>. Поля расширения используют CEF-словарь (suser,src,act,rt,requestMethod,requestUrl,externalIdплюс customcs1/cs2/cs3с label’ами для namespace/resource).
Оба SIEM-формата экранируют служебные символы (|, =, \, ", ], переводы строк), гарантируя одну запись на строку и безопасный ingestion в любой RFC- или CEF-совместимый парсер.
RBAC: экспорт аудита требует роли
adminилиsupport. Рольsupportможет экспортировать, но не изменять записи.
Срок хранения журналов аудита
Срок хранения журнала аудита задаётся расписанием audit_log_cleanup в Админ-панели → Политики очистки. Значение по умолчанию настраивается под конкретное развёртывание; записи старше этого срока жёстко удаляются, чтобы таблица не разрасталась бесконтрольно.
Для регулируемых развёртываний (банки по 719-П ЦБ РФ §6.4, государственные системы по ФСТЭК приказ №17 п.4.2) Mockarty поддерживает минимальный порог соответствия, заданный переменной окружения. Если переменная установлена, любое меньшее значение, сохранённое оператором через UI, автоматически поднимается до порога — оператор не может случайно сократить срок хранения ниже законодательно установленного минимума.
| Переменная | По умолчанию | Пример | Описание |
|---|---|---|---|
MOCKARTY_AUDIT_RETENTION_MIN_DAYS |
не задана | 1095 |
Минимальный срок хранения аудита (дни). UI-значение ниже порога округляется вверх. |
Типовые значения: 1095 для 719-П ЦБ РФ (3 года), 1825 для расширенных политик ФСТЭК (5 лет). Для нерегулируемых развёртываний переменную оставляют неустановленной.
Порог применяется на каждом тике планировщика очистки и логируется на уровне WARN, когда он поднял эффективный срок хранения.
Юридические блокировки свидетельств (legal hold)
Юридическая блокировка замораживает свидетельства на время нормативной проверки, расследования инцидента или судебного разбирательства. Существующий операторский API /admin/audit/legal-holds защищает строки аудита и подходящие свидетельства автономных миссий: таймлайн и payload, завершённую историю Autotester/Coder, задания кодера и входные записи. Выбора отдельного ID миссии нет: полная область блокировки задаётся документированным временным окном и необязательным namespace.
Для завершённых миссий кодера срок хранения и окно блокировки отсчитываются от времени завершения. Последующее обновление миссии не запускает срок хранения заново.
Блокировки закрывают сразу три требования:
- SOX §802 / 18 USC §1519 — уничтожение документов под действующим judicial preservation notice в США является уголовным преступлением.
- 719-П ЦБ РФ §6.4 — банковский оператор обязан иметь возможность заморозить журналы аудита по запросу ЦБ.
- ФСТЭК приказ №17 п.4.2 — целостность журналов в ходе расследования инцидентов ИБ.
Каждая блокировка — это диапазон от метки from_time до опциональной to_time (открытые блокировки допускаются) — и может быть ограничена одним пространством имён или применена глобально. Установка и снятие блокировки сами попадают в аудит через verbs audit_legal_hold_applied и audit_legal_hold_released.
Очистка выполняется ограниченными пачками и не монополизирует базу. Каждая завершённая пачка очистки журнала сама записывается как ресурс audit_log_cleanup со стабильным actor system:retention; если центральный аудит временно недоступен, запись остаётся в надёжной очереди и повторяется без повторного удаления данных.
REST API
# Заморозить последние 7 дней для пространства имён "prod"
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"reason": "INC-42 preservation",
"from_time": "2026-04-12T00:00:00Z",
"to_time": "2026-04-19T23:59:59Z",
"namespace": "prod",
"filter_summary": {"ticket": "INC-42"}
}' \
"$MOCKARTY_URL/api/v1/admin/audit/legal-holds"
# Список блокировок (status: active|released, limit 1..1000)
curl -H "Authorization: Bearer $TOKEN" \
"$MOCKARTY_URL/api/v1/admin/audit/legal-holds?status=active"
# Снять блокировку (идемпотентно — повторные вызовы возвращают 200 со снятой записью)
curl -X DELETE -H "Authorization: Bearer $TOKEN" \
"$MOCKARTY_URL/api/v1/admin/audit/legal-holds/<hold-id>"
Поведение
- Перед первым удалением каждый проход очистки свидетельств проверяет хранилище блокировок, а destructive-запросы сохраняют коррелированный guard. Partial index активных блокировок ограничивает стоимость обычного пустого случая.
- Блокировка, ограниченная namespace, защищает только строки этого namespace. Блокировка без поля
namespaceпокрывает все пространства имён. - Открытая блокировка (без
to_time) покрывает все строки отfrom_timeи далее без верхней границы. - Снятые блокировки не удаляются — они остаются в таблице
audit_log_legal_holdsкак доказательная база того, что было заморожено, когда и кем. - RBAC: POST и DELETE доступны только роли
admin. Рольsupportможет просматривать список блокировок (SOC-видимость), но не устанавливать и не снимать их.
Безопасность
Если хранилище блокировок не читается, уборщики аудита и свидетельств миссий прерывают текущий тик до первого удаления, а не считают блокировки отсутствующими. Повтор будет на следующем интервале.
Сборка для соответствия требованиям: SQLite на чистом Go
Релизные бинарники используют движок SQLite на чистом Go — в них нет нативного (libc) кода, именно это делает их пригодными для distroless / scratch-образов и аудита закрытых контуров. Software Bill of Materials (SBOM), публикуемый с каждым релизом, позволяет аудитору подтвердить полный состав зависимостей запускаемого бинарника.
Шифрование персональных данных в хранилище
Если вашей установке нужно защищать персональные данные при хранении, включите эту возможность до запуска. Без ключей она выключена. Храните ключи в менеджере секретов и задайте одинаковые значения на всех админ-нодах. Шифруются email и имя пользователя, а также данные user-agent в аудите. Записи, сохранённые до включения шифрования, нужно перенести отдельно.
| Переменная | По умолчанию | Что указать |
|---|---|---|
MOCKARTY_PII_ENCRYPTION_KEY |
Не задана | Ключ из 32 байт в Base64. Включает шифрование. |
MOCKARTY_PII_HMAC_PEPPER |
Не задана | Отдельный секрет не короче 32 байт в Base64; нужен для поиска по email и имени. |
MOCKARTY_PII_ENCRYPTION_KEY_PREVIOUS |
Не задана | Прежние ключи при ротации; см. «Ротацию ключей». |
MOCKARTY_PII_DECRYPT_CACHE_ENTRIES |
10000 |
Размер дополнительного кеша; disabled отключает его. |
Ключ шифрования также защищает поддерживаемые сохранённые учётные данные. Если он не задан, админ-нода при запуске предупреждает, что эти значения хранятся в читаемом виде. Позднее включение шифрования не изменяет старые записи автоматически.
Создайте два разных ключа на доверенной машине и сохраните их как разные секреты:
openssl rand -base64 32 # ключ шифрования
openssl rand -base64 32 # секрет для поиска
Чтобы преобразовать ранее сохранённые персональные данные, сначала проверьте объём работы без изменений, затем обработайте каждый поддерживаемый набор. Используйте те же настройки базы данных, что и админ-нода, и проверяйте итог после каждой команды:
./mockarty --pii-backfill audit_logs --pii-backfill-dry-run
./mockarty --pii-backfill audit_logs --pii-backfill-batch 1000
./mockarty --pii-backfill users --pii-backfill-dry-run
./mockarty --pii-backfill users --pii-backfill-batch 500
Для шага users нужны оба ключа. После прерывания команду можно повторить: уже преобразованные записи пропускаются. Если меняете ключ, следуйте «Ротации ключей», не подменяйте текущий ключ в работающей установке.
Перенос истории миссий при обновлении
Если в установке есть старые миссии Autotester, перенесите их историю, прежде чем включать режим чтения только из нового журнала. Запускайте команды с теми же настройками базы данных, что и админ-нода.
- Сначала обновите все админ-ноды. Пока работает старая нода, не переключайте режим.
- Проверьте состояние командой
./mockarty --mission-journal-status. - Повторяйте
./mockarty --mission-journal-backfill --mission-journal-backfill-batch 128, проверяя состояние после каждого запуска, покаbackfillCompleteне станетtrue. После прерывания перенос можно продолжить. - Убедитесь, что история миссий открывается и в метрике
mockarty_mission_journal_projection_totalне растут результатыmismatchиread_error. Только после этого сделайте журнал основным источником:
./mockarty --mission-journal-mode journal_primary_fallback --mission-journal-request-id mission-history-primary-1
Если история неполная или появилась ошибка чтения журнала, на время расследования вернитесь в режим наблюдения:
./mockarty --mission-journal-mode dual_read_observe --mission-journal-request-id mission-history-observe-1
Для каждого отдельного переключения используйте новый request ID. Повторно используйте тот же ID только при повторе попытки с неизвестным результатом. Режимы journal_only и journal_sealed отключают совместимые пути чтения; выбирайте их лишь после проверки всей истории и плана отката вашей установки. После каждого изменения снова запускайте --mission-journal-status.
Источник ключевого материала: software или HSM (PKCS#11)
Для установок госсектора (ФСТЭК приказ №17 п.21, УЗ-2 и выше) и банковского сектора (ЦБ РФ 719-П §5.1) хранить долгоживущие AES- и HMAC-ключи в переменных окружения недостаточно — регулятор требует хранения ключевого материала на сертифицированном оборудовании (ФСТЭК КС2/КС3 или FIPS 140-2 Level 2+). Mockarty абстрагирует источник ключей через единый интерфейс KeyStore с двумя взаимозаменяемыми бэкендами.
| Переменная | По умолчанию | Значения | Описание |
|---|---|---|---|
MOCKARTY_KEYSTORE |
software |
software | pkcs11 |
Бэкенд ключевого материала. Не задана = software (исторический env-var путь). |
MOCKARTY_PKCS11_LIB |
(не задана) | /usr/lib/softhsm/libsofthsm2.so |
Абсолютный путь к shared object PKCS#11-библиотеки HSM-вендора. Требуется для pkcs11. |
MOCKARTY_PKCS11_SLOT |
(не задана) | 0 |
Номер слота с KEK. Требуется для pkcs11. |
MOCKARTY_PKCS11_PIN |
(не задана) | 1234 |
User PIN. В production предпочитайте MOCKARTY_PKCS11_PIN_FILE (env-переменные утекают в ps). |
MOCKARTY_PKCS11_PIN_FILE |
(не задана) | /run/secrets/hsm-pin |
Путь к файлу с PIN. Приоритетнее, чем MOCKARTY_PKCS11_PIN. |
MOCKARTY_PKCS11_KEK_LABEL |
(не задана) | mockarty-pii-kek |
CKA_LABEL симметричного KEK (key-encryption key) на HSM. |
MOCKARTY_PKCS11_WRAPPED_PII_KEY |
(не задана) | base64 шифротекста | DEK (AES-256) в обёртке под KEK. Распаковывается один раз на старте. |
MOCKARTY_PKCS11_WRAPPED_PEPPER |
(не задана) | base64 шифротекста | HMAC-pepper в обёртке под KEK. |
MOCKARTY_PKCS11_UNWRAP_MECHANISM |
aes-cbc-pad |
aes-cbc-pad | aes-gcm |
Механизм обёртки, использованный при генерации wrapped-значений. |
Как это работает. Ключ шифрования ключей (KEK) никогда не покидает HSM. При старте Mockarty аутентифицируется к PKCS#11-токену и использует KEK для распаковки ключа шифрования данных из значения MOCKARTY_PKCS11_WRAPPED_PII_KEY — распакованный материал хранится только в памяти процесса и обнуляется при корректном выключении. Отзыв доступа к HSM (смена PIN, блокировка пользователя, выключение токена) достаточен, чтобы заблокировать все работающие и будущие экземпляры Mockarty от зашифрованных данных.
PKCS#11-вариант сборки. Стандартный бинарник Mockarty собирается без CGO (совместим с distroless-образами) и не линкует PKCS#11-библиотеку. Для HSM-интеграции нужен PKCS#11-вариант сборки Mockarty — запросите его у поставщика Mockarty, указав модель вашего HSM, чтобы была слинкована корректная PKCS#11-библиотека вендора.
Выбор MOCKARTY_KEYSTORE=pkcs11 на бинаре, который не включает этот backend, сразу падает на старте с сообщением keystore: PKCS#11 backend is not compiled in — некорректно настроенный деплой никогда не «откатится» тихо на software-ключи.
Провижининг ключей (пример для SoftHSMv2 в staging — в production замените на сертифицированный HSM):
# 1. Инициализировать токен и задать user PIN (один раз на HSM/слот).
softhsm2-util --init-token --slot 0 --label mockarty --pin 1234 --so-pin 5678
# 2. Сгенерировать KEK на HSM — ключ никогда не покинет токен.
pkcs11-tool --module /usr/lib/softhsm/libsofthsm2.so --slot 0 --login --pin 1234 \
--keygen --key-type AES:32 --label mockarty-pii-kek --usage-wrap --usage-decrypt
# 3. Сгенерировать свежий DEK вне HSM, обернуть его под KEK, выгрузить base64:
openssl rand 32 > /tmp/dek.bin
pkcs11-tool --module /usr/lib/softhsm/libsofthsm2.so --slot 0 --login --pin 1234 \
--encrypt --mechanism AES-CBC-PAD --iv $(printf '%.0s00' {1..16}) \
--input-file /tmp/dek.bin --output-file /tmp/dek-wrapped.bin --label mockarty-pii-kek
base64 -w0 /tmp/dek-wrapped.bin # → значение для MOCKARTY_PKCS11_WRAPPED_PII_KEY
# 4. Повторить для HMAC-pepper (32 случайных байта, обёрнутые под тем же KEK).
# 5. Удалить plaintext DEK и pepper с рабочей станции оператора.
shred -u /tmp/dek.bin
Мониторинг. Эндпоинт /health включает раздел keystore с активным бэкендом (software или pkcs11), флагом pkcs11_compiled_in и результатом проверки PKCS#11-сессии (C_GetSessionInfo). Потерянная HSM-сессия выставляет pod в unhealthy — оператор пересоздаёт деплой для повторной аутентификации.
Соответствие требованиям. ФСТЭК приказ №17 п.21 (УЗ-2+ аппаратная защита ключей), ЦБ РФ 719-П §5.1 (HSM-требование для платёжной инфраструктуры), 152-ФЗ УЗ-3 (разделение владельца ключа и владельца данных — HSM хранит KEK, Mockarty хранит данные).
Журнал человеческих решений
Каждое одобрение, которое человек выносит через защищённые поверхности Mockarty, параллельно попадает в ЕДИНЫЙ кросс-поверхностный журнал — администратор отвечает на вопрос «кто что одобрил», не обходя историю каждого модуля. В журнал пишутся: согласование/отклонение автономных миссий, одобрение деплоя coder-миссии, согласование/отклонение change-request контрактов, ревью записей реестра контрактов, approve/deny отложенных fuzz-прогонов, голоса ревью (approve / request changes / reject), одобрение/отклонение сопряжения companion-устройств, утверждение визуальных базлайнов, решения по одобрениям сканов безопасности и переопределение вердиктов качества (POST /api/v1/quality/verdicts/{taskId}/override).
Журнал пишется «насквозь», но best-effort: поверхность записывает решение сразу после собственного сохранения, а сбой записи журнала никогда не блокирует само одобрение — собственная запись поверхности и аудит-лог остаются авторитетными.
Прочитать журнал (токен администратора или админ-сессия):
curl -H "Authorization: Bearer $MOCKARTY_TOKEN" \
"http://127.0.0.1:5770/api/v1/admin/human-decisions?namespace=sandbox&limit=50"
Необязательные фильтры: surface, decision, subjectKind, subjectId, namespace (пусто — все пространства имён), limit (по умолчанию 50, максимум 500) и offset. В ответе — decisions (свежие сверху), total (число записей под теми же фильтрами), limit и offset.
Одна запись:
{
"id": "5f0c6d2e-1b8a-4c1e-9a1d-2f6f1c0e7a11",
"namespace": "sandbox",
"surface": "mission",
"decision": "approve",
"subjectKind": "mission",
"subjectId": "9d3a1e40-7c2b-4f6e-8b1a-3e5d7c9f2a10",
"reason": "scope reviewed, safe to run",
"actorUserId": "7c1b2a3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
"actorEmail": "qa-lead@example.com",
"decidedAt": "2026-09-19T01:02:03Z"
}
Поверхности: mission, coder_mission, contract_cr, contract_registry, fuzz_held_run, review, companion_pair, visual_baseline, security_scan, aqc_override. Решения: approve, reject, request_changes, deny, expire (одобрение скана безопасности, которое согласующий оставил истечь); для aqc_override решение — исход вердикта, который выставил человек: pass, fail или could_not_verify.
Примечания:
- Журнал только дописывается и читается только через REST — отдельной страницы в веб-интерфейсе у него нет.
actorEmailхранится под той же защитой «в покое», что иuser_emailаудит-лога, если настроено шифрование ПДн (см. Шифрование ПДн на уровне полей).- Журнал содержит одобрения, записанные после включения этой возможности. Ранее принятые решения остаются в соответствующих разделах и журнале аудита.
Смотрите также
- Быстрый старт — Установите Mockarty и создайте первый мок
- Установка и развёртывание — Docker-развёртывание, переменные окружения и настройка TLS
- Руководство по интеграциям — Настройка resolver-нод, runner-агентов и webhooks
- Connection Authority — Публикация и отзыв внешних подключений без исходных учётных данных
- Контрактное тестирование — Валидация моков по OpenAPI-спецификациям и обнаружение дрейфа моков
- Chaos Engineering — Эксперименты с инъекцией сбоев для тестирования устойчивости (PRO)
- Руководство по веб-интерфейсу — Подробное руководство по веб-интерфейсу
- Справочник API — Полная документация REST API для программного доступа