Подготовьте отдельный HTTPS-хост
Нужны PHP 8.1 или новее с PDO_SQLite, доступ к PHP CLI, ежедневный cron и возможность направить веб-корень на каталог public/. Если хостинг этого не позволяет, сначала уточните условия у поддержки.
В примерах сайт находится на https://example.ru, панель на https://stats.example.ru, пакет в /srv/dulesov-analytics. Это адреса и путь для объяснения; замените их своими. Одна установка обслуживает один сайт.
Начните с тестового окружения. Независимый аудит безопасности и нагрузочное испытание ещё не проведены. Размещение базы, журналов и резервных копий, политика и правовое основание обработки требуют отдельной проверки владельцем.
Откройте по HTTP только public/
- Распакуйте пакет целиком вне публичного каталога основного сайта, например в
/srv/dulesov-analytics. Не переносите весь архив вpublic_html. - Создайте отдельный HTTPS-хост. Его
DocumentRootв Apache илиrootв Nginx должен указывать только на/srv/dulesov-analytics/public. - Настройте обработку PHP средствами своего хостинга. Для Nginx в PHP-location нужна проверка существования файла
try_files $uri =404;. Закройте скрытые файлы, листинг каталогов и любые alias кapp/,bin/иdata/.
/srv/dulesov-analytics/
├── app/ приватный код
├── bin/ только CLI
├── config.php приватная конфигурация после установки
├── data/ приватная база и защитные счётчики
└── public/ единственный веб-кореньЗагрузка всего пакета в общедоступный каталог может раскрыть конфигурацию и базу при ошибке настройки сервера. Ограничение веб-корня является обязательным этапом установки.
Запустите установщик от пользователя приложения
Используйте отдельного системного пользователя, под которым работает PHP этого приложения. Имя и пути зависят от хостинга; команды ниже выполняются после выбора этого пользователя и перехода в распакованный каталог.
cd /srv/dulesov-analytics
php -v
php -m
php bin/install.phpПроверьте наличие PDO и pdo_sqlite в выводе модулей. CLI и PHP-FPM могут использовать разные версии и конфигурации; расширение нужно в обоих окружениях.
- Введите origin сайта, например
https://example.ru, строго без пути и завершающего слеша. - Введите URL панели
https://stats.example.ruи существующую страницу политики на origin отслеживаемого сайта. - Задайте уникальный пароль длиной 16–72 байта. Ввод отображается терминалом: отключите запись сессии и не отправляйте её другим людям.
Установщик создаёт приватные config.php и data/analytics.sqlite, собственный секрет и хеш пароля. Существующую конфигурацию он не перезаписывает. Общего стандартного пароля и веб-установщика нет.
chmod 600 /srv/dulesov-analytics/config.php
chmod 700 /srv/dulesov-analytics/data
chmod 600 /srv/dulesov-analytics/data/analytics.sqliteЭти права подходят, когда PHP и файлы принадлежат одному пользователю. PHP-FPM нужны чтение конфигурации и кода, запись в каталог data/ для SQLite/WAL. Если владелец отличается, сначала настройте его вместе с администратором хостинга. chmod 777 для решения ошибок доступа использовать нельзя.
Задайте разрешённые метки
В приватном config.php измените поля по образцу config.example.php. Сохраните уже созданные secret и password_hash. Ниже показан фрагмент существующего массива, который нужно адаптировать под свои страницы.
'origins' => ['https://example.ru'],
'base_url' => 'https://stats.example.ru',
'policy_url' => 'https://example.ru/privacy/',
'paths' => ['/', '/contacts/', '/blog/*'],
'events' => ['contact_click', 'lead_sent'],
'campaigns' => ['autumn_2026'],
'mediums' => ['cpc', 'ppc', 'paid_social', 'social', 'messenger', 'email', 'organic', 'referral'],
'contents' => ['post_15', 'banner_a'],
'capture_terms' => false,
'retention' => 90,Домены с www и без него считаются разными origin. Пути должны совпадать с опубликованными адресами, включая завершающий слеш. Маска /blog/* объединяет адреса в одну группу. Полные query и hash не сохраняются.
Если HTTPS завершается на доверенном прокси, параметр secure_proxy => true подходит только при закрытом прямом доступе к PHP. Произвольным proxy-заголовкам приложение не доверяет.
Сбор фраз первоначально выключен. Для его включения проверьте политику и допустимый состав данных; автоматический фильтр не гарантирует удаления всех персональных данных из текста.
Подключите счётчик и согласие
Откройте панель через HTTPS, войдите и скопируйте сниппет из раздела "Подключение счётчика и события". Указанные в нём пути и рекламные списки должны совпадать с приватной конфигурацией сервера.
Для готового баннера добавьте следующие теги в HTML в указанном порядке, заменив адреса и конфигурацию. defer сохраняет порядок выполнения внешних скриптов и позволяет дождаться разметки страницы.
<link rel="stylesheet" href="https://stats.example.ru/consent.css">
<script defer src="https://stats.example.ru/tracker.js" referrerpolicy="no-referrer"
data-config='{"endpoint":"https://stats.example.ru/collect.php","paths":["/","/contacts/","/blog/*"],"events":["contact_click","lead_sent"],"campaigns":["autumn_2026"],"mediums":["cpc","ppc","paid_social","social","messenger","email","organic","referral"],"contents":["post_15","banner_a"],"capture_terms":false}'></script>
<script defer src="https://stats.example.ru/consent.js" referrerpolicy="no-referrer"
data-policy="/privacy/"></script>В удобном месте футера внутри body добавьте кнопку изменения выбора:
<button type="button" data-da-settings>Настройки аналитики</button>Встроенный баннер хранит разрешение или отказ 180 дней. Отзыв синхронизируется между вкладками. Если у вас уже есть CMP, подключите grant() и revoke() к её выбору и не добавляйте второй баннер. До согласия запросы статистики не отправляются; DNT/GPC останавливают сбор.
Для клика используйте data-da-event="contact_click". Для заявки вызывайте window.DulesovAnalytics.event('lead_sent') в обработчике подтверждённого успешного ответа вашего сервера формы. Тексты формы передавать не нужно.
Проверьте CSP и ежедневную очистку
Если на сайте есть Content Security Policy, добавьте точный origin панели к существующим директивам. Ниже показан фрагмент: его нельзя использовать для полной замены вашей политики, иначе можно закрыть другие ресурсы сайта.
script-src 'self' https://stats.example.ru;
style-src 'self' https://stats.example.ru;
connect-src 'self' https://stats.example.ru;Wildcard CORS и unsafe-eval счётчику не нужны. Сервер принимает браузерные запросы только с разрешённым origin; это не аутентификация запросов от произвольных внешних программ.
В crontab пользователя приложения добавьте ежедневную очистку. Уточните путь к PHP CLI и часовой пояс cron у своего хостинга.
15 3 * * * /usr/bin/php /srv/dulesov-analytics/bin/purge.phpПо активности очистка также выполняется не чаще раза в час. Для удаления в заданное время при отсутствии посещений нужен cron. Резервные копии и access-логи живут по отдельным правилам хранения.
Проверьте доступ и отправку
- Откройте панель по HTTPS. До входа отчёты и CSV должны быть недоступны. Проверьте вход с новым паролем и выход из панели.
- Откройте адреса
https://stats.example.ru/config.php,/data/analytics.sqlite,/app/и/bin/. Они должны возвращать 404/403 и не выдавать содержимое. - Откройте основной сайт в приватном окне. В DevTools → Network до согласия не должно быть POST к
collect.php. После разрешения появится просмотр. - Перейдите на другую разрешённую страницу и проверьте отчёт за сегодняшнюю дату UTC. Примените фильтры, затем скачайте CSV.
- Отзовите согласие и убедитесь, что новые события не отправляются. Проверьте отдельно устройство с DNT/GPC: сбор там должен оставаться выключенным.
При отсутствии данных проверьте включение в приватной конфигурации, точный origin, совпадение путей, загрузку скриптов, CSP, права на data/ и журнал ошибок PHP. Посетителю внутренние ошибки сервера показывать не следует.
Лимиты: 120 обращений в минуту с одного адреса и 50 000 в сутки на установку. SQLite требует оценки нагрузки вашего сайта. Отказы, блокировщики, сбои сети и поддельные события влияют на полноту данных; уникальные пользователи, сессии и коэффициент конверсии не рассчитываются.
Обновляйте код с сохранением приватных данных
- Сохраните защищённую резервную копию
config.phpи каталогаdata/. Для активной SQLite/WAL используйте согласованный backup базы; простое копирование одного файла во время записи может быть неполным. - Проверьте новую версию на тестовой копии. Замените каталоги
app/,public/иbin/файлами нового пакета. Существующиеconfig.phpиdata/сохраните. - Проверьте прежние итоги, новый просмотр, события, CSV и очистку. При изменении разрешённых списков обновите
data-configв HTML сайта.
Суточная история 0.1 и почасовые данные 0.2 сохраняются. Новые метки появляются после обновления счётчика; прошлые часы и сочетания меток задним числом не восстанавливаются.
Подробнее о составе данных · Установка на Tilda · События из CRM