Самостоятельный хостинг Plausible Analytics на VPS с Docker Compose
Разверните Plausible Community Edition на своём VPS с помощью Docker Compose. Полное руководство по установке, интеграции скрипта отслеживания, пользовательским событиям, бэкапам и обновлениям.
Plausible Analytics предоставляет веб-аналитику без куков, без сбора персональных данных и без баннеров согласия. Самостоятельный хостинг Community Edition означает, что данные посетителей никогда не покидают твой сервер. Это руководство охватывает весь жизненный цикл: развёртывание Plausible CE v3.2.0 с Docker Compose, интеграция скрипта отслеживания, настройка пользовательских событий, бэкапы и обновления.
Требования: VPS с минимум 4 ГБ оперативной памяти, на котором работают Docker и Docker Compose Docker в продакшене на VPS: что ломается и как это починить, доменное имя, направленное на сервер, и обратный прокси с TLS Traefik vs Caddy vs Nginx: сравнение Docker reverse proxy.
Что такое Plausible Community Edition и чем она отличается от облачной версии?
Plausible CE — это бесплатная самохостинговая версия Plausible Analytics с лицензией AGPL. Она работает в виде трёх Docker-контейнеров: веб-приложение Plausible (Elixir), PostgreSQL для учётных записей пользователей и ClickHouse для хранения аналитических событий. Ты получаешь тот же дашборд с приоритетом конфиденциальности, что и в платной облачной версии. Данные остаются на твоём сервере. CE выпускается дважды в год как долгосрочный релиз.
Различия:
| Функция | Облако | Community Edition |
|---|---|---|
| Аналитический дашборд | Да | Да |
| Конфиденциальность (без куков) | Да | Да |
| Пользовательские события и цели | Да | Да |
| Stats API (v2) | Да | Да |
| Отчёты по e-mail | Да | Да (нужен SMTP) |
| Воронки и цели по доходам | Да | Нет |
| Sites API | Да | Нет |
| Коннектор Looker Studio | Да | Нет |
| Интеграция Google Search Console | Да | Да (нужна настройка) |
| SSO / управление командой | Да | Нет |
| Премиум-поддержка | Да | Только сообщество |
| Частота обновлений | Еженедельно | Дважды в год |
| Управление инфраструктурой | Управляемое | Самостоятельно |
Облачная версия работает по подписке. Актуальные тарифы смотри на странице цен Plausible. Самохостинг стоит только ресурсы VPS.
Какие системные требования для самохостинга Plausible?
ClickHouse — самый ресурсоёмкий компонент. В простое ему нужно минимум 2 ГБ оперативной памяти, а при сложных запросах по большим наборам данных потребление возрастает. Процессор должен поддерживать инструкции SSE 4.2 (все современные x86_64 процессоры поддерживают; ARM64 с NEON тоже работает). Планируй VPS соответственно.
| Ресурс | Минимум | Рекомендуется |
|---|---|---|
| RAM | 2 ГБ | 4 ГБ |
| CPU | 1 vCPU (SSE 4.2) | 2 vCPU |
| Диск | 10 ГБ | 20 ГБ+ |
| Docker | 20.10+ | Последняя стабильная |
| Docker Compose | v2.x | Последняя стабильная |
Рост диска зависит от трафика. Примерно 1 ГБ на 1-2 миллиона просмотров страниц в ClickHouse. При низком трафике (менее 100 000 просмотров в месяц) использование диска незначительно.
Как установить Plausible Analytics с Docker Compose?
Клонируй официальный репозиторий Community Edition на теге v3.2.0, настрой переменные окружения и запусти контейнеры. Весь процесс занимает около пяти минут.
Клонируй репозиторий:
git clone -b v3.2.0 --single-branch https://github.com/plausible/community-edition plausible-ce
cd plausible-ce
Это даст тебе compose.yml, конфигурационные файлы ClickHouse и README.
Как настроить переменные окружения?
Создай файл .env в директории plausible-ce. Две переменные обязательны. Остальные опциональны, но некоторые настоятельно рекомендуются.
Сначала сгенерируй секреты:
openssl rand -base64 48
Команда выводит строку из 64 символов. Скопируй её для SECRET_KEY_BASE.
Сгенерируй отдельный ключ для шифрования TOTP:
openssl rand -base64 32
Теперь создай файл .env:
cat > .env << 'EOF'
BASE_URL=https://plausible.example.com
SECRET_KEY_BASE=<your-64-char-secret>
TOTP_VAULT_KEY=<your-32-char-key>
DISABLE_REGISTRATION=invite_only
# SMTP for email reports and password resets
MAILER_EMAIL=plausible@example.com
SMTP_HOST_ADDR=mail.example.com
SMTP_HOST_PORT=587
SMTP_USER_NAME=plausible@example.com
SMTP_USER_PWD=<your-smtp-password>
SMTP_HOST_SSL_ENABLED=false
EOF
Заблокируй права доступа к файлу, так как он содержит секреты:
chmod 600 .env
ls -la .env
-rw------- 1 root root 412 Mar 20 10:00 .env
Что делает каждая переменная:
- BASE_URL: Публичный URL, по которому доступен Plausible. Должен совпадать с конфигурацией обратного прокси.
- SECRET_KEY_BASE: Шифрует сессии и генерирует производные ключи. Минимум 64 байта. Никогда не делись этим значением.
- TOTP_VAULT_KEY: Шифрует секреты двухфакторной аутентификации с помощью AES256-GCM. Если не задан, производится из
SECRET_KEY_BASEчерез PBKDF2, но явная установка безопаснее для ротации ключей. - DISABLE_REGISTRATION: Установи
invite_only(по умолчанию) илиtrueпосле создания аккаунта. Не даёт посторонним регистрироваться на твоём инстансе. - SMTP-переменные: Нужны для отчётов по e-mail, сброса пароля и приглашений. Без SMTP Plausible работает, но функции e-mail будут недоступны.
Как настроить обратный прокси с TLS для Plausible?
По умолчанию Plausible слушает порт 8000. Обратный прокси перенаправляет HTTPS-трафик на него. Если у тебя уже работает Caddy или Traefik из Traefik vs Caddy vs Nginx: сравнение Docker reverse proxy, добавь Plausible как новый upstream.
Создай compose.override.yml, чтобы подключить Plausible к сети обратного прокси:
services:
plausible:
networks:
- proxy
- default
networks:
proxy:
external: true
Если используешь Caddy, добавь в Caddyfile:
plausible.example.com {
reverse_proxy plausible:8000
}
Если используешь Traefik, добавь лейблы в override:
services:
plausible:
labels:
- "traefik.enable=true"
- "traefik.http.routers.plausible.rule=Host(`plausible.example.com`)"
- "traefik.http.routers.plausible.tls.certresolver=letsencrypt"
- "traefik.http.services.plausible.loadbalancer.server.port=8000"
networks:
- proxy
- default
networks:
proxy:
external: true
Также у Plausible есть встроенная поддержка Let's Encrypt. Установи HTTP_PORT=80 и HTTPS_PORT=443 в файле .env, затем пробрось эти порты в override:
services:
plausible:
ports:
- 80:80
- 443:443
Этот подход проще, но означает, что Plausible сам управляет TLS. Могут возникнуть конфликты, если другие сервисы работают на том же сервере.
Запуск контейнеров
docker compose up -d
Запускаются три контейнера: plausible_db (PostgreSQL 16), plausible_events_db (ClickHouse 24.12) и plausible (веб-приложение). Контейнер Plausible автоматически выполняет миграции базы данных при запуске.
Проверь, что все три работают нормально:
docker compose ps
NAME IMAGE STATUS
plausible ghcr.io/plausible/community-edition:v3.2.0 Up 30s (healthy)
plausible_db postgres:16-alpine Up 35s (healthy)
plausible_events_db clickhouse/clickhouse-server:24.12-alpine Up 35s (healthy)
Все три должны показывать (healthy). Если ClickHouse показывает (health: starting), подожди ещё минуту. Он выполняет healthcheck через wget к HTTP-интерфейсу.
Создание аккаунта администратора
Открой https://plausible.example.com в браузере. Появится форма регистрации. Создай аккаунт. При DISABLE_REGISTRATION=invite_only новые пользователи могут зарегистрироваться, только если ты явно пригласишь их через дашборд.
После регистрации полностью заблокируй регистрацию, если ты единственный пользователь:
Отредактируй .env и измени:
DISABLE_REGISTRATION=true
Затем перезапусти:
docker compose up -d
Как добавить скрипт отслеживания Plausible на сайт?
После входа нажми «Add a website» и введи домен. Plausible сгенерирует код отслеживания. Стандартный тег script выглядит так:
<script defer data-domain="yoursite.com" src="https://plausible.example.com/js/script.js"></script>
Замени plausible.example.com на реальный URL твоего инстанса Plausible. Добавь этот тег в <head> каждой страницы, которую хочешь отслеживать.
Как добавить Plausible на статический HTML-сайт?
Вставь тег script прямо в <head> HTML:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>My Site</title>
<script defer data-domain="yoursite.com" src="https://plausible.example.com/js/script.js"></script>
</head>
<body>
<!-- content -->
</body>
</html>
Для генераторов статических сайтов (Hugo, Jekyll, 11ty) добавь тег script в базовый шаблон или head partial.
Как добавить Plausible на WordPress-сайт?
Официальный плагин Plausible Analytics для WordPress (v2.5.4, более 10 000 активных установок) делает всё через панель WordPress.
- Установи плагин: Плагины > Добавить новый > Поиск «Plausible Analytics»
- Перейди в Настройки > Plausible Analytics
- Введи URL самохостинг-инстанса (например,
https://plausible.example.com) - Введи доменное имя для отслеживания
- Сохрани
Плагин автоматически внедряет скрипт отслеживания. Он также поддерживает отслеживание конверсий WooCommerce и автоматическое отслеживание отправки форм Contact Form 7, WPForms и Ninja Forms.
Как добавить Plausible в Next.js-приложение?
Используй пакет next-plausible (v3.12.5, 36 000 загрузок в неделю).
npm i next-plausible
Для App Router (Next.js 13+) добавь провайдер в корневой layout:
import PlausibleProvider from "next-plausible";
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html>
<head>
<PlausibleProvider
domain="yoursite.com"
customDomain="https://plausible.example.com"
selfHosted
/>
</head>
<body>{children}</body>
</html>
);
}
Для отслеживания пользовательских событий в компонентах используй хук usePlausible:
"use client";
import { usePlausible } from "next-plausible";
export default function SignupButton() {
const plausible = usePlausible();
return (
<button onClick={() => plausible("Signup")}>
Sign up
</button>
);
}
Как добавить Plausible в одностраничное приложение?
Для React, Vue, Svelte или любого SPA добавь тег script в index.html. Plausible автоматически отслеживает смену маршрутов через History API. Никакой дополнительной настройки не нужно.
Если твоё SPA использует hash-роутинг (/#/path), используй hash-расширение:
<script defer data-domain="yoursite.com" src="https://plausible.example.com/js/script.hash.js"></script>
Как отслеживать пользовательские события и цели в Plausible?
Пользовательские события позволяют отслеживать действия помимо просмотров страниц: клики по кнопкам, отправку форм, скачивание файлов, регистрации. Plausible предлагает два метода: no-code подход через CSS-классы и JavaScript API для динамического отслеживания.
Сначала включи расширенный скрипт с поддержкой пользовательских событий. Замени источник скрипта по умолчанию:
<script defer data-domain="yoursite.com" src="https://plausible.example.com/js/script.tagged-events.js"></script>
Метод CSS-классов (без JavaScript)
Добавь CSS-класс в формате plausible-event-name=EventName к любому HTML-элементу:
<a href="/signup" class="plausible-event-name=Signup">Create Account</a>
<button class="plausible-event-name=Download+PDF">Download Report</button>
<form class="plausible-event-name=Contact+Form+Submit">
<!-- form fields -->
</form>
Для пробелов в именах событий используй +. Некоторые CMS (Webflow) заменяют = на -. В этом случае используй двойное тире --: plausible-event-name--Signup.
JavaScript API для динамических событий
Вызывай функцию plausible() напрямую для событий с условной логикой или динамическими свойствами:
// Simple event
plausible("Signup");
// Event with custom properties
plausible("Download", {
props: { format: "PDF", document: "annual-report" }
});
// Event with a callback (useful for redirects)
plausible("Outbound Link", {
props: { url: "https://example.com" },
callback: () => { window.location = "https://example.com"; }
});
Создание цели в дашборде
События не появятся в дашборде, пока ты не создашь соответствующую цель. Перейди в Site Settings > Goals > Add Goal. Выбери «Custom event» и введи точное имя события (например, Signup). Имя чувствительно к регистру и должно совпадать с кодом.
Как использовать Stats API Plausible?
Plausible включает Stats API (v2) для программного доступа к аналитическим данным. На самохостинг-инстансе базовый URL API — https://plausible.example.com/api/v2/query.
Создай API-ключ: перейди в Account Settings > API Keys > New API Key > Stats API.
Запроси количество посетителей за последние 7 дней:
curl --request POST \
--header 'Authorization: Bearer YOUR-API-KEY' \
--header 'Content-Type: application/json' \
--url 'https://plausible.example.com/api/v2/query' \
--data '{
"site_id": "yoursite.com",
"metrics": ["visitors", "pageviews", "bounce_rate"],
"date_range": "7d"
}'
{
"results": [
{
"metrics": [1423, 3847, 42],
"dimensions": []
}
],
"query": {
"site_id": "yoursite.com",
"metrics": ["visitors", "pageviews", "bounce_rate"],
"date_range": ["2026-03-13", "2026-03-20"]
}
}
Разбивка посетителей по страницам:
curl --request POST \
--header 'Authorization: Bearer YOUR-API-KEY' \
--header 'Content-Type: application/json' \
--url 'https://www.example.com/api/v2/query' \
--data '{
"site_id": "yoursite.com",
"metrics": ["visitors", "pageviews"],
"date_range": "30d",
"dimensions": ["event:page"],
"pagination": {"limit": 5}
}'
API поддерживает фильтрацию, временные измерения (time:day, time:month) и сортировку. Лимит запросов — 600 в час. Полная документация Stats API содержит все доступные метрики и измерения.
Как настроить отчёты по e-mail?
Отчёты по e-mail требуют рабочей конфигурации SMTP в файле .env (описана в разделе настройки выше). После настройки SMTP любой пользователь может включить еженедельные или ежемесячные отчёты из дашборда Plausible.
Перейди в Site Settings > Email Reports. Добавь адреса получателей. Plausible отправляет сводку посетителей, популярных страниц и источников трафика по выбранному расписанию.
Если письма не приходят, проверь логи контейнера Plausible:
docker compose logs plausible | grep -i mail
Частые проблемы: неправильный порт SMTP (используй 587 для STARTTLS, 465 для имплицитного TLS с SMTP_HOST_SSL_ENABLED=true) или ошибки аутентификации.
Как сделать бэкап самохостинг-инстанса Plausible?
Plausible хранит данные в двух базах данных и одном томе. Потеря любого из них означает потерю данных. Делай бэкап всех трёх.
| Данные | Хранилище | Метод бэкапа |
|---|---|---|
| Учётные записи, конфигурация сайтов | PostgreSQL | pg_dump |
| Аналитические события | ClickHouse | Бэкап тома или команда BACKUP |
| Сертификаты, загрузки | Том plausible-data |
Копирование тома |
Бэкап PostgreSQL
docker compose exec plausible_db pg_dump -U postgres plausible_db | gzip > backup-postgres-$(date +%F).sql.gz
Бэкап ClickHouse
ClickHouse 24.12 поддерживает команду BACKUP нативно. Выполни её внутри контейнера:
docker compose exec plausible_events_db clickhouse-client \
--query "BACKUP DATABASE plausible_events_db TO Disk('backups', 'plausible-$(date +%F).zip')"
Если диск backups не настроен, используй бэкап на уровне тома:
docker compose stop plausible_events_db
docker run --rm \
-v plausible-ce_event-data:/source:ro \
-v $(pwd)/backups:/backup \
alpine tar czf /backup/clickhouse-$(date +%F).tar.gz -C /source .
docker compose start plausible_events_db
Это ненадолго останавливает ClickHouse. Для бэкапов без простоя настрой диск backups в ClickHouse или используй clickhouse-backup.
Автоматизация
Создай скрипт /opt/plausible-backup.sh:
#!/bin/bash
set -euo pipefail
BACKUP_DIR=/opt/backups/plausible
mkdir -p "$BACKUP_DIR"
cd /opt/plausible-ce
# PostgreSQL
docker compose exec -T plausible_db pg_dump -U postgres plausible_db \
| gzip > "$BACKUP_DIR/postgres-$(date +%F).sql.gz"
# ClickHouse volume
docker run --rm \
-v plausible-ce_event-data:/source:ro \
-v "$BACKUP_DIR":/backup \
alpine tar czf "/backup/clickhouse-$(date +%F).tar.gz" -C /source .
# Plausible data volume
docker run --rm \
-v plausible-ce_plausible-data:/source:ro \
-v "$BACKUP_DIR":/backup \
alpine tar czf "/backup/plausible-data-$(date +%F).tar.gz" -C /source .
# Rotate: keep 14 days
find "$BACKUP_DIR" -name "*.gz" -mtime +14 -delete
echo "Backup complete: $(ls -lh $BACKUP_DIR/*$(date +%F)*)"
chmod 700 /opt/plausible-backup.sh
Запланируй ежедневный запуск через cron:
crontab -e
Добавь:
0 3 * * * /opt/plausible-backup.sh >> /var/log/plausible-backup.log 2>&1
Подробнее о стратегиях бэкапа Docker-томов смотри в Резервное копирование и восстановление томов Docker на VPS.
Как безопасно обновить Plausible Community Edition?
Plausible CE выходит дважды в год. Закрепи версию на конкретном теге в compose.yml для предсказуемых обновлений. Стандартная конфигурация уже закреплена на v3.2.0.
Стратегии закрепления версий:
| Уровень | Пример тега | Что обновляется автоматически |
|---|---|---|
| Патч (самый безопасный) | v3.2.0 |
Ничего. Только ручные обновления. |
| Минорная | v3.2 |
Патч-релизы (исправления багов) |
| Мажорная | v3 |
Минорные и патч-релизы |
Рекомендация: закрепляй на уровне патча и обновляй вручную после прочтения release notes.
Процедура обновления
-
Прочитай release notes на предмет несовместимых изменений
-
Сделай бэкап баз данных (запусти скрипт бэкапа выше)
-
Скачай новую версию:
cd /opt/plausible-ce
git fetch --tags
git checkout v3.3.0 # replace with the target version
- Запусти обновлённые контейнеры:
docker compose up -d
Plausible автоматически выполняет миграции базы данных при запуске. Следи за логами при первом запуске:
docker compose logs -f plausible
Ищи [info] Migrations up to XXXXXXXX applied successfully в выводе. Если видишь ошибки миграции, не удаляй старые данные. Проверь wiki-страницу обновления для инструкций по конкретной версии.
- Удали старый образ:
docker image prune -f
Патчи безопасности не бэкпортируются на старые версии. Подпишись на уведомления о релизах на GitHub: перейди в репозиторий, нажми Watch > Custom > Releases.
Соответствует ли самохостинг Plausible GDPR без куков?
Да. Plausible не устанавливает куки. Не собирает и не хранит персональные данные. Уникальные посетители считаются по хэшу IP-адреса в сочетании со строкой User-Agent. Этот хэш обновляется каждые 24 часа и никогда не хранится в сыром виде. Исходный IP-адрес удаляется после хэширования.
Это значит:
- Не нужен баннер согласия на куки по GDPR, CCPA или PECR
- Нет обработки персональных данных, поэтому требования к правовому основанию по статье 6 GDPR не применяются
- Самохостинг гарантирует, что данные никогда не покидают сервер и не передаются стороннему обработчику
- Ты остаёшься единственным контролёром данных, без необходимости заключать договоры с обработчиками для аналитики
Если VPS размещён в ЕС (серверы Virtua Cloud расположены в европейских дата-центрах), аналитические данные остаются в ЕС. Никаких проблем с передачей данных по Schrems II.
Именно поэтому многие инди-хакеры и разработчики, заботящиеся о конфиденциальности, переходят с Google Analytics. Никаких баннеров согласия, никаких препятствий для посетителей, никаких договоров с обработчиками данных.
Мониторинг потребления ресурсов ClickHouse
ClickHouse — самый ресурсоёмкий компонент. В простое при низком трафике использует около 500 МБ оперативной памяти. При запросах по большим наборам данных может вырасти до 2-3 ГБ. Если на VPS всего 2 ГБ RAM, в периоды нагрузки возможны OOM kill.
Следи за потреблением памяти:
docker stats plausible_events_db --no-stream
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM %
a1b2c3d4e5f6 plausible_events_db 0.50% 487MiB / 3.84GiB 12.38%
Конфигурация ClickHouse, поставляемая с Plausible CE, уже включает оверрайды для ограниченных ресурсов (через low-resources.xml и default-profile-low-resources-overrides.xml). Они ограничивают потребление памяти при мерджах и запросах.
Если нужна дополнительная настройка, создай файл clickhouse/custom.xml и подключи его в compose.override.yml. Про лимиты ресурсов в Docker Compose смотри Лимиты ресурсов, healthcheck-проверки и политики перезапуска в Docker Compose.
Проверь логи ClickHouse на предмет предупреждений:
docker compose logs plausible_events_db | grep -i "memory\|oom"
Что-то пошло не так?
Контейнеры не запускаются: Проверь docker compose logs <service>. Частые причины: конфликт портов, отсутствующие переменные в .env, ClickHouse не проходит проверку SSE 4.2 на старых процессорах.
«Bad Request» на странице входа: Твой BASE_URL не совпадает с URL, по которому ты обращаешься. Plausible проверяет заголовок origin на соответствие BASE_URL для защиты от CSRF.
Скрипт отслеживания не записывает визиты: Открой DevTools браузера, проверь вкладку Network на запросы к /api/event. Ответ 202 означает, что событие принято. Если видишь CORS-ошибки, обратный прокси удаляет заголовки. Убедись, что прокси передаёт заголовок Host.
Отчёты по e-mail не отправляются: Проверь учётные данные SMTP. Посмотри логи командой docker compose logs plausible | grep -i smtp. Протестируй SMTP-сервер отдельно с помощью swaks или openssl s_client.
ClickHouse убит OOM killer: На VPS недостаточно оперативной памяти. Увеличь до минимум 4 ГБ или уменьши max_memory_usage в оверрайде конфигурации ClickHouse.
Дашборд показывает ноль посетителей после установки: Скрипт отслеживания может блокироваться рекламными блокировщиками. Рассмотри проксирование скрипта через основной домен. В документации Plausible это называется proxy setup.
Для мониторинга доступности инстанса Plausible смотри Самостоятельный хостинг Uptime Kuma и Beszel на VPS с Docker Compose.
Готовы попробовать?
Разверните свой сервер за секунды. Linux, Windows или FreeBSD. →