Google Analytics тянет за собой баннер согласия на cookie, чужие серверы для ваших данных о посетителях и репутацию инструмента, который блокирует едва ли не каждый второй адблокер. Umami и Plausible - два самых популярных self-hosted способа уйти от этого, но они устроены по-разному: разный стек, разный аппетит к памяти, разная лицензия. Разбираем реальные отличия и разворачиваем более лёгкий из двух прямо на VPS - с docker compose, nginx и честным разговором о том, что self-hosting не делает вас невидимым для блокировщиков рекламы.
Тема Umami vs Plausible всплывает в любом обсуждении, где кто-то устал ставить Google Analytics на очередной сайт. Причина обычно не «хочу графики покрасивее» - причина в баннере cookie, который приходится городить ради одной строчки gtag.js, и в ощущении, что данные о ваших же посетителях лежат на серверах компании, которая зарабатывает именно на данных. Umami и Plausible - два самых популярных ответа на это: оба open-source, оба ставятся на свой сервер, оба показывают графики без единой куки для отслеживания. А вот дальше начинаются различия, и они не косметические - разный стек, разный аппетит к оперативной памяти, разная лицензия и разная логика вокруг того, что можно собирать. Разберём это по порядку и развернём один из двух вариантов прямо на VPS.
Коротко. Umami - это Node.js-приложение с базой PostgreSQL, лёгкое и простое в эксплуатации, лицензия MIT. Plausible Community Edition - Elixir/Phoenix плюс ClickHouse (для событий) и PostgreSQL (для остального), заметно тяжелее по ресурсам и лицензирован под AGPLv3. Для маленького VPS на 1-2 ГБ Umami - более практичный выбор: меньше сервисов, меньше того, что может отвалиться ночью. Plausible берут ради готовых воронок, revenue-трекинга и публичных дашбордов из коробки - если под ClickHouse не жалко отдельных 2+ ГБ памяти. Ниже - установка Umami через
docker compose, nginx с HTTPS поверх, и отдельно - честный разбор того, почему self-hosted аналитика не гарантирует обход блокировщиков рекламы, вопреки распространённому мифу.
Зачем вообще уходить с Google Analytics
Первая причина - юридическая, и она бьёт по конверсии напрямую. Google Analytics использует cookie для отслеживания уникальных посетителей между визитами, а по GDPR и аналогичным законам это требует явного согласия перед установкой такой cookie. Отсюда баннер на весь экран, который видит каждый посетитель из Евросоюза - и который часть посетителей закрывает не глядя, отклоняя всё подряд, что портит статистику ещё до того, как она собралась. Umami и Plausible в стандартной конфигурации не используют cookie для идентификации: посетителя не «запоминают» между визитами через постоянный идентификатор, а уникальность считают статистически, по комбинации IP и User-Agent за сутки с солью, которая меняется ежедневно. Юридическая консультация не входит в объём этой статьи - но факт в том, что именно это чаще всего позволяет обойтись без баннера согласия вообще, и это главная практическая причина, ради которой люди вообще смотрят в сторону self-hosted аналитики. Вторая причина проще - собственность на данные. Сервер стоит у вас, база данных - тоже у вас, и никто третий не видит трафик вашего сайта, чтобы обучать на нём рекламные модели.
А вот третья причина, которую часто называют первой в маркетинговых текстах - "self-hosted аналитика не блокируется адблокерами" - на самом деле не факт, а миф с оговорками. Ниже разберём это отдельно и подробно, потому что врать читателю в статье про приватность как минимум неуместно.
Umami vs Plausible: что у них внутри
Umami написан на Node.js - серверной среде выполнения JavaScript - и хранит данные в PostgreSQL (начиная с третьей версии - только в ней, поддержку MySQL из проекта убрали). Всё приложение - это по сути один процесс плюс база данных, лицензия - MIT, самая мягкая из массово используемых open-source лицензий: делайте с кодом почти что угодно, включая встраивание в коммерческий продукт, без обязательства публиковать свои изменения.
Plausible Community Edition устроен сложнее. Ядро написано на Elixir - языке для Erlang VM, спроектированной для параллельной обработки множества независимых соединений, - поверх фреймворка Phoenix. Данные о самих событиях (просмотры страниц, клики, конверсии) хранятся в ClickHouse - колоночной базе данных, заточенной под быструю агрегацию огромных объёмов аналитических записей, - а служебные данные (аккаунты, настройки сайтов) в отдельной PostgreSQL. Итого три сервиса вместо двух, и лицензия строже: AGPLv3, копилефт-лицензия, которая обязывает публиковать исходный код и ваших изменений, если вы предоставляете изменённую версию продукта другим людям через сеть - даже без физической передачи бинарника. Для личного использования на своём сервере это ничего не меняет. Для агентства, которое хочет предложить клиентам аналитику "как услугу" под своим брендом на модифицированном Plausible - меняет, и стоит хотя бы прочитать текст лицензии, прежде чем строить на этом бизнес.
Umami vs Plausible: таблица различий
Параметр | Umami | Plausible Community Edition |
|---|---|---|
Стек | Node.js + PostgreSQL | Elixir/Phoenix + ClickHouse + PostgreSQL |
Число сервисов в compose | 2 (приложение + БД) | 3 (приложение + ClickHouse + PostgreSQL) |
Лицензия | MIT | AGPLv3 |
Минимум RAM по официальным данным | не заявлен официально; на практике достаточно скромного VPS | ≥2 ГБ - официальная рекомендация именно для ClickHouse в простое |
Кастомные события | да | да |
Воронки и revenue-трекинг | есть в новых версиях, менее развиты (проверить актуальное состояние) | развиты сильнее, часть отмечается как более отполированная |
Публичный доступ к дашборду | да | да |
Встроенный HTTPS без внешнего прокси | нет, нужен nginx/Caddy отдельно | да, начиная с 2.1.2 - выпускает Let's Encrypt сам при портах 80/443 |
Сложность самостоятельного хостинга | ниже - один процесс, одна база | выше - три сервиса, у ClickHouse свои нюансы эксплуатации |
Сколько ресурсов это реально просит у VPS
Здесь стоит разделить два вопроса: что говорит официальная документация и что видно на практике. Plausible честно называет цифру в своём README - для ClickHouse и Plausible вместе рекомендовано от 2 ГБ RAM, и это именно минимум под простой, не под нагрузку. ClickHouse - самый тяжёлый компонент связки: колоночным базам вообще свойственно резервировать память под буферы и индексы заранее, а не только под фактические данные. Добавьте геобазу городского уровня (MaxMind GeoLite2-City вместо страновой) - и по независимым оценкам это ещё около гигабайта сверху.
Umami в этом смысле проще - и официальная документация просто не называет цифру, потому что называть особо нечего: один процесс Node.js плюс обычный Postgres, оба хорошо себя чувствуют на ресурсах, которые не назовёшь щедрыми. Точные мегабайты приводить не будем - слишком легко соврать числом, которое никто не проверял вживую на VPS WeaselCloud (это прямо стоит в чек-листе «Проверить» к статье). Но практический вывод понятен уже сейчас: если у вас VPS на 1-2 ГБ и на нём уже крутится сайт, разница между «добавить ещё Umami» и «добавить ещё Plausible с ClickHouse» - это разница между «скорее всего не заметите» и «стоит сначала посчитать, сколько там реально остаётся свободного, командой free -h» (как это делать - в статье про сколько CPU и RAM нужно серверу).
Именно поэтому дальше разворачиваем Umami. Не потому что Plausible "хуже" - у него честные преимущества в глубине аналитики, - а потому что для типичного VPS весом в пару долларов в месяц лишний тяжёлый сервис ClickHouse часто не окупается тем, что он даёт.
Разворачиваем Umami через docker compose
Ставим Docker из официального репозитория самого проекта, а не из репозитория Ubuntu - версия там свежее, и docker compose идёт отдельным плагином, а не устаревшей командой через дефис.
sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
$(. /etc/os-release && echo "$VERSION_CODENAME")- подставляет кодовое имя вашей версии Ubuntu автоматически, строку менять не нужно.docker-compose-plugin- это современныйdocker compose(два слова). Старая командаdocker-composeчерез дефис - отдельный устаревший инструмент, он тут не нужен.
Проверка: docker compose version должна вывести строку вида Docker Compose version v2.x.x. Если вместо этого docker: 'compose' is not a docker command - плагин не встал, повторите последнюю команду установки.
Дальше - две случайные строки, которые понадобятся в compose-файле. Первая защищает сессии внутри приложения, вторая шифрует данные для двухфакторной аутентификации, даже если вы её не включаете сразу - переменная у Umami обязательная.
openssl rand -base64 32
openssl rand -hex 32
Каждая команда выведет одну случайную строку - скопируйте обе, они понадобятся в файле ниже как значения APP_SECRET и TWO_FACTOR_ENCRYPTION_KEY соответственно.
Создаём каталог и сам compose-файл:
sudo mkdir -p /opt/umami
cd /opt/umami
sudo nano docker-compose.yml
Содержимое файла - минимальная официальная схема из двух сервисов:
services:
umami:
image: ghcr.io/umami-software/umami:postgresql-latest
container_name: umami
restart: always
ports:
- "127.0.0.1:3000:3000"
environment:
DATABASE_URL: postgresql://umami:замените-пароль@db:5432/umami
APP_SECRET: вставьте-первую-строку-из-openssl
TWO_FACTOR_ENCRYPTION_KEY: вставьте-вторую-строку-из-openssl
depends_on:
db:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:3000/api/heartbeat || exit 1"]
interval: 5s
timeout: 5s
retries: 5
db:
image: postgres:15-alpine
container_name: umami-db
restart: always
environment:
POSTGRES_DB: umami
POSTGRES_USER: umami
POSTGRES_PASSWORD: замените-пароль
volumes:
- umami-db-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U umami -d umami"]
interval: 5s
timeout: 5s
retries: 5
volumes:
umami-db-data:
127.0.0.1:3000:3000- порт публикуется только на loopback-адрес самого сервера, снаружи его не существует вообще. Это намеренно: наружу будет смотреть nginx, а не сам контейнер, - ниже разберём, почему это важно.замените-парольв двух местах - вDATABASE_URLи вPOSTGRES_PASSWORD- должен быть одной и той же строкой, придуманной вами. Это внутренний пароль между двумя контейнерами, наружу он никогда не выходит.APP_SECRETиTWO_FACTOR_ENCRYPTION_KEY- подставьте те две строки, что вывелopensslвыше. Без них Umami либо откажется стартовать, либо сгенерирует свои значения сам и не покажет вам их - тогда при переносе на новый сервер потеряете доступ к зашифрованным данным.umami-db-data- именованный том Docker, здесь живут все реальные данные Postgres. Пересоздание контейнеров командойdocker compose down(без флага-v) том не тронет.
Поднимаем оба сервиса и смотрим статус:
cd /opt/umami
sudo docker compose up -d
sudo docker compose ps
В колонке STATUS для обоих сервисов должно появиться running (а не restarting по кругу). Первый запуск занимает секунд десять - Umami должен создать таблицы в пустой базе, прежде чем ответить на первый запрос.
Проверить, что приложение реально ответило, можно без браузера:
curl -s http://127.0.0.1:3000/api/heartbeat
Если сервис жив, эндпоинт вернёт короткий JSON-ответ с кодом 200 - если вместо этого curl завис или вернул ошибку соединения, смотрите логи: sudo docker compose logs -n 50 umami.
Первый вход и трекинг-скрипт
Порт 3000 открыт только на localhost сервера, а домена и HTTPS у нас пока нет - значит, до первого входа добираемся через SSH-туннель, не открывая ничего наружу раньше времени.
ssh -L 3000:127.0.0.1:3000 root@ВАШ_IP
Пока эта сессия открыта, адрес http://127.0.0.1:3000 в браузере на вашем компьютере на самом деле ведёт на порт сервера. Логин по умолчанию - admin, пароль - umami. Это задокументированные дефолтные учётные данные, а не секрет, поэтому первое, что нужно сделать после входа - сменить пароль в настройках профиля, прежде чем открывать сервис наружу через nginx.
Дальше в интерфейсе добавляете сайт (домен, по которому он у вас известен) - и Umami сгенерирует тег для вставки на страницы, что-то вроде:
<script defer src="https://umami.example.com/script.js" data-website-id="ваш-id-сайта"></script>
Эту строку вставляете перед закрывающим </head> на каждой странице сайта, который хотите отслеживать - она подтянется автоматически на любом фреймворке, где можно вставить произвольный HTML в head.
nginx и HTTPS перед Umami
Открывать порт 3000 наружу напрямую - плохая идея сразу по двум причинам: во-первых, без TLS логин и пароль администратора идут по сети открытым текстом, во-вторых, ufw в принципе не фильтрует порты, которые Docker публикует сам - правило вида 127.0.0.1:3000:3000 в compose-файле выше уже решило эту проблему на корню, порт снаружи просто не существует. Базовые правила фаервола для остального сервера - в статье про ufw на VPS.
Серверный блок nginx - обычный обратный прокси, без особых заголовков вроде Upgrade/Connection, которые нужны инструментам с живыми WebSocket-обновлениями интерфейса (Umami в этом смысле проще):
server {
listen 80;
server_name umami.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Проверяем синтаксис и перечитываем конфиг, а не перезапускаем сервис целиком - reload не рвёт уже открытые соединения:
sudo nginx -t
sudo systemctl reload nginx
Сертификат - отдельным шагом после того, как HTTP уже отвечает на домене, обычно через certbot:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d umami.example.com
Если certbot отработал успешно, он сам допишет в серверный блок редирект на HTTPS и подключит сертификат. Если сайт после этого не открывается, а с самим сервером всё в порядке - разбор кодов 404/502/504/413 есть в отдельной статье про ошибки nginx.
Блокировщики рекламы: самообман про self-hosted
Вот здесь стоит остановиться и честно поговорить про миф. Расхожая фраза "self-hosted аналитика не режется адблокерами, потому что она не Google" - была правдой лет пять назад. Сейчас - не совсем.
Списки фильтров вроде EasyPrivacy (на нём построена часть правил в uBlock Origin и похожих блокировщиках) давно матчат не по конкретному домену Google, а по паттернам в адресе. И оба - и Umami, и Plausible - уже попали в такие списки правил, причём именно как паттерн по имени хоста. Если ваш поддомен называется umami.example.com, analytics.example.com или буквально содержит слово вроде track - шанс, что часть посетителей с включённым адблокером вообще не попадёт в статистику, реальный. Не стопроцентный, но реальный.
Что реально помогает, а что нет. Самостоятельный хостинг сам по себе не спасает - критично именно имя хоста и имя файла скрипта. Назовите поддомен для аналитики нейтрально: не umami., не stats., не analytics., а что-то вроде произвольного технического имени, никак не намекающего на назначение. У Umami для этого же есть отдельная переменная окружения, которая переименовывает сам файл скрипта с script.js на что угодно ещё - в документации проекта это описано в разделе про обход блокировщиков.
Это не хак и не серая зона - вы не скрываете от посетителя факт сбора статистики, а просто не совпадаете со списком паттернов, написанным для рекламных трекеров, к которым self-hosted-инструменты для приватной аналитики технически не относятся. Но обещать читателю "поставите Umami - и адблокеры вас больше не тронут" было бы неправдой, а врать в статье про приватность как-то особенно неловко.
Что выбрать: Umami или Plausible
Если сайт один или их несколько и все небольшие, а VPS на 1-2 ГБ RAM - берите Umami. Меньше сервисов означает меньше того, что может упасть посреди ночи, а MIT-лицензия развязывает руки, если аналитику когда-нибудь захочется встроить во что-то своё.
Если нужны готовые воронки конверсии, трекинг выручки по заказам и публичные дашборды, отполированные из коробки, а лишний гигабайт-два памяти под ClickHouse не проблема - смотрите Plausible. Он честно даёт больше готовой аналитики "из коробки", просто за счёт более тяжёлой инфраструктуры вокруг.
Наш выбор для типичного VPS WeaselCloud - Umami, и не потому что Plausible хуже. Для 90% сайтов на трафике, который вообще имеет смысл смотреть на своём сервере, разница в глубине аналитики не окупает третий сервис в compose-файле, который ест память круглые сутки просто потому, что он есть.
Частые вопросы
Чем Umami отличается от Plausible?
Разный стек и разный вес. Umami - Node.js плюс PostgreSQL, два сервиса, лицензия MIT. Plausible Community Edition - Elixir/Phoenix, ClickHouse и PostgreSQL вместе, три сервиса, лицензия AGPLv3, и заметно тяжелее по памяти из-за ClickHouse.
Можно ли поставить свою аналитику вместо Google Analytics?
Да, и юридически это часто даже проще: Umami и Plausible по умолчанию не используют cookie для отслеживания посетителей, а значит во многих случаях не требуют баннера согласия по GDPR, который обязателен при использовании Google Analytics. Это не заменяет консультацию юриста для конкретного сайта, но снимает главную практическую причину, из-за которой люди вообще ищут альтернативу.
Сколько ресурсов VPS нужно для self-hosted аналитики?
Зависит от выбора. Plausible официально рекомендует минимум 2 ГБ RAM для связки с ClickHouse - и это минимум под простой, не под нагрузку. Umami заметно легче: официальных цифр проект не публикует, но по устройству это один процесс Node.js плюс обычный Postgres, и для маленького сайта такая связка комфортно живёт рядом с самим сайтом на том же недорогом VPS.
Обходит ли self-hosted аналитика блокировщики рекламы?
Не гарантированно. Списки фильтров вроде EasyPrivacy матчат и Umami, и Plausible по паттернам в имени хоста - если поддомен называется вроде umami. или analytics., часть посетителей с адблокером всё равно выпадет из статистики. Нейтральное имя поддомена и (для Umami) переименование файла скрипта снижают этот риск, но не убирают его полностью и навсегда, потому что списки правил обновляются.
Какая лицензия у Umami и у Plausible?
Umami - MIT, самая мягкая из массовых open-source лицензий: можно почти всё, включая встраивание в свой коммерческий продукт без обязательства раскрывать код. Plausible Community Edition - AGPLv3, копилефт-лицензия: если вы модифицируете продукт и предоставляете доступ к изменённой версии другим людям через сеть, обязаны опубликовать исходный код своих изменений.
Нужен ли баннер cookie для Umami или Plausible?
В стандартной конфигурации оба инструмента не ставят cookie для идентификации посетителей и считают уникальность статистически, без постоянного идентификатора - это часто позволяет обойтись без баннера согласия по GDPR. Точный ответ зависит от юрисдикции и от того, что именно вы настроили дополнительно, поэтому для конкретного сайта стоит свериться с юристом или актуальными рекомендациями по GDPR, а не полагаться только на маркетинговые заявления инструментов.
Коротко
- Umami - Node.js + PostgreSQL, два сервиса, лицензия MIT, легче в эксплуатации на маленьком VPS.
- Plausible Community Edition - Elixir/Phoenix + ClickHouse + PostgreSQL, три сервиса, лицензия AGPLv3, официально рекомендует от 2 ГБ RAM только под ClickHouse в простое.
- Оба инструмента по умолчанию не используют cookie для идентификации посетителей, что часто снимает необходимость в баннере согласия по GDPR.
- Для VPS на 1-2 ГБ практичнее Umami: меньше сервисов, меньше точек отказа. Plausible берут ради готовых воронок, revenue-трекинга и более развитой аналитики из коробки.
- Umami ставится через docker compose из двух сервисов, порт публикуется только на loopback, снаружи - nginx с HTTPS через certbot.
- Self-hosted аналитика не гарантирует обход блокировщиков рекламы - списки фильтров матчат по паттернам имени хоста вроде
umami.илиanalytics., нейтральное имя поддомена снижает риск, но не убирает его полностью. - Лицензия имеет практическое значение не только для юристов: AGPLv3 у Plausible требует раскрывать код изменений при предоставлении сервиса другим через сеть, MIT у Umami такого требования не ставит.
Что дальше
Прежде чем разворачивать что-то на VPS, разумно сначала прикинуть, какой тариф вообще нужен - в статье сколько CPU и RAM нужно серверу разобрано, как считать это по типу нагрузки и проверять на уже работающем сервере. Общий порядок выбора сервера - в пилар-статье как выбрать VPS. Базовые правила фаервола перед тем, как открывать порты 80 и 443 - в статье про ufw на VPS.
