GrowthBook в Docker Compose: готовый файл
Если вы устали от лимитов бесплатных тарифов 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 эксперименты) |
|---|---|---|
| CPU | 1 vCPU | 2 vCPU |
| RAM | 2 GB | 4 GB |
| Диск | 15 GB SSD | 30 GB SSD |
| ОС | Ubuntu 22.04/24.04 | Ubuntu 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 ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →