Настройки сервера: справочник

В этом руководстве перечислены настройки сервера, которые можно менять через переменные окружения. Переменные окружения – это настройки, которые сервер читает из обычного текстового файла с именем .env. Приложение Marinara Engine работает и без настройки. Большинству она нужна, только чтобы открыть доступ другим устройствам, защитить общий сервер, перенести папку данных, повысить подробность журнала или дать медленным задачам больше времени.

Аккаунты ИИ, персонажи и параметры чатов настраиваются в самом приложении. О добавлении аккаунта ИИ читайте в руководстве Подключение к провайдеру ИИ.

Редактирование файла .env

Marinara создает пустой файл .env при первом запуске. Каждая строка имеет вид KEY=value. Строки, начинающиеся с #, – это комментарии.

УстановкаГде лежит .env
Обычная установкаКорневая папка проекта
Официальный образ Docker или Podman/app/data/.env, в том же томе, что и ваши данные
  1. Откройте .env.example в той же папке. В нем перечислены все настройки со значениями по умолчанию.
  2. Скопируйте нужную строку в .env.
  3. Измените значение после = и сохраните файл.
PORT=8080
BASIC_AUTH_USER=alice
BASIC_AUTH_PASS=correct-horse-battery-staple

Файл .env – это данные, а не сценарий оболочки. Marinara не выполняет $, $(...) и другой синтаксис оболочки внутри значения. Значение, уже заданное в окружении скрипта запуска, имеет приоритет над такой же строкой в .env.

Сервер читает .env при любом способе запуска. Скрипты запуска (start.bat, start.sh, start-termux.sh) вдобавок задают HOST=0.0.0.0, чтобы могли подключаться другие устройства, и открывают браузер, когда сервер готов. AUTO_OPEN_BROWSER=false отключает это. При запуске просто через pnpm start сервер слушает только этот компьютер, пока вы не зададите HOST.

Перезапуск или применение на ходу

Marinara следит за файлом .env во время работы. Большинство настроек применяется почти сразу, без перезапуска. Для каждого изменения в журнале появляется строка [env-watcher]. Если слежение не удается запустить, сервер проверяет файл раз в 30 секунд и сообщает об этом в журнале.

Если правки не подхватываются, например когда вы правите файл с другой машины или в примонтированной папке контейнера (bind mount), задайте MARINARA_ENV_WATCH=poll. Чтобы отключить слежение, задайте MARINARA_ENV_WATCH=0. Оба варианта рассчитаны на опытных пользователей.

Следующие настройки читаются только при запуске. Изменение любой из них требует перезапуска, и журнал вас об этом предупреждает:

Скрипты запуска читают AUTO_UPDATE_ENABLED до старта сервера, поэтому изменение применяется со следующего запуска, и журнал о нем не предупреждает.

Настройкам управления доступом и секретам (BASIC_AUTH_USER, BASIC_AUTH_PASS, IP_ALLOWLIST, ADMIN_SECRET, CSRF_TRUSTED_ORIGINS) перезапуск не нужен.

Управление доступом

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

Вход можно задать и без .env: через Settings → Advanced → Access (настройки → дополнительно → доступ) в браузере, где вы уже вошли, или с помощью одноразового кода настройки из журнала сервера. Сервер печатает этот код, только пока вход не задан и сервер слушает не только loopback. Вход сохраняется в DATA_DIR/.remote-login.json. Команда node scripts/reset-login.mjs (запускайте ее в папке Marinara) удаляет его и выводит из системы все браузеры. Вход из .env имеет приоритет. Чтобы изменить или убрать вход, нужен текущий пароль. О прокси со входом читайте в разделе Прокси со входом (forward auth).

Термины, которые используются ниже:

Пока вход не задан, сервер принимает подключения только из доверенных источников: loopback, адресов из IP_ALLOWLIST, сети Tailscale и трафика моста Docker с того же хоста. Все остальные, включая вашу домашнюю сеть, получают ответ 403 Forbidden. Чтобы другие устройства вообще могли подключиться, сервер должен слушать доступный адрес: задайте HOST=0.0.0.0.

