Установка inotrack на свой сервер
Требования
Ubuntu или Debian (LTS). Установщик проверяет ОС; на другом дистрибутиве предупредит и продолжит — на ваш риск, официально такие системы не поддерживаются.
Свободные порты 80 и 443 (Caddy сам получает TLS-сертификат через Let's Encrypt).
Docker и docker compose — если их нет, установщик поставит сам.
Домен(ы), у которых A-запись уже указывает на IP этого сервера: один под панель администратора и один или несколько под приём кликов (трекер-домены). Установщик проверяет A-запись перед стартом (можно пропустить флагом, если сервер за NAT/CDN). Своих доменов нет — установщик выдаст бесплатные домены inotrack (см. ниже).
Лицензионный ключ — покупается на https://inotrack.run (см. «Как получить лицензионный ключ» ниже). Ключа нет — установщик оформит пробный период на 7 дней.
Root-доступ по SSH — скрипт ставит системные пакеты, пишет в
/opt/inotrackи правит systemd/cron.ClickHouse: стандартная установка сама поднимает свой (образ закреплён на 24.8 —
deploy/docker-compose.yml/deploy/k8s/clickhouse.yaml). Если вместо этого подключаете СВОЙ уже развёрнутый ClickHouse (INOTRACK_CH_ADDRS) — версия может быть и старше; ниже 24.8 продукт всё равно запускается (не требуется), но дневная сводка отчётов работает только от 23.12 и новее (нуженREFRESHABLE MATERIALIZED VIEW) — что именно теряется на более старой версии и почему это безопасно, см. «Обслуживание инстанса», раздел «ClickHouse: версия и дневная сводка отчётов».Redis: стандартная установка использует Redis 7 (
deploy/docker-compose.yml). Для внешнего Redis минимальная версия — 6.2: мобильные пуши используютZRANGE ... BYSCOREиXAUTOCLAIM.
Требования к серверу (нагрузка 1-10М кликов/сутки)
| Минимум | Рекомендовано (1-10М кликов/сутки) | Рост/масштабирование | |
|---|---|---|---|
| CPU | 2 vCPU | 4 vCPU | больше офферов/потоков с антифродом и синхронизацией расходов — считать по CPU, не по кликам |
| RAM | 4 ГБ | 8 ГБ | Postgres/ClickHouse/Redis/tracker-core делят один бокс — растёт вместе с диском и числом одновременных отчётов |
| Диск | 15 ГБ (с --unattended — жёсткий стоп установщика) |
160 ГБ NVMe | см. оценку роста ниже; NVMe — не опция: ClickHouse на сетевом/HDD-диске на пиках ~2k rps не успевает мержить парты |
| Сеть | — | публичный IP, 80/443 открыты | Caddy сам получает TLS через Let's Encrypt |
Средняя нагрузка ~115 rps (1-10М/сутки), пиковая — до ~2000 rps (рекламные кампании,
всплески трафика). Установщик на минимуме только предупреждает, а
не останавливает установку — кроме диска при --unattended: если свободно меньше 15 ГБ, установка
остановится (в интерактивном режиме — предупреждение).
Оценка роста диска
ClickHouse — основной потребитель места. TTL по умолчанию: clicks, funnel_steps,
landing_events, smartlink_clicks — 13 месяцев; conversions и stats_daily — 36;
blocked — 3. costs и stats_hourly хранятся без TTL, stats_daily_recent ограничена
окном refreshable MV; срок app_events пока не определён (P3 аудита ретенции).
Ручной шаблон настройки: deploy/clickhouse/ttl-policy.sql; сам по себе он не применяется. Ориентир —
~100-300 байт на клик после сжатия ClickHouse (зависит от того, сколько sub1-sub10/
UTM-полей реально заполнены и насколько они однородны — LowCardinality-колонки вроде
country/device/os сжимаются сильно лучше произвольных строк):
| Кликов/сутки | ~ГБ/сутки (ClickHouse) | ~ГБ/месяц | За 13 месяцев (TTL кликов) |
|---|---|---|---|
| 1 000 000 | 0.1-0.3 | 3-9 | 40-115 |
| 5 000 000 | 0.5-1.5 | 15-45 | 195-580 |
| 10 000 000 | 1-3 | 30-90 | 390-1170 |
На рекомендованном боксе (160 ГБ NVMe) при верхней границе трафика (10М/сутки) диска
хватает на несколько месяцев истории, не на все 13 — либо сокращайте TTL кликов
(deploy/clickhouse/ttl-policy.sql), либо заранее планируйте диск большего размера/
выносите ClickHouse на отдельный том. tracker-ctl doctor и алерт InotrackDiskSpaceLow
(deploy/prometheus/alerts.yml) предупреждают заранее, не постфактум.
Для пяти таблиц событий (clicks, conversions, funnel_steps, landing_events,
smartlink_clicks) миграция 257 включает удаление целых партов: срок может
продлеваться до конца месяца истечения TTL последних строк парта, плюс задержка
фоновой очистки. Номинальные 13/36 месяцев не являются строгим пределом удаления
персональных данных. blocked и stats_daily сохраняют построчную TTL-очистку.
Планируйте дополнительно до одной месячной партиции: для кликов 30–90 ГБ при
10М/сутки, сверх запаса на обычные мержи и резервные копии.
Оценка роста Redis
В отличие от ClickHouse, Redis здесь не архив (без TTL-политики, целиком в памяти) — все структуры на клик-пути и постбеках живут ограниченное окном/TTL время, но объём растёт С ОБЪЁМОМ ТРАФИКА, а не только с историей. Ключ на клик/конверт ≈ 150-170 Б (имя ключа + служебные поля Redis — hash table entry, TTL-метаданные и т.д.):
| Структура | Назначение | TTL/окно | ~ГБ на 1М/сутки | ~ГБ на 10М/сутки |
|---|---|---|---|---|
uniq:<...> уникальность клика |
уникальность клика в потоке | окно потока (day/campaign/forever, по умолчанию day = 24ч) | ~0.1 | ~1.1 |
uqd:* / uqc:* / uqf:* hash-бакеты уникальности |
явно INOTRACK_UNIQ_BUCKET_MODE=dual/new (дефолт off) |
TTL поля: day/campaign; forever бессрочно | зависит от наполнения/encoding | замер и выкатка |
caps:cnt:*/caps:block:* капы |
капы офферов | до конца периода окна (день/неделя/месяц/until) | пренебрежимо (на оффер×окно, не на клик) | пренебрежимо |
pb:dedup:* дедуп постбеков |
защита от повторных постбеков | фиксировано 30 дней, не масштабируется с окном потока | ~5 (на 1М КОНВЕРСИЙ/сутки) | пропорционально росту конверсий |
click:<clickid> кэш клика для матчинга постбека |
быстрый матчинг постбека с кликом | INOTRACK_CLICK_CACHE_TTL (дефолт 30 мин, ~750 Б на ключ) |
~0.02 | ~0.16 |
При диагностике памяти уникальности SCAN должен охватывать uniq:*, uqd:*,
uqc:*, uqf:*; число бакетов не равно числу посетителей (считать HLEN).
Проверять HPTTL поля, не PTTL ключа. Для команд по ключам нужен бинарно-безопасный клиент.
Самый тяжёлый и часто упускаемый пункт — pb:dedup:*: TTL 30 дней не связан с окном
уникальности потока и не сбрасывается за сутки, поэтому именно он определяет нижнюю
границу памяти Redis на established-трафике, а не ключи уникальности.
При миграции INOTRACK_POSTBACK_DEDUP_KEY_SCHEMA=dual прежние pb:* и новые pbd:* / pbc:* временно занимают память одновременно (модель ≈190+160 Б на запись). См. протокол.
⚠️ Окна campaign (90 дней по умолчанию, INOTRACK_UNIQUE_CAMPAIGN_DAYS) и forever
для уникальности клика не рекомендуются при 1М+ кликов/сутки — набор живых ключей не
ограничен сутками, при высоком трафике счёт быстро уходит в десятки ГБ. Используйте day,
если нет прямой бизнес-причины держать уникальность дольше.
install.sh сам считает REDIS_MAXMEMORY от памяти хоста (25%, минимум 1gb) и сохраняет его при переустановке, если он уже задан в .env.
Redis работает с политикой noeviction (docker-compose.yml) — при достижении лимита
он не вытесняет ключи молча, а отвечает OOM на запись (капы/дедуп нельзя терять тихо);
алерт InotrackRedisMemoryHigh (deploy/prometheus/alerts.yml) срабатывает на 80% заранее.
DNS: только DNS-режим, без прокси (Cloudflare "оранжевая тучка" и подобные)
Домены приёма кликов (TRACKER_DOMAINS) должны резолвиться напрямую в IP этого
сервера (DNS-only) — не через Cloudflare-проксирование или аналогичный CDN/WAF перед
трекером. Две независимые причины, обе тихие:
- Caddy получает TLS-сертификат через HTTP-01/TLS-ALPN challenge Let's Encrypt — challenge
должен дойти до самого Caddy; прокси перед ним либо ломает выпуск сертификата, либо
требует отдельной настройки edge-TLS на стороне прокси (вне зоны ответственности этого
установщика). Это всё ещё не решено install.sh — если вам всё же нужен именно
прокси-режим Cloudflare для трекер-доменов, придётся настраивать выпуск сертификата
отдельно (DNS-01, свой сертификат) — по аналогии с гео-hostname edge-нод
(
EDGE_GEO_TLSвdeploy/Caddyfile). - Реальный IP посетителя за прокси:
install.shсам получает актуальные диапазоны Cloudflare и записывает их вINOTRACK_CLOUDFLARE_IPS/CADDY_CLOUDFLARE_IPS(см.deploy/.env.example, раздел «доверенные прокси», иdeploy/Caddyfile) при КАЖДОЙ установке/переустановке, для central-роли — всегда, без флагов. Caddy берёт клиента изCF-Connecting-IPтолько от самих сетей Cloudflare (иначе — адрес TCP-соединения, как раньше) и отдаёт его трекеру вX-Real-IP. Оба списка install.sh перезаписывает, поэтому руками в них ничего не дописывайте — при следующем запуске правка пропадёт. Если ваш прокси НЕ Cloudflare (другой CDN/WAF), задайте его сети вINOTRACK_EXTRA_PROXY_IPS(CIDR через запятую — в.env, в окружении или в--answers-file) и перезапуститеinstall.sh: он сохраняет эту переменную между запусками и дописывает её в оба списка. Такой прокси должен передавать посетителя вCF-Connecting-IPили дописывать его вX-Forwarded-For— Caddy разбираетX-Forwarded-Forсправа налево до первого недоверенного адреса, так что подделка в левой части цепочки не проходит. Если Cloudflare сменил диапазоны, перезапуститеinstall.shповерх той же установки — он заберёт актуальный список сhttps://www.cloudflare.com/ips/.
Домен админ-панели (PANEL_DOMAIN) можно проксировать так же — но по умолчанию
рекомендация та же: DNS-only, пока не понадобилось иначе. Лимит попыток входа
(считается по e-mail и IP), INOTRACK_ADMIN_IP_ALLOWLIST и IP в
списке сессий считаются по адресу посетителя. Caddy на всех маршрутах панели
перезаписывает X-Real-IP своим {client_ip} — присланный клиентом заголовок до ядра не
доходит; запросы, которые идут через саму панель (вход, страницы, server actions), она
пересылает ядру с тем же X-Real-IP. Ядро принимает X-Real-IP только от доверенных
прокси (INOTRACK_TRUSTED_PROXIES, по умолчанию — приватные сети, где живут Caddy и
контейнер панели), прямой запрос с поддельным заголовком ничего не даёт. За Cloudflare
{client_ip} — это адрес из CF-Connecting-IP, поэтому лимит и allowlist видят
посетителя, а не Cloudflare (пока диапазоны Cloudflare в CADDY_CLOUDFLARE_IPS
актуальны).
Установка в одну команду
curl -fsSL https://get.inotrack.run/install.sh -o install.sh && bash install.sh
-o install.sh && bash install.sh вместо | bash — намеренно: пайп в curl | bash
глотает код ошибки curl (set -o pipefail в вашем шелле по умолчанию выключен), и
недоступность get.inotrack.run (сеть, опечатка в URL, временный сбой) молча запускает
bash на ПУСТОМ вводе — никакого видимого сообщения об ошибке, просто ничего не
происходит. && останавливает всё на первой же неудаче curl с его собственной ошибкой
на экране.
Или из уже скачанного репозитория:
sudo ./deploy/install.sh
Язык установщика
Установщик и tracker-ctl говорят по-русски или по-английски. По умолчанию — по-русски;
--lang en переводит на английский все сообщения, вопросы и ошибки (команды и флаги те же).
Без флага язык выбирается так:
--lang ru|en;INOTRACK_LANG=ru|enв окружении или в--answers-file;- язык прежней установки (
INOTRACK_LANGв.env) — при повторном запуске; установка, сделанная до появления выбора языка (в.envнетINOTRACK_LANG), остаётся русской, какой бы ни была локаль, — на английский её переводит--lang en; - локаль системы:
LANG(илиLC_ALL/LC_MESSAGES) видаen_*— английский; - иначе русский (в том числе при
C.UTF-8).
Выбранный язык пишется в .env (INOTRACK_LANG): на нём же говорят tracker-ctl и его
таймеры (автообновление, бэкапы). Сменить — правкой INOTRACK_LANG в .env; на один
запуск — tracker-ctl --lang en <команда> или INOTRACK_LANG=en. Письмо с пробным ключом
(--trial-email) тоже уходит на языке установки.
Что спросит установщик (интерактивный режим)
- лицензионный ключ (Enter без ключа — пробный период, см. ниже);
- использовать ли бесплатные домены inotrack — если домены не переданы флагами;
- домен админ-панели;
- трекер-домен(ы) через запятую (можно один, добавить остальные потом через
tracker-ctl domain add); - e-mail для Let's Encrypt;
- роль инстанса —
central(всё на одном сервере, дефолт) илиedge; - таймзона отчётов (дефолт
Europe/Moscow); - базовая валюта (дефолт
USD); - e-mail первого администратора.
В конце установки выводится одноразовая сводка с логином и паролем первого
администратора — сохраните её сразу, второй раз пароль не покажут (только хэш хранится
в .env).
Неинтерактивная установка (массовые развёртывания)
sudo ./deploy/install.sh --unattended \
--panel-domain panel.example.com --tracker-domains track1.example.com,track2.example.com \
--acme-email [email protected] --license-key XXXXX-XXXXX-XXXXX \
--admin-email [email protected]
Либо ответами из файла: --unattended --answers-file answers.env (формат — обычный
.env, KEY=VALUE построчно, см. deploy/.env.example).
Полный список флагов — ./deploy/install.sh --help.
Как получить лицензионный ключ
Ключ покупается сам, без переписки с менеджером: https://inotrack.run/buy/ — тариф, срок (1, 3 или 12 месяцев) и e-mail, на который оформится лицензия. Оплата — USDT в сети TRON (TRC20); карты пока не принимаются.
- После «Купить» откроется страница заказа: адрес для оплаты (у каждого заказа свой, повторно не используется), QR-код и точная сумма в USDT. На оплату — 60 минут.
- Отправьте ровно эту сумму на этот адрес. Страница обновляется сама: «платёж найден» → ожидание 19 подтверждений сети (обычно около минуты) → «оплата получена».
- Ключ показывается на странице заказа один раз — скопируйте его сразу. Копия придёт
письмом с
[email protected], и ключ всегда можно открыть в личном кабинете.
- Пришло меньше суммы — заказ ждёт доплату на тот же адрес 24 часа (сколько осталось, видно на странице заказа).
- Время на оплату вышло, а полная сумма уже отправлена — платёж засчитается, поздние платежи принимаются 7 дней. Если ещё не платили — оформите новый заказ, на старый адрес не отправляйте.
- Ссылку на заказ потеряли — ключ всё равно придёт письмом после оплаты.
Личный кабинет — https://inotrack.run/account/: без пароля, по ссылке из письма (действует 15 минут, открывается один раз). В кабинете — ваши лицензии, показ ключа и продление: продлить можно только оттуда, новый ключ при этом не выдаётся — срок текущей лицензии сдвигается на оплаченный период (от даты окончания, а если она уже прошла — от даты оплаты). За 7, 3 и 1 день до окончания придёт напоминание на почту.
Попробовать без оплаты — пробный период на 7 дней: на https://inotrack.run/trial/ или прямо из установщика (ниже).
Пробный период на 7 дней
Ключа нет — на вопросе о ключе нажмите Enter и введите e-mail (или передайте
--trial-email [email protected]). Ключ придёт письмом с [email protected] (проверьте
«Спам»); введите его, и установка продолжится как обычно. Пробный период один на
e-mail и один на сервер; ответ сервера одинаков, даже если триал на этот адрес уже был, —
тогда письма не будет, ключ ищите в прошлом письме или в кабинете на inotrack.run.
С --unattended ввести ключ некому: установщик запросит триал и остановится с
подсказкой — повторите команду с --license-key <ключ из письма> вместо --trial-email.
Бесплатные домены inotrack
Нет своего домена — ответьте «y» на вопрос о бесплатных доменах (или передайте
--free-domains). Установщик по лицензионному ключу получит у license-server два домена
вида abcd2345.lnkhop.online (зоны lnkhop.online, redirly.online, nxtclk.online,
gohopr.site, clkpath.site) — под панель и под приём кликов; A-запись license-server
ставит сам на IP, с которого пришёл запрос, то есть на этот сервер. Дальше установщик
ждёт, пока домены появятся в DNS (до 5 минут), и всё идёт как обычно: активация
лицензии, TLS от Let's Encrypt (HTTP-01).
sudo ./deploy/install.sh --unattended --free-domains \
--license-key XXXXX-XXXXX-XXXXX --acme-email [email protected]
- Домены берутся до активации лицензии: они входят в её отпечаток (fingerprint).
- Бесплатный домен выдаётся только вместо незаданного:
--panel-domain/--tracker-domains(и пул трекер-доменов из прежнего.envпри повторном запуске) имеют приоритет. Можно смешивать: свой домен панели + бесплатный трекер-домен. - Нужен публичный IPv4 у самого сервера: за NAT или только с IPv6 license-server откажет
(
ip_not_allowed) — укажите свои домены. - Повторный запуск возвращает те же домены. Число доменов ограничено тарифом
(
limit_exceeded); у отозванной или истёкшей больше 30 дней лицензии домены удаляются. - Только для роли
central; несовместимо с--skip-license.
Для уже установленного инстанса то же самое делает
tracker-ctl domain claim [--purpose clicks|panel] (по умолчанию clicks): clicks
добавляет домен в пул трекер-доменов, panel заменяет домен панели (PANEL_DOMAIN и
INOTRACK_PANEL_URL, пересоздаются контейнеры caddy и admin). Домены входят в отпечаток
лицензии, поэтому команда предупреждает об этом и сразу выполняет tracker-ctl license refresh; если отпечаток изменился, инстанс активируется заново. Ответ
instance_limit_exceeded на этом шаге значит, что прежняя активация сервера ещё занимает
слот лицензии, — освободите слот прежнего сервера в кабинете (см. FAQ) или
напишите в поддержку и повторите tracker-ctl license refresh.
Разворот edge-ноды
Edge-нода — отдельный небольшой сервер рядом с трафиком: принимает клики, раздаёт ленды, смартлинк и воронки, а события реплицирует в центральный инстанс, так что отчёты в панели остаются едиными. Проще всего поставить ноду из панели центрального инстанса: «Edge-ноды → Добавить ноду» — панель сама подключится по SSH и покажет живой лог установки. Вручную — командой из вкладки «Вручную» того же мастера:
curl -fsSL https://get.inotrack.run/install.sh | sudo INOTRACK_LICENSE_KEY=<ваш ключ> bash -s -- \
--role edge \
--central-url https://panel.example.com \
--join-token <ОДНОРАЗОВЫЙ ТОКЕН> \
--edge-domain edge-eu.example.com \
--node-name edge-eu-1
Лицензионный ключ — тот же, что у центрального инстанса; панель в команду его не
подставляет. Если не заменить <ваш ключ> на свой, установщик спросит ключ сам (скрытый
ввод). Join-токен одноразовый (действует 1 час) и показывается в панели один раз; после
регистрации ноды установщик удаляет его с диска. Панели на edge-ноде нет, Postgres и
ClickHouse там не поднимаются — только Redis, Caddy с TLS для --edge-domain и сам
трекер в роли edge. Минимум для ноды — 2 vCPU, 2 ГБ RAM, 15 ГБ
свободного места на диске: если свободно меньше, установка из панели остановится.
Режим edge готов к продакшену. Что важно знать заранее:
- Число нод ограничено лицензией. Edge-ноды входят в тарифы Business и Team, на Enterprise — без ограничений; на Starter и Growth их нет. Лимит проверяется при добавлении ноды в панели и при её регистрации. Понижение тарифа уже созданные ноды не отключает — новые просто нельзя добавить.
- Связь с центром пропала — нода работает автономно по последнему снимку
конфигурации (потоки, капы, правила фильтрации), клики и постбеки копит в дисковом спуле
(по умолчанию до 256 МБ,
INOTRACK_EDGE_SPOOL_MAX_BYTES) и досылает без дублей, когда связь вернётся. Переполнение спула — громкая ошибка в логах и метриках, а не тихая потеря. - Капы в автономном режиме — оценка. Без связи с центром нода считает капу локально по доле остатка и оценке «клики × конверсия оффера»; точная капа гарантирована, пока нода на связи, после восстановления центр досчитывает её сам.
- Превью версий лендов, отчёты и настройки — только на центральном инстансе.
Состояние нод (online / degraded / offline), отставание репликации и конфигурации видно в панели в списке edge-нод. Подробнее о гео-маршрутизации и автономной работе — на странице «Edge-ноды».
Что происходит во время установки
- Предпроверки: ОС, CPU/RAM/диск, порты 80/443, docker. Мастер: ключ (или пробный период), бесплатные домены (если выбраны) и ожидание их появления в DNS, A-запись доменов.
- Установка Docker, если его нет.
- Генерация секретов (
.env, права600): пароли Postgres/ClickHouse/Redis, JWT-секрет, пароль первого администратора. Туда же — внешний адрес сервера (INOTRACK_PUBLIC_IP, см. «Внешний адрес сервера» ниже). - Активация лицензии на license-server (проверка ключа; при невалидном ключе установка
останавливается, если явно не передан
--skip-license). docker compose up, миграции Postgres и ClickHouse, создание первого пользователя с ролью admin.- Финальный self-check и вывод сводки.
Внешний адрес сервера (INOTRACK_PUBLIC_IP)
Установщик определяет внешний IP сервера и записывает его в .env как
INOTRACK_PUBLIC_IP; docker-compose.yml передаёт значение трекеру. Трекер называет этот
адрес license-server вместе с доменами установки (поле public_ip в heartbeat) — для лицензирования и защиты от нелегального
использования; свои домены и адрес покупатель видит в кабинете.
- Как определяется. Запрос к нескольким независимым сервисам по очереди
(
api.ipify.org,ifconfig.me,icanhazip.com,checkip.amazonaws.com): сначала IPv4, затем IPv6, на каждый — до 3 секунд на соединение и 5 на ответ, на всё вместе — не больше 10 секунд (INOTRACK_PUBLIC_IP_TIMEOUT): без выхода в интернет установщик сообщает, что сервисы не ответили, и идёт дальше. Ответ, не похожий на внешний IP (страница-заглушка, приватный адрес, адрес за NAT провайдера100.64.0.0/10), пропускается. - Если не определился. Установка продолжается, в
.envостаётся пустое значение (или адрес из прежнего.envпри повторном запуске), в выводе — предупреждение. На работу трекера и лицензии это не влияет: license-server видит адрес запроса и без него. - Повторный запуск
install.shопределяет адрес заново — после переезда сервера в.envокажется новый. - Задать вручную (сервер за NAT, исходящий адрес не тот, по которому он доступен):
INOTRACK_PUBLIC_IP=203.0.113.7в окружении или в--answers-fileпри запуске установщика. Правка.envруками проживёт до следующего запускаinstall.sh; чтобы трекер подхватил значение —docker compose up -dв каталоге установки. - Не определять и не отправлять:
INOTRACK_PUBLIC_IP=noneпри запуске установщика. В.envостаётсяnone, и отказ действует при следующих запускахinstall.sh; вернуть определение —INOTRACK_PUBLIC_IP=auto(или сам адрес) при запуске.
Проверить: grep INOTRACK_PUBLIC_IP /opt/inotrack/.env — адрес, по которому сервер виден
из интернета.
Как проверить, что всё поднялось
tracker-ctl status # docker compose ps — все контейнеры должны быть healthy/running
tracker-ctl doctor # DNS/TLS домена, связь с license-server, PG/CH/Redis,
# лаг буфера кликов, очередь постбеков, свободное место
doctor — первое, что стоит запускать при любой проблеме: он печатает конкретный список
«что не так» вместо общих логов.
Быстрая ручная проверка приёма кликов (после того как в системе есть хотя бы один поток — см. «Быстрый старт»):
curl -sI "https://<трекер-домен>/go/<token>"
# ожидается 302 Location: <URL оффера> либо 204 (fallback не настроен)
Типичные проблемы
- A-запись не готова — установщик остановится на предпроверке. Либо дождитесь
распространения DNS, либо передайте
--skip-dns-check(актуально, если домен за Cloudflare/другим прокси и его A-запись указывает не напрямую на сервер). - Порт 80/443 занят — на сервере уже работает свой nginx/Apache/другой Caddy. Caddy
не сможет получить TLS-сертификат. Освободите порты или разнесите панель/приём кликов
на другой сервер (профили
core/panel, см.deploy/README.md). - Лицензионный ключ не проходит активацию — установка останавливается на шаге 4.
Проверьте, что ключ не истёк/не отозван, и что сервер видит
INOTRACK_LICENSE_URL(по умолчаниюhttps://lic.inotrack.run) — исходящий HTTPS должен быть разрешён файрволом сервера. docker compose psпоказываетunhealthyуtracker-core/workers— они ждутpostgres/clickhouseв состоянииservice_healthy; на слабом диске первый старт баз может занять больше времени, чем таймаут healthcheck. Подождите и перезапуститеtracker-ctl status, при повторении —tracker-ctl logs postgres clickhouse.--seed-demoне засеял демо-данные — демо сеется только на пустом central-инстансе (вымышленные рекламодатели, офферы, источники, потоки и 30 дней истории); на edge-ноде и на инстансе с рабочими данными флаг пропускается с предупреждением. Сбой посева не валит установку — повторить можно командойtracker-ctl seed-demo, удалить только демо —tracker-ctl seed-demo --purge.- Дубль/расхождение
INOTRACK_PUBLIC_URLв.env— известная точка ошибки: если это значение указывает на домен панели, а не на трекер-домен, генерируемые трекинговые ссылки будут вести не туда, и ни один клик не дойдёт при формально «зелёной» установке. После установки сверьтеINOTRACK_PUBLIC_URLв/opt/inotrack/.envс реальным трекер-доменом.
Дальше
Первые шаги в свежепоставленном трекере — «Быстрый старт».
Обслуживание инстанса (tracker-ctl, обновления, бэкапы) — «Обслуживание инстанса».
Очистка образов Docker и место на диске
После успешного обновления inotrack сохраняет текущий и предыдущий образы для отката. Образы любых контейнеров, включая остановленные, сохраняются. Ошибка очистки выводится как предупреждение и не отменяет обновление.
Предпросмотр: tracker-ctl images prune --dry-run. Очистка: tracker-ctl images prune. Флаг --keep N задаёт число сохраняемых версий на репозиторий (по умолчанию 2). Очистка выбирает только репозитории inotrack и настроенные зеркала. Удаление dangling-образов ограничено меткой run.inotrack.managed=true, чтобы не затронуть другие сервисы.
tracker-ctl doctor проверяет свободное место на файловой системе Docker: WARN при менее 20%, FAIL при менее 10%. При нехватке места выполните очистку до загрузки следующего образа.