> For the complete documentation index, see [llms.txt](https://docs.ipcheck.ing/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.ipcheck.ing/developer/ru/reference/environment-variables.md).

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

Каждая переменная окружения, которую читает MyIP, что она делает и её значение по умолчанию.

Это авторитетный список. Каждая переменная ниже где-то читается в коде (`process.env.*` на сервере, `import.meta.env.*` в браузерном бандле). Всё, чего нет в этом списке, игнорируется.

Скопируйте `.env.example` в `.env` чтобы начать:

{% code title="shell" %}

```bash
cp .env.example .env
```

{% endcode %}

`dotenv` загружает `.env` из корня репозитория в `backend-server.js`, `frontend-server.js`, `server/logger.js`, `sentry-instrument.js`, а также `vite.config.js`.

## Сборка vs выполнение

В MyIP есть два типа переменных, и путать их — самая распространённая ошибка при развёртывании.

| Тип             | Префикс      | Читается                                                                          | Когда вступает в силу      |
| --------------- | ------------ | --------------------------------------------------------------------------------- | -------------------------- |
| Выполнение      | без префикса | процессами Node.js (`backend-server.js`, `frontend-server.js`, обработчиками API) | После перезапуска процесса |
| Во время сборки | `VITE_`      | Vite во время `pnpm run build`                                                    | Только после пересборки    |

`VITE_*` значения **встраиваются в JavaScript-бандл** Vite во время сборки. Они не читаются из окружения, когда приложение работает в браузере. Изменение `VITE_*` переменной и перезапуск сервера ничего не дадут — нужно пересобрать.

{% hint style="warning" %}
**Следствие для Docker.** Официальный `jason5ng32/myip:latest` образ запускался `pnpm run build` во время сборки образа без `.env` присутствия (`.env` указано в `.dockerignore`). Передача `-e VITE_CURL_IPV4_DOMAIN=...` этому образу не оказывает **никакого влияния на фронтенд-бандл**. Чтобы использовать переменные сборки в Docker, нужно собрать собственный образ, чтобы значения были доступны во время сборки.
{% endhint %}

## Все переменные вкратце

Нажмите на имя переменной, чтобы перейти к её полному описанию.

| Переменная                                                                | По умолчанию   | Область применения  | Обязательно                      |
| ------------------------------------------------------------------------- | -------------- | ------------------- | -------------------------------- |
| [MAXMIND\_ACCOUNT\_ID](#maxmind-account-id)                               | `""`           | Выполнение          | Функции MaxMind                  |
| [MAXMIND\_LICENSE\_KEY](#maxmind-license-key)                             | `""`           | Выполнение          | Функции MaxMind                  |
| [DATASET\_AUTO\_UPDATE](#dataset-auto-update)                             | `"true"`       | Выполнение          | —                                |
| [DATASET\_UPDATE\_CRON](#dataset-update-cron)                             | `"30 4 * * *"` | Выполнение          | —                                |
| [BULK\_LOOKUP\_SOURCE](#bulk-lookup-source)                               | `"maxmind"`    | Выполнение          | —                                |
| [BACKEND\_PORT](#backend-port)                                            | `11966`        | Выполнение          | —                                |
| [FRONTEND\_PORT](#frontend-port)                                          | `18966`        | Выполнение          | —                                |
| [ALLOWED\_DOMAINS](#allowed-domains)                                      | `""`           | Выполнение          | Развёртывания не на localhost    |
| [SECURITY\_RATE\_LIMIT](#security-rate-limit)                             | `0`            | Выполнение          | —                                |
| [SECURITY\_DELAY\_AFTER](#security-delay-after)                           | `0`            | Выполнение          | —                                |
| [SECURITY\_BLACKLIST\_LOG\_FILE\_PATH](#security-blacklist-log-file-path) | `""`           | Выполнение          | —                                |
| [LOG\_LEVEL](#log-level)                                                  | `"info"`       | Выполнение          | —                                |
| [LOG\_FORMAT](#log-format)                                                | pretty         | Выполнение          | —                                |
| [LOG\_HTTP](#log-http)                                                    | `"false"`      | Выполнение          | —                                |
| [VITE\_SENTRY\_DSN\_FRONTEND](#vite-sentry-dsn-frontend)                  | `""`           | Сборка + выполнение | —                                |
| [SENTRY\_DSN\_BACKEND](#sentry-dsn-backend)                               | `""`           | Выполнение          | —                                |
| [SENTRY\_ENVIRONMENT](#sentry-environment)                                | `"production"` | Выполнение + сборка | —                                |
| [SENTRY\_ORG](#sentry-org)                                                | `""`           | Сборка              | —                                |
| [SENTRY\_PROJECT\_FRONTEND](#sentry-project-frontend)                     | `""`           | Сборка              | —                                |
| [SENTRY\_AUTH\_TOKEN](#sentry-auth-token)                                 | `""`           | Сборка              | —                                |
| [GOOGLE\_MAP\_API\_KEY](#google-map-api-key)                              | `""`           | Выполнение          | —                                |
| [IPINFO\_API\_KEY](#ipinfo-api-key)                                       | `""`           | Выполнение          | —                                |
| [IPAPIIS\_API\_KEY](#ipapiis-api-key)                                     | `""`           | Выполнение          | —                                |
| [IP2LOCATION\_API\_KEY](#ip2location-api-key)                             | `""`           | Выполнение          | —                                |
| [CLOUDFLARE\_API\_KEY](#cloudflare-api-key)                               | `""`           | Выполнение          | Совместное использование отчётов |
| [RIPESTAT\_SOURCE\_APP](#ripestat-source-app)                             | `"myip"`       | Выполнение          | —                                |
| [CLOUDFLARE\_ACCOUNT\_ID](#cloudflare-account-id)                         | `""`           | Выполнение          | Совместное использование отчётов |
| [CLOUDFLARE\_KV\_NAMESPACE\_ID](#cloudflare-kv-namespace-id)              | `""`           | Выполнение          | Совместное использование отчётов |
| [VITE\_CURL\_IPV4\_DOMAIN](#vite-curl-ipv4-domain)                        | `""`           | Сборка              | Все три или ни одного            |
| [VITE\_CURL\_IPV6\_DOMAIN](#vite-curl-ipv6-domain)                        | `""`           | Сборка              | Все три или ни одного            |
| [VITE\_CURL\_IPV64\_DOMAIN](#vite-curl-ipv64-domain)                      | `""`           | Сборка              | Все три или ни одного            |
| [VITE\_SITE\_URL](#vite-site-url)                                         | `""`           | Сборка + выполнение | —                                |
| [VITE\_DOCS\_URL](#vite-docs-url)                                         | `""`           | Сборка              | —                                |
| [VITE\_PULSE\_BEACON\_URL](#vite-pulse-beacon-url)                        | `""`           | Сборка              | —                                |
| [VITE\_FESTIVAL\_SKINS](#vite-festival-skins)                             | `"false"`      | Сборка              | —                                |
| [VITE\_GOOGLE\_ANALYTICS\_ID](#vite-google-analytics-id)                  | `""`           | Сборка              | —                                |
| [VITE\_INVISIBILITY\_TEST\_KEY](#vite-invisibility-test-key)              | `""`           | Сборка              | —                                |
| [IPCHECKING\_API\_KEY](#ipchecking-api-key)                               | `""`           | Выполнение          | —                                |
| [IPCHECKING\_API\_ENDPOINT](#ipchecking-api-endpoint)                     | `""`           | Выполнение          | —                                |

## Обязательно — MaxMind и офлайн-датасеты

Собственный источник геолокации IP в MyIP и значки стран во всём интерфейсе обслуживаются из локальных баз данных MaxMind GeoLite2. Без них, `GET /api/maxmind` отвечает **503**, и то же самое делает `POST /api/bulk-lookup`. См. [Настройка MaxMind](/developer/ru/getting-started/maxmind-setup.md).

#### `MAXMIND_ACCOUNT_ID` <a href="#maxmind-account-id" id="maxmind-account-id"></a>

По умолчанию `""` · Выполнение · **Требуется для функций MaxMind**

ID учётной записи MaxMind. В паре с `MAXMIND_LICENSE_KEY` используется как учётные данные HTTP Basic при загрузке баз GeoLite2.

#### `MAXMIND_LICENSE_KEY` <a href="#maxmind-license-key" id="maxmind-license-key"></a>

По умолчанию `""` · Выполнение · **Требуется для функций MaxMind**

Лицензионный ключ MaxMind, создаваемый на странице «Manage License Keys» вашей учётной записи.

#### `DATASET_AUTO_UPDATE` <a href="#dataset-auto-update" id="dataset-auto-update"></a>

По умолчанию `"true"` · Выполнение · Необязательно

Включает или выключает ежедневное обновление каждого офлайн-датасета: базы MaxMind GeoLite2 (только с указанными выше учётными данными), as2org от CAIDA для названий организаций ASN, as-rel2 для графа связности ASN и счётчиков отношений, зеркало дампа PeeringDB от CAIDA для инструмента ASN Profile и реестры IEEE MAC для MAC Lookup (ключ не нужен). Только точное значение `"false"` выключает её. Обновление скачивает датасет только тогда, когда на удалённой стороне есть более новая версия. Датасет PeeringDB загружается — при запуске или при обновлении — только когда [`CLOUDFLARE_API_KEY`](#cloudflare-api-key) установлено, потому что инструмент, который его использует, скрыт без этого ключа.

#### `DATASET_UPDATE_CRON` <a href="#dataset-update-cron" id="dataset-update-cron"></a>

По умолчанию `"30 4 * * *"` · Выполнение · Необязательно

Cron-выражение для этого обновления, в локальном времени сервера — по умолчанию каждый день в 04:30. Датасеты обновляются по очереди, каждый прерывается через 30 минут. Если сервер был выключен, когда должно было выполниться обновление, пропущенные датасеты догоняются через 60 секунд после следующего запуска.

{% hint style="info" %}
`DATASET_AUTO_UPDATE` ограничивает **только ежедневное обновление**. При запуске датасет, который отсутствует, нечитаем или остался наполовину записанным из-за прерванного обновления, скачивается в любом случае (не более 5 минут на датасет), так что `"false"` свежее развёртывание никогда не остаётся без данных.
{% endhint %}

Бэкенд никогда не отказывается запускаться из-за отсутствующих баз данных. Он сразу начинает слушать запросы и скачивает их в фоне; пока загрузка не завершится, маршруты, читающие этот датасет, отвечают `503` (см. [API-эндпоинты](/developer/ru/reference/api-endpoints.md#boot-time-readiness)). Неудачная загрузка оставляет эти маршруты в деградированном состоянии, а сервер продолжает работать.

#### `BULK_LOOKUP_SOURCE` <a href="#bulk-lookup-source" id="bulk-lookup-source"></a>

По умолчанию `"maxmind"` · Выполнение · Необязательно

Источник данных, лежащий в основе инструмента Bulk IP Lookup (`POST /api/bulk-lookup`). Подходит только локальный источник данных — один запрос содержит до 200 IP, так что инструмент никогда не расходует квоту платного внешнего сервиса — и `maxmind`, локальные базы GeoLite2, указанные выше, — это единственное текущее значение. Значение обрезается по краям и не чувствительно к регистру. Неизвестное значение записывает в лог `⚠️ Неизвестное значение BULK_LOOKUP_SOURCE "…" — откат к maxmind` один раз при запуске, и инструмент продолжает работать на MaxMind. `GET /api/configs` сообщает о текущем источнике как `bulkLookupSource`, и инструмент указывает его в своём примечании.

## Порты

#### `BACKEND_PORT` <a href="#backend-port" id="backend-port"></a>

По умолчанию `11966` · Выполнение · Необязательно

Порт, к которому привязывается сервер Express API. Также используется как целевой адрес прокси для `frontend-server.js` и для `/api` прокси.

#### `FRONTEND_PORT` <a href="#frontend-port" id="frontend-port"></a>

По умолчанию `18966` · Выполнение · Необязательно

Порт, к которому привязывается сервер статических файлов/SPA в продакшене, и порт dev-сервера Vite в разработке.

Оба разбираются с помощью `parseInt(..., 10)`. В Dockerfile `EXPOSE`s `18966` только; порт бэкенда остаётся внутренним для контейнера.

## Безопасность

См. [Параметры безопасности](/developer/ru/configuration/security-options.md) и [Обратный прокси и домены](/developer/ru/getting-started/reverse-proxy-and-domains.md).

#### `ALLOWED_DOMAINS` <a href="#allowed-domains" id="allowed-domains"></a>

По умолчанию `""` · Выполнение · **Фактически обязательно для развёртываний не на localhost**

Белый список хостнеймов, разделённых запятыми, для глобальной `Referer` проверки на `/api/*`. `localhost` всегда разрешён; всё остальное должно быть перечислено здесь, иначе каждый API-вызов с вашего домена получит 403.

#### `SECURITY_RATE_LIMIT` <a href="#security-rate-limit" id="security-rate-limit"></a>

По умолчанию `0` (отключено) · Выполнение · Необязательно

Максимум `/api/*` запросов на IP клиента за **20-минутное** окно. При превышении лимита → `429 {"message":"Too Many Requests"}`. `0` или пустое значение полностью отключает ограничитель.

#### `SECURITY_DELAY_AFTER` <a href="#security-delay-after" id="security-delay-after"></a>

По умолчанию `0` (отключено) · Выполнение · Необязательно

После такого количества `/api/*` запросов с одного IP в течение **60-минутного** окна каждый следующий запрос задерживается на `попаданий × 400 мс`. `0` или пустое значение отключает его.

#### `SECURITY_BLACKLIST_LOG_FILE_PATH` <a href="#security-blacklist-log-file-path" id="security-blacklist-log-file-path"></a>

По умолчанию `""` · Выполнение · Необязательно

Необязательный локальный журнал IP с ограничением скорости, например `"logs/blacklist-ip.log"`, путь к которому вычисляется относительно корня репозитория. Пустое значение означает, что файл не записывается; предупреждение `IP ограничен по скорости` в любом случае будет записано в лог.

Примечания по поведению прямо из кода:

* **Сопоставление Referer — это точное сопоставление имени хоста.** `ALLOWED_DOMAINS=example.com` делает **не** разрешает `sub.example.com` — перечислите все хостнеймы, с которых вы обслуживаете сайт.
* Запрос без **без** `Referer` заголовка отклоняется с `403 {"error":"What are you doing?"}`. Запрос с недопустимым `Referer` получает `403 {"error":"Access denied"}`.
* Оба ограничителя **пропускают** `/api/monitoring`; туннель Sentry имеет собственный фиксированный ограничитель (600 запросов за 20 минут на IP).
* Ограничитель скорости пишет в лог только при переходе в ограниченное состояние, а не при каждом заблокированном запросе.
* `app.set('trust proxy', 1)` установлено, поэтому перед ним должен стоять ровно один доверенный прокси. IP клиента определяется по `cf-connecting-ip`, затем `x-forwarded-for` (первый элемент), затем `cf-connecting-ipv6`, затем по адресу сокета.

## Логирование

См. [Логирование](/developer/ru/configuration/logging.md).

#### `LOG_LEVEL` <a href="#log-level" id="log-level"></a>

По умолчанию `"info"` · Выполнение · Необязательно

Минимальный уровень pino: `debug` / `info` / `warn` / `error`. Сообщения более низкого уровня отбрасываются — включая их зеркалирование в Sentry.

#### `LOG_FORMAT` <a href="#log-format" id="log-format"></a>

По умолчанию pretty · Выполнение · Необязательно

`"json"` выводит по одному JSON-событию на строку для систем доставки логов. Любое другое значение (или пустое) использует цветной `pino-pretty` вывод.

#### `LOG_HTTP` <a href="#log-http" id="log-http"></a>

По умолчанию `"false"` · Выполнение · Необязательно

`"true"` подключает `pino-http` на `/api/*`: по одной строке на запрос с методом, URL и статусом. Подключается до ограничителя скорости, так что 429 тоже логируются.

## Sentry

Всё необязательно. Если DSN не задан, ни один SDK Sentry не загружается и код Sentry не попадает в бандл. См. [Мониторинг ошибок (Sentry)](/developer/ru/configuration/error-monitoring.md).

#### `VITE_SENTRY_DSN_FRONTEND` <a href="#vite-sentry-dsn-frontend" id="vite-sentry-dsn-frontend"></a>

По умолчанию `""` · Сборка **и** выполнение · Необязательно

DSN фронтенда, вшитый в бандл во время сборки. **Также читается во время выполнения** из `backend-server.js` — `POST /api/monitoring` (собственный туннель envelope) подключается только если это задано в серверном процессе.

#### `SENTRY_DSN_BACKEND` <a href="#sentry-dsn-backend" id="sentry-dsn-backend"></a>

По умолчанию `""` · Выполнение · Необязательно

DSN бэкенда, читается `sentry-instrument.js` (загружается через `node --import`) и `server/logger.js`, который зеркалирует `warn+` строки в Sentry Logs и переводит `error+` в Issues.

#### `SENTRY_ENVIRONMENT` <a href="#sentry-environment" id="sentry-environment"></a>

По умолчанию `"production"` · Выполнение + сборка · Необязательно

Тег окружения в событиях Sentry на бэкенде. Также управляет загрузкой source map: загрузки выполняются только когда это значение не задано или `production`.

#### `SENTRY_ORG` <a href="#sentry-org" id="sentry-org"></a>

По умолчанию `""` · Сборка · Необязательно

Слаг организации Sentry для загрузки source map во время сборки.

#### `SENTRY_PROJECT_FRONTEND` <a href="#sentry-project-frontend" id="sentry-project-frontend"></a>

По умолчанию `""` · Сборка · Необязательно

Слаг проекта Sentry для загрузки source map во время сборки.

#### `SENTRY_AUTH_TOKEN` <a href="#sentry-auth-token" id="sentry-auth-token"></a>

По умолчанию `""` · Сборка · Необязательно

Токен авторизации для загрузки source map во время сборки. Если не задано, Vite вообще не генерирует source map, так что они никогда не оказываются публично доступны из `dist/`Секрет во время сборки — никогда не раскрывается браузеру.

{% hint style="warning" %}
Если вы сами собираете Docker-образ с `VITE_SENTRY_DSN_FRONTEND` вшитым значением, передайте это же значение контейнеру и во время выполнения. Иначе бандл отправляет envelopes на `/api/monitoring`, маршрут, который бэкенд никогда не подключал, и каждый отчёт получает 404.
{% endhint %}

## Необязательные API-ключи

Каждый ключ открывает один источник данных IP или инструмент. `GET /api/configs` сообщает, какие из них заданы, — только как булевы значения, никогда не сами значения, — а фронтенд скрывает соответствующий интерфейс, когда ключ отсутствует. См. [Необязательные API-ключи](/developer/ru/configuration/optional-api-keys.md) и [Источники данных IP](/developer/ru/architecture/ip-data-sources.md).

#### `GOOGLE_MAP_API_KEY` <a href="#google-map-api-key" id="google-map-api-key"></a>

По умолчанию `""` · Выполнение · Необязательно

Ключ Google Static Maps, используется `/api/map`. Принимает список, разделённый запятыми; один ключ выбирается случайно для каждого запроса.

#### `IPINFO_API_KEY` <a href="#ipinfo-api-key" id="ipinfo-api-key"></a>

По умолчанию `""` · Выполнение · Необязательно

Токен ipinfo.io для `/api/ipinfo`. Поддерживается список через запятую. Эндпоинт по-прежнему работает без ключа, на анонимной скорости ipinfo.io.

#### `IPAPIIS_API_KEY` <a href="#ipapiis-api-key" id="ipapiis-api-key"></a>

По умолчанию `""` · Выполнение · Необязательно

Ключ api.ipapi.is для `/api/ipapiis`. Поддерживается список через запятую.

#### `IP2LOCATION_API_KEY` <a href="#ip2location-api-key" id="ip2location-api-key"></a>

По умолчанию `""` · Выполнение · Необязательно

Ключ ip2location.io для `/api/ip2location`. Поддерживается список через запятую.

#### `CLOUDFLARE_API_KEY` <a href="#cloudflare-api-key" id="cloudflare-api-key"></a>

По умолчанию `""` · Выполнение · **Требуется для совместного использования отчётов**

API-токен Cloudflare с двумя ролями: токен Bearer для Cloudflare Radar (каждый `?view=` у `/api/cfradar` — сводка ASN, список анонсированных префиксов, тепловая карта онлайн-активности по странам и лента сбоев используют одно и то же право чтения Radar, так что ни одному view не нужен дополнительный scope токена), и — вместе с двумя переменными в [Совместное использование отчётов](#report-sharing-cloudflare-kv) — учётные данные для хранения отчётов, которыми можно делиться, в Workers KV. Роли KV дополнительно требуется **Workers KV Storage: Edit** разрешение в токене Workers KV Storage: Edit. При его установке также появляется **Earth Online** панель в навигационной панели — только лента сбоев, если только [`VITE_PULSE_BEACON_URL`](#vite-pulse-beacon-url) не добавляет социальную часть — перечисляет **ASN Profile** инструмент среди Advanced Tools и включает загрузку датасета PeeringDB (см. [`DATASET_AUTO_UPDATE`](#dataset-auto-update)).

#### `RIPESTAT_SOURCE_APP` <a href="#ripestat-source-app" id="ripestat-source-app"></a>

По умолчанию `"myip"` · Выполнение · Необязательно

Значение, отправляемое как RIPEstat `sourceapp` параметр запроса, чтобы RIPE мог привязать трафик к вашему развёртыванию.

{% hint style="info" %}
`/api/ipapiis` и `/api/ip2location` собирают свой upstream-URL, вызывая `.split(',')` к ключу без проверки на null. Если ключ не задан, обработчик выбрасывает исключение и возвращает 500. Фронтенд никогда не вызывает их в таком состоянии, потому что `/api/configs` сообщает, что источник недоступен, и интерфейс скрывает его.
{% endhint %}

## Обмен отчётами (Cloudflare KV) <a href="#report-sharing-cloudflare-kv" id="report-sharing-cloudflare-kv"></a>

Отчёты диагностики, которыми можно поделиться, хранятся в Cloudflare Workers KV через REST API. **Все три** переменные — [`CLOUDFLARE_API_KEY`](#cloudflare-api-key) плюс две указанные ниже — должны быть заданы, иначе `POST /api/report` и `GET /api/report/:id` оба возвращают `503 {"error":"Обмен отчётами не настроен"}` и `/api/configs` отчёты `reportSharing: false`, что скрывает интерфейс обмена.

#### `CLOUDFLARE_ACCOUNT_ID` <a href="#cloudflare-account-id" id="cloudflare-account-id"></a>

По умолчанию `""` · Выполнение · **Требуется для совместного использования отчётов**

ID аккаунта Cloudflare, которому принадлежит пространство имён KV.

#### `CLOUDFLARE_KV_NAMESPACE_ID` <a href="#cloudflare-kv-namespace-id" id="cloudflare-kv-namespace-id"></a>

По умолчанию `""` · Выполнение · **Требуется для совместного использования отчётов**

пространства имён **шестнадцатеричный ID** из панели управления — не его отображаемое имя.

Ограничения отчётов, из `common/report-schema.js`: можно выбрать срок хранения 1, 3 или 7 дней (всё остальное принудительно сводится к 1 дню), а размер сохраняемого полезного содержимого ограничен 256 КБ (`413` сверх этого). Лимит JSON-тела Express — 500 КБ, намеренно выше лимита отчёта.

## Curl API

#### `VITE_CURL_IPV4_DOMAIN` <a href="#vite-curl-ipv4-domain" id="vite-curl-ipv4-domain"></a>

По умолчанию `""` · Сборка · Все три или ни одного

Имя хоста только для IPv4, указанное в диалоге Command Line API.

#### `VITE_CURL_IPV6_DOMAIN` <a href="#vite-curl-ipv6-domain" id="vite-curl-ipv6-domain"></a>

По умолчанию `""` · Сборка · Все три или ни одного

Имя хоста только для IPv6.

#### `VITE_CURL_IPV64_DOMAIN` <a href="#vite-curl-ipv64-domain" id="vite-curl-ipv64-domain"></a>

По умолчанию `""` · Сборка · Все три или ни одного

Имя хоста с поддержкой двух стеков.

{% hint style="warning" %}
В нижнем колонтитуле запись Command Line API показывается только когда **все три** не пусты — `curlDomainsHadSet` в `frontend/store.js` объединяет их через AND. Если задать одно или два, ничего не отобразится. А поскольку это `VITE_*`, они должны быть заданы на этапе сборки.
{% endhint %}

Эти переменные лишь задают имена хостов, показываемые пользователям. MyIP сам не обслуживает эти конечные точки — вы указываете DNS-записи на любой запущенный вами сервис, возвращающий IP в виде обычного текста.

## Разное

#### `VITE_SITE_URL` <a href="#vite-site-url" id="vite-site-url"></a>

По умолчанию `""` · Сборка **и** выполнение · Необязательно

Абсолютный origin вашего развёртывания. На этапе сборки он заполняет `__SITE_URL__` в `index.html` (canonical / OG-теги); если пусто, весь этот помеченный блок удаляется. Во время выполнения он становится последним сегментом upstream- `User-Agent` (`MyIP/v7.2.0/https://example.com`), так что форки идентифицируют себя для upstream API, а не притворяются ipcheck.ing. Замыкающие слэши удаляются.

#### `VITE_DOCS_URL` <a href="#vite-docs-url" id="vite-docs-url"></a>

По умолчанию `""` · Сборка · Необязательно

Origin сайта документации GitBook, который обслуживает встроенный помощник по документации, например `https://docs.ipcheck.ing`. Замыкающие слэши удаляются; скрипт встраивания загружается из `<origin>/~gitbook/embed/script.js` при первом использовании, а не при загрузке страницы.

Если пусто, помощник вообще не встраивается в bundle. Точка входа в навигации дополнительно требует каноническое развёртывание — см. [Функции, привязанные к IPCheck.ing](/developer/ru/configuration/features-tied-to-ipcheck-ing.md).

#### `VITE_PULSE_BEACON_URL` <a href="#vite-pulse-beacon-url" id="vite-pulse-beacon-url"></a>

По умолчанию `""` · Сборка · Необязательно

Полный URL сервиса агрегации, стоящего за социальной частью **Earth Online**, панели живых посетителей в навигационной панели. Замыкающие слэши удаляются; фронтенд добавляет `/beacon`, `/status` и `/stats` к нему.

Если пусто — значение по умолчанию в `.env.example` — социальные части отключены: нет редактора статусов, ленты Latest, карты посетителей, визита-маяка и раздела на странице конфиденциальности. Само окно не зависит от этой переменной: его глобальная лента сбоев работает через `GET /api/cfradar?view=outages`, поэтому пункт в навигации и <kbd>p</kbd> сочетание клавиш всё равно появляются в любом развёртывании с [`CLOUDFLARE_API_KEY`](#cloudflare-api-key). Сервис агрегации не является open-source, поэтому установка любого значения, кроме собственного совместимого бэкенда, не даёт ничего полезного. См. [Функции, привязанные к IPCheck.ing](/developer/ru/configuration/features-tied-to-ipcheck-ing.md).

#### `VITE_FESTIVAL_SKINS` <a href="#vite-festival-skins" id="vite-festival-skins"></a>

По умолчанию `"false"` · Сборка · Необязательно

Включает фестивальную тему. Только `"true"` (обрезанное по краям, без учёта регистра) включает её; любое другое значение или отсутствие настройки оставляет её выключенной — значение по умолчанию в `.env.example`. Как `VITE_*` переменная, её изменение требует пересборки.

Когда включено, тема следует временным фестивальным статусам **Earth Online** (`frontend/data/pulse-statuses.js`) и использует то же глобальное окно, что и редактор статусов панели — от момента, когда первый часовой пояс входит в день фестиваля, до момента, когда последний его покидает; для однодневного фестиваля это около 50 часов; если окна перекрываются, побеждает то, что было открыто последним. Пока фестиваль находится в своём окне, меняются ровно четыре вещи: кнопка входа Earth Online показывает эмодзи этого фестиваля вместо вращающегося глобуса, а для фестивалей, у которых есть скин (сейчас это Halloween, Christmas, New Year, Lunar New Year, Valentine's Day и день рождения сайта), — маленькое украшение размещается на логотипе, ещё одно висит под навигационной панелью, а гирлянда на всю ширину тянется по верхней части подвала. Больше на странице ничего не меняется, и для каждого фестиваля ничего делать не нужно: тема сама включается и выключается по окну. Украшения учитывают снижение анимации, а их код подгружается лениво, только пока фестиваль активен. Замена эмодзи требует, чтобы вход Earth Online вообще был виден, что занимает [`CLOUDFLARE_API_KEY`](#cloudflare-api-key) или [`VITE_PULSE_BEACON_URL`](#vite-pulse-beacon-url); украшения на логотипе, в навигации и в подвале — нет.

#### `VITE_GOOGLE_ANALYTICS_ID` <a href="#vite-google-analytics-id" id="vite-google-analytics-id"></a>

По умолчанию `""` · Сборка · Необязательно

Идентификатор измерения Google Analytics. Если пусто, `gtag.js` никогда не внедряется, а страница конфиденциальности показывает аналитику как отключённую. Тем, кто хостит самостоятельно, следует оставить его пустым.

#### `VITE_INVISIBILITY_TEST_KEY` <a href="#vite-invisibility-test-key" id="vite-invisibility-test-key"></a>

По умолчанию `""` · Сборка · Необязательно

Ключ, передаваемый как `pdKey` в сторонний скрипт определения прокси, используемый тестом Invisibility. Имеет смысл только в развёртываниях, где также есть `IPCHECKING_API_KEY`. Отсутствует в `.env.example`.

#### `IPCHECKING_API_KEY` <a href="#ipchecking-api-key" id="ipchecking-api-key"></a>

По умолчанию `""` · Выполнение · Необязательно

API-ключ для приватного companion API IPCheck.ing. Открывает доступ к `/api/ipchecking`, `/api/getuserinfo`, `PUT /api/updateuserachievement`, `/api/invisibility`, `/api/dnsleaktest/session/:token`, `/api/ipblocklist`, а также `POST /api/persona/evaluate` — без него эти маршруты возвращают `500 {"error":"Отсутствует API-ключ"}`. Он также открывает доступ к `репутации` разделу `/api/asn-profile`, который сообщает `отключено` вместо ошибки. Также отображается как `ipChecking` в `/api/configs`. Отсутствует в `.env.example`.

#### `IPCHECKING_API_ENDPOINT` <a href="#ipchecking-api-endpoint" id="ipchecking-api-endpoint"></a>

По умолчанию `""` · Выполнение · Необязательно

Базовый URL этого companion API, используемый вместе с `IPCHECKING_API_KEY`. Отсутствует в `.env.example`.

{% hint style="info" %}
`IPCHECKING_API_KEY` / `IPCHECKING_API_ENDPOINT` и `VITE_INVISIBILITY_TEST_KEY` принадлежат закрытому companion-сервису с закрытым исходным кодом. Самостоятельно размещённые форки не могут их получить, а функции, к которым они открывают доступ, скрыты на не-`ipcheck.ing` развёртываниях в любом случае. См. [Функции, привязанные к IPCheck.ing](/developer/ru/configuration/features-tied-to-ipcheck-ing.md).
{% endhint %}

## Старые псевдонимы

Две переменные были переименованы. Старые написания по-прежнему читаются как запасные варианты, чтобы существующие развёртывания не теряли функции при обновлении. Предпочитайте новые имена.

| Старое имя         | Текущее имя          | См. где                                                       |
| ------------------ | -------------------- | ------------------------------------------------------------- |
| `IPINFO_API_TOKEN` | `IPINFO_API_KEY`     | `api/ipinfo-io.js`, `api/configs.js`                          |
| `CLOUDFLARE_API`   | `CLOUDFLARE_API_KEY` | `server/cf-radar.js`, `api/share-report.js`, `api/configs.js` |

Порядок приоритета: `NEW || OLD` — если заданы оба, побеждает новое имя.

`MAXMIND_AUTO_UPDATE` и `CAIDA_AUTO_UPDATE`, переключатели для отдельных наборов данных, которые [`DATASET_AUTO_UPDATE`](#dataset-auto-update) заменили, по-прежнему учитываются, пока `DATASET_AUTO_UPDATE` не задано: `"true"` оставляет ежедневное обновление этого набора данных включённым, любое другое значение выключает его (`CAIDA_AUTO_UPDATE` охватывает as2org, as-rel и PeeringDB). Как только `DATASET_AUTO_UPDATE` задано, оно определяет поведение для каждого набора данных, а оба переключателя игнорируются.

## Минимальная рабочая конфигурация

{% code title=".env" %}

```bash
BACKEND_PORT=11966
FRONTEND_PORT=18966
ALLOWED_DOMAINS="myip.example.com"
MAXMIND_ACCOUNT_ID="your-account-id"
MAXMIND_LICENSE_KEY="your-license-key"
DATASET_AUTO_UPDATE="true"
```

{% endcode %}

Всё остальное необязательно и лишь добавляет источники данных или инструменты. См. [Быстрый старт](/developer/ru/getting-started/quickstart.md).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.ipcheck.ing/developer/ru/reference/environment-variables.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
