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

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

MAATRIX

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

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

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

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

Чем GrowthBook отличается от обычных feature-flag сервисов

Ключевая особенность GrowthBook — он не хранит сырые данные о событиях пользователей у себя. Вместо этого он подключается к вашему уже существующему хранилищу аналитики (BigQuery, Snowflake, Postgres, ClickHouse, Redshift, Databricks или Mixpanel) и считает результаты экспериментов прямо там, SQL-запросами. Сам GrowthBook хранит только конфигурацию — какие флаги существуют, правила таргетинга, какие метрики считать значимыми.

Отсюда следствие: данные пользователей не копируются ещё в одну систему, GrowthBook просто читает их из вашего хранилища. Для полноценной A/B-статистики нужен настроенный источник событий — без него GrowthBook работает как обычный сервис feature flags, просто без расчёта конверсий по вариантам.

Self-hosted версия бесплатна без ограничений по числу флагов, окружений и пользователей — платный Cloud-тариф GrowthBook.io берёт деньги за хостинг, а не за функциональность. Если у вас уже настроен PostHog или другая аналитика с SQL-доступом, GrowthBook встраивается в существующий стек; если аналитики пока нет — можно начать с feature flags, а статдвижок подключить позже.

Что нужно перед установкой

GrowthBook состоит из двух сервисов в одном образе (API и Web UI) плюс MongoDB для хранения конфигурации флагов, экспериментов и метрик.

Понадобится:

  • VPS с 2 vCPU / 4 GB RAM — 4 GB дают запас на рост числа флагов и экспериментов;
  • Ubuntu 24.04 (или любой дистрибутив, где работает Docker);
  • установленные Docker и Docker Compose plugin;
  • домен или поддомен, направленный на IP сервера — для SSL и доступа команды к UI.

Если Docker ещё не установлен:

curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
newgrp docker

Проверка:

docker --version
docker compose version

Про аккуратную установку Docker и Compose на Ubuntu с нуля — отдельный разбор в статье про Docker Compose для продакшена.

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

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

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

docker-compose.yml для GrowthBook и MongoDB

Создаём рабочую директорию:

mkdir -p ~/growthbook && cd ~/growthbook

Файл .env с секретами:

MONGO_USER=growthbook
MONGO_PASSWORD=замените-на-длинный-случайный-пароль
MONGO_DB=growthbook
JWT_SECRET=замените-на-случайную-строку-32-символа
ENCRYPTION_KEY=замените-на-другую-случайную-строку

Генерировать пароли и ключи лучше сразу, а не придумывать на ходу:

openssl rand -base64 32

docker-compose.yml:

services:
  growthbook-mongo:
    image: mongo:7
    restart: unless-stopped
    environment:
      MONGO_INITDB_ROOT_USERNAME: ${MONGO_USER}
      MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD}
      MONGO_INITDB_DATABASE: ${MONGO_DB}
    volumes:
      - growthbook-mongo-data:/data/db
    healthcheck:
      test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"]
      interval: 10s
      timeout: 5s
      retries: 10
    networks:
      - growthbook-net

  growthbook:
    image: growthbook/growthbook:latest
    restart: unless-stopped
    depends_on:
      growthbook-mongo:
        condition: service_healthy
    ports:
      - "127.0.0.1:3100:3100"
      - "127.0.0.1:3000:3000"
    environment:
      MONGODB_URI: mongodb://${MONGO_USER}:${MONGO_PASSWORD}@growthbook-mongo:27017/${MONGO_DB}?authSource=admin
      JWT_SECRET: ${JWT_SECRET}
      ENCRYPTION_KEY: ${ENCRYPTION_KEY}
      APP_ORIGIN: https://flags.вашдомен.ru
      API_HOST: https://flags.вашдомен.ru/api
    volumes:
      - growthbook-uploads:/usr/local/src/app/packages/back-end/uploads
    networks:
      - growthbook-net

networks:
  growthbook-net:
    driver: bridge

volumes:
  growthbook-mongo-data:
  growthbook-uploads:

Порты 3000 (Web UI) и 3100 (API) пробрасываются только на loopback — снаружи сервис отдаётся через nginx с TLS. Том growthbook-uploads хранит загруженные изображения (например, для визуальных экспериментов) и без него пропадёт при пересоздании контейнера.

Поднимаем:

docker compose up -d
docker compose logs -f growthbook

В логах должно появиться сообщение о старте сервера на портах 3000 и 3100. Если контейнер падает сразу после старта — почти всегда причина в MONGODB_URI: проверьте, что пароль в .env совпадает с тем, что MongoDB реально приняла при первом запуске (после смены пароля старый том нужно пересоздавать — MongoDB не подхватывает новый пароль на лету).

Публикация через nginx и SSL

Держать GrowthBook доступным только через проброс порта небезопасно — в UI хранятся API-ключи с доступом к вашим данным. Если nginx как reverse proxy ещё не настроен, база разложена в статье про nginx как обратный прокси на VPS.

Конфиг для GrowthBook — важный нюанс в том, что UI и API это разные пути на одном домене:

server {
    listen 80;
    server_name flags.вашдомен.ru;

    location /api/ {
        proxy_pass http://127.0.0.1:3100/;
        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;
    }

    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;
    }
}

Сертификат через Certbot:

sudo certbot --nginx -d flags.вашдомен.ru

Certbot сам допишет блок для 443-го порта и редирект с http на https. Если сертификат не обновится автоматически через 90 дней — типовые причины разобраны в статье SSL-сертификат не обновился.

После проверки, что всё работает через домен, закройте порты 3000 и 3100 от внешнего мира на уровне файрвола на случай, если они где-то были открыты без 127.0.0.1: в пробросе:

sudo ufw deny 3000/tcp
sudo ufw deny 3100/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

Базовая настройка UFW на Ubuntu — в статье про настройку файрвола UFW.

Первый вход и создание флага

Открываем https://flags.вашдомен.ru, создаём аккаунт администратора — при первом заходе GrowthBook сам предложит форму регистрации, отдельного дефолтного пароля тут нет. Дальше система проведёт через базовую настройку: Organization (рабочее пространство команды), Project (группа флагов и экспериментов — отдельный под каждое приложение, если их несколько) и SDK Connection — язык/платформа приложения (JavaScript, React, Node.js, Python, Go, Ruby, PHP, iOS, Android) и ключ клиента, который генерируется в разделе SDKs → SDK Connections.

Даже без подключённого хранилища данных GrowthBook полноценно работает как flag-сервис. Создание флага — Features → Add Feature: задаётся ключ (например, new-checkout-flow), тип значения (boolean, string, number или JSON) и правила показа по окружениям (dev/staging/production), которые настраиваются независимо друг от друга.

Пример SDK для Node.js:

npm install @growthbook/growthbook
import { GrowthBook } from '@growthbook/growthbook';

const gb = new GrowthBook({
  apiHost: 'https://flags.вашдомен.ru/api',
  clientKey: 'ваш-sdk-ключ',
  enableDevMode: true,
});

await gb.loadFeatures();

if (gb.isOn('new-checkout-flow')) {
  // новая логика
} else {
  // старая логика
}

SDK кэширует последнее полученное состояние флагов локально — если GrowthBook временно недоступен, приложение продолжает работать на последних известных значениях, а не падает. Правила таргетинга задаются в UI: по проценту пользователей (постепенный раскат 5% → 25% → 100%), по атрибутам из запроса (страна, план подписки, версия приложения) или комбинацией условий.

A/B-тесты: источник данных и первый эксперимент

Чтобы получить статистику по экспериментам, а не только on/off флаги, GrowthBook нужен доступ на чтение к вашему хранилищу событий — подключается в разделе Metrics and Data → Data Sources. Поддерживаются Postgres/MySQL, BigQuery, ClickHouse, Snowflake и Mixpanel/Segment — для каждого нужны свои учётные данные с правами только на чтение.

После подключения GrowthBook просит описать схему событий — через готовый шаблон (Segment, RudderStack, Amplitude-совместимая схема) или вручную SQL-запросом, возвращающим нужные поля (user_id, timestamp, event name). На основе схемы создаются метрики — конверсия, выручка на пользователя, время до события, — которые привязываются к экспериментам. Это самая трудоёмкая часть настройки, зависящая от того, насколько аккуратно организовано хранилище событий. Если аналитики пока нет вообще, для начала имеет смысл поднять PostHog на том же VPS — у него есть встроенное хранилище событий, к которому GrowthBook подключается через SQL-коннектор.

Создание эксперимента — Experiments → Add Experiment. Он привязывается к существующему feature flag или создаётся как отдельный визуальный/URL-редирект эксперимент, задаются варианты с процентами распределения трафика и метрики из ранее настроенных — обычно одна главная (например, конверсия в оплату) и несколько дополнительных для контроля побочных эффектов.

GrowthBook по умолчанию использует байесовский подход к статистической значимости вместо классического частотного — вместо p-value он показывает вероятность того, что вариант B лучше варианта A, и ожидаемый прирост с доверительным интервалом. Это требует отдельного понимания вероятностных интервалов — не то же самое, что бинарное «значимо / не значимо». Точных сроков набора значимости дать нельзя, это зависит от трафика, базовой конверсии и размера эффекта; GrowthBook показывает калькулятор нужного размера выборки прямо при создании эксперимента.

Обновление и бэкапы

Флаги, эксперименты, метрики и подключения к источникам данных хранятся в MongoDB, поэтому бэкапить нужно именно её:

docker compose exec growthbook-mongo mongodump --authenticationDatabase admin -u growthbook -p ваш-пароль --db growthbook --archive=/tmp/gb_backup.archive
docker cp $(docker compose ps -q growthbook-mongo):/tmp/gb_backup.archive ./growthbook_backup_$(date +%Y%m%d).archive

Разумно вынести в cron и хранить копии отдельно от сервера. Восстановление:

docker cp ./growthbook_backup_20260825.archive $(docker compose ps -q growthbook-mongo):/tmp/restore.archive
docker compose exec growthbook-mongo mongorestore --authenticationDatabase admin -u growthbook -p ваш-пароль --archive=/tmp/restore.archive

Обновление образа — стандартно для Docker Compose:

docker compose pull growthbook
docker compose up -d growthbook

Перед мажорным обновлением стоит свериться с release notes на GitHub — между крупными версиями иногда меняется формат хранения экспериментов. Миграции применяются автоматически при старте контейнера, но свежий бэкап перед обновлением лишним не будет.

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

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

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

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

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

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

Можно ли использовать GrowthBook только как feature-flag сервис, без A/B-тестов?

Да, это полноценный сценарий. Источник данных нужен только для статистики по экспериментам — сами флаги работают независимо от него.

Чем GrowthBook отличается от Unleash, если оба self-hosted и бесплатные?

У Unleash нет встроенного статдвижка для A/B-тестов — сравнение конверсий приходится делать во внешней аналитике. GrowthBook изначально проектировался как инструмент экспериментов, а flags — база для него.

Нужна ли своя аналитика (data warehouse), если я просто хочу гонять эксперименты?

Да, без источника данных с событиями пользователей GrowthBook не посчитает конверсию по вариантам — он не собирает эти данные сам, а читает их из вашего хранилища через SQL.

Что будет, если контейнер GrowthBook временно упадёт — приложение тоже упадёт?

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

MongoDB обязательна, или можно на Postgres?

GrowthBook хранит служебную конфигурацию именно в MongoDB — это отдельная база от источника данных для аналитики, которым может быть Postgres, BigQuery и так далее. Установка MongoDB разобрана в статье про MongoDB на VPS, сравнение с Postgres — в статье MongoDB или PostgreSQL.

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

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

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