Skip to content

Latest commit

 

History

History
396 lines (313 loc) · 30.3 KB

README.ru.md

File metadata and controls

396 lines (313 loc) · 30.3 KB

PlotBird Analytics

Self-hosted веб-аналитика без cookie на чистом PHP. Без Docker, без Node на сервере, без SSH, без Composer — загрузите папку на обычный виртуальный хостинг, установите её прямо в браузере и вставьте в свой сайт один тег <script>.

Дашборд PlotBird: переключение периода, открытие цели и разбор сессии посетителя

Tests License: AGPL-3.0 PHP 8.0+

Английская версия

Сайт на WordPress? Плагин PlotBird Analytics вставит счётчик и покажет эту статистику прямо в админке WordPress — четыре шага настройки, код вставлять не нужно, есть русский язык.


Быстрый старт

  1. Залейте архив релиза на хостинг и откройте сайт в браузере.
  2. Инсталлятор создаст таблицы, администратора и первый сайт.
  3. Вставьте однострочный счётчик на страницы и удалите install/.

Подробности — в разделе Установка. Требования: PHP 8.0+ и MySQL 5.7+ или MariaDB 10.3+, больше ничего.

WordPress

Если сайт на WordPress, всю обвязку берёт на себя плагин PlotBird Analytics: он добавляет счётчик только на публичные страницы, проверяет подключение и показывает статистику внутри админки.

Статистика PlotBird в админке WordPress

  • Четыре шага без кода. Адрес установки, идентификатор сайта, публичная ссылка только для чтения — и проверка, что визиты действительно доходят.
  • Статистика в админке. Просмотры, посетители, сессии, среднее время и отказы с мини-графиками, график трафика, популярные страницы, источники, страны, устройства, браузеры и цели.
  • Администраторы не считаются, поэтому ваши собственные визиты не попадают в отчёты.
  • Английский и русский, по языку сайта.

Плагин не хранит учётных данных: для чтения нужна публичная ссылка, она только для чтения и её можно отозвать. Сам PlotBird по-прежнему живёт в data/ и в базе на вашем хостинге.

Почему PlotBird

Большинство систем аналитики для собственного сервера требуют VPS: Plausible нужны Elixir и ClickHouse, Umami — Node, GoatCounter — бинарник, который разворачиваете сами. PlotBird рассчитан на миллионы сайтов, которые живут на виртуальном хостинге за €3, где есть только PHP, MySQL, FTP и панель управления.

  • Устанавливается целиком в браузере. Без SSH, без php bin/console, без Composer. Мастер из семи шагов проверяет окружение, создаёт таблицы, записывает конфигурацию, создаёт администратора и добавляет первый сайт. Ради этого проект и существует.
  • Настоящая геолокация — и по-прежнему из коробки. База стран DB-IP Lite входит в комплект и импортируется в MySQL при установке, поэтому отчёты по странам работают с первого дня: без внешнего API, без лицензионного ключа и без скачивания. (Определение страны по языку браузера, как делают некоторые инструменты, говорит о том, где настроен браузер посетителя, а не где находится он сам.)
  • Никаких cookie. Посетители считаются по псевдониму с солью, который пересчитывается каждый день: md5(IP + User-Agent + salt + date). В браузере ничего не сохраняется, и никто не отслеживается по сети.
  • Очень лёгкий. Трекер весит 1,3 КБ, а панель управления поставляется с 43 КБ уже скомпилированного CSS вместо компилятора CSS во время работы. Все фронтенд-библиотеки лежат локально: панель управления работает и на сервере без доступа в интернет.
  • Обновляется по FTP. Изменения схемы поставляются как обычные SQL-миграции и применяются со страницы настроек — без шелла и без ручного ALTER TABLE.

Возможности

Панель управления Сетка виджетов с перетаскиванием, скрытие и показ виджетов, запоминание раскладки для каждого сайта, мгновенное переключение между сайтами и периодами через AJAX
Виджеты Счётчик в реальном времени (5 минут), обзорные карточки со сравнением с предыдущим периодом, график трафика (по дням или часам), популярные страницы, источники трафика и страницы входа, страны + интерактивная карта мира, устройства/ОС/браузеры
Журнал посещений Одна строка на визит: время начала в часовом поясе сайта, длительность, число страниц, страница входа и выхода, источник, страна, устройство — щёлкните по строке, чтобы увидеть все страницы этого визита. Можно показывать и IP-адрес посетителя (по желанию, см. ниже)
Отслеживание Трекер размером <2 KB, sendBeacon с запасным вариантом на fetch, смена маршрутов в SPA, фильтрация ботов, правила включения и исключения для каждого сайта, ограничение частоты запросов, список разрешённых хостов
Цели Конверсии измеряются двумя способами: достижение страницы (изменения на сайте не нужны) или именованное событие из plotbird.track('signup'). Конверсии, уникальные посетители, совершившие конверсию, коэффициент конверсии и изменение относительно предыдущего периода
Аккаунты Супер-администратор (всё) и клиенты (только назначенные им сайты, переключение в шапке)
Публичный доступ Публичные панели управления только для чтения по ссылкам /share/<token> с возможностью задать срок действия и отзывом в один щелчок; хранится только хеш SHA-256 токена, а журнал посещений там никогда не показывается
PWA Устанавливается на телефон или компьютер, работает как отдельное приложение
i18n English, Русский, Deutsch, Español, Français, 中文 — определение языка браузера и переключатель везде
Приватность Без cookie, анонимизация IP, поддержка Do-Not-Track по желанию, настраиваемый срок хранения, по умолчанию геолокация только по странам
Безопасность Только подготовленные выражения PDO, CSRF-токены в каждой форме, password_hash(), привязка сессии к отпечатку клиента, блокировка при подборе пароля, защищённая папка config/, заблокированный установщик, журнал аудита
Обслуживание Cron-эндпоинт, миграции схемы из интерфейса, очистка по сроку хранения, обновление GeoIP, импорт базы IP из браузера

Сравнение

Разные инструменты — разные компромиссы. Каждый хорош в том, для чего сделан; эта таблица — о модели развёртывания.

PlotBird Matomo Plausible Umami GoatCounter
Стек PHP + MySQL PHP + MySQL Elixir + ClickHouse Node + PostgreSQL/MySQL Go
Работает на виртуальном хостинге без SSH yes yes no no rarely
Установщик в браузере yes yes no no no
Cookie по умолчанию no yes no no no
Страна по локальной базе IP bundled plugin bundled (MaxMind) bundled no
Обновление схемы без шелла yes (UI) yes no no no
Размер трекера 1.3 KB ~20 KB ~1 KB ~2 KB ~3 KB
Глубина возможностей small huge medium large small
Лицензия AGPL-3.0 GPL-3.0 AGPL-3.0 MIT own

Если уже сейчас нужны цели, воронки, отслеживание электронной коммерции или экосистема плагинов, безопаснее выбрать Matomo. PlotBird сознательно остаётся небольшим и дешёвым в эксплуатации.

Требования

  • PHP 8.0+ с pdo_mysql, mbstring, json (а также zlib для встроенной базы IP и curl или allow_url_fopen, если нужно скачивать более новые базы)
  • MySQL 5.7+ или MariaDB 10.2+ — никакой особой настройки, таблицы часовых поясов не нужны
  • Apache с mod_rewrite (файл .htaccess входит в комплект) или nginx (см. ниже)
  • Около 40 МБ дискового пространства

Установка

  1. Загрузите всю папку на хостинг (корень сайта или подкаталог — работают оба варианта) и направьте на неё домен.
  2. Убедитесь, что папки config/ и data/ доступны для записи (обычно достаточно 755).
  3. Откройте сайт — он перенаправит на /install/ и проведёт через семь шагов: язык → требования → база данных → таблицы + config.php → администратор → первый сайт + код отслеживания → завершение.
  4. Удалите папку /install/. Мастер блокируется сразу, как только появляется администратор, но удаление папки полностью устраняет риск.
  5. Настройте задание cron на URL, показанный на странице настроек (см. ниже).

Cron (рекомендуется)

https://your-domain.example/api/cron.php?secret=<generated secret>

Каждые пять минут: обновить ежедневные сводные таблицы, удалить необработанные просмотры, вышедшие за срок хранения, поддерживать базу IP в актуальном состоянии. Без cron PlotBird всё равно работает — сводные таблицы тогда вычисляются лениво, и первая за день загрузка панели управления немного медленнее.

Код отслеживания

<script async defer src="https://your-domain.example/assets/tracker.js"
        data-website-id="00000000-0000-0000-0000-000000000000"></script>

Вставьте его в <head> каждой страницы, которую нужно измерять. Установщик и страница «Сайты» умеют проверять, что обращения поступают.

nginx

nginx игнорирует .htaccess, поэтому перенесите его один раз:

