INOTrackбыстрота, надежность и ахуенность

Установка 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 перед трекером. Две независимые причины, обе тихие:

  1. 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).
  2. Реальный 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 переводит на английский все сообщения, вопросы и ошибки (команды и флаги те же). Без флага язык выбирается так:

  1. --lang ru|en;
  2. INOTRACK_LANG=ru|en в окружении или в --answers-file;
  3. язык прежней установки (INOTRACK_LANG в .env) — при повторном запуске; установка, сделанная до появления выбора языка (в .env нет INOTRACK_LANG), остаётся русской, какой бы ни была локаль, — на английский её переводит --lang en;
  4. локаль системы: LANG (или LC_ALL / LC_MESSAGES) вида en_* — английский;
  5. иначе русский (в том числе при 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); карты пока не принимаются.

  1. После «Купить» откроется страница заказа: адрес для оплаты (у каждого заказа свой, повторно не используется), QR-код и точная сумма в USDT. На оплату — 60 минут.
  2. Отправьте ровно эту сумму на этот адрес. Страница обновляется сама: «платёж найден» → ожидание 19 подтверждений сети (обычно около минуты) → «оплата получена».
  3. Ключ показывается на странице заказа один раз — скопируйте его сразу. Копия придёт письмом с [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-ноды».

Что происходит во время установки

  1. Предпроверки: ОС, CPU/RAM/диск, порты 80/443, docker. Мастер: ключ (или пробный период), бесплатные домены (если выбраны) и ожидание их появления в DNS, A-запись доменов.
  2. Установка Docker, если его нет.
  3. Генерация секретов (.env, права 600): пароли Postgres/ClickHouse/Redis, JWT-секрет, пароль первого администратора. Туда же — внешний адрес сервера (INOTRACK_PUBLIC_IP, см. «Внешний адрес сервера» ниже).
  4. Активация лицензии на license-server (проверка ключа; при невалидном ключе установка останавливается, если явно не передан --skip-license).
  5. docker compose up, миграции Postgres и ClickHouse, создание первого пользователя с ролью admin.
  6. Финальный 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%. При нехватке места выполните очистку до загрузки следующего образа.

Поддержка