Formbricks на Ubuntu 24.04: пошаговая установка
Formbricks — открытая альтернатива Typeform и Google Forms: формы, опросы, NPS и продуктовые исследования с логикой ветвления вопросов, но без ежемесячной подписки и без чужих серверов, на которых оседают ответы ваших пользователей. Разворачивается он в Docker, требует PostgreSQL и немного терпения с переменными окружения — ниже пошаговая установка на чистый VPS с Ubuntu 24.04, от подготовки сервера до рабочего HTTPS-домена.
Содержание
- Что понадобится и сколько ресурсов заложить
- Подготовка сервера: обновления, файрвол, Docker
- Разворачиваем Formbricks через docker-compose
- Nginx как обратный прокси и HTTPS через Certbot
- Первый запуск: создание организации и первой формы
- Резервное копирование базы данных
- Обновление Formbricks и типовые проблемы
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что понадобится и сколько ресурсов заложить
Formbricks — это Node.js-приложение (Next.js) плюс PostgreSQL, упакованные официально в docker-compose. Для тестового стенда хватит 2 vCPU и 4 ГБ RAM, но если формы будут собирать заметный трафик (десятки одновременных заполнений, вебхуки, интеграции) — комфортнее на 4 ГБ и выше, потому что и Node-процесс, и Postgres любят запас по памяти под кэш и сборку мусора.
Что нужно заранее:
- VPS с Ubuntu 24.04, доступ по SSH с правами sudo;
- доменное имя (поддомен вида forms.example.com), A-запись указывает на IP сервера;
- открытые порты 80 и 443 в файрволе.
Если сервера ещё нет, для такой задачи достаточно младшего VPS — Formbricks не требователен к диску (база растёт медленно, ответы на формы — это текст и JSON, не медиафайлы).
Подготовка сервера: обновления, файрвол, Docker
Начинаем с обновления системы и установки базовых утилит:
sudo apt update && sudo apt upgrade -y
sudo apt install -y ca-certificates curl gnupg ufw
Настраиваем файрвол — оставляем только SSH, HTTP и HTTPS:
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
Ставим Docker Engine и Docker Compose plugin по официальному репозиторию Docker (пакет docker.io из репозитория Ubuntu тоже подойдёт для простых сценариев, но официальный репозиторий даёт более свежую версию compose-плагина):
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Проверяем, что всё встало, и добавляем текущего пользователя в группу docker, чтобы не писать sudo перед каждой командой:
sudo usermod -aG docker $USER
newgrp docker
docker compose version
Если предпочитаете отдельную статью по этому шагу — есть подробный разбор установки Docker и Compose для продакшена: Docker Compose для продакшена на Ubuntu 24.04.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверРазворачиваем Formbricks через docker-compose
Formbricks официально распространяется как docker-compose-стек, который сам поднимает PostgreSQL внутри того же compose-файла — отдельно устанавливать базу не нужно, если вас устраивает контейнерная СУБД (для нагруженных инсталляций многие выносят Postgres на отдельный managed-сервис, но для старта штатной связки достаточно).
Создаём рабочую директорию и скачиваем конфиг:
mkdir -p ~/formbricks && cd ~/formbricks
curl -o docker-compose.yml https://raw.githubusercontent.com/formbricks/formbricks/main/docker-compose.yml
Перед первым запуском стоит открыть файл и свериться с актуальной версией на момент установки — проект развивается быстро, и структура сервисов (formbricks, postgres, при необходимости traefik) может немного отличаться от того, что было полгода назад. Смотрите на секции services: — там должны быть как минимум сервис самого приложения и сервис postgres с volume для данных.
Официальный образ сам умеет сгенерировать .env при первом запуске интерактивного скрипта, но для сервера удобнее заполнить переменные вручную и запускать без интерактива. Создаём .env рядом с compose-файлом:
nano .env
Минимальный набор переменных:
WEBAPP_URL=https://forms.example.com
NEXTAUTH_URL=https://forms.example.com
NEXTAUTH_SECRET=замените-на-случайную-строку-32-байта
ENCRYPTION_KEY=замените-на-случайную-строку-32-байта
POSTGRES_PASSWORD=замените-на-надёжный-пароль
DATABASE_URL=postgresql://postgres:замените-на-надёжный-пароль@postgres:5432/formbricks
Секреты генерируем локально, не вручную «с потолка»:
openssl rand -hex 32
Выполните команду дважды — для NEXTAUTH_SECRET и для ENCRYPTION_KEY нужны разные значения. Пароль для Postgres в POSTGRES_PASSWORD и в DATABASE_URL должен совпадать дословно.
Запускаем стек:
docker compose up -d
docker compose ps
Первый запуск занимает время — Formbricks применяет миграции базы данных при старте. Смотрим логи, пока не появится сообщение о готовности приложения:
docker compose logs -f formbricks
Если контейнер приложения перезапускается в цикле — почти всегда причина в DATABASE_URL (опечатка в пароле или в имени сервиса postgres, если вы переименовали сервис в compose-файле) либо в том, что Postgres ещё не успел подняться к моменту первого коннекта; штатный depends_on с healthcheck в официальном compose-файле обычно это покрывает, но при кастомизации проверьте это в первую очередь.
Nginx как обратный прокси и HTTPS через Certbot
Formbricks в контейнере слушает свой внутренний порт (по умолчанию 3000), наружу его напрямую открывать не стоит — ставим Nginx перед ним и вешаем валидный сертификат.
sudo apt install -y nginx
Конфиг сайта:
sudo nano /etc/nginx/sites-available/formbricks
server {
listen 80;
server_name forms.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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;
client_max_body_size 20m;
}
}
Заголовки Upgrade/Connection нужны для WebSocket-соединений, которые Formbricks использует для живого предпросмотра форм в редакторе — без них редактор будет работать, но обновление превью может подглючивать.
Активируем сайт и проверяем синтаксис:
sudo ln -s /etc/nginx/sites-available/formbricks /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Получаем сертификат Let's Encrypt:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d forms.example.com
Certbot сам допишет блок listen 443 ssl и настроит редирект с 80 на 443. Если хотите разобраться в альтернативах certbot (acme.sh, ручной DNS-challenge для wildcard-сертификатов) — есть отдельный разбор: Certbot или acme.sh — что выбрать для сервера. А если после установки сертификата Nginx вдруг не применяет SSL-конфиг — типовые причины разобраны здесь: Nginx не применяет SSL: причины и решение.
После установки сертификата убедитесь, что WEBAPP_URL и NEXTAUTH_URL в .env указывают именно на https:// — иначе авторизация и генерация ссылок на формы будут кривыми. Если меняли .env после первого запуска, перезапустите приложение:
docker compose up -d
Первый запуск: создание организации и первой формы
Открываем https://forms.example.com в браузере. Formbricks предложит создать аккаунт администратора — это ваш первый пользователь и владелец организации внутри системы (не путать с системным пользователем сервера). Дальше:
- Создаёте организацию (workspace) — в бесплатной self-hosted версии ограничений на количество организаций и проектов практически нет, в отличие от облачного тарифа.
- Внутри организации создаёте проект (Project) — под сайт, продукт или отдел.
- В проекте создаёте первую форму (Survey) — из шаблона (NPS, форма обратной связи, product-market fit) или с нуля.
В конструкторе форм логика ветвления настраивается через блок «Logic» на каждом вопросе: можно вести пользователя на разные следующие вопросы в зависимости от ответа, скрывать вопросы по условию, завершать опрос досрочно при определённом ответе. Это ключевое отличие от простых форм — Formbricks проектировался как инструмент продуктовых исследований, а не просто конструктор анкет.
Для встраивания формы на сайт есть три пути: полноэкранная ссылка, встроенный <iframe>-виджет и JS SDK для триггеров по событиям (например, показать опрос после определённого действия пользователя в приложении). Код вставки Formbricks генерирует сам во вкладке «Share» каждой формы.
Резервное копирование базы данных
Все ответы, формы и настройки живут в PostgreSQL-контейнере — бэкапить нужно именно базу. Простой снапшот через pg_dump из контейнера:
docker compose exec postgres pg_dump -U postgres formbricks > formbricks_backup_$(date +%F).sql
Восстановление на новом сервере (после docker compose up -d с пустой базой):
cat formbricks_backup_2026-08-30.sql | docker compose exec -T postgres psql -U postgres formbricks
Для регулярных бэкапов добавьте команду pg_dump в cron и складывайте архивы вне сервера (объектное хранилище, второй сервер, локальный диск с ротацией) — если сервер физически недоступен, локальная копия рядом с той же базой не спасёт. Общие принципы настройки и восстановления PostgreSQL на VPS, если нужно углубиться, описаны в статье PostgreSQL на Ubuntu 24.04: пошаговая установка — она пригодится, если решите вынести базу из контейнера на отдельный managed-инстанс для более серьёзной нагрузки.
Обновление Formbricks и типовые проблемы
Обновление до новой версии — это обновление образа и перезапуск стека:
cd ~/formbricks
docker compose pull
docker compose up -d
Перед обновлением на продакшене сделайте pg_dump — миграции базы данных при мажорных обновлениях иногда необратимы, откатиться проще из бэкапа, чем разбираться постфактум.
Частые проблемы при установке:
- Контейнер приложения падает сразу после старта. Смотрите
docker compose logs formbricks— в 90% случаев причина в неверномDATABASE_URLили в том, чтоNEXTAUTH_SECRET/ENCRYPTION_KEYне заданы вовсе (Formbricks откажется стартовать без них). - Страница открывается, но письма-приглашения не уходят. Нужно настроить SMTP-переменные (
SMTP_HOST,SMTP_PORT,SMTP_USER,SMTP_PASSWORD,MAIL_FROM) в.env— без них транзакционные письма (приглашения в команду, уведомления) просто не отправляются, и это не ошибка, а отсутствие конфигурации. - Формы не сохраняются в конструкторе. Обычно это WebSocket через прокси — проверьте заголовки
Upgrade/Connectionв конфиге Nginx выше. - После обновления сервер не отвечает. Проверьте, не остался ли контейнер в состоянии применения миграции —
docker compose logs -fпокажет, если миграция ещё выполняется; для крупной базы это может занять несколько минут.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Formbricks бесплатен полностью или только self-hosted версия?
Self-hosted редакция — с открытым исходным кодом и без ограничений по числу форм, ответов и пользователей внутри вашей инсталляции. Облачная версия от разработчиков — платная подписка с тарифными лимитами; это разные продукты на одной кодовой базе.
Можно ли использовать внешний PostgreSQL вместо контейнера из compose-файла?
Да, просто уберите сервис postgres из docker-compose.yml (или не поднимайте его) и укажите в DATABASE_URL адрес вашего внешнего инстанса — работать будет так же, разница только в том, кто управляет резервным копированием и апдейтами базы.
Нужен ли Redis для Formbricks?
В части конфигураций (в основном для функций типа rate-limiting в облачной версии) Redis используется опционально; для базовой self-hosted установки по актуальному официальному compose-файлу он не обязателен — сверяйтесь с конкретной версией конфига, который вы скачали.
Как перенести Formbricks на другой сервер?
Бэкапите базу через pg_dump, переносите .env (не забыв поменять WEBAPP_URL/NEXTAUTH_URL на новый домен, если он меняется), поднимаете тот же docker-compose на новом сервере и восстанавливаете дамп через psql — как показано в разделе про бэкапы выше.
Formbricks можно встроить в мобильное приложение, а не только на сайт?
Да, у проекта есть SDK для React Native и других платформ помимо веба, но это отдельная интеграция поверх того же self-hosted бэкенда — сама установка сервера от этого не меняется.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →