Как развернуть PHP-пакет

Самостоятельная установка включает панель с паролем, SQLite-базу и публичный JavaScript-счётчик. Она подходит для сайта на другой CMS и для Tilda с отдельным хостингом аналитики.

Версия 0.4.0 betaPHP 8.1+ / PDO_SQLiteHTTPS и PHP CLI

Подготовьте отдельный HTTPS-хост

Нужны PHP 8.1 или новее с PDO_SQLite, доступ к PHP CLI, ежедневный cron и возможность направить веб-корень на каталог public/. Если хостинг этого не позволяет, сначала уточните условия у поддержки.

В примерах сайт находится на https://example.ru, панель на https://stats.example.ru, пакет в /srv/dulesov-analytics. Это адреса и путь для объяснения; замените их своими. Одна установка обслуживает один сайт.

Начните с тестового окружения. Независимый аудит безопасности и нагрузочное испытание ещё не проведены. Размещение базы, журналов и резервных копий, политика и правовое основание обработки требуют отдельной проверки владельцем.

Откройте по HTTP только public/

  1. Распакуйте пакет целиком вне публичного каталога основного сайта, например в /srv/dulesov-analytics. Не переносите весь архив в public_html.
  2. Создайте отдельный HTTPS-хост. Его DocumentRoot в Apache или root в Nginx должен указывать только на /srv/dulesov-analytics/public.
  3. Настройте обработку 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 могут использовать разные версии и конфигурации; расширение нужно в обоих окружениях.

  1. Введите origin сайта, например https://example.ru, строго без пути и завершающего слеша.
  2. Введите URL панели https://stats.example.ru и существующую страницу политики на origin отслеживаемого сайта.
  3. Задайте уникальный пароль длиной 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-логи живут по отдельным правилам хранения.

Проверьте доступ и отправку

  1. Откройте панель по HTTPS. До входа отчёты и CSV должны быть недоступны. Проверьте вход с новым паролем и выход из панели.
  2. Откройте адреса https://stats.example.ru/config.php, /data/analytics.sqlite, /app/ и /bin/. Они должны возвращать 404/403 и не выдавать содержимое.
  3. Откройте основной сайт в приватном окне. В DevTools → Network до согласия не должно быть POST к collect.php. После разрешения появится просмотр.
  4. Перейдите на другую разрешённую страницу и проверьте отчёт за сегодняшнюю дату UTC. Примените фильтры, затем скачайте CSV.
  5. Отзовите согласие и убедитесь, что новые события не отправляются. Проверьте отдельно устройство с DNT/GPC: сбор там должен оставаться выключенным.

При отсутствии данных проверьте включение в приватной конфигурации, точный origin, совпадение путей, загрузку скриптов, CSP, права на data/ и журнал ошибок PHP. Посетителю внутренние ошибки сервера показывать не следует.

Лимиты: 120 обращений в минуту с одного адреса и 50 000 в сутки на установку. SQLite требует оценки нагрузки вашего сайта. Отказы, блокировщики, сбои сети и поддельные события влияют на полноту данных; уникальные пользователи, сессии и коэффициент конверсии не рассчитываются.

Обновляйте код с сохранением приватных данных

  1. Сохраните защищённую резервную копию config.php и каталога data/. Для активной SQLite/WAL используйте согласованный backup базы; простое копирование одного файла во время записи может быть неполным.
  2. Проверьте новую версию на тестовой копии. Замените каталоги app/, public/ и bin/ файлами нового пакета. Существующие config.php и data/ сохраните.
  3. Проверьте прежние итоги, новый просмотр, события, CSV и очистку. При изменении разрешённых списков обновите data-config в HTML сайта.

Суточная история 0.1 и почасовые данные 0.2 сохраняются. Новые метки появляются после обновления счётчика; прошлые часы и сочетания меток задним числом не восстанавливаются.

Подробнее о составе данных · Установка на Tilda · События из CRM

Вернуться к Диванной аналитике · Обсудить установку