ПеременнаяПо умолчаниюЧто делает
BASIC_AUTH_USERпустоИмя пользователя для входа. Задайте вместе с BASIC_AUTH_PASS.
BASIC_AUTH_PASSпустоПароль для входа. Оставьте любое из двух значений пустым, чтобы отключить вход.
BASIC_AUTH_REALMMarinara EngineИмя realm в запросе Basic Auth.
IP_ALLOWLISTпустоIP-адреса или диапазоны CIDR через запятую, которым доступ разрешен всегда. Прямой loopback разрешен всегда. Обратный прокси на той же машине – нет.
IP_ALLOWLIST_ENABLEDtrueЗначение false сохраняет список, но перестает его применять.
ALLOW_UNAUTHENTICATED_PRIVATE_NETWORKfalseРазрешает доступ без пароля из частных сетей, когда вход не задан. Не охватывает 100.64.0.0/10 – диапазон, которым интернет-провайдеры делятся между клиентами. Добавляйте его в TRUSTED_PRIVATE_NETWORKS, только если доверяете ему.
ALLOW_UNAUTHENTICATED_REMOTEfalseРазрешает доступ без пароля с любого адреса, включая интернет. Не рекомендуется.
TRUSTED_PRIVATE_NETWORKSвстроенные диапазоныЗаменяет стандартные частные диапазоны. Перечислите и те стандартные, которые хотите оставить.
BYPASS_AUTH_TAILSCALEавтоматическиПусто: устройство пропускает вход, только если подключается напрямую к адресу Tailscale этого компьютера. Через Tailscale Serve, Funnel или другой прокси вход по-прежнему нужен. true: прежний обход всего диапазона 100.64.0.0/10. false: обычное управление доступом.
BYPASS_AUTH_DOCKERавтоматическиПусто: доверяет только обнаруженному интерфейсу контейнера и его шлюзу, и только пока не задан ни вход, ни IP_ALLOWLIST, ни TRUSTED_AUTH_PROXY. true: старые или нестандартные сети. false: обычное управление доступом.
REQUIRE_AUTH_FOR_DOCKER_PROXYtrueТребует входа или списка разрешенных адресов для трафика Docker, который передает прокси. Ставьте false, только если сам прокси требует входа от каждого посетителя.
REQUIRE_AUTH_FOR_LOOPBACK_PROXYtrueСчитает удаленными запросы, которые пересылает прокси или туннель на той же машине, в том числе HTTP/1.0, например от proxy_pass nginx по умолчанию. Ставьте false, только если сам прокси требует входа от каждого посетителя.
TRUSTED_AUTH_PROXYпустоIP-адреса или диапазоны CIDR прокси со входом (forward auth: tinyauth, Authelia, Authentik, oauth2-proxy), который требует входа от каждого посетителя. Его запросы пропускают вход и IP_ALLOWLIST. Прокси должен защищать каждый путь, а Marinara не должна быть доступна в обход него.
TRUSTED_HOSTSпустоДополнительные публичные имена хостов или имена прокси, на которые отвечает Marinara, например chat.example.com. Прямые IP-адреса, localhost, .local, .home.arpa и однословные имена в локальной сети работают и без этого. Имена из CSRF_TRUSTED_ORIGINS или CORS_ORIGINS тоже принимаются.
SSL_CERTпустоПуть к сертификату TLS. Задайте вместе с SSL_KEY, чтобы сервер сам работал по HTTPS.
SSL_KEYпустоПуть к закрытому ключу TLS.
CSRF_TRUSTED_ORIGINSпустоДополнительные браузерные источники, которым разрешено сохранять изменения, – для публичного домена или нестандартного порта. Буквальное значение null игнорируется, в том числе для APK на Android.

Предупреждение: широкий публичный диапазон в IP_ALLOWLIST, например 0.0.0.0/0, может впустить клиентов из интернета без входа. Указывайте только адреса, которым доверяете.

Хранение данных

ПеременнаяПо умолчаниюЧто делает
DATA_DIRpackages/server/dataКорневая папка всех пользовательских данных. В образах Docker задан путь /app/data.
FILE_STORAGE_DIRпапка storage внутри DATA_DIRПереопределяет папку хранения файлов.
ENCRYPTION_KEYпустоКлюч, которым шифруются сохраненные ключи API.
MARINARA_MAX_RESIDENT_CHATS0 (без ограничений); 8 на SteamOS и TermuxМаксимальное число чатов, которые держатся в памяти одновременно. При превышении предела после каждого сохранения чат, к которому дольше всего не обращались и в котором нет несохраненных изменений, убирается из памяти (но никогда не с диска). При недопустимом тексте берется значение платформы по умолчанию. Положительные значения меньше 2 повышаются до 2. 0 отключает вытеснение.
MARINARA_EAGER_STORAGEвыключено1 загружает все чаты при запуске, как до версии 2.4.5. На больших профилях расходует намного больше памяти. Нужен перезапуск.

Сгенерируйте ключ шифрования и вставьте его в ENCRYPTION_KEY:

openssl rand -hex 32

Marinara хранит ваши данные в обычных файлах JSON, поэтому резервные копии можно копировать и читать. О том, что лежит в каждой папке, читайте в руководстве Где Marinara хранит ваши данные.

Уровни логирования

LOG_LEVEL задает, насколько подробно пишет сервер. Все, что ниже выбранного уровня, скрывается.

УровеньЧто показывает
errorТолько серьезные сбои.
warnОшибки и предупреждения. Значение по умолчанию.
infoДобавляет записи о старте и о каждом запросе.
debugВсе, включая полные промпты и ответы модели. Вывода очень много.
ПеременнаяПо умолчаниюЧто делает
LOG_LEVELwarnУровень из таблицы выше.
LOG_PRESETdefaultprompt-connections показывает те же подробности о промптах и модели, что и debug, но скрывает рутинные строки запросов, например GET /api/chats.
LOG_DISABLE_REQUEST_LOGGINGfalsetrue скрывает рутинные строки запросов и сохраняет ваш уровень. Нужен перезапуск.
LOG_FORMATавтоматическиpretty везде печатает удобочитаемые строки, например чтобы читать промпты Debug mode (режим отладки) в docker logs. json печатает по одному объекту JSON в строке. Нужен перезапуск.

