Установка¶
Трекер ставится одной командой на чистый сервер. Установщик генерирует
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:
Публичным адресом станет 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 включён по умолчанию и нужен для двух вещей:
- исполнение
.php-файлов в локальных лендингах; - action_script — PHP-скрипт на потоке, который сам решает, куда отправить клик.
Если ни то, ни другое не нужно — ставьте с --no-php, это экономит память.
Включить позже: update --with-php, выключить: update --no-php.
PHP работает в отдельном контейнере на изолированной сети, без доступа к Postgres, ClickHouse и Redis, с урезанным набором функций и таймаутом запроса.
Первый вход¶
- Откройте адрес, который напечатал установщик.
- Войдите под админом (по умолчанию
admin@local) с паролем из вывода скрипта. - Смените пароль: Настройки → Профиль.
- Включите 2FA — панель управляет живым трафиком и деньгами.
- Проверьте Настройки → Лицензия: статус должен быть «Активна».
Дальше — первая кампания.
Что установщик оставил на сервере¶
/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:
Затем запустите update, чтобы контейнер подхватил переменную. Остальные базы —
в разделе GeoIP.
Обновление и удаление — в разделе Обновление.