Self-hosted веб-аналитика без cookie на чистом PHP. Без Docker, без Node на
сервере, без SSH, без Composer — загрузите папку на обычный виртуальный
хостинг, установите её прямо в браузере и вставьте в свой сайт один тег
<script>.
Сайт на WordPress? Плагин PlotBird Analytics вставит счётчик и покажет эту статистику прямо в админке WordPress — четыре шага настройки, код вставлять не нужно, есть русский язык.
- Залейте архив релиза на хостинг и откройте сайт в браузере.
- Инсталлятор создаст таблицы, администратора и первый сайт.
- Вставьте однострочный счётчик на страницы и удалите
install/.
Подробности — в разделе Установка. Требования: PHP 8.0+ и MySQL 5.7+ или MariaDB 10.3+, больше ничего.
Если сайт на WordPress, всю обвязку берёт на себя плагин PlotBird Analytics: он добавляет счётчик только на публичные страницы, проверяет подключение и показывает статистику внутри админки.
- Четыре шага без кода. Адрес установки, идентификатор сайта, публичная ссылка только для чтения — и проверка, что визиты действительно доходят.
- Статистика в админке. Просмотры, посетители, сессии, среднее время и отказы с мини-графиками, график трафика, популярные страницы, источники, страны, устройства, браузеры и цели.
- Администраторы не считаются, поэтому ваши собственные визиты не попадают в отчёты.
- Английский и русский, по языку сайта.
Плагин не хранит учётных данных: для чтения нужна публичная ссылка, она только
для чтения и её можно отозвать. Сам PlotBird по-прежнему живёт в data/ и в
базе на вашем хостинге.
Большинство систем аналитики для собственного сервера требуют 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 МБ дискового пространства
- Загрузите всю папку на хостинг (корень сайта или подкаталог — работают оба варианта) и направьте на неё домен.
- Убедитесь, что папки
config/иdata/доступны для записи (обычно достаточно755). - Откройте сайт — он перенаправит на
/install/и проведёт через семь шагов: язык → требования → база данных → таблицы +config.php→ администратор → первый сайт + код отслеживания → завершение. - Удалите папку
/install/. Мастер блокируется сразу, как только появляется администратор, но удаление папки полностью устраняет риск. - Настройте задание cron на URL, показанный на странице настроек (см. ниже).
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 игнорирует .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.
- Загрузите новые файлы поверх старых, сохранив
config/config.phpи каталогdata/. - Откройте панель управления. Если в выпуске есть изменение базы данных, об этом сообщит баннер; нажмите Обновить сейчас (или воспользуйтесь Настройки → Схема базы данных). SQL-миграции выполняются по порядку и фиксируются, поэтому неудачный шаг можно безопасно повторить.
- Перезагрузите страницу. В 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-адреса никогда не записываются в базу: только хеш с солью,
который пересчитывается каждый день, причём перед хешированием сетевая часть
усекается (IPv4 /24, IPv6 /48).
Если нужно различать отдельные визиты — для поддержки, разбора злоупотреблений или сверки с логами — включите Настройки → Хранить IP-адреса посетителей. Тогда журнал посещений показывает адрес каждого визита. Прочитайте предупреждение, которое идёт вместе с настройкой: IP-адреса — это персональные данные, поэтому нужны правовое основание, политика конфиденциальности с упоминанием обработки и, желательно, более короткий срок хранения. Каждое переключение этого тумблера пишется в журнал активности, чтобы можно было показать, когда он был включён.
PlotBird построен так, что баннер о согласии обычно не нужен, — но это правовая оценка для вас как оператора, а не свойство программы.
Что делает программа: никаких cookie и никакого localStorage на стороне
посетителя, никакого межсайтового идентификатора, никакого снятия отпечатка, по
умолчанию геолокация на уровне страны, поддержка Do-Not-Track и настраиваемое
удаление необработанных просмотров.
Две оговорки, которые стоит знать, прежде чем на это полагаться:
- Французский регулятор по защите данных (CNIL) даёт освобождение от согласия
для измерения аудитории только при условиях: собственные (first-party) цели,
анонимная выдача, отсутствие передачи неанонимизированных данных третьим лицам и
отсутствие межсайтового отслеживания через общий идентификатор. Он также
рекомендует информировать пользователей, ограничивать срок жизни идентификатора
(13 месяцев) и хранить данные не дольше 25 месяцев. Для поставщиков решений
есть официальный опросник для самооценки:
Cookies : solutions pour les outils de mesure d'audience.
CNIL прямо запрещает называть инструмент «сертифицированным» или «одобренным»
этой организацией. Держите
retention_daysна уровне 760 или ниже, если хотите оставаться в этих рекомендациях. - Отсутствие 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:cssPlotBird 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).