В терминале сервер печатает удобочитаемые строки. В других местах, например в журналах Docker, сервер в режиме production печатает строки JSON. Скрипт запуска Termux запрашивает удобочитаемые строки. Логирование в браузере работает отдельно, и LOG_LEVEL им не управляет.

Тайм-ауты

Тайм-аут – это максимальное время, которое сервер ждет медленную задачу. Откройте Settings → Advanced → Request timeouts (тайм-ауты запросов), чтобы задать в секундах лимиты для текста, агентов, промптов изображений Game, изображений, видео, ComfyUI и эмбеддингов. Более высокие лимиты помогают медленным локальным бэкендам. Они не отменяют ограничение, которое устанавливает сам сервис. Для сохранения нужен доступ администратора сервера.

Эти настройки действуют для всех профилей и сохраняются рядом с активным .env в файле .env.timeouts.json (или <custom-env-path>.timeouts.json). Они имеют приоритет над соответствующими переменными, не меняя .env. Изменения для текста, агентов, промптов изображений Game и эмбеддингов применяются к новым запросам. Изменениям для медиа и установленным пакетам агентов нужен перезапуск. Чтобы вернуться к переменным, удалите этот файл и перезапустите сервер.

Значения указаны в миллисекундах, если в названии не сказано иначе. Недопустимые, нулевые, отрицательные или выходящие за диапазон значения для проверяемых тайм-аутов чата, агентов и промптов изображений Game вызывают предупреждение в журнале, и берется значение по умолчанию. О задачах видео читайте в руководстве Генерация видео сцены.

ПеременнаяПо умолчаниюЧто делает
CHAT_GENERATION_TIMEOUT_MS300000 (5 минут)Время до первого токена и промежуток между частями ответа для ответов в Conversation, Roleplay и Game. Также лимит для фоновых задач без собственного тайм-аута (Professor Mari, обновление ленты Noodle, ответы Slurp). Диапазон 10000-3600000. Не меняет тайм-ауты агентов, медиа, эмбеддингов и инструментов.
AGENT_CALL_TIMEOUT_MS300000 (5 минут)Максимальное время без данных до или во время одного обращения агента к модели, включая скачиваемых агентов. Поступающие данные запускают отсчет заново. Диапазон 10000-3600000. У агента Illustrator сохраняется как минимум встроенный 30-минутный лимит бездействия.
GAME_DYNAMIC_IMAGE_PROMPT_TIMEOUT_MS45000 (45 секунд)Ограничение общей длительности обращения к модели, которое превращает сцену Game в промпт для изображения. Диапазон 10000-3600000.
EMBEDDING_TIMEOUT_MS300000 (5 минут)Время на один запрос эмбеддинга.
IMAGE_GEN_TIMEOUT_MS1800000 (30 минут)Время на один запрос генерации изображения.
IMAGE_GEN_MAX_RESPONSE_BYTES31457280 (30 MiB)Максимальный размер принимаемого ответа с изображением. Увеличьте его, если локальный ComfyUI встраивает большие метаданные.
VIDEO_GEN_TIMEOUT_MS1800000 (30 минут)Время на один запрос видео сцены, включая процессы видео в ComfyUI.
VIDEO_GEN_MAX_RESPONSE_BYTES167772160 (160 MiB)Максимальный размер видео сцены, которое сервер согласится скачать.
COMFYUI_GEN_TIMEOUT2400 (40 минут, в секундах)Время на один процесс изображения в ComfyUI после постановки в очередь.
SPRITE_GENERATION_TIMEOUT_MSIMAGE_GEN_TIMEOUT_MSВремя на одну задачу генерации спрайта с помощью ИИ.
CUSTOM_TOOL_TIMEOUT_MS60000 (1 минута)Время на один вызов своего инструмента.
MAX_TOOL_ROUNDS100Сколько циклов вызова инструментов допустимо, прежде чем модель обязана ответить. Ход Game получает не больше 4, агент – 16, а дозаполнение лорбука – 64, или значение этой переменной, если оно меньше.

Особые действия по API (ADMIN_SECRET)

Разрушительным или рискованным действиям, таким как резервные копии, очистка данных, применение обновлений и установка тем оформления, нужен дополнительный секрет вдобавок к обычным проверкам доступа. Его можно создать в Settings → Advanced → Admin Access (доступ администратора) на компьютере, где работает сервер (см. раздел Admin Access), или задать на сервере длинное случайное значение:

ADMIN_SECRET=replace-this-with-a-long-random-secret

На компьютере, где работает сервер, такие действия обычно проходят и без секрета. Запрос, который пересылает прокси или туннель на этом компьютере, считается удаленным, если не задано REQUIRE_AUTH_FOR_LOOPBACK_PROXY=false. Прямым запросам с другого устройства секрет нужен. Вставьте то же значение в Settings → Advanced → Admin Access, и приложение будет отправлять его само. ADMIN_SECRET в .env имеет приоритет над секретом, созданным в приложении. Если секрета администратора нет, особые действия не выполняются ни с одного устройства, кроме компьютера сервера, а сообщение об ошибке предлагает задать секрет. Установленные агенты работают с любого устройства, на котором выполнен вход; для их установки, обновления и удаления нужен секрет.