server {
    root /var/www/plotbird;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ ^/(config|core|data|locales|templates|tests|migrations)/ {
        deny all;
        return 404;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~* ^/assets/.*\.(css|js|svg|png|woff2)$ {
        expires 30d;
        add_header Cache-Control "public";
    }
}

Цели и события

Цель отвечает на единственный вопрос, важный с коммерческой точки зрения: сколько посетителей сделали то, ради чего сайт существует?

Цели бывают двух видов, добавляются для каждого сайта на странице Сайты:

  • Цель по странице — посетитель дошёл до пути, например /thanks, /checkout/success или /checkout/* — для всего, что начинается с этого префикса. Считается по обычным просмотрам страниц: менять сайт не нужно.

  • Цель по событию — страница обратилась к трекеру:

    plotbird.track('signup');

    Имена событий могут содержать буквы, цифры, точки, тире, двоеточия и знаки подчёркивания. Трекер открывает API сразу после загрузки; если событие нужно отправить раньше, поставьте его в очередь:

    window.plotbird = window.plotbird || { q: [] };
    window.plotbird.track = function (name) { plotbird.q.push(name); };

    Очередь отправляется, когда трекер запускается.

Панель управления показывает по каждой цели: уникальных посетителей, совершивших конверсию, коэффициент конверсии относительно всех посетителей периода, число конверсионных визитов и изменение по сравнению с предыдущим периодом. События хранятся отдельно от просмотров страниц, поэтому отслеживание события никогда не завышает число просмотров и визитов.

Удаление цели удаляет и её статистику; отключение сохраняет историю и просто скрывает цель в панели управления. То, на что указывает цель, изменить нельзя — переименуйте её или добавьте новую, иначе прошлые конверсии молча получат иную трактовку.

Обновление

PlotBird обновляется так же, как устанавливается: по FTP.

  1. Загрузите новые файлы поверх старых, сохранив config/config.php и каталог data/.
  2. Откройте панель управления. Если в выпуске есть изменение базы данных, об этом сообщит баннер; нажмите Обновить сейчас (или воспользуйтесь Настройки → Схема базы данных). SQL-миграции выполняются по порядку и фиксируются, поэтому неудачный шаг можно безопасно повторить.
  3. Перезагрузите страницу. В URL ресурсов входит хеш времени изменения, поэтому браузеры подхватывают новый JavaScript и CSS без жёсткой перезагрузки.

Если что-то не работает

  • Все визиты относятся к одной стране или к ZZ. Значит адрес посетителя подменяется прокси, CDN или балансировщиком перед сайтом, и все хиты выглядят как один и тот же адрес. Укажите прокси в security.trusted_proxies в config/config.php — один адрес ('203.0.113.7'), сеть ('10.0.0.0/8') или true, если приложение вообще недоступно напрямую. Заголовок принимается только от адресов из этого списка.

    На хостинге с opcache изменённый config.php может продолжать отдаваться из кеша. Перезапустите PHP или подождите несколько секунд, прежде чем решать, что правка не помогла.

  • Инсталлятор всё ещё открыт. После создания администратора мастер блокируется сам, но папку install/ всё равно удалите.

  • Ничего не записывается. Откройте панель с кодом нужного сайта на странице «Сайты» и нажмите «Проверить код»: она скажет, дошёл ли хит. Если хиты отбрасываются, в журнале посещений будет видно причину — обычно это ограничение частоты, фильтр ботов или правила путей, и каждое из них настраивается отдельно.

IP-адреса посетителей (по желанию)

По умолчанию IP-адреса никогда не записываются в базу: только хеш с солью, который пересчитывается каждый день, причём перед хешированием сетевая часть усекается (IPv4 /24, IPv6 /48).

Если нужно различать отдельные визиты — для поддержки, разбора злоупотреблений или сверки с логами — включите Настройки → Хранить IP-адреса посетителей. Тогда журнал посещений показывает адрес каждого визита. Прочитайте предупреждение, которое идёт вместе с настройкой: IP-адреса — это персональные данные, поэтому нужны правовое основание, политика конфиденциальности с упоминанием обработки и, желательно, более короткий срок хранения. Каждое переключение этого тумблера пишется в журнал активности, чтобы можно было показать, когда он был включён.

Замечания о соответствии требованиям

PlotBird построен так, что баннер о согласии обычно не нужен, — но это правовая оценка для вас как оператора, а не свойство программы.

Что делает программа: никаких cookie и никакого localStorage на стороне посетителя, никакого межсайтового идентификатора, никакого снятия отпечатка, по умолчанию геолокация на уровне страны, поддержка Do-Not-Track и настраиваемое удаление необработанных просмотров.

Две оговорки, которые стоит знать, прежде чем на это полагаться:

  1. Французский регулятор по защите данных (CNIL) даёт освобождение от согласия для измерения аудитории только при условиях: собственные (first-party) цели, анонимная выдача, отсутствие передачи неанонимизированных данных третьим лицам и отсутствие межсайтового отслеживания через общий идентификатор. Он также рекомендует информировать пользователей, ограничивать срок жизни идентификатора (13 месяцев) и хранить данные не дольше 25 месяцев. Для поставщиков решений есть официальный опросник для самооценки: Cookies : solutions pour les outils de mesure d'audience. CNIL прямо запрещает называть инструмент «сертифицированным» или «одобренным» этой организацией. Держите retention_days на уровне 760 или ниже, если хотите оставаться в этих рекомендациях.
  2. Отсутствие cookie — это не «нет персональных данных». IP-адрес — это персональные данные по GDPR. Оператором остаётесь вы: упомяните аналитику в политике конфиденциальности и сохраните правовое основание в документах.

Как определяются показатели

  • Посетитель — уникальный псевдоним на день: md5(IP + User-Agent + salt + date). Завтра тот же человек будет новым посетителем; это цена отказа от cookie.
  • Визит (сессия) — последовательные просмотры страниц с промежутками меньше тайм-аута визита (по умолчанию 30 минут).
  • Отказ — визит ровно с одним просмотром страницы.
  • Длительность визита — последний просмотр страницы минус первый.
  • Посетители за период — сумма ежедневных значений уникальных посетителей, потому что точный подсчёт уникальных посетителей между днями невозможен без идентификатора, который живёт дольше дня.
  • Конверсия — визит, который дошёл до страницы цели или вызвал подходящее событие. Посетитель, который дважды доходит до страницы цели в рамках одного визита, совершает конверсию один раз.
  • Коэффициент конверсии — число уникальных посетителей, совершивших конверсию, делённое на число всех уникальных посетителей периода.
  • Часовой пояс — каждый сайт группируется по собственному часовому поясу; и панель управления, и журнал посещений показывают, по какому именно.

Безопасность

О том, как сообщить об уязвимости, и о чек-листе по усилению защиты — см. SECURITY.md. Коротко: удалите /install/, держите config/ недоступной по HTTP, отдавайте сайт по HTTPS и задайте длинный случайный cron_secret.

Проект молодой и не проходил независимый аудит безопасности. Если для вашей задачи это важно, прочитайте код — это около 40 небольших файлов.

Разработка

# Serve the project locally (mirrors the shipped .htaccess routing)
php -S 127.0.0.1:8080 tests/router.php

# Run the end-to-end suite: installs, tracks hits, checks every page
php tests/e2e.php
php tests/e2e.php --with-geoip   # also imports the full IP database

Набор тестов запускает встроенный сервер PHP, устанавливает приложение через настоящий установщик и выполняет 223 проверки поведения — в установщике, трекере, API, панели управления и правилах доступа. CI гоняет его на PHP 8.0–8.4 с MySQL 8.0 и MariaDB 11.4.

Стили панели управления компилируются заранее — npm нужен только для этого:

npm install && npm run build:css

Лицензия

PlotBird Analytics — свободное ПО под GNU Affero General Public License, версия 3 или новее — см. LICENSE. © участники проекта PlotBird Analytics.

Вы можете ставить его себе, изменять и распространять свободно. Единственное требование AGPL: если вы предлагаете его третьим лицам как сетевой сервис, вы обязаны предоставить им исходный код той версии, которую запускаете, — включая свои изменения.

Если нужно запускать его как закрытый облачный сервис или встраивать в проприетарный продукт, есть коммерческая лицензия, снимающая это требование. Подробности — в LICENSING.md.

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

Данные и библиотеки в комплекте сохраняют свои лицензии, полный список — THIRD-PARTY-NOTICES.md. Коротко:

  • База стран DB-IP Lite, © DB-IP, лицензия CC BY 4.0. Поставляется в data/geoip/, чтобы свежая установка определяла геолокацию без скачивания чего-либо; указание авторства показывается на странице настроек. Если они не нужны, удалите файл и указание авторства.
  • Флаги: flag-icons (MIT).
  • Названия стран: i18n-iso-countries (MIT).
  • Фронтенд: Tailwind CSS (MIT), Alpine.js (MIT), Chart.js (MIT), jsVectorMap (MIT), Sortable (MIT), Inter (OFL).