UNRUIN
документация · v1.0

Панель

Вход и выставление наружу

Три способа войти, что каждый из них защищает, и почему в четвёртой конфигурации Unruin не стартует.

Панель умеет запускать копирование, убирать хранилища, снимать метки занятости и переписывать вашу конфигурацию. Всё, что дотягивается до порта, умеет это тоже. Эта страница — о том, чтобы «всё, что дотягивается» совпало с тем, что вы имели в виду.

Три способа войти

Какой из них включён, решает исключительно окружение; GET /api/authmode сообщает, какой именно, и панель показывает соответствующий экран.

Режим Включается Что вы видите Чем защищено
none ничего не задано, слушает loopback сразу панель сетью — до порта дотягивается только эта машина
login UNRUIN_AUTH_PASSWORD (и по желанию UNRUIN_AUTH_USER) форма с именем и паролем подписанная кука сессии (HMAC)
token только UNRUIN_API_TOKEN одно поле для ключа Authorization: Bearer <token> на каждом запросе

Если заданы и пароль, и ключ, людям достаётся форма входа, а ключ продолжает работать для программ — моста MCP и ваших собственных скриптов. Пароль без имени даёт пользователя admin.

Кука сессии — это HMAC, выведенный из самого имени и пароля, поэтому отдельного секрета заводить не надо, а смена пароля обесценивает все существующие сессии — именно то, чего от неё и ждут.

В режиме ключа он хранится в браузере (localStorage) после того, как проверен на сервере, и уходит заголовком Bearer. «Забыть ключ» в шапке его стирает. Если ключ перестал действовать посреди сеанса, панель его забывает и возвращает на экран входа с объяснением — не браузерное окно и не замёрзшая панель со вчерашними данными.

Ключ надо брать откуда-то, где действительно случайно:

sh
openssl rand -hex 32

Конфигурация, в которой Unruin отказывается стартовать

UNRUIN_LISTEN не на loopback и ни одного настроенного доступа — это значит раздавать запуск заданий, уборку, снятие меток и запись конфигурации всякому, кто до порта дотянется маршрутом. Unruin не предупреждает об этом и не продолжает. Он выходит:

refusing to start: UNRUIN_LISTEN=0.0.0.0:8080 is non-loopback but no auth is set
— set UNRUIN_AUTH_PASSWORD (login) or UNRUIN_API_TOKEN, bind to 127.0.0.1, or
set UNRUIN_INSECURE=1 to override

UNRUIN_INSECURE=1 — осознанный отказ от этой проверки, и существует он ровно для одного случая: закрытый сегмент сети, где вы решили, что границей служит сама сеть. Правку конфигурации он обратно не включает.

Что открывает каждый уровень

чтение и запуск правка конфигурации
loopback, без доступа да да
с доступом (ключ или пароль) да да
не loopback, без доступа, UNRUIN_INSECURE=1 да нет
любое из перечисленного с UNRUIN_READONLY=1 да нет

Правка — самая опасная точка продукта: она переписывает файл, который решает, что вообще копируется. Поэтому на непроверяемом публичном адресе её нет никогда, даже под UNRUIN_INSECURE.

Как выставить наружу по-человечески

Unruin не терминирует TLS. Привяжите его к loopback и поставьте перед ним обратный прокси:

ports:
  - "127.0.0.1:8080:8080"     # только loopback хоста
environment:
  UNRUIN_LISTEN: "0.0.0.0:8080"   # внутри контейнера
  UNRUIN_API_TOKEN: "${UNRUIN_API_TOKEN}"

Контейнер слушает на всех своих интерфейсах; настоящая граница — привязка порта на хосте. Дальше сертификатом занимается Caddy, nginx или что у вас уже работает.

Место, на котором спотыкаются: публикация порта в Docker — это не loopback с точки зрения Unruin. Внутри контейнера адрес привязки 0.0.0.0, поэтому Unruin считает его публичным и требует доступа. И это правильный ответ: публикацию можно поменять на 0.0.0.0 со стороны хоста, а Unruin об этом даже не узнает.

Если прокси заводить не хочется — пробрасывайте порт по SSH, когда он нужен:

sh
ssh -N -L 8080:127.0.0.1:8080 you@your-host

Для парка машин с одним оператором это совершенно достойный боевой ответ.

Доступ для программ

Всё, что делает панель, — это JSON API под /api/, и тот же ключ его открывает:

sh
curl -fsS -H "Authorization: Bearer $UNRUIN_API_TOKEN" \
  http://127.0.0.1:8080/api/health

/api/health — то, чем проверяет живость контейнер: он сообщает число заданий, сколько из них зелёных, годно ли хранилище секретов и разрешена ли правка.

Сервер MCP — клиент этого же API, своей привилегированной логики у него нет. Помощник, ведущий Unruin, проходит ту же проверку, ту же атомарную запись и тот же вход, что и человек в браузере. Ему нужны UNRUIN_API_URL и UNRUIN_API_TOKEN.

Что не защищено

  • Учётных записей нет. Один пароль или один ключ, один оператор. Если нужен доступ по людям и запись о том, кто что запускал, — это не тот продукт.
  • Ключ предъявительский. Всякий, у кого он есть, — это вы, пока вы его не смените. Он живёт в окружении процесса и в браузере того, кто его вставил.
  • UNRUIN_MASTER_PASSPHRASE — не пароль от панели. Она открывает хранилище секретов и стоит дороже: см. секреты.

Бесплатно, целиком ваше, наружу ничего не уходит. Сайт статический: ни аналитики, ни куки, ни внешних запросов.