ПеременнаяПо умолчаниюЧто делает
ADMIN_SECRETпустоСекрет для особых действий с удаленных устройств.
MARINARA_REQUIRE_ADMIN_SECRET_ON_LOOPBACKfalsetrue требует секрет и на компьютере сервера.
UPDATES_APPLY_ENABLEDfalseРазрешает браузеру применять обновления в том же канале кнопкой Apply Update (применить обновление). Переключение канала выпусков из браузера на компьютере сервера работает и без этого. Только для установок из Git.
UPDATES_APPLY_DISABLEDне заданоЗапрещает любое применение обновлений на стороне сервера, включая переключение канала. Имеет приоритет над UPDATES_APPLY_ENABLED. Скрипты запуска для разработки и для e2e задают его.
UPDATES_ALLOW_REMOTE_APPLYfalseРазрешает удаленному устройству применять обновления при верном секрете.
HAPTICS_ALLOW_REMOTEfalseРазрешает удаленному устройству выполнять тактильные команды при верном секрете.
CUSTOM_TOOL_SCRIPT_ENABLEDfalseВключает свои инструменты-сценарии. Держите выключенным для непроверенных или импортированных инструментов.
MARI_DB_ALLOW_UNSAFE_TRANSFORMSfalseРазрешает скриптам преобразования базы данных от Professor Mari работать на хостах без песочницы ОС (macOS Seatbelt или Linux Bubblewrap, которые используются, если они есть). Держите выключенным, если вы не проверили скрипт.
ENABLE_CUSTOM_AGENT_REPOSfalseВключает ручной предпросмотр и синхронизацию репозиториев агентов с GitHub в разделе Agent Organizer. См. Свои репозитории агентов.
MARINARA_OVERWORLD_GAMESfalseПозволяет игрокам создавать игры Overworld (набор мира и сгенерированный мир) и превращать в такую игру старую. Когда настройка выключена, мастер предлагает только игры Classic.
ENABLE_EXTERNAL_EXTENSIONSfalseПервое из двух разрешений на импорт сторонних расширений. См. Внешние расширения.
IMPORT_ALLOWED_ROOTSпустоПапки, из которых массовый импорт может читать без токена выбора файлов.
PROFILE_EXPORT_JSON_LIMIT_BYTES268435456 (256 MiB)Максимальный размер одного экспорта профиля в JSON, который собирает сервер.

Разрешения для локальных адресов

По умолчанию исходящие запросы к сервисам ИИ, сервисам изображений и вебхукам не обращаются к частным или локальным адресам. Это защищает от SSRF (подделки запроса на стороне сервера), когда запрос обманом направляют на внутренний адрес. Серверы моделей на loopback продолжают работать. Включайте только тот переключатель, который нужен для вашего сервиса на другой машине в частной сети.

ПеременнаяПо умолчаниюЧто делает
PROVIDER_LOCAL_URLS_ENABLEDfalseАдреса сервисов ИИ могут обращаться к частным или локальным сетевым адресам. На Android включено по умолчанию.
IMAGE_LOCAL_URLS_ENABLEDfalseАдреса сервисов изображений могут обращаться к частным или локальным сетевым адресам. Частные адреса результатов все равно должны точно совпадать с источником сервиса.
TTS_LOCAL_URLS_ENABLEDfalseАдреса синтеза речи могут обращаться к частным или локальным сетевым адресам.
STT_LOCAL_URLS_ENABLEDfalseАдрес сервера распознавания речи может обращаться к частным или локальным сетевым адресам. Сервер на той же машине работает и без этого.
DEEPLX_LOCAL_URLS_ENABLEDfalseАдреса перевода DeepLX могут обращаться к частным или локальным сетевым адресам.
WEBHOOK_LOCAL_URLS_ENABLEDfalseВебхуки своих инструментов могут обращаться к частным или локальным сетевым адресам.

О подключении локальной модели или модели на своем сервере читайте в руководстве Подключение локальной модели или модели на своем сервере.

Переключатели функций

Необязательные функции сервера, например повтор неудачных вызовов провайдера или стабильный выбор групп лорбука, находятся в Settings → Advanced → Features (функции). По умолчанию все выключены. У некоторых есть переменная, которая, если задана, имеет приоритет над переключателем. См. Переключатели функций.

Уведомления Marinara

Уведомления – это короткие предупреждения от мейнтейнеров, например о проблеме безопасности или о ручном шаге, который нужен вашей версии. Они показываются в виде баннера.

Чтобы отключить уведомления, задайте MARINARA_NOTICES_ENABLED=false.

Предупреждение: когда уведомления отключены, Marinara не может сообщить вам об исправлениях безопасности и обязательных шагах. Следите за выпусками на GitHub сами.

Форки могут указать в MARINARA_NOTICES_URL свой файл.

Необязательный многопользовательский режим

