---
title: "Аутентификация"
description: "Режимы password и none, серверные сессии, инвайты и сброс, восстановление админа через CLI."
---

# Аутентификация

Аутентификация в Notarium встроена и реализована целиком на служебной БД — без внешнего IdP, без JWT, без SMTP. Режим выбирается переменной `AUTH_MODE` и определяет, есть ли вообще логин.

## Режим `password` (по умолчанию)

Безопасно по умолчанию: полноценная многопользовательская аутентификация.

- **Первый запуск.** На чистом инстансе первый посетитель через setup-экран заводит владельца (администратор + владелец сконфигурированных пространств). Преднастроенного пароля нет; после регистрации setup закрывается навсегда.
- **Сессии.** Логин создаёт **серверную сессию** — строку в БД, а не JWT. Она живёт в HttpOnly-cookie `nt_session` со скользящим TTL 30 дней и флагом `Secure` за HTTPS. Отзыв доступа мгновенный: отключение пользователя или смена пароля немедленно рвут живые сессии.
- **Нужна служебная БД.** Она есть по умолчанию — SQLite под `DATA_DIR`, задавать ничего не требуется. `META_DB_URL` трогают только ради переезда на внешний Postgres. См. [База данных](/docs/self-hosting/database/).

## Режим `none`

Единственный all-access принципал — оператор включает этот режим осознанно, для десктопа, локальной разработки или доверенного интранета. Auth-маршруты отвечают `404`, login-UI не существует, служебная БД для auth не нужна.

> [!danger] Не выставляйте `none`-инстанс в сеть
> В режиме `none` любой, кто достучится до порта, получает полный доступ ко всем данным — включая MCP-эндпоинт агентов. Используйте его только на изолированном или доверенном контуре.

## Роли и доступ

Доступ к данным даётся членством в пространстве, роли — три:

| Роль | Права |
|---|---|
| `reader` | Читает всё в пространстве. |
| `writer` | Правит заметки. |
| `owner` | Управляет составом участников. |

Флаг **host-admin** управляет пользователями и пространствами, но чтобы **читать данные** конкретного пространства, всё равно нужно членство в нём. Подробнее о модели — [Модель доступа](/docs/concepts/access-model/).

## Инвайты и сброс пароля

SMTP в Notarium нет — первичная выдача учётки — это **одноразовая ссылка**, которую администратор передаёт вручную. Один механизм, два назначения:

- **Инвайт** — приглашение пользователя без пароля; ссылка живёт 7 дней.
- **Сброс пароля** — ссылка живёт 24 часа; принятие завершает старые сессии.

Токен передаётся в URL-фрагменте (`/invite#<token>`), поэтому не попадает в access-логи. Одновременно у пользователя живёт одна такая ссылка; чужой пароль администратор не знает никогда.

## Токены для агентов

ИИ-агенты аутентифицируются персональным access-токеном (PAT) вида `Authorization: Bearer ntp_…` со scope `read` или `write` и опциональным сужением по пространствам. Секрет показывается **ровно один раз**. Выпуск токенов и другие управляющие действия доступны только под сессией — утёкший PAT не эскалируется. Подробности — [Подключить агента](/docs/agents/connect/) и [Безопасность и видимость](/docs/agents/security/).

## Восстановление доступа

Раз reset-ссылку выдаёт только администратор, потеря пароля единственного админа означала бы потерю доступа. Выход — **admin-CLI**, работающий напрямую по служебной БД. Это одна из встроенных команд образа, поэтому вызывается коротко, прямо в работающий контейнер:

```bash
docker compose exec notarium admin create-admin <user> --random

# для голого docker run:
docker exec -it notarium admin create-admin <user> --random
```

Останавливать сервер не нужно: SQLite в режиме WAL терпит второго писателя, а Postgres — тем более. Служебную БД CLI находит сам, по той же логике, что и сервер (`META_DB_URL` или корень из `DATA_DIR`); при неверном пути он завершается ошибкой, а не создаёт молча пустую БД, в которой «нет пользователей».

Доступные команды:

| Команда | Действие |
|---|---|
| `list` | Список пользователей. |
| `passwd <user> [--password <pw> \| --random]` | Сменить пароль. |
| `create-admin <user> [--random] [--display "Имя"]` | Создать администратора. |
| `grant <user> <space> <owner\|writer\|reader>` | Выдать роль в пространстве. |

Пароль без флага читается из stdin с заглушённым эхо, чтобы не попасть в историю команд. `setPassword`/`createAdmin` доступны **только из CLI** — HTTP-пути для них нет: это операторская граница хоста. Остальные команды образа — на странице [CLI образа](/docs/self-hosting/cli/).
