Самостоятельный хостинг Plausible Analytics на VPS с Docker Compose

11 мин чтения·Matthieu·privacygdprdocker-composeanalyticsplausibleclickhouse|

Разверните 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.

  1. Установи плагин: Плагины > Добавить новый > Поиск «Plausible Analytics»
  2. Перейди в Настройки > Plausible Analytics
  3. Введи URL самохостинг-инстанса (например, https://plausible.example.com)
  4. Введи доменное имя для отслеживания
  5. Сохрани

Плагин автоматически внедряет скрипт отслеживания. Он также поддерживает отслеживание конверсий 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.

Процедура обновления

  1. Прочитай release notes на предмет несовместимых изменений

  2. Сделай бэкап баз данных (запусти скрипт бэкапа выше)

  3. Скачай новую версию:

cd /opt/plausible-ce
git fetch --tags
git checkout v3.3.0  # replace with the target version
  1. Запусти обновлённые контейнеры:
docker compose up -d

Plausible автоматически выполняет миграции базы данных при запуске. Следи за логами при первом запуске:

docker compose logs -f plausible

Ищи [info] Migrations up to XXXXXXXX applied successfully в выводе. Если видишь ошибки миграции, не удаляй старые данные. Проверь wiki-страницу обновления для инструкций по конкретной версии.

  1. Удали старый образ:
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.