Многопользовательский режим по умолчанию выключен. Он позволяет людям вместе пользоваться частной комнатой Conversation, Roleplay или Game без фиксированного ограничения на число участников. Каждый гость использует собственную доверенную установку Marinara. Гостям не нужен аккаунт ИИ. Аккаунты ИИ предоставляет хост, и он может читать и сохранять общее содержимое. Пока хотя бы одно из двух разрешений выключено, Marinara не выполняет фоновых проверок сессий, сертификатов и участников.

  1. Задайте MULTIPLAYER_ENABLED=true в .env каждой участвующей установки Marinara и перезапустите ее. Работает только точное значение true, и применение на ходу его не подхватывает.
  2. Откройте Settings → Advanced → Multiplayer (многопользовательский режим), прочитайте предупреждение и включите настройку. Это не запускает прослушивание порта и не подключает к комнате.
  3. Чтобы стать хостом, используйте Create shared session (создать общую сессию) или Play together (играть вместе) при выборе режима или в процессе настройки. Проверьте настройки, свое отображаемое имя и текст персоны, которым вы делитесь. Существующий чат передает только выбранные настройки, но никогда не историю сообщений, заметки или воспоминания.
  4. На хосте задайте SSL_CERT и SSL_KEY для сертификата, который действителен для имени хоста комнаты и которому доверяют гости. Выберите отдельные HTTPS-адрес и порт комнаты, например https://room.example.org:7861. Этот порт открывает действие Host. Пропускайте через брандмауэр или роутер только порт комнаты. Не открывайте наружу обычный API Marinara. Проброс портов, ретранслятор и обход сертификатов за вас не настраиваются.
  5. Задайте пароль комнаты длиной не менее 12 символов, отличный от ваших учетных данных администратора. Отправьте временное приглашение и пароль по отдельности людям, которым доверяете. Гость проверяет отпечаток имени хоста, имя комнаты и текст персоны, а затем запрашивает вход. Хост одобряет каждый запрос в Players (игроки) до отправки какой-либо истории.

Ограничения и поведение:

Предупреждение: подключайтесь только к тем, кому доверяете, и используйте собственный клиент Marinara. Никогда не устанавливайте клиент, расширение или файл от хоста. Хост может читать то, чем вы делитесь, а общее содержимое может попасть в его сервисы ИИ. Прямые подключения раскрывают сетевые адреса. Не делитесь паролями, ключами API и личными данными. Сразу выходите, если что-то кажется подозрительным.

Точные ограничения и проверенные платформы описаны в записи о совместимости и проверках. О проблемах читайте в руководстве Устранение неполадок.

Агенты и расширения

Дополнительные официальные агенты устанавливаются в приложении: Agents → Agent Organizer (агенты → организатор агентов). Marinara сама выбирает каталог Pasta-Devs/Marinara-Agents, который соответствует ее основной версии.

Импорт своих агентов

Внешние файлы агентов, папки и репозитории заблокированы. Чтобы разрешить их, включите Allow custom Agent imports (разрешить импорт своих агентов) в Settings → Advanced → Danger Zone (опасная зона). Переменная окружения для этого не нужна. Пока вы этого не сделаете, элементы импорта остаются серыми.

Каждый импорт сначала показывает, какие возможности запрашивает агент. Разрешения нужно подтвердить явно. Вложенные функции и наборы инструментов не импортируются, сгенерированный код CSS проходит очистку, а действия из результата сверяются с одобренными возможностями. Если выключить этот переключатель, импортированные агенты перестают работать. Агентов, созданных в Marinara, и официальные пакеты это не затрагивает.

Свои репозитории агентов

Репозитории по умолчанию выключены, потому что их промпты и инструменты не проверены. Задайте ENABLE_CUSTOM_AGENT_REPOS=true, включите Allow custom Agent imports, затем откройте Agents → Agent Organizer → Custom Sources (свои источники), чтобы посмотреть публичный репозиторий GitHub. И добавление источника, и применение последующих изменений требуют подтверждения. Синхронизация только ручная: Marinara никогда не клонирует и не опрашивает репозитории в фоне. Принимаются только URL корня репозитория GitHub.

Репозиторий публикует агентов, наборы правил Game Mode или и то и другое. В корне репозитория:

  [
    {
      "id": "continuity-helper",
      "name": "Continuity Helper",
      "description": "Checks recent turns for contradictions.",
      "phase": "post_processing",
      "enabledByDefault": false,
      "category": "writer",
      "defaultPromptTemplate": "Check {{messages}} for continuity errors."
    }
  ]

Имена импортированных наборов правил строятся от владельца репозитория, например alice/my-5e, поэтому они никогда не займут имя официального набора. Сохраняется каждая версия, и игра идет на той версии, с которой началась. Если та же версия приходит с другим содержимым, Marinara оставляет установленную и предлагает попросить автора повысить номер версии. Файл, который Marinara не может прочитать, показывается в списке с причиной и пропускается.

При синхронизации промпты, настройки и инструменты из репозитория заменяют управляемые репозиторием значения, показанные в предпросмотре. Ваш выбор аккаунта и изображений остается локальным. Если агент исчезает из источника, он остается обычным локальным агентом и теряет только связь с репозиторием. Удаление источника работает так же, а его наборы правил остаются установленными.

Свои агенты также могут включить Previous output (предыдущий результат) в разделе Context Sources, чтобы читать свой последний успешный результат. При включенном JSON context output (вывод контекста в JSON) возвращайте {"text":"main prompt content","agent-context":"private continuation context"}. В основной промпт попадает только text. Hide output as spoilers (скрывать результаты как спойлеры) оставляет сохраненные результаты свернутыми. При повторной генерации заменяемый ход исключается, а удаленные сообщения и неактивные свайпы не могут передавать контекст.

