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

Диагностика

Сначала — общее правило: у трекера есть строка на каждый клик и на каждый постбэк, а для разбора конкретного случая — пошаговый Traffic log. Почти любой вопрос «почему так» решается чтением журналов, а не догадками.

Traffic log по умолчанию выключен

Пошаговый трейс весит больше самого клика, поэтому включается вручную: Настройки → Валюты → Traffic log — сэмплирование, процент кликов 0–100. Включите на время разбора и верните в 0. На статистику кликов и конверсий это не влияет.

Клик не редиректит

Проверяйте по порядку:

  1. Кампания активна? На паузе или в архиве трекер отвечает 404, и клик никуда не записывается — если журнал пуст, а трафик идёт, причина обычно здесь или в опечатке в алиасе ссылки. Проверьте заодно авто-правила: возможно, кампанию остановило правило.
  2. Режим ротации кампании не disabled — в этом режиме кампания всегда отвечает 204.
  3. Есть подходящий поток? Клик, не попавший ни в один regular, уходит в 204, если нет default-потока. Заведите default без фильтров.
  4. У потока есть назначение? Активному потоку нужен лендинг, оффер или redirect URL.
  5. Журнал кликов, фильтр «исход» → «только отказы». Отказной клик виден с пометкой no_match (ни один поток не совпал) или do_nothing (клик намеренно остановлен потоком-заглушкой).
  6. Traffic log — там видно, какое условие отсекло клик.

Клик уходит не в тот поток

Откройте Traffic log и прочитайте трейс. Типичные причины:

  • у forced-потока совпали фильтры — он выбирается вперёд ротации;
  • при режиме without_rotation побеждает первый подходящий поток по позиции — у перехватчика она меньше, чем у ожидаемого;
  • у кампании включено залипание посетителя: вернувшийся уходит туда же, куда в первый раз — в трейсе это причина binding_replay;
  • фильтр написан строкой, а значение приходит в другом регистре — используйте glob или regex.

Конверсии не приходят

Что видно Причина
Журнал постбэков пуст партнёрка не отправляет: проверьте URL в её кабинете
401 Incorrect postback key в адресе нет ключа воркспейса или ключ не тот. Старый адрес без ключа (/postback?…) отвечает именно так
400 missing required parameter: subid/clickid в ссылке оффера нет макроса click_id
400 unparseable payout сумма приходит как $10.50 или 10.50 USD
503 conversion not stored, retry, а строки в журнале нет click_id не привязан ни к одной кампании: постбэк обогнал сам клик, клик слишком старый или click_id не от этой инсталляции. Ответ 5xx — намеренный: партнёрка повторит

401 приходит и тогда, когда ключ верный, но click_id принадлежит чужому воркспейсу: ответ намеренно неотличим, чтобы по нему нельзя было перебирать чужие клики.

Ручная проверка — возьмите click_id из журнала кликов:

curl -i "https://tr.example.com/КЛЮЧ/postback?subid=CLICK_ID&status=lead&payout=1.5"

Готовый адрес с ключом лежит в Настройки → Интеграции → Postback URL (входящий). Успех — 200 и ok в теле; подробности в Приёме конверсий.

Источник не видит конверсии

  • Заполнен ли S2S postback URL в кампании? Если нет — берётся шаблон источника трафика, а он тоже может быть пустым.
  • Ограничен ли список статусов в кампании? Конверсия со статусом вне списка наружу не уходит.
  • Что в журнале постбэков в направлении «исходящие» — какой код ответа?
  • Не лежат ли доставки в DLQ (Настройки → DLQ)? Оттуда их можно переотправить.
  • Конверсия пришла из браузера (/action, /px.gif) без валидного токена клика? Такая конверсия записывается, но наружу — в S2S, вебхуки и CAPI — не уходит: см. MINIK_CONV_TOKEN_ENFORCE в переменных окружения.
  • Если используете CAPI, смотрите лог доставок интеграции, а не постбэков.

