MAATRIX / Блог / Как установить и настроить PostHog на VPS

Как установить и настроить PostHog на VPS

MAATRIX

Продуктовая аналитика на облачных SaaS упирается в две вещи: цену за событие, которая растёт быстрее, чем бюджет, и данные пользователей, утекающие на сторонние серверы за рубежом. PostHog решает обе проблемы разом — это open-source платформа с воронками, записью сессий, feature flags и A/B-тестами, которую можно поднять на собственном VPS и полностью контролировать. Ниже — рабочий путь от чистого сервера до первого события в дашборде.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Что такое PostHog и когда его стоит держать у себя

PostHog — это не просто счётчик посещений, а полноценная product-analytics платформа: воронки конверсии, когортный анализ, session replay (запись действий пользователя в браузере), feature flags для постепенного раскрытия функций и встроенные A/B-эксперименты. В облачной версии (PostHog Cloud) всё это работает из коробки, но тарификация идёт по количеству событий, и при активном продукте счёт быстро становится ощутимым.

Self-hosted вариант снимает вопрос оплаты по событиям — вы платите только за сервер — и держит данные пользователей на площадке, которую выбираете сами. Для российского бизнеса это дополнительно снимает вопросы с 152-ФЗ: данные не покидают контролируемую инфраструктуру.

Важная оговорка, которую даёт сама команда PostHog: self-hosted развёртывание официально рекомендуется для небольших и средних объёмов — команд без выделенного DevOps-инженера, которым не нужно обрабатывать десятки миллионов событий в день. Под капотом у PostHog стоит ClickHouse, Kafka (или его аналог), PostgreSQL и Redis — стек тяжёлый, и на серьёзных объёмах его обслуживание становится отдельной работой. Если у вас стартап или внутренний продукт с несколькими тысячами активных пользователей — self-hosted вариант отлично впишется в бюджет. Если планируете миллионы событий в сутки — закладывайте отдельного человека на поддержку кластера или смотрите в сторону Cloud.

Требования к серверу и подготовка

PostHog в self-hosted варианте разворачивается через официальный docker-compose стек, который поднимает сразу несколько сервисов: веб-приложение, worker, plugin-server, ClickHouse, PostgreSQL, Redis, очередь событий и Caddy для автоматического SSL. Из коробки это не лёгкий инструмент.

Ориентировочные требования для комфортной работы небольшого проекта:

ПараметрМинимумРекомендуется
CPU2 vCPU4 vCPU
RAM4 ГБ8 ГБ и выше
Диск40 ГБ SSD80+ ГБ SSD (события растут быстро)
ОСUbuntu 22.04/24.04, Debian 12Ubuntu 24.04 LTS

Это именно ориентир — точные цифры зависят от объёма трафика на вашем сайте или в приложении, длины хранения событий и включена ли запись сессий (она заметно прожорливее на диск). Начинайте с 8 ГБ RAM и расширяйтесь, если увидите, что ClickHouse или Kafka регулярно упираются в память — docker stats покажет это честно.

Подготовка сервера стандартная: обновить систему, создать пользователя без root, установить Docker и Docker Compose plugin, настроить фаервол. Если ещё не делали этого на новом VPS — у нас есть отдельный разбор настройки UFW на сервере, там же порядок правил для веб-сервисов.

sudo apt update && sudo apt upgrade -y
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
newgrp docker
docker --version
docker compose version

Домен обязателен для нормальной работы — PostHog поднимает SSL автоматически через Caddy, но для этого A-запись домена должна указывать на IP сервера ещё до запуска установки.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Установка PostHog через официальный скрипт

Самый надёжный способ поднять self-hosted PostHog — использовать официальный установочный скрипт из репозитория проекта, а не собирать docker-compose.yml вручную: слишком много сервисов, зависящих друг от друга по сети и переменным окружения, и разработчики сами поддерживают этот скрипт в актуальном состоянии под новые версии.

git clone https://github.com/PostHog/posthog.git posthog
cd posthog
sudo ./bin/deploy-hobby

Скрипт задаст несколько вопросов: домен, на котором будет доступен PostHog, email для Let's Encrypt (используется Caddy для выпуска сертификата) и — при первом запуске — сгенерирует стартовые пароли для внутренних сервисов. После этого он сам:

  • поднимет docker-compose стек со всеми зависимостями (ClickHouse, PostgreSQL, Redis, очередь событий, plugin-server, web);
  • настроит Caddy как обратный прокси с автоматическим HTTPS на 80/443 порту;
  • применит миграции базы данных и запустит приложение.

Первый запуск занимает от 5 до 15 минут в зависимости от скорости диска и сети — образы контейнеров тяжёлые, ClickHouse и Kafka скачиваются дольше остальных. Прогресс видно в выводе скрипта, зависаний быть не должно.

Если вы уже используете nginx как единую точку входа для нескольких сервисов на сервере и не хотите отдавать 80/443 порт Caddy — вынесите Caddy на внутренний порт и проксируйте на него через nginx. Логика настройки reverse proxy для таких случаев подробно разобрана в статье про nginx как reverse proxy на VPS — те же принципы применимы и здесь, только upstream будет указывать на порт Caddy внутри docker-сети.

Домен, SSL и первый вход

После успешного завершения скрипта откройте https://ваш-домен в браузере. Caddy к этому моменту уже должен был выпустить сертификат Let's Encrypt автоматически — если сайт открывается без ошибок SSL, всё прошло штатно.

Проверить, что сертификат действительно валиден и не самоподписанный:

curl -vI https://ваш-домен 2>&1 | grep -i "SSL certificate"

Если сертификат не выпустился — почти всегда причина в том, что DNS A-запись ещё не успела распространиться, либо порт 80 занят другим процессом на сервере (проверьте sudo ss -tulpn | grep :80) и Caddy не смог пройти HTTP-01 challenge.