Внешние расширения

Импорт сторонних расширений требует двух разрешений. Переменная окружения – это разрешение от того, кто держит сервер. Переключатель в Danger Zone – согласие пользователя.

  1. Задайте ENABLE_EXTERNAL_EXTENSIONS=true в .env.
  2. Откройте Settings → Advanced → Danger Zone, прокрутите ниже элементов удаления данных, прочитайте предупреждение и включите Allow third-party extension imports (разрешить импорт сторонних расширений).

После этого раздел External Extensions (внешние расширения) появится в Settings → Addons (дополнения). Закрытие любого из разрешений отключает записи внешних расширений и останавливает их код. Записи, добавленные вручную, старые, импортированные из профиля и с неизвестным источником считаются внешними, поэтому разрешения нельзя обойти, просто положив файлы в папку. Черновикам от Professor Mari не нужно ни одно из разрешений. Они создаются выключенными, и их точный хеш кода требует одобрения.

По умолчанию используется режим Sandboxed Browser Extensions. Некоторые старые пакеты показывают Full page access (полный доступ к странице), потому что им нужна страница Marinara. В этом режиме одобренный код выполняется прямо на странице Marinara и получает доступ к содержимому страницы, хранилищу браузера, сетевым интерфейсам и вашей сессии. Режим доступен только для External Extensions, когда открыты оба разрешения, и требует отдельного подтверждения предупреждения. После отключения режима перезагрузите страницу.

Полный справочник переменных окружения

Таблицы выше описывают управление доступом, хранение данных, логирование, тайм-ауты, особые действия и разрешения для локальных адресов. Остальные переменные собраны здесь.

Сервер и запуск

ПеременнаяПо умолчаниюЧто делает
PORT7860Порт, который слушает сервер. На Android, в Docker и в Termux держите одно и то же значение.
HOST127.0.0.1 (0.0.0.0 в скриптах запуска и образах Docker)Сетевой интерфейс для прослушивания. Для доступа из локальной сети используйте 0.0.0.0. Файл Compose по умолчанию публикует порт Docker только на 127.0.0.1.
MARINARA_ANDROID_SECRETпустоВнутренний секрет для установок Termux под управлением APK. Приложение Android создает его, а скрипт запуска Termux экспортирует. Никогда не просите пользователей задавать его. Значение должно состоять ровно из 64 шестнадцатеричных символов. Недопустимое непустое значение приводит к ошибке HTTP 503 на локальные запросы устройства.
MARINARA_ANDROID_SECRET_FILE~/.marinara-engine/android-secretФайл секрета, который используют скрипт запуска Termux и локальная команда mari. APK и скрипт запуска управляют им сами.
AUTO_OPEN_BROWSERtrueОткрывают ли скрипты запуска URL приложения. false отключает это. При установке под управлением APK эта функция выключена.
AUTO_UPDATE_ENABLEDtrueСкачивают и применяют ли скрипты запуска для установок из Git обновления перед стартом. false отключает это со следующего запуска. Скрипт запуска все равно проверяет без изменений, есть ли новые выпуски, и выводит напоминание. Ключ --skip-update пропускает обе проверки для одного запуска.
MARINARA_NOTICES_ENABLEDtrueЗагружает ли сервер уведомления мейнтейнеров. См. Уведомления Marinara.
MARINARA_NOTICES_URLnotices.json в ветке noticesДругой файл уведомлений для форков и зеркал. Он проверяется так же, а ссылки не на https://github.com/Pasta-Devs/ отбрасываются.
MARINARA_ENV_FILE.env в корне проектаДругой путь к файлу .env. Задайте его до запуска.
MARINARA_MEDIA_GENERATION_CONCURRENCY4Максимум одновременных запросов изображений или видео на весь сервер. Понизьте до 1–2, если локальному ComfyUI или SwarmUI не хватает видеопамяти. 0 снимает предел. Недопустимые значения игнорируются с предупреждением. Пакетная работа никогда не занимает последнее место. Действует поверх переключателя Queue media generation requests (ставить запросы генерации медиа в очередь) в Settings → Generations → Overall Generations (генерации → общие настройки генерации). Этот переключатель по умолчанию включен и ставит задачи изображений и видео в очередь для каждого аккаунта.
MARINARA_MEDIA_GENERATION_WAIT_TIMEOUT_MS600000 (10 минут)Сколько запрос ждет свободного места, прежде чем завершиться ошибкой. 0 – ждать бесконечно.
MARINARA_SHARED_GPU_HOSTSпустоСписок host:port через запятую для одной GPU, которую совместно используют локальная модель и локальный сервер изображений или видео (например, через llama-swap). Текстовые и медиазапросы к хосту из списка выполняются по очереди, поэтому изображение не может бесконечно ждать за ответами чата. Изображение или клип ждет не дольше MARINARA_MEDIA_GENERATION_WAIT_TIMEOUT_MS. Эмбеддинги не задерживаются. Применяется к новым запросам без перезапуска.
MARINARA_ENV_WATCH1Как сервер следит за .env. По умолчанию – по событиям изменений (задержка примерно 250 мс) с проверкой раз в 30 секунд как запасным вариантом. poll: всегда проверка раз в 30 секунд. 0: слежение выключено. См. Перезапуск или применение на ходу.
TZсистемныйРезервный часовой пояс хоста для серверных задач, например Europe/Warsaw. Оставьте его незаданным или пустым, чтобы использовать часовой пояс хоста. Для расписаний приоритет имеет сохраненная в Conversation настройка Schedule timezone (часовой пояс расписаний).
CORS_ORIGINShttp://localhost:5173,http://127.0.0.1:5173Браузерные источники, которым разрешены межсайтовые запросы.
AUTO_CREATE_DEFAULT_CONNECTIONtrueУстаревший флаг. Текущие сборки не включают стартовый ключ, поэтому он ничего не создает. Добавьте свой аккаунт в приложении.

По умолчанию Schedule timezone берет часовой пояс вашего устройства. Изменить его можно при настройке Conversation, в Chat Settings режима Conversation или в редакторе расписания персонажа. Это одна общая настройка для всех чатов Conversation, и она синхронизируется с другими клиентами на том же сервере.

Медиа и работа со спрайтами

ПеременнаяПо умолчаниюЧто делает
FFMPEG_PATHпустоПуть к ffmpeg, который используется для анимированных GIF с выражениями лица. Если не задан, берется ffmpeg из PATH.
SPRITE_ANIMATED_FFMPEG_TIMEOUT_MS180000 (3 минуты)Время на преобразование одного анимированного клипа с выражением лица.
SPRITE_BACKGROUND_REMOVAL_ENGINEautoauto сначала пробует встроенную очистку, затем необязательный инструмент с ИИ. builtin использует только встроенную очистку. backgroundremover принудительно включает инструмент с ИИ.
BACKGROUNDREMOVER_AUTO_INSTALLfalsetrue устанавливает необязательный инструмент удаления фона на базе ИИ при запуске.
BACKGROUNDREMOVER_COMMANDпустоПуть к системной программе backgroundremover.
BACKGROUNDREMOVER_PYTHONпустоПуть к Python, в котором установлен backgroundremover.
BACKGROUNDREMOVER_TIMEOUT_MS600000 (10 минут)Время на один вызов удаления фона с помощью ИИ.

Провайдеры видео сцены

Аккаунты для видео настраиваются в приложении. Эти настройки лишь подстраивают задачи. Значения указаны в миллисекундах.

ПеременнаяПо умолчаниюЧто делает
GOOGLE_VEO_VIDEO_POLL_INTERVAL_MS10000Как часто сервер проверяет задачу Google Veo.
XAI_VIDEO_POLL_INTERVAL_MS5000Как часто он проверяет задачу xAI Imagine.
OPENROUTER_VIDEO_POLL_INTERVAL_MS10000Как часто он проверяет задачу видео в OpenRouter.
SEEDANCE_VIDEO_POLL_INTERVAL_MS10000Как часто он проверяет задачу Seedance.
VIDEO_REFERENCE_PUBLIC_BASE_URLпустоПубличный HTTPS-адрес этого сервера для сервисов, которым нужно скачать образец изображения по ссылке.

Лорбуки

Обе настройки по умолчанию выключены и действуют со следующей генерации после изменения .env. Если LOREBOOK_STABLE_GROUP_WINNERS задана, она имеет приоритет над переключателем Stable lorebook picks (стабильный выбор лорбука) в Settings → Advanced → Features. Иначе решает переключатель. См. Переключатели функций.

ПеременнаяПо умолчаниюЧто делает
LOREBOOK_STABLE_GROUP_WINNERSfalseСохраняет в чате одного и того же победителя группы включения, пока кандидаты не меняются, вместо нового розыгрыша при каждой генерации. Сохраняет начало промпта стабильным для кеширования промпта у провайдера.
LOREBOOK_COMPACT_STORED_SCANSfalseХранит полный текст активированных записей только у последнего сообщения ассистента или рассказчика. Старые сообщения хранят ID записей, ключи и оценки. Заметно уменьшает размер чатов с большими лорбуками. Если новые сообщения удалены, Active Context и повторы агентов показывают текущий текст записи для сообщения, которое снова стало последним.

scripts/compact-lorebook-scans.mjs применяет то же правило к старым чатам. Сначала остановите сервер. Без --apply выполняется только пробный проход, а перед записью скрипт делает резервные копии обеих таблиц сообщений.

Устойчивость

Все настройки по умолчанию выключены, что сохраняет прежнее поведение. STORAGE_CACHE_WINDOWS_BOOT_ID, SHUTDOWN_WINDOWS_CONSOLE_SIGNALS и SHUTDOWN_FORCE_EXIT_ON_REPEAT требуют перезапуска. Остальные применяются после изменения .env. Если PROVIDER_RETRY_TRANSIENT_ERRORS задана, она имеет приоритет над переключателем Retry failed provider calls (повторять неудачные вызовы провайдера) в Settings → Advanced → Features. Иначе решает переключатель.

