Перейти к содержимому

Журнал аудита

NORA записывает операции реестра в структурированный журнал аудита. Каждая запись представляет собой JSON-объект, записанный в одну строку (формат JSONL).

ПеременнаяПо умолчаниюОписание
NORA_AUDIT_LOGfileРежим вывода: file, stdout, both или off
config.toml
[audit]
mode = "file" # "file", "stdout", "both", "off"

Режимы:

РежимПоведение
fileЗапись в {storage_path}/audit.jsonl
stdoutЗапись в stderr (совместимо с 12-factor, работает с агрегаторами логов)
bothЗапись и в файл, и в stderr
offОтключить журналирование аудита

Каждая строка представляет собой JSON-объект со следующими полями:

ПолеТипОписание
tsstringВременная метка в формате ISO 8601 (UTC)
actionstringpush, pull, delete, cache_hit, proxy_fetch, overwrite, retention-apply
actorstringИсточник операции: api (HTTP-запрос), scheduler (политики хранения) или cli
artifactstringИмя пакета или ссылка на образ
registrystringТип реестра: docker, npm, pypi, maven и т. д.
detailstringДополнительный контекст (версия, дайджест, размер)
{"ts":"2026-05-18T10:30:45.123Z","action":"push","actor":"api","artifact":"myapp","registry":"docker","detail":"sha256:abc123"}
{"ts":"2026-05-18T10:31:02.456Z","action":"pull","actor":"api","artifact":"lodash","registry":"npm","detail":"4.17.21"}
{"ts":"2026-05-18T10:32:15.789Z","action":"delete","actor":"api","artifact":"old-image:v1","registry":"docker","detail":"manifest"}
{"ts":"2026-05-18T10:33:00.001Z","action":"cache_hit","actor":"api","artifact":"","registry":"maven","detail":""}
{"ts":"2026-05-18T10:33:05.200Z","action":"proxy_fetch","actor":"api","artifact":"","registry":"npm","detail":""}
{"ts":"2026-05-18T10:34:10.500Z","action":"overwrite","actor":"api","artifact":"libs/config.yaml","registry":"raw","detail":""}

Типы действий:

ДействиеОписание
pushКлиент загрузил новый артефакт
pullКлиент скачал артефакт из локального хранилища
deleteКлиент удалил артефакт
cache_hitЗапрос обслужен из локального кэша без обращения к вышестоящему реестру
proxy_fetchАртефакт получен из вышестоящего реестра
overwriteСуществующий артефакт заменён (реестр Raw)
retention-applyАртефакт удалён политикой хранения

При использовании режима file или both журнал аудита записывается в:

{NORA_STORAGE_PATH}/audit.jsonl

По умолчанию: data/audit.jsonl (относительно рабочей директории).

Файл создаётся автоматически. Родительские директории создаются, если они не существуют.

services:
nora:
image: ghcr.io/getnora-io/nora:0.9
environment:
NORA_AUDIT_LOG: both
NORA_STORAGE_PATH: /data
volumes:
- nora-data:/data

Затем следите за журналом:

Окно терминала
docker exec nora tail -f /data/audit.jsonl | jq .

В режиме stdout записи аудита отправляются в stderr вместе с обычными логами. Используйте драйвер логов вашего оркестратора контейнеров для их пересылки:

Окно терминала
# Filter audit entries from container logs
docker logs nora 2>&1 | grep '"action":' | jq .

Для выделенной пересылки на основе файлов (Filebeat, Promtail, Vector):

filebeat.yml
filebeat.inputs:
- type: log
paths:
- /data/audit.jsonl
json.keys_under_root: true
json.add_error_key: true
Окно терминала
# All pushes today
grep '"action":"push"' /data/audit.jsonl | jq .
# All Docker operations by user "admin"
jq -c 'select(.registry == "docker" and .actor == "admin")' /data/audit.jsonl
# Count operations per registry
jq -r '.registry' /data/audit.jsonl | sort | uniq -c | sort -rn