Данные и безопасность

Эта страница собирает в одно место ответы, которые обычно приходится выпытывать по частям: что где лежит, кто это видит, что уходит за пределы платформы, сколько всё это хранится и — отдельным разделом — чего в платформе нет. Тарифом из перечисленного зависят три вещи: срок хранения истории запусков (на бесплатном это 7 дней), размер команды (на бесплатном — одно место для приглашённого участника сверх владельца, см. «Команду и роли») и набор каналов публикации (на бесплатном — только веб-чат, см. «Лимиты тарифа»). Роли, скоупинг данных и секреты тарифом не ограничены и работают на любом.

Что скоупится по рабочему пространству

Рабочее пространство — граница данных, и она проведена в хранилище, а не в интерфейсе. Запрос всегда несёт идентификатор пространства, поэтому объект соседнего пространства не просто «не показывается» — он не находится.

ДанныеОбластьКто может прочитать
Воркфлоу, версии, запуски, логипространстволюбой участник
Файлы и хранилищепространстволюбой участник
Коллекции базы данныхпространстволюбой участник
Базы знаний и их векторапространстволюбой участник
История чатовпространстволюбой участник
Память агентов и переменныепространствоворкфлоу этого пространства
Секретыпространствоимена — редактор и выше; значения — никто
Интеграциипространствоучастники видят настройки, секретные поля скрыты
Баланс кредитов, тариф, профильаккаунт владельцавладелец аккаунта

Отсюда практическое следствие: переносить данные между пространствами платформа не умеет. Разложить клиентов по отдельным пространствам стоит сразу, а не «когда вырастем».

Внутри одного пространства ролей три, и они решают, кто читает, а кто меняет; разбор — в «Команде и ролях». Одно важно повторить здесь: наблюдатель читает все данные — историю чатов, файлы, содержимое коллекций. Роль ограничивает изменения, а не любопытство.

Секреты

Секрет — это пара «имя → значение» рабочего пространства: НастройкиСекреты. Ссылаются на него в любом шаблоне как {{ secret.ИМЯ }}, поэтому имя должно быть допустимым идентификатором — как переменная окружения: OPENAI_API_KEY, CRM_TOKEN.

Как это устроено:

  • Хранится зашифрованным. Значение лежит в базе в виде шифротекста; ключ шифрования выводится из мастер-ключа установки и не совпадает с ключом подписи токенов входа.
  • Значение не возвращается наружу никогда. API отдаёт только имя и признак «значение задано». Ни администратор, ни владелец, ни поддержка не могут посмотреть сохранённый секрет — его можно только перезаписать. При правке пустое поле значения означает «оставить прежнее».
  • Расшифровывается один раз на запуск. Первое обращение {{ secret.* }} внутри рана загружает и расшифровывает весь набор в память процесса на время этого запуска; на диск расшифрованное не попадает.
  • Меняет секреты администратор пространства, а видеть их имена (нужные для автодополнения в редакторе) может редактор. Наблюдателю не видно и имён: список имён — это карта ваших интеграций.
  • Удаление секрета не ломает граф на месте. Ссылка на удалённый секрет разворачивается в пустую строку, и воркфлоу продолжает работать — с пустым ключом в заголовке. Отказ придёт от внешнего сервиса и будет выглядеть как «неверный ключ», а не как «секрета нет». Это и есть причина, по которой удалять секреты стоит осознанно.

Ключи интеграций (пароль IMAP, токен CRM, ключ провайдера моделей) устроены так же: шифруются, не возвращаются, при правке пустое поле значит «не менять».

Секреты не попадают в логи и в тексты ошибок. Снимки входов и выходов ноды заменяют поля с учётными данными на имя интеграции, а текст ошибки прогоняется через санитайзер, который вырезает значения секретов этого запуска, Bearer …, ключи вида sk-… и пароли внутри URL. Смысл: словоохотливый чужой сервер часто цитирует присланный ему ключ обратно в тексте ошибки, и без вычистки этот текст стал бы витриной для ключа.

Что уходит наружу

Любой исходящий HTTP-запрос платформы — из ноды HTTP, из интеграции, из вызова модели — идёт через один защищённый клиент с политикой адресов. Политика проверяется на каждом соединении и на каждом редиректе, а не один раз по строке URL: адрес, который после редиректа указывает в приватную сеть, отбивается там же. Диапазоны loopback, RFC1918 и link-local закрыты, у запроса есть предельный таймаут и потолок на размер ответа.

Пользовательский JavaScript (нода JavaScript-код) исполняется не в процессе платформы, а в отдельном контейнере: у него нет доступа к базе, к секретам и к файловому хранилищу, файловая система только для чтения, сеть ограничена, а параллельность и время работы — квотированы. Подробности — в «Своём коде».

Ключи каналов — это право запускать за ваш счёт

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

КлючЧто даётКак выдаётсяКак обесценить
Ссылка публичного чата и виджетаговорить с одним воркфлоуавтоматически при первой публикациивыключить канал и опубликовать заново
Ключ вебхуказапускать воркфлоу по HTTPавтоматически при публикации в вебхуквыключить канал и опубликовать заново
Секрет подписи виджетаподписывать end-user JWTкнопкой в настройкахкнопка обновления
Ключ Assistant MCPуправлять платформой по MCPкнопкой в настройкахсмена или отключение

Разбор всех дверей и того, чего среди них нет, — в «Доступе по API».

Файлы и подписанные ссылки

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

Сколько всё это живёт

  • История запусков чистится по тарифу: 7 дней на бесплатном, 90 на платном. Чистка «мягкая» — удаляются логи и по-нодовые записи, тяжёлые входы-выходы обнуляются, а сама строка запуска со статусом и временем остаётся, поэтому статистика не рвётся. Открытый старый запуск честно скажет, что подробности вычищены.
  • История чатов автоматически не удаляется. Её чистит человек — кнопками очистки в чате (роль редактора). Учитывайте это, если по договору с клиентом переписку хранить нельзя.
  • Записанная история Telegram-групп выключена по умолчанию, включается на конкретном воркфлоу и имеет собственные тарифные сроки и потолок числа сообщений.
  • Файлы, коллекции, базы знаний и память не имеют срока — живут, пока их не удалят, и считаются в квотах хранения владельца («Лимиты тарифа»).

Архивация пространства ничего из этого не удаляет: данные остаются, освобождается только слот в квоте пространств.

Вход в аккаунт

Пароль хранится в виде хеша; вход выдаёт токен на 24 часа, после чего нужен новый вход. Попытки входа и регистрации ограничены по частоте. Вход, смена ролей и правка секретов пишутся в журнал безопасности с временем, автором и IP — журнал сегодня доступен только глобальному администратору установки.

Чего в платформе нет

Честный список — чтобы вы не искали эти кнопки и не строили на них планов.

  • Двухфакторной аутентификации нет.
  • Отдельного документа про юрисдикцию, обработку персональных данных и сроки хранения у платформы пока нет. Что можно сказать по факту устройства: данные лежат там, где развёрнута установка, и уходят наружу только к тем провайдерам, которых вы сами подключили — к провайдеру моделей и к сервисам ваших интеграций. Если требования к размещению данных жёсткие, единственный сегодняшний ответ — развернуть платформу у себя («Развернуть у себя»).
  • Экспорта «всех моих данных одной кнопкой» нет. Выгружать приходится по частям: воркфлоу — из редактора, файлы — из хранилища, коллекции и базы знаний — через собственные разделы.
  • Журнала действий для администратора пространства нет — только для глобального администратора установки.