ПеременнаяПо умолчаниюЧто делает
PROVIDER_RETRY_TRANSIENT_ERRORSfalseПовторяет отказ или недоступность соединения либо ошибку 502 или 503 до двух раз с паузой не более 5 с и только до того, как к вам пришел какой-либо текст. 504 и оборванное соединение никогда не повторяются. Не используется, если у аккаунта есть резервный вариант (fallback): он пробуется сразу. Медленно отказывающий хост может задержать ошибку примерно на 20 с.
STORAGE_SKIP_UNCHANGED_WRITESfalseПри сохранении файл чата или manifest.json не перезаписывается, если его содержимое совпадает с последней записью этого сервера и файл на диске не менялся. Файл, только что восстановленный из .bak, перезаписывается всегда.
STORAGE_YIELDING_SERIALIZEfalseГотовит большие файлы чатов к сохранению короткими порциями, чтобы сохранение очень длинного чата не приостанавливало другие запросы. Записанные байты остаются теми же.
STORAGE_CACHE_WINDOWS_BOOT_IDfalseТолько Windows. Запоминает до следующей перезагрузки проверку времени загрузки, которую блокировка хранилища выполняет при каждом запуске (около 1,5–2 с PowerShell), в файле .writer-boot-id.json внутри DATA_DIR.
SHUTDOWN_WINDOWS_CONSOLE_SIGNALSfalseТолько Windows. <kbd>Ctrl</kbd>+<kbd>Break</kbd> и закрытие консоли тоже корректно останавливают сервер и записывают ожидающие сохранения. Для закрытия консоли сроки сокращены, чтобы уложиться примерно в 5 с, которые дает Windows.
SHUTDOWN_FORCE_EXIT_ON_REPEATfalseПовторное нажатие <kbd>Ctrl</kbd>+<kbd>C</kbd> или <kbd>Ctrl</kbd>+<kbd>Break</kbd> более чем через 1,5 с после первого немедленно завершает сервер. Незаписанные сохранения могут потеряться. Без этой настройки повторы игнорируются и действует предел завершения 8 с.
SHUTDOWN_EARLY_FLUSHfalseНачинает запись ожидающих сохранений сразу при сигнале остановки, пока соединения еще закрываются. Перезапуск в Advanced Settings это не использует.
SHUTDOWN_RUNTIME_STOP_BUDGET_MS0Сколько сигнал остановки ждет фоновые среды выполнения (пакеты, расширения, встроенную модель), прежде чем закрыть хранилище. 0 ждет их все. Максимум 2500, чтобы хранилище закрылось в пределах 8 с. Перезапуск в Advanced Settings по-прежнему ждет все.

Интеграции и прочее

ПеременнаяПо умолчаниюЧто делает
CLAUDE_SUBSCRIPTION_USE_INSTALLED_CLItrueИспользуют ли аккаунты Claude (Subscription) программу Claude Code на этом компьютере, если она не старее встроенной копии. На Android встроенной копии нет, поэтому эту настройку нужно оставить включенной. false всегда использует встроенную копию. Изменение вступает в силу в течение пяти минут.
DOCS_I18N_BASE_URLофициальная ветка docs-i18nОткуда загружаются языковые пакеты документации и интерфейса. Пакеты интерфейса берутся из поддерева ui/. Нужен общедоступный хост https://.
GIPHY_API_KEYпустоКлюч Giphy для поиска GIF в режиме Conversation. Поиск выключен, пока вы не зададите ключ и не перезапустите сервер.
INTIFACE_URLws://127.0.0.1:12345Адрес по умолчанию для приложения тактильной отдачи Intiface.
SPOTIFY_REDIRECT_URIвычисляется из запросаДругой адрес обратного вызова для входа в Spotify. Задайте его, если TLS завершается выше по цепочке.
MARI_WIKI_CONTENT_MAX_BYTES50000Максимальный размер содержимого страницы вики, который Professor Mari читает до обрезки.
MARI_WIKI_REQUEST_TIMEOUT_MS30000Время на один запрос к вики от Professor Mari.
MARI_WIKI_CACHE_TTL_MS300000Сколько Professor Mari хранит в кеше прочитанную страницу вики.
SIDECAR_RUNTIME_INSTALL_ENABLEDfalse (скрипт запуска для Windows задает true)Разрешает устанавливать среду Built-in model (встроенная модель) без заголовка администратора на loopback.

О Built-in model читайте в руководстве Настройка встроенной модели.

Исходящий HTTP-прокси

В некоторых сетях выход в интернет возможен только через HTTP-прокси, например v2rayN без режима TUN. Marinara может отправлять через него запросы к сервисам ИИ, сервисам изображений, серверам эмбеддингов и каталогу агентов. Задайте эти переменные в окружении, из которого запускается Marinara, или в .env, затем перезапустите ее.

ПеременнаяПо умолчаниюЧто делает
NODE_USE_ENV_PROXYне задано1 включает прокси. Без этого Marinara, как и сам Node.js, игнорирует настройки прокси.
HTTP_PROXYпустоАдрес прокси, например http://127.0.0.1:10809. Используется для всех запросов, если не задан HTTPS_PROXY.
HTTPS_PROXYпустоПрокси для адресов https://, если он отличается от HTTP_PROXY.
NO_PROXYпустоХосты через запятую, которые обходят прокси. Добавьте сюда серверы моделей в вашей сети. localhost, 127.0.0.1 и ::1 обходят прокси всегда.

Смежные руководства