При первом открытии PostHog предложит создать организацию и первый проект, затем — учётную запись администратора (email и пароль). На этом же экране система выдаст project API key — его нужно будет вставить в SDK на сайте или в приложении, чтобы события начали поступать.

Если планируете приглашать команду по email (сброс пароля, инвайты), настройте SMTP в Settings → Email внутри интерфейса — без него письма просто не уйдут, а ссылки-приглашения нужно будет передавать вручную.

Feature flags, воронки и запись сессий — быстрый старт

Установка PostHog — это только инфраструктура, польза начинается с настройки трекинга. Минимальный SDK для веб-страницы:

<script>
  !function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){
    function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){
      t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}
    (p=t.createElement("script")).type="text/javascript",p.crossOrigin="anonymous",
    p.async=!0,p.src=s.api_host+"/static/array.js",(r=t.getElementsByTagName("script")[0])
    .parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",
    u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},
    u.people.toString=function(){return u.toString(1)+".people (stub)"},
    o="init capture register register_once alias people.set people.set_once".split(" "),n=0;n<o.length;n++)g(u,o[n]);
    e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);
  posthog.init('ВАШ_PROJECT_API_KEY', { api_host: 'https://ваш-домен' })
</script>

Для бэкенда есть официальные библиотеки под Python, Node.js, PHP, Go, Ruby — логика та же: posthog.capture(distinct_id, 'event_name', properties).

Что настроить сразу после подключения:

  • Воронки (Funnels) — задайте последовательность шагов (например, «зашёл на сайт → добавил в корзину → оформил заказ») и увидите, на каком шаге теряются пользователи.
  • Feature flags — создаются в разделе Feature Flags, позволяют включать функцию для процента пользователей или конкретного сегмента без деплоя нового кода.
  • Session replay — включается в Settings → Project → Session Recording. Учтите: это самая ресурсоёмкая функция, она пишет DOM-снапшоты и заметно увеличивает нагрузку на диск и ClickHouse — на слабом сервере лучше включать точечно, а не для 100% трафика.
  • Когорты — группы пользователей по поведению или свойствам, пригодятся для таргетированных feature flags и рассылок.

Обновление, бэкапы и ограничения self-hosted

PostHog развивается быстро, и self-hosted версия требует регулярных обновлений — как минимум ради патчей безопасности. Стандартный порядок:

cd posthog
git pull
docker compose -f docker-compose.yml pull
docker compose -f docker-compose.yml up -d

Перед серьёзным обновлением (major-версия) обязательно смотрите changelog в репозитории — иногда меняется схема ClickHouse или формат конфигов, и накатывать вслепую на продакшен не стоит.

Бэкап self-hosted PostHog — это не один файл, а несколько компонентов:

  • PostgreSQL — хранит метаданные (проекты, пользователей, feature flags, настройки). Бэкапится стандартно через pg_dump из контейнера.
  • ClickHouse — хранит сами события, самая объёмная часть. Требует отдельного подхода к бэкапу (снапшоты volume или встроенные механизмы ClickHouse).
  • Object storage (S3-совместимое хранилище или встроенный MinIO) — здесь лежат записи сессий и экспортированные файлы.
docker exec -t posthog-db-1 pg_dumpall -c -U posthog > posthog_pg_backup_$(date +%F).sql

Полноценный бэкап ClickHouse-данных лучше делать через снапшот docker volume целиком, пока сервисы остановлены, либо через штатные механизмы бэкапа ClickHouse — руками копировать файлы БД без остановки записи ненадёжно.

Здесь же стоит честно проговорить границы self-hosted PostHog: это не «поставил и забыл». Стек из пяти-семи сервисов требует мониторинга ресурсов, регулярных обновлений и понимания, что делать, если ClickHouse не поднимается после перезагрузки диска. Если у вас нет времени на эту рутину — можно начать с малого сервера для пилота, а параллельно присматриваться к более лёгким альтернативам вроде Matomo, если из полного набора PostHog вам нужна в основном веб-аналитика без воронок и feature flags. Для управления самим docker-стеком в продакшене пригодится и общий разбор Docker Compose для продакшена на VPS — там про health checks, restart policy и логирование, актуальные и для PostHog.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Сколько событий в месяц потянет self-hosted PostHog на скромном VPS?

Точную цифру назвать нельзя — зависит от CPU, диска и того, включена ли запись сессий. На сервере с 4 vCPU и 8 ГБ RAM без session replay комфортно живут проекты с несколькими сотнями тысяч событий в месяц; для точной оценки под свою нагрузку тестируйте на реальном трафике и следите за docker stats.

Можно ли обойтись без ClickHouse и упростить стек?

Нет, ClickHouse — обязательный компонент официального self-hosted развёртывания, именно он хранит и агрегирует события. Урезанных вариантов без него официально не поддерживается.

Нужен ли отдельный сервер под PostHog или можно на общий с другими сервисами?

Технически можно, но стек PostHog сам по себе тяжёлый (5-7 контейнеров), поэтому на общем сервере с другими production-сервисами закладывайте запас по RAM минимум в 4-6 ГБ сверх текущей нагрузки.

Как перенести PostHog на другой сервер?

Переносите docker volumes с PostgreSQL, ClickHouse и object storage целиком (через docker volume бэкап или прямое копирование директорий данных), затем разворачивайте тот же docker-compose стек на новом сервере и подключаете скопированные volumes перед первым запуском.

Стоит ли включать session replay сразу для всех пользователей?

Не рекомендуется на старте — это самая ресурсоёмкая функция. Лучше включить для небольшого процента трафика через таргетинг в настройках записи сессий, оценить нагрузку на диск и ClickHouse, и расширять постепенно.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →