Перейти к содержанию

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

Живут в /opt/minik/.env. После правки перезапустите трекер:

cd /opt/minik && docker compose up -d server

Большинство значений установщик проставляет сам — руками трогают единицы.

Не всякая переменная доезжает из .env

Установщик генерирует docker-compose.yml с фиксированным списком переменных сервера, и .env подставляется только в него. Переменная, которой в этом списке нет, до контейнера не доедет — её нужно дописать в environment: сервиса server. Из .env работают: MINIK_IMAGE, MINIK_VERSION, PUBLIC_BASE_URL, ADMIN_EMAIL, ADMIN_PASSWORD, JWT_SECRET, TRACKER_SECRET_KEY, POSTGRES_PASSWORD, CLICKHOUSE_PASSWORD, CENTRIFUGO_*, GEOIP_*, PHP_FPM_ADDR, INTERNAL_DENY_CIDR, HTTP_ACCESS_LOG, PPROF, EVENTQ_MAXLEN, REDIS_MAXMEMORY, MINIK_LICENSE_KEY, LICENSE_SERVER_URL, LICENSE_CHECK_INTERVAL. Отдельно ACME_EMAIL: её читает сам установщик и кладёт в конфиг Caddy. Правки самого docker-compose.yml не переживают обновление — повторите их после update.

Базовое

Переменная По умолчанию Назначение
DATABASE_URL postgres://minik:minik@localhost:5432/minik?sslmode=disable подключение к PostgreSQL; установщик собирает его из POSTGRES_PASSWORD
CLICKHOUSE_DSN clickhouse://default:@localhost:9000/default подключение к ClickHouse, пароль из CLICKHOUSE_PASSWORD
REDIS_URL подключение к Redis
LISTEN_ADDR :8080 адрес прослушивания
PUBLIC_BASE_URL http://localhost:8080 (в compose — http://localhost) публичный адрес установки: из него строятся ссылки кампаний и входящий postback-URL. Незаданное значение не вызывает ошибку — ссылки молча собираются с localhost
WEB_DIST /app/web каталог собранной панели внутри образа
ADMIN_EMAIL, ADMIN_PASSWORD admin@local / admin учётка администратора, создаётся один раз при первом запуске

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

Пустой REDIS_URL — только для разработки

Без Redis очередь событий живёт в памяти процесса и теряется при перезапуске. Установщик всегда поднимает Redis и прописывает адрес.

Секреты

Переменная Назначение
JWT_SECRET подпись токенов сессий; короче 16 байт — сервер не стартует
TRACKER_SECRET_KEY ключ шифрования хранимых секретов (токен Telegram-бота, ключи интеграций, приватные ключи ACME, семена 2FA) и подписи токенов браузерных конверсий
POSTGRES_PASSWORD, CLICKHOUSE_PASSWORD пароли баз; попадают в DSN сервера
CENTRIFUGO_API_KEY, CENTRIFUGO_HMAC_SECRET доступ к брокеру realtime и подпись его токенов
CENTRIFUGO_API_URL, CENTRIFUGO_PUBLIC_WS внутренний адрес API брокера и публичный websocket-адрес для браузера
MINIK_DEV 1 понижает проверку секретов ниже до предупреждения — только для локальной разработки

Установщик генерирует эти значения случайными при первой установке и хранит в .env с правами 600.

Сервер не стартует на дефолтных секретах

Если JWT_SECRET, TRACKER_SECRET_KEY или непустой CENTRIFUGO_HMAC_SECRET содержат подстроку change-me — то есть остались значениями из репозитория, — процесс завершается с ошибкой. Эти значения публичны: с ними подделывается админ-сессия и расшифровывается всё хранимое. Задайте случайные; MINIK_DEV=1 снимает проверку, но такую установку нельзя выставлять в интернет.

Не меняйте секреты на живой установке

Смена JWT_SECRET разлогинит всех. Смена TRACKER_SECRET_KEY сделает нечитаемыми зашифрованные значения — например токен Telegram-бота.

Реальный IP и CDN

Переменная По умолчанию Назначение
TRUSTED_PROXIES loopback и приватные сети: 127.0.0.0/8, ::1/128, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, fc00::/7 список CIDR и адресов, чьему X-Forwarded-For можно верить
TRUST_EDGE_HEADERS выключено 1 — доверять заголовкам CDN CF-Connecting-IP и X-Country

X-Forwarded-For читается справа налево: клиентом считается первый адрес, который не входит в TRUSTED_PROXIES. Если запрос пришёл не от доверенного прокси, берётся реальный TCP-адрес. X-Real-IP не учитывается вовсе — его подделал бы любой посетитель.

За Cloudflare нужен явный флаг

Пока TRUST_EDGE_HEADERS выключен, CF-Connecting-IP и X-Country отбрасываются, и в отчётах окажется гео edge-узла CDN. Включайте флаг только когда CDN действительно стоит перед трекером: обычный обратный прокси передаёт эти заголовки от посетителя как есть, и включённый флаг отдаёт ему управление гео, уникальностью и фильтрами по IP. Второй рабочий вариант — перечислить публичные подсети CDN в TRUSTED_PROXIES.

GeoIP

