GrowthBook на Ubuntu 24.04: пошаговая установка
Feature flags и A/B-тесты в облачном SaaS быстро упираются в лимиты бесплатного тарифа или в цену за платный — а данные о поведении пользователей утекают к третьей стороне. GrowthBook решает обе проблемы: open-source платформа с полноценным движком экспериментов, которую можно развернуть на своём сервере за 20-30 минут. Ниже — рабочая установка на чистой Ubuntu 24.04 через Docker Compose, с MongoDB, Nginx и SSL.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что такое GrowthBook и когда он нужен
GrowthBook — открытая платформа для feature flags и A/B-тестирования с собственным движком статистики (байесовским и частотным). В отличие от LaunchDarkly или Optimizely, у неё нет обязательной подписки за пользователя — self-hosted версия бесплатна, лицензия MIT для ядра.
Типичные сценарии:
- постепенный раскат новой фичи на % пользователей без деплоя;
- A/B-тесты интерфейса и ценообразования с расчётом статзначимости;
- кастомные метрики через подключение к вашей аналитической базе (ClickHouse, BigQuery, Snowflake, Postgres, MySQL, Mixpanel).
Если у вас уже есть self-hosted аналитика — например, PostHog или Matomo — GrowthBook закрывает нишу именно экспериментов, а не сбора событий как таковых. Ближайшая альтернатива по классу задач — Unleash, но у него упор на фиче-флаги, а движок A/B-статистики слабее.
Для установки хватит 2 vCPU / 4 ГБ RAM на старте — GrowthBook App-сервер и MongoDB вместе едят немного, пока база экспериментов небольшая. Под нагрузку с сотнями тысяч событий в день закладывайте 8 ГБ и отдельный диск под MongoDB.
Подготовка сервера
Обновите систему и поставьте базовые пакеты:
apt update && apt upgrade -y
apt install -y curl git ufw
Настройте файрвол — открываем только SSH, HTTP и HTTPS:
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
Создайте отдельного пользователя для деплоя, если работаете не под root — практика правильная, но не обязательная для тестового стенда:
adduser deploy
usermod -aG sudo deploy
Проверьте, что у сервера есть A-запись домена, направленная на его IP — она понадобится для SSL на шаге с Nginx. Если домена пока нет, можно ограничиться доступом по IP и HTTP, но для продакшена это не вариант — GrowthBook работает с cookie и токенами, без HTTPS часть функций (например, встроенный webhook) будет капризничать.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверУстановка Docker и Docker Compose
GrowthBook официально поставляется как набор Docker-образов, и это самый надёжный путь установки — вручную собирать Node.js-приложение и MongoDB отдельными сервисами смысла нет.
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
usermod -aG docker $USER
После добавления в группу docker перелогиньтесь (exit и зайдите заново по SSH), иначе команды docker будут требовать sudo. Проверьте версии:
docker --version
docker compose version
На Ubuntu 24.04 официальный скрипт ставит Docker Engine с плагином Compose V2 (команда docker compose, без дефиса) — это важно, потому что часть старых мануалов по GrowthBook ссылается на устаревший docker-compose (с дефисом), которого в свежей установке просто нет.
Разворачиваем GrowthBook через Docker Compose
Создайте директорию проекта и файл docker-compose.yml:
mkdir -p /opt/growthbook && cd /opt/growthbook
nano docker-compose.yml
Минимальный рабочий конфиг с MongoDB как хранилищем:
services:
mongo:
image: mongo:7
restart: always
volumes:
- mongo-data:/data/db
command: ["--wiredTigerCacheSizeGB", "0.5"]
growthbook:
image: growthbook/growthbook:latest
restart: always
ports:
- "127.0.0.1:3000:3000"
- "127.0.0.1:3100:3100"
depends_on:
- mongo
environment:
- MONGODB_URI=mongodb://mongo:27017/growthbook
- APP_ORIGIN=https://growthbook.example.com
- API_HOST=https://growthbook.example.com/api
- JWT_SECRET=замените-на-случайную-строку-минимум-32-символа
- ENCRYPTION_KEY=замените-на-другую-случайную-строку-32-символа
volumes:
- uploads:/usr/local/src/app/packages/back-end/uploads
volumes:
mongo-data:
uploads:
Порты 3000 (веб-интерфейс) и 3100 (API) намеренно забиндены только на 127.0.0.1 — наружу их отдаст Nginx по HTTPS, напрямую в интернет контейнер смотреть не должен.
JWT_SECRET и ENCRYPTION_KEY сгенерируйте отдельно, не оставляйте плейсхолдеры:
openssl rand -base64 32
Замените домен growthbook.example.com в APP_ORIGIN и API_HOST на реальный. Запускаем:
docker compose up -d
docker compose ps
Первый запуск создаёт индексы в MongoDB и может занять минуту-две — проверьте логи, если контейнер growthbook перезапускается:
docker compose logs -f growthbook
Настройка Nginx и SSL
Ставим Nginx и Certbot напрямую на хост — для одного сервиса это проще, чем городить ещё один контейнер с reverse-proxy:
apt install -y nginx certbot python3-certbot-nginx
Конфиг /etc/nginx/sites-available/growthbook:
server {
listen 80;
server_name growthbook.example.com;
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;
}
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;
}
}
Активируем и получаем сертификат:
ln -s /etc/nginx/sites-available/growthbook /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
certbot --nginx -d growthbook.example.com
Certbot сам пропишет редирект на HTTPS и настроит автопродление через systemd-таймер. Если сертификат почему-то не выпускается — чаще всего дело в том, что DNS ещё не разрешился или порт 80 занят другим сервисом; подробный разбор причин есть в статье про ошибки Let's Encrypt на сервере.
После этого шага откройте https://growthbook.example.com — должна открыться страница создания первого аккаунта администратора.
Первичная настройка: организация, SDK-подключение, первый флаг
При первом входе GrowthBook попросит создать организацию и предложит выбрать язык SDK для интеграции — доступны React, Node.js, PHP, Python, Go, Ruby, Java, а также чистый JavaScript для клиентских приложений.
Базовый флоу такой:
- Environments — по умолчанию есть
productionиstaging, можно добавить свои (например,development). - SDK Connections → создать подключение, выбрать окружение и платформу — GrowthBook выдаст
Client Keyи код инициализации SDK. - Features → создать первый флаг, например
new-checkout-flow, тип Boolean, значение по умолчаниюfalse. - В коде приложения подключаете SDK и проверяете флаг:
import { GrowthBook } from "@growthbook/growthbook";
const gb = new GrowthBook({
apiHost: "https://growthbook.example.com/api",
clientKey: "sdk-xxxxxxxxxxxx",
});
await gb.loadFeatures();
if (gb.isOn("new-checkout-flow")) {
// новая версия
}
Для A/B-тестов логика та же, только вместо isOn используется gb.getFeatureValue() с несколькими вариантами и заданным весом трафика — GrowthBook сам считает, в какую группу попал пользователь, детерминированно по хэшу его ID.
Подключение источника данных для экспериментов
Флаги работают сразу «из коробки», но чтобы GrowthBook считал статзначимость A/B-тестов, ему нужен доступ к сырым событиям. Идём в Metrics and Data → Data Sources и подключаем одну из поддерживаемых баз.
Если у вас уже есть PostgreSQL на этом же или соседнем сервере, можно направить туда события из приложения и подключить как источник напрямую — GrowthBook умеет строить метрики через SQL-запросы (например, «конверсия = количество строк в таблице orders с user_id, сгруппированных по варианту эксперимента»).
Для связки с MongoDB как источником данных (не путать с MongoDB под саму платформу GrowthBook — это разные базы) настройки задаются в том же разделе через строку подключения. Учтите: подключение из контейнера growthbook к внешней базе идёт по сети Docker или через хост — если база на этом же сервере вне Docker, используйте host.docker.internal (нужно явно прописать extra_hosts в compose-файле) либо IP хост-машины в сети Docker-моста.
Пример метрики-конверсии через SQL-редактор в интерфейсе:
SELECT
user_id,
timestamp
FROM orders
WHERE status = 'completed'
GrowthBook сам сопоставит user_id с назначением варианта эксперимента и посчитает доверительный интервал.
Бэкапы, обновление и типовые проблемы
Бэкап — всё состояние платформы (флаги, эксперименты, настройки) хранится в MongoDB, поэтому достаточно бэкапить один volume:
docker compose exec mongo mongodump --archive=/data/db/backup-$(date +%F).gz --gzip
docker cp $(docker compose ps -q mongo):/data/db/backup-$(date +%F).gz ./backups/
Разумно вынести это в cron и складывать архивы отдельно от сервера — на случай если сервер целиком станет недоступен.
Обновление — тянем свежий образ и пересоздаём контейнер:
docker compose pull growthbook
docker compose up -d growthbook
MongoDB при этом не трогаем, если major-версия не менялась. Перед обновлением на новую мажорную версию GrowthBook стоит свериться с их release notes — миграции схемы иногда требуют однократного скрипта.
Частые проблемы на практике:
- Контейнер
growthbookв рестарт-луп после старта — почти всегда неверныйMONGODB_URI(опечатка в имени сервисаmongoили отсутствующийdepends_on). Смотритеdocker compose logs growthbook— ошибка подключения к базе видна сразу. - Флаги не долетают до SDK в проде — проверьте, что
API_HOSTв переменных окружения совпадает с реальным публичным адресом, а не осталсяlocalhost:3100по умолчанию. - После обновления SSL через Certbot слетает проксирование
/api/— обычно это старый location-блок Nginx безproxy_set_header X-Forwarded-Proto, из-за чего GrowthBook формирует ссылки сhttp://внутриhttps://-страницы. - Долгая загрузка дашборда с большим числом событий — это на стороне источника данных (SQL-запросы к вашей аналитической базе), не самого GrowthBook; проверяйте индексы на полях, по которым строятся метрики.
Если сервису тесно на одном сервере с другими контейнерами — вынесите MongoDB на отдельный volume большего размера или на отдельную VM; сама платформа GrowthBook по CPU нетребовательна, узкое место почти всегда база данных под большим потоком событий.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Нужен ли отдельный сервер под GrowthBook или можно на общем с другими сервисами?
Для небольших и средних нагрузок (до нескольких десятков активных экспериментов) хватит общего сервера — сама платформа лёгкая. Разделять стоит, когда MongoDB под GrowthBook начинает конкурировать за диск и память с другими базами.
Чем GrowthBook отличается от Unleash?
Unleash сильнее как чистая система feature flags (гибкие стратегии выката, много готовых интеграций), GrowthBook — как платформа A/B-тестирования со встроенной статистикой. Если нужны только флаги — сравните оба варианта, у нас есть отдельная статья по установке Unleash.
Можно ли работать без своей аналитической базы, только с флагами?
Да, модуль feature flags полностью независим от Data Sources — подключать источник данных нужно только для расчёта статистики по экспериментам.
Обязателен ли Docker или можно поставить из исходников?
Официально поддерживается только Docker-развёртывание (или Kubernetes через Helm-чарт для крупных инсталляций) — сборка из исходников возможна, но не документирована и не гарантирует совместимость при обновлениях.
Что будет, если контейнер MongoDB упадёт?
Приложение GrowthBook перестанет отдавать флаги через API (SDK у клиентов при этом обычно продолжат работать на последнем закэшированном значении, если так настроено), а веб-интерфейс станет недоступен до восстановления MongoDB — поэтому бэкапы и restart: always в compose-файле не опциональны.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →