# Настройка своего сервера

> Переменные окружения открытого ядра Eggent, обратный прокси с HTTPS для VPS, Telegram-вебхук, исходящий прокси и правила безопасности.

Source: https://eggent.ai/r/docs/self-host-config/

Почти всё настраивается в интерфейсе Eggent, и файл `.env` не обязателен. Переменные окружения нужны для того, что должно быть известно до запуска: адрес, порт, запасные ключи.

## Переменные окружения {#env}

Полный список — в `.env.example` в репозитории. Основные:

| Переменная | По умолчанию | Для чего |
| --- | --- | --- |
| `APP_BIND_HOST` | `127.0.0.1` | На каком адресе хоста слушает Docker. `0.0.0.0` — только осознанно |
| `APP_PORT` | `3000` | Порт на хосте |
| `APP_BASE_URL` | `http://localhost:3000` | Публичный адрес — для вебхуков и ссылок |
| `EGGENT_AUTH_SECRET` | создаётся в `data/settings/` | Секрет подписи сессий |
| `EXTERNAL_API_TOKEN` | не задан | Запасной токен для [внешнего API](https://eggent.ai/r/docs/external-api.md) |
| `TELEGRAM_BOT_TOKEN` | не задан | Токен бота, если не хочешь вводить его в интерфейсе |
| `TELEGRAM_WEBHOOK_SECRET` | не задан | Секрет вебхука Telegram |
| `TELEGRAM_DEFAULT_PROJECT_ID` | не задан | Проект по умолчанию для Telegram |
| `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `GOOGLE_API_KEY`, `OPENROUTER_API_KEY` | не заданы | Запасные ключи провайдеров |
| `EGGENT_STT_ENABLED`, `EGGENT_STT_MODEL`, `EGGENT_STT_LANGUAGE` | `1`, `base`, `auto` | [Распознавание речи](https://eggent.ai/r/docs/voice.md#self-host) |
| `HTTPS_PROXY`, `HTTP_PROXY`, `NO_PROXY` | не заданы | Исходящий трафик через прокси |
| `EGGENT_LEARNING` | включено | `off` не даёт агенту сохранять заметки и навыки из разговоров (см. [«Память»](https://eggent.ai/r/docs/memory.md#learned)); уже сохранённое тоже перестаёт читаться |
| `EGGENT_LEARNING_MODEL` | модель чата | Модель для фонового взгляда назад: `провайдер/id` или просто id — хватит и более дешёвой |
| `EGGENT_LEARNING_DAILY_CAP`, `EGGENT_LEARNING_MIN_GAP_SECONDS`, `EGGENT_LEARNING_EVERY_TURNS` | `40`, `60`, `6` | Сколько раз в сутки агент оглядывается, пауза между двумя взглядами и как часто смотрит разговор, в котором ничего не отмечено |
| `EGGENT_TURN_WATCHDOG` | включено | `off` отключает проверку, которая останавливает «замолчавший» ход (см. [«Чаты»](https://eggent.ai/r/docs/chats.md#while-working)). Стоит отключить, если ты запускаешь медленную локальную модель, которая может думать дольше лимитов ниже |
| `EGGENT_TURN_SILENCE_SOFT_SECONDS`, `EGGENT_TURN_SILENCE_START_SECONDS`, `EGGENT_TURN_SILENCE_MODEL_SECONDS`, `EGGENT_TURN_SILENCE_TOOL_SECONDS` | `90`, `180`, `360`, `1200` | Сколько ход может молчать, прежде чем чат скажет, что он ещё идёт, и прежде чем его остановят: пока он запускается, пока модель не ответила, пока выполняется команда. Команда, которая идёт рядом с другой, сохраняет весь свой запас |
| `EGGENT_TURN_QUESTION_WAIT_SECONDS` | `86400` | Сколько вопрос к тебе может ждать ответа, прежде чем ход остановят (см. [«Чаты»](https://eggent.ai/r/docs/chats.md#questions)). `0` или `off` — вопрос ждёт сколько угодно |
| `EGGENT_VISITS_MAX`, `EGGENT_VISIT_TIMEOUT_MINUTES`, `EGGENT_VISIT_STOP_GRACE_SECONDS` | `2`, `10`, `20` | [Обращение к проекту через `@`](https://eggent.ai/r/docs/projects.md#ask): сколько их может идти одновременно, сколько может занять одно и сколько ему дают на остановку, прежде чем его отпускают |
| `EGGENT_BOARD` | включено | `off` — [доска задач](https://eggent.ai/r/docs/board.md) перестаёт запускать карточки; сама доска и карточки остаются |
| `EGGENT_BOARD_MAX_RUNNING`, `EGGENT_BOARD_MAX_PER_PROJECT` | `3`, `1` | Сколько карточек работают одновременно на всей доске и в одном проекте. Карточки одного проекта работают в одной папке |
| `EGGENT_BOARD_RETRY_SECONDS` | `60` | Сколько упавшая карточка ждёт своего единственного автоматического повтора |
| `EGGENT_ZIP_MAX_MB`, `EGGENT_ZIP_MAX_FILES`, `EGGENT_ZIP_IDLE_SECONDS` | `1024`, `10000`, `120` | Размер и число файлов одного [архива](https://eggent.ai/r/docs/files.md#zip) и сколько он может простоять, когда его никто не забирает, прежде чем его бросят |
| `EGGENT_VERSIONS` | включено | `off` — [версии файлов](https://eggent.ai/r/docs/files.md#history) больше не сохраняются; то, что уже сохранено, можно смотреть |
| `EGGENT_VERSIONS_KEEP_DAYS`, `EGGENT_VERSIONS_DAILY_DAYS`, `EGGENT_VERSIONS_MAX_PER_FILE`, `EGGENT_VERSIONS_MAX_FILE_MB` | `30`, `90`, `200`, `10` | Сколько каждая версия хранится после того, как её заменили, до какого срока хранится по одной в день, сколько версий держит один файл и с какого размера у файла нет истории |
| `EGGENT_VERSIONS_SCAN_SECONDS` | `120` | Как часто файлы с историей проверяются на изменения, сделанные в обход Eggent: синхронизация, терминал, другая программа |
| `EGGENT_VERSIONS_MAX_TOTAL_MB`, `EGGENT_VERSIONS_DISK_SHARE` | `1024`, `0.25` | Сколько может занимать вся история и какую долю диска, если развёртывание сообщает его размер; сверх этого первыми уходят версии, заменённые раньше всех |
| `EGGENT_WEB_SEARCH_DEFAULTS` | включено | `off` — Eggent не записывает при старте порядок бесплатных поисковиков в `data/pi-agent/web-search.json` (см. [Инструменты агента](https://eggent.ai/r/docs/agent-tools.md#web)) |
| `EGGENT_CLOUD_PROMO` | включено | `0` убирает короткую карточку про Eggent Cloud внизу страницы **Настройки → Модели** |
| `EGGENT_VERSION` | `latest` | Тег образа для `docker-compose.ghcr.yml` |

После изменения `.env` пересоздай контейнер:

```bash
docker compose up -d --force-recreate
```

## Обратный прокси и HTTPS {#reverse-proxy}

На VPS держи Eggent на `127.0.0.1` и ставь перед ним прокси с HTTPS. HTTPS нужен не только для безопасности: без него браузер не даст доступ к микрофону, а Telegram не примет вебхук.

**Caddy** (сертификат получит сам):

```text
eggent.example.com {
    request_body {
        max_size 100MB
    }
    reverse_proxy 127.0.0.1:3000
}
```

**Nginx**:

```nginx
server {
    server_name eggent.example.com;
    client_max_body_size 100m;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_buffering off;
        proxy_read_timeout 600s;
    }
}
```

> [!WARNING]
> Прокси ограничивает размер запроса, и его лимит обычно меньше, чем у Eggent: у Nginx по умолчанию 1 МБ, и загрузка большого файла падает с ошибкой `413`. Подними лимит до 100 МБ, как в примерах. `proxy_buffering off` и большой `proxy_read_timeout` нужны, чтобы ответы агента шли потоком и долгие задачи не обрывались.

После настройки прокси пропиши публичный адрес в `APP_BASE_URL`.

## Telegram на своём сервере {#telegram}

Бот подключается в **Настройки → Мессенджеры**, как описано в [«Telegram»](https://eggent.ai/r/docs/telegram.md#own-bot). Режим:

- **Long Polling** — работает без публичного адреса. Подходит для домашней машины. Сообщения обрабатываются по очереди, поэтому то, что ты отправляешь, пока агент занят, — включая `/reset` и «стоп», — прочитывается, когда этот ход закончится; «замолчавший» ход завершают лимиты `EGGENT_TURN_SILENCE_*` выше.
- **Webhook** — нужен публичный HTTPS-адрес (`APP_BASE_URL`). Быстрее и надёжнее на VPS.

Режим **Auto** сам выберет вебхук, когда публичный HTTPS-адрес задан.

## Исходящий прокси {#egress-proxy}

Если сервер выходит в интернет только через прокси, задай `HTTPS_PROXY` (и при необходимости `HTTP_PROXY`, `NO_PROXY`). Нужен Node.js 22.23 или новее; в Docker-образе он уже такой.

## Безопасность {#security}

- Не открывай порт Eggent в интернет без HTTPS. По умолчанию он слушает только `127.0.0.1` — так и оставь, если стоит прокси.
- Сразу смени логин и пароль по умолчанию.
- Относись к токену внешнего API как к паролю и не используй его в коде браузера.
- Защищай и резервируй папку `data/`: там чаты, файлы, память, настройки и ключи.
- У агента есть терминал внутри контейнера. Не монтируй в контейнер папки, к которым агенту не нужен доступ.
