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

Установка

Трекер ставится одной командой на чистый сервер. Установщик генерирует docker-compose.yml и .env в /opt/minik, тянет образ и поднимает весь стек: трекер, PostgreSQL, ClickHouse, Redis, Centrifugo, Caddy и PHP-FPM.

Требования

Что Минимум
ОС Linux с Docker (Ubuntu 22.04+ / Debian 12+ — проверенный вариант)
CPU / RAM 2 vCPU / 4 ГБ для старта; ClickHouse любит память
Диск 20 ГБ + запас под клики
Доступ root или sudo
Домен A-запись на IP сервера — нужна для HTTPS
Лицензионный ключ обязателен, без него установщик не начнёт работу
Исходящая сеть ghcr.io (образы) и сервер лицензий (активация)

Docker установщик поставит сам через get.docker.com, если его нет. Если Docker уже стоит, а плагина Compose v2 нет — установка прервётся с ошибкой: плагин ставится руками.

Заодно создаётся swap-файл размером с оперативную память (максимум 4 ГБ) с vm.swappiness=1 — это аварийный резерв от OOM, а не рабочая память. Если swap на сервере уже включён или на диске мало места, шаг пропускается. Отключить — --no-swap.

Лицензионный ключ

Ключ обязателен: без --license-key (или переменной окружения MINIK_LICENSE_KEY) установщик останавливается и ничего не разворачивает. Формат — XXXX-XXXX-XXXX-XXXX, пробный ключ выдаётся на license.minik.sh. Единственное исключение — --dry-run: он только пишет конфиги и ключа не требует.

Активация проходит онлайн: трекер сам обращается к серверу лицензий при старте и дальше перепроверяет ключ в фоне примерно раз в час. Состояние — статус, владелец лицензии, срок и время последней проверки — видно в Настройки → Лицензия; вкладка доступна только владельцу инсталляции. Там же можно ввести другой ключ (Активировать) или запросить внеочередную проверку (Проверить сейчас).

Лицензия ограничивает только админку

Приём кликов, редиректы, постбэки и конверсии работают всегда, независимо от состояния лицензии. Кратковременная недоступность сервера лицензий тоже ничего не блокирует: панель закрывается только на подтверждённый ответ «ключ недействителен» (истёк, отменён, отозван, не найден, уже активирован) — и только когда истечёт выданный сервером лицензий грейс-период. А вот инсталляция вообще без ключа админку не откроет.

Установка с доменом (рекомендуется)

Сначала направьте домен на сервер: A-запись track.example.com → IP сервера. Затем:

curl -fsSL https://get.minik.sh/install.sh | bash -s install \
  --domain track.example.com --email you@example.com \
  --license-key XXXX-XXXX-XXXX-XXXX

Caddy выпустит сертификат Let's Encrypt автоматически — ничего настраивать не нужно. --email — адрес аккаунта ACME, на него приходят письма об истечении сертификатов.

Домен из --domain становится публичным адресом панели и адресом realtime-соединения; оба запоминаются в .env.

После установки скрипт напечатает адрес панели, логин и сгенерированный пароль администратора. Смените пароль сразу после первого входа.

Установка без домена

Для теста на голом IP:

curl -fsSL https://get.minik.sh/install.sh | bash -s install \
  --license-key XXXX-XXXX-XXXX-XXXX

Публичным адресом станет http://<IP сервера>; IP определяется автоматически, переопределяется флагом --host.

HTTP-режим годится только для проверки

Facebook Ads, Google Ads и TikTok Ads отклоняют tracking-URL без HTTPS. Push-сети обычно принимают. Для боевого трафика ставьте с --domain.

Команды установщика

Команда Что делает
install установка, команда по умолчанию
update обновить образ и переприменить конфигурацию — см. Обновление
logs живые логи всего стека (--tail=100)
down остановить контейнеры, данные не трогать
uninstall удалить контейнеры, данные не трогать

-h / --help печатает встроенную справку.

Флаги установщика

Флаг Что делает
--license-key K лицензионный ключ; альтернатива — переменная MINIK_LICENSE_KEY
--domain D публичный домен панели → Caddy и авто-HTTPS
--email E e-mail аккаунта ACME (рекомендуется вместе с --domain)
--host H публичный хост/IP, если домена нет (обычно определяется сам)
--admin-email E логин первого администратора (по умолчанию admin@local)
--version V тег образа (по умолчанию latest)
--dir D каталог установки (по умолчанию /opt/minik)
--with-php / --no-php включить или выключить PHP-FPM (включён по умолчанию)
--no-swap не создавать swap-файл
--dry-run записать конфиги, но не трогать Docker

Обе формы записи равнозначны: --domain track.example.com и --domain=track.example.com.

PHP-рантайм

PHP-FPM включён по умолчанию и нужен для двух вещей:

Если ни то, ни другое не нужно — ставьте с --no-php, это экономит память. Включить позже: update --with-php, выключить: update --no-php.

PHP работает в отдельном контейнере на изолированной сети, без доступа к Postgres, ClickHouse и Redis, с урезанным набором функций и таймаутом запроса.

Первый вход

  1. Откройте адрес, который напечатал установщик.
  2. Войдите под админом (по умолчанию admin@local) с паролем из вывода скрипта.
  3. Смените пароль: Настройки → Профиль.
  4. Включите 2FA — панель управляет живым трафиком и деньгами.
  5. Проверьте Настройки → Лицензия: статус должен быть «Активна».

Дальше — первая кампания.

Что установщик оставил на сервере

/opt/minik/
  docker-compose.yml     # стек целиком
  .env                   # секреты, домен, версия образа, лицензионный ключ (chmod 600)
  Caddyfile              # конфиг edge-прокси
  deploy/clickhouse/     # низкоресурсный конфиг ClickHouse
  deploy/php/            # конфиг PHP-FPM (если PHP включён)
  data/pg/               # PostgreSQL — вся конфигурация трекера
  data/ch/               # ClickHouse — клики и конверсии
  data/redis/            # очереди и кэш
  data/landings/         # файлы лендингов
  data/geoip/            # базы MaxMind, кладутся вручную
  data/caddy/            # сертификаты и состояние edge-прокси
  data/caddy-config/

Ручные правки docker-compose.yml не переживут update

Файл перезаписывается из шаблона при каждом update. Большинство параметров задаётся рядом, в .env; переменную, которой нет в списке compose, придётся дописывать в environment: сервиса server и повторять правку после каждого update — список в Переменных окружения.

Всё управление — обычный docker compose в этом каталоге:

docker compose -f /opt/minik/docker-compose.yml ps
docker compose -f /opt/minik/docker-compose.yml logs -f server

Домены для трафика

Домен из --domain — это адрес панели. Домены, на которые льётся трафик, добавляются в самой панели: A-запись на этот же сервер, а сертификат выпускается на первом запросе. Подробнее — Домены.

GeoIP

Гео, ASN и ISP определяются по базам MaxMind — они не входят в поставку. Положите файл в /opt/minik/data/geoip/ и пропишите путь в .env:

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

Затем запустите update, чтобы контейнер подхватил переменную. Остальные базы — в разделе GeoIP.

Обновление и удаление — в разделе Обновление.