MAATRIX / Блог / GrowthBook в Docker Compose: готовый файл

GrowthBook в Docker Compose: готовый файл

MAATRIX

Если вы устали от лимитов бесплатных тарифов LaunchDarkly или Split.io, а платить $500+ в месяц за feature flags и A/B-тесты не готовы — есть рабочая альтернатива. GrowthBook — open-source платформа с полным набором возможностей: feature flags, эксперименты, statistical engine на Bayesian и Frequentist методах, интеграция с вашим Data Warehouse. Разворачивается в Docker Compose за один файл, данные остаются на вашем сервере, а не в чужом облаке.

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

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

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

Что такое GrowthBook и зачем он нужен

GrowthBook — это платформа для feature flag management и A/B-тестирования с открытым исходным кодом (лицензия MIT для core-функций, часть enterprise-фич — по коммерческой лицензии). Ключевое отличие от конкурентов вроде LaunchDarkly или Optimizely — GrowthBook не собирает и не хранит event-данные пользователей у себя. Вместо этого он подключается к вашему уже существующему хранилищу аналитики (Postgres, ClickHouse, BigQuery, Snowflake, Mixpanel и т.д.) и считает статистику по результатам эксперимента прямо там.

Это значит два практических следствия:

  • Данные не покидают вашу инфраструктуру. Для проектов с требованиями по 152-ФЗ или просто нежеланием отправлять поведенческие данные пользователей в US-облако это существенный плюс.
  • Сам GrowthBook — легкий сервис. Он хранит только конфигурацию флагов, метаданные экспериментов и настройки — в MongoDB. Никакой тяжелой event-обработки внутри самого приложения нет, поэтому сервер под него не нужен мощный.

Self-hosted версия покрывает практически весь функционал: неограниченное число флагов, окружений, экспериментов, SDK для JS/Node/Python/Go/Ruby/PHP/Java/.NET/Flutter, визуальный редактор экспериментов, вебхуки. За рамками open-source остаются в основном enterprise-фичи вроде SSO с SAML, продвинутого RBAC и аудит-логов — для команды до 15-20 человек это обычно не критично.

Требования к серверу

GrowthBook сам по себе не прожорлив — вся тяжелая работа (агрегация метрик) делегируется внешнему Data Warehouse. Для старта достаточно:

РесурсМинимумКомфортно (5-10 разработчиков, active-active эксперименты)
CPU1 vCPU2 vCPU
RAM2 GB4 GB
Диск15 GB SSD30 GB SSD
ОСUbuntu 22.04/24.04Ubuntu 24.04

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

Если вы уже держите Postgres или ClickHouse под аналитику на отдельном сервере — GrowthBook можно ставить рядом с приложением, обращение к warehouse пойдет по сети. Если аналитики пока нет вообще, для старта подойдет связка с обычным Postgres, куда SDK будет писать события через собственный event-tracker (или через существующий у вас Segment/RudderStack).

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

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

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

Docker Compose файл

Официальный образ GrowthBook публикует единый контейнер growthbook/growthbook, который включает и API, и веб-интерфейс. Плюс отдельный контейнер MongoDB для хранения конфигурации.

Создайте директорию проекта и файл docker-compose.yml:

mkdir -p ~/growthbook && cd ~/growthbook
mkdir -p mongo-data uploads
# docker-compose.yml
services:
  mongo:
    image: mongo:7
    container_name: growthbook-mongo
    restart: unless-stopped
    volumes:
      - ./mongo-data:/data/db
    environment:
      MONGO_INITDB_ROOT_USERNAME: gbadmin
      MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD}
    command: ["mongod", "--quiet"]
    networks:
      - growthbook-net

  growthbook:
    image: growthbook/growthbook:latest
    container_name: growthbook-app
    restart: unless-stopped
    ports:
      - "127.0.0.1:3000:3000"
      - "127.0.0.1:3100:3100"
    depends_on:
      - mongo
    environment:
      MONGODB_URI: mongodb://gbadmin:${MONGO_PASSWORD}@mongo:27017/growthbook?authSource=admin
      APP_ORIGIN: https://${DOMAIN}
      API_HOST: https://${DOMAIN}/api
      JWT_SECRET: ${JWT_SECRET}
      ENCRYPTION_KEY: ${ENCRYPTION_KEY}
    volumes:
      - ./uploads:/usr/local/src/app/packages/back-end/uploads
    networks:
      - growthbook-net

networks:
  growthbook-net:
    driver: bridge

Порты 3000 (веб-интерфейс) и 3100 (API для SDK) намеренно забинжены только на 127.0.0.1 — наружу их отдаст reverse-proxy с SSL. Отдельно вынесен API-порт, потому что SDK клиенты стучатся именно туда за фичефлагами, и в проде это обычно отдельный поддомен вроде api.flags.example.com, тогда как 3000 — это админка для команды.

Создайте .env рядом с compose-файлом:

# .env
DOMAIN=flags.example.com
MONGO_PASSWORD=замените-на-длинный-случайный-пароль
JWT_SECRET=замените-на-случайную-строку-32-символа
ENCRYPTION_KEY=замените-на-случайную-строку-32-символа

Сгенерировать случайные секреты можно так:

openssl rand -hex 32

Выполните команду трижды и подставьте результаты в MONGO_PASSWORD, JWT_SECRET, ENCRYPTION_KEY. Права на .env стоит сразу ограничить:

chmod 600 .env

Поднимаем стек:

docker compose up -d
docker compose logs -f growthbook

Первый запуск занимает 20-40 секунд — GrowthBook применяет миграции в MongoDB. Когда в логах появится Listening on port 3000, интерфейс готов.

Reverse-proxy и SSL