Переменная Назначение
GEOIP_MMDB путь к GeoLite2-City.mmdb — страна, регион, город
GEOIP_ASN_MMDB GeoLite2-ASN.mmdb — нужен для детекта дата-центров по ASN
GEOIP_ISP_MMDB GeoIP2-ISP.mmdb — поле ISP и фильтр мобильного оператора

Без баз гео остаётся пустым, а фильтры по стране не работают. Базы MaxMind скачиваются бесплатно после регистрации.

Файлы кладут в /opt/minik/data/geoip/, а в переменной указывают путь внутри контейнера — этот каталог примонтирован туда как /data/geoip:

GEOIP_MMDB=/data/geoip/GeoLite2-City.mmdb

Валюты

Переменная По умолчанию Назначение
FX_RATES_URL https://open.er-api.com/v6/latest источник курсов: открытый ExchangeRate-API без ключа, ~160 валют
FX_REFRESH_INTERVAL 6h как часто обновлять курсы

Курсы нужны, чтобы cost и revenue в разных валютах сводились в базовую валюту воркспейса.

Антифрод и боты

Переменная По умолчанию Назначение
BOT_INTEL_ENABLED true общий выключатель IP-интеллекта и базы ботов
IPINTEL_REFRESH 24h периодичность обновления списков
IPINTEL_DATACENTER_ASN_SOURCE публичный список ASN-денилист хостингов
IPINTEL_DATACENTER_CIDR_SOURCE публичный список CIDR-листы дата-центров
IPINTEL_VPN_CIDR_SOURCE публичный список CIDR-листы VPN
IPINTEL_PROXY_CIDR_SOURCE выключен список proxy-подсетей
BOT_UA_LIST_SOURCE публичный список база сигнатур User-Agent ботов
TOR_LIST_URL список Tor Project список exit-нод Tor

Каждый источник — либо HTTPS-URL, либо путь к локальному файлу (оффлайн-режим). Пусто — публичное значение по умолчанию, off — отключить сигнал.

HTTPS

Переменная По умолчанию Назначение
ACME_EMAIL пусто почта аккаунта Let's Encrypt (только письма об истечении). Установщик записывает её в конфиг Caddy — сертификаты для трекинг-доменов выпускает edge
ACME_DIRECTORY боевой эндпоинт Let's Encrypt эндпоинт ACME для встроенного клиента. Для тестов — staging Let's Encrypt: без лимитов, но сертификаты недоверенные
TLS_WARM_ADDR caddy:443 адрес edge для прогрева сертификата сразу после добавления домена; пусто — прогрев выключен

PHP

Переменная По умолчанию Назначение
PHP_FPM_ADDR пусто (PHP выключен) адрес PHP-FPM. Флаг установщика --with-php ставит tcp://php:9000
LANDINGS_DIR /data/landings в контейнере каталог с файлами лендингов и скриптами потоков
INTERNAL_DENY_CIDR пусто подсеть, из которой запрещены служебные /metrics и /tls-ask. --with-php ставит 10.89.71.0/24 — сеть контейнера PHP

INTERNAL_DENY_CIDR закрывает путь «PHP арендатора → сервер»: без него скрипт на лендинге мог бы прочитать метрики всей установки и перечислить домены чужих воркспейсов. Меняете подсеть PHP — поменяйте и эту переменную.

Конверсии из браузера

Переменная По умолчанию Назначение
MINIK_CONV_TOKEN_ENFORCE выключено отклонять конверсии /action и /px.gif без валидного токена клика

Пока выключено, конверсия с плохим или отсутствующим токеном записывается, но не уходит наружу — ни в CAPI, ни в вебхуки, ни в исходящий S2S. Включайте, когда все лендинги обновлены до SDK, отдающего токен: счётчик minik_conversion_token_invalid_total в метриках должен стоять на нуле.

Производительность и очереди

Переменная По умолчанию Назначение
HTTP_ACCESS_LOG 1 пер-запросный HTTP-лог. 0 для нагрузочных тестов и высокого RPS — строка на каждый клик стоит реальной латентности
EVENTQ_MAXLEN 200000 потолок очереди кликов в Redis; очереди трейсов, конверсий и постбэков — по трети от него
REDIS_MAXMEMORY 768mb лимит памяти Redis
PPROF выключено 1 включает профилировщик на /debug/pprof; наружу edge отдаёт 404

EVENTQ_MAXLEN и REDIS_MAXMEMORY меняют парой

Очереди не вытесняются по TTL. Если их потолок перерастёт лимит памяти, Redis выбросит полезный кеш и начнёт отказывать в записи. Ориентир — примерно 1,3 КБ на клик и 1,8 КБ на трейс.

Лицензия

Переменная По умолчанию Назначение
MINIK_LICENSE_KEY ключ лицензии; его же задаёт флаг установщика --license-key
LICENSE_SERVER_URL https://license.minik.sh/api/v1/license адрес сервера лицензий
LICENSE_CHECK_INTERVAL 1h как часто перепроверять лицензию

Состояние лицензии хранится в PostgreSQL и видно в Настройках → Лицензия — вкладка доступна владельцу инсталляции. Подробности — в установке.