Гео определяется неверно

  • Нужны базы MaxMind: GEOIP_MMDB для гео, GEOIP_ASN_MMDB для детекта дата-центров, GEOIP_ISP_MMDB для ISP и мобильных операторов (переменные). Без них гео будет пустым. Путь указывают внутри контейнера — /data/geoip/….
  • Если домен за Cloudflare в proxy-режиме, вместо IP посетителя в отчёты попадёт IP edge-узла CDN, пока не выставлен TRUST_EDGE_HEADERS=1 — только с ним трекер читает CF-Connecting-IP (реальный IP и CDN).
  • Если перед трекером стоит свой балансировщик с публичным адресом, добавьте его подсети в TRUSTED_PROXIES — иначе клиентом будет считаться он.
  • В Click API IP нужно передавать явно, иначе посчитается IP вашего сервера.

Не выпускается SSL

  • A-запись домена смотрит на IP этого сервера?
  • Порты 80 и 443 открыты снаружи?
  • Домен добавлен в разделе Домены? Сертификаты выпускаются только для известных трекеру доменов.
  • Смотрите логи: docker compose logs caddy.

Панель не открывается

cd /opt/minik
docker compose ps          # все контейнеры Up?
docker compose logs server --tail=100

Частая причина на маленьких серверах — нехватка памяти: ClickHouse прожорлив. Установщик создаёт swap как страховку, но лучше добавить RAM.

Если контейнер server перезапускается по кругу, прочитайте первые строки его лога:

  • refusing to start: insecure built-in default crypto secret(s) in use — в .env остались дефолтные JWT_SECRET или TRACKER_SECRET_KEY, задайте случайные (секреты);
  • ошибки подключения к PostgreSQL или ClickHouse — смотрите их контейнеры.

Отдельный случай: контейнеры Up, панель открывается, но вместо интерфейса — экран о лицензии. Клики, редиректы и постбэки при этом работают; что делать — в установке.

Сброс пароля администратора

Если потеряны и пароль, и второй фактор — восстановление выполняется на сервере по SSH:

docker compose -f /opt/minik/docker-compose.yml exec server /app/server reset-password admin@local

Команда печатает новый случайный пароль и снимает 2FA. Задать пароль аргументом нельзя — он остался бы в истории команд и в списке процессов. Трогается только PostgreSQL, поэтому панель может быть недоступна. Если сам контейнер не запущен, exec не сработает — запустите разовый:

docker compose -f /opt/minik/docker-compose.yml run --rm server reset-password admin@local

Раздел «Система»

Первое место, куда стоит смотреть, если «всё стало странно»:

  • PostgreSQL, ClickHouse и Redis — отвечают ли и с какой задержкой;
  • сервер — версия, аптайм, память процесса;
  • системный лог — предупреждения и ошибки с фильтрами по уровню и источнику: потерянные события очереди (queue), проблемы с курсами валют (fx). Записи о лицензии тоже попадают в лог, но отдельного пункта в выпадающем списке источников для них нет — ищите их в общем перечне.

Метрики Prometheus — на /metrics. Наружу edge отдаёт на этот путь 404: собирать их можно только изнутри, из compose-сети (например, контейнером Prometheus или Grafana Agent рядом).

Клики теряются под нагрузкой

При штатной работе клики не теряются. Если счётчики расходятся:

  • загляните в системный лог раздела Система, источник queue: там видны потерянные события и пересозданные группы Redis;
  • в метриках смотрите minik_eventq_lost_total, minik_chwriter_enqueue_dropped_total, minik_chwriter_flush_lost_total, minik_track_bg_dropped_total — при штатной работе они стоят на нуле;
  • посмотрите, хватает ли ClickHouse памяти и диска, а Redis — памяти (REDIS_MAXMEMORY, парой с EVENTQ_MAXLEN);
  • при нагрузочном тестировании выключайте пер-запросный HTTP-лог (HTTP_ACCESS_LOG=0) — он сам по себе стоит латентности.