В проде GrowthBook должен ходить строго по HTTPS — API-ключи и данные экспериментов передаются в открытом виде без TLS. Проще всего поднять Caddy, который сам выпустит и обновит сертификат Let's Encrypt.

# Caddyfile
flags.example.com {
    reverse_proxy 127.0.0.1:3000
}

api.flags.example.com {
    reverse_proxy 127.0.0.1:3100
}

Если Caddy у вас тоже в Docker — добавьте growthbook-net в его сеть или проксируйте по имени контейнера. Подробный разбор автоматического SSL с Caddy — в статье про установку Caddy с авто-SSL. Если вместо Caddy у вас Traefik или nginx proxy manager — общая логика выбора между ними разобрана в сравнении Traefik и nginx proxy manager.

Не забудьте прописать оба поддомена (flags.example.com и api.flags.example.com) в DNS на IP вашего сервера, прежде чем Caddy попытается выпустить сертификаты — иначе ACME-challenge не пройдет.

Первичная настройка и подключение к Data Warehouse

Откройте https://flags.example.com, создайте аккаунт администратора (это первый и единственный шанс — регистрация закрывается после первого пользователя, дальше приглашаете команду через интерфейс).

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

  • PostgreSQL / MySQL (через прямое SQL-подключение)
  • ClickHouse
  • BigQuery, Snowflake, Redshift
  • Mixpanel (через API, без прямого доступа к БД)
  • Google Analytics 4 (через BigQuery export)

Если у вас уже настроен, например, Postgres с событиями продукта — в разделе Settings → Data Sources достаточно указать хост, базу, пользователя и SQL-шаблоны для метрик (GrowthBook подставляет их в свои запросы автоматически, но вы можете и переопределить). Если хранилища аналитики нет вовсе — для старта можно использовать встроенный GrowthBook Cloud events tracker в self-hosted режиме через собственный Postgres-контейнер, но для честного A/B-тестирования на реальных метриках рано или поздно понадобится нормальный warehouse.

Небольшой честный нюанс: без Data Warehouse GrowthBook по сути работает только как feature flag сервис — это уже полезно само по себе (управляемые флаги, поэтапные раскатки, kill switch на прод), но статистику по экспериментам он тогда считать не сможет.

Подключение SDK к приложению

После настройки флага в интерфейсе GrowthBook нужно подключить SDK на стороне приложения. Пример для Node.js:

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

const gb = new GrowthBook({
  apiHost: "https://api.flags.example.com",
  clientKey: "sdk-xxxxxxxxxxxxx", // из Settings → SDK Connections
  enableDevMode: false,
});

await gb.init({ streaming: true });

if (gb.isOn("new-checkout-flow")) {
  // показать новую версию
} else {
  // старая версия
}

Флаг streaming: true включает Server-Sent Events — SDK получает изменения флагов мгновенно, без поллинга. Для этого API-контейнер GrowthBook должен держать долгоживущие соединения, что и объясняет, зачем порт 3100 вынесен отдельно от 3000 в reverse-proxy конфиге выше.

Для фронтенда (React) есть отдельный пакет @growthbook/growthbook-react с хуками useFeatureIsOn и useExperiment, для мобильных приложений — SDK на Kotlin и Swift.

Бэкапы и обслуживание

Вся ценная информация GrowthBook — это содержимое MongoDB (конфигурация флагов, эксперименты, настройки команды). Простой бэкап через mongodump:

docker exec growthbook-mongo mongodump \
  --username gbadmin --password "$MONGO_PASSWORD" \
  --authenticationDatabase admin \
  --archive=/data/db/backup-$(date +%F).archive

Вынесите архив за пределы контейнера и добавьте в cron:

0 3 * * * docker exec growthbook-mongo mongodump --username gbadmin --password "$(grep MONGO_PASSWORD ~/growthbook/.env | cut -d= -f2)" --authenticationDatabase admin --archive=/data/db/backup-$(date +\%F).archive && find ~/growthbook/mongo-data -name "backup-*.archive" -mtime +7 -delete

Для восстановления:

docker exec -i growthbook-mongo mongorestore \
  --username gbadmin --password "$MONGO_PASSWORD" \
  --authenticationDatabase admin \
  --archive=/data/db/backup-2026-08-20.archive

Обновление самого GrowthBook — простая замена образа:

docker compose pull growthbook
docker compose up -d growthbook

Перед обновлением на мажорную версию стоит свериться с changelog на GitHub — миграции MongoDB применяются автоматически при старте контейнера, но откатить их назад без бэкапа не получится.

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

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

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

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

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

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

Чем GrowthBook отличается от LaunchDarkly в self-hosted сценарии?

LaunchDarkly не предлагает полноценный self-hosted вариант для большинства тарифов — это SaaS с закрытым кодом. GrowthBook изначально спроектирован под self-hosting, включая open-source ядро и возможность вообще не отправлять никакие данные во внешние сервисы.

Нужен ли отдельный сервер под Data Warehouse?

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

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

Да, это частый сценарий. Флаги и поэтапные раскатки работают без подключения Data Warehouse — статистика экспериментов нужна только для полноценных A/B-тестов со значимостью.

Что если забуду ENCRYPTION_KEY?

Он используется для шифрования чувствительных данных (например, API-ключей внешних интеграций) в MongoDB. Потеря ключа означает, что эти данные придется вводить заново — сами флаги и эксперименты не пострадают, но сохраните ключ в надежном месте (менеджер паролей, а не только .env на сервере).

Как масштабировать при росте команды?

GrowthBook-контейнер stateless относительно конфигурации (все хранится в MongoDB), поэтому его легко запустить в нескольких репликах за одним балансировщиком. Для большинства команд до сотни разработчиков одного инстанса на 2 vCPU / 4 GB хватает с большим запасом.

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

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

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