Budibase на сервере: частые ошибки и решения
Budibase — low-code платформа для сборки внутренних приложений и форм поверх своих данных, и на бумаге self-hosted установка выглядит просто: один скрипт, один docker-compose. На практике всё чуть сложнее — установка обрывается на середине, app-service не видит CouchDB, обновление ломает связку сервисов, а email-приглашения молча не уходят. Ниже — конкретные симптомы, причины и рабочие исправления по каждому из этих сценариев.
Содержание
- Установка через hosting.sh падает или зависает
- Budibase не открывается в браузере после установки
- App-service не может подключиться к CouchDB
- Подключение к внешним источникам данных обрывается
- Email-приглашения и уведомления не отправляются
- Контейнер падает по памяти или после обновления версии
- Перенос Budibase на другой сервер и бэкап данных
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Установка через hosting.sh падает или зависает
Стандартный способ развернуть Budibase на своём сервере — официальный скрипт:
git clone https://github.com/Budibase/budibase
cd budibase/hosting
./hosting.sh
Скрипт спрашивает порт (по умолчанию 10000), генерирует .env и docker-compose.yaml, поднимает стек. Частые сбои на этом шаге:
- Порт занят. Если на сервере уже что-то слушает 10000 (или порт, который вы указали), контейнер
proxyлибо не стартует, либо стартует, но снаружи ничего не отвечает. Проверьте заранее:
sudo ss -tulpn | grep 10000
Если порт занят — либо остановите конфликтующий сервис, либо при повторном запуске hosting.sh укажите другой порт и пропишите его же в конфиге вашего reverse proxy.
- Docker Compose V1 vs V2. Скрипт рассчитан на современный
docker compose(плагин, без дефиса). Проверьте версию:docker compose version— если команда не найдена, ставьте плагин compose отдельно, не полагаясь на старый бинарникdocker-compose. - Нет прав на запись в текущую директорию.
hosting.shсоздаёт.envиdocker-compose.yamlрядом с собой — если репозиторий склонирован от root, а скрипт запущен от обычного пользователя, файлы молча не создаются. - Недостаточно памяти уже на этапе
docker compose up. Стек поднимает сразу несколько контейнеров (proxy, app-service, worker-service, couchdb, redis) — на VPS с 1 ГБ RAM часть из них может не подняться из-за OOM ещё до первого открытия страницы. Смотритеdmesg | grep -i "out of memory".
Если что-то из перечисленного не помогло, полезно прогнать общий чек-лист по production-конфигурации Docker Compose — многие грабли здесь общие для любого self-hosted стека, не только для Budibase: Docker Compose для продакшена.
Budibase не открывается в браузере после установки
Контейнеры подняты (docker ps показывает всё Up), но по адресу сервера — таймаут или ERR_CONNECTION_REFUSED. Порядок диагностики:
- Проверьте локально на самом сервере, что proxy-контейнер вообще отвечает:
curl -I http://localhost:10000
- Если curl отвечает 200/302, а снаружи ничего — дело в файрволе. Откройте нужный порт:
sudo ufw allow 10000/tcp
- Облачный файрвол хостинга (security group) — отдельный слой поверх
ufw, проверяйте правила там тоже. - Для продакшена нужен домен и SSL, а не голый IP:порт. Правильная схема — внешний Nginx или Caddy на 80/443 с валидным сертификатом, проксирующий на внутренний порт Budibase:
server {
listen 443 ssl;
server_name apps.example.com;
location / {
proxy_pass http://127.0.0.1:10000;
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;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Заголовки Upgrade/Connection обязательны — часть внутреннего взаимодействия app-service и браузера идёт через websocket, без них builder-режим будет работать со странными задержками или обрывами соединения. Подробный разбор настройки самого reverse proxy — в статье Nginx как reverse proxy. Выпуск и продление сертификата — тема отдельная, если сомневаетесь между инструментами, сравнение есть в статье про Certbot и acme.sh.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверApp-service не может подключиться к CouchDB
Budibase хранит метаданные приложений (структуру таблиц, автоматизации, пользователей) в CouchDB — отдельном контейнере внутри того же стека. Если в логах app-service или worker-service вы видите что-то вроде ECONNREFUSED или Error: connect couchdb, проверяйте по порядку:
docker compose logs -f app-service --tail=100
- Контейнер couchdb вообще не поднялся.
docker compose ps couchdb-service— если статус неUp, смотрите его логи отдельно, часто причина в повреждённом volume после нештатной перезагрузки сервера. - Неверный
COUCH_DB_URLв.env. Если вы вручную редактировали.envили переносили конфиг с другого сервера, значение должно указывать на имя сервиса в Docker-сети (http://couchdb-service:5984), а не наlocalhost— частая ошибка при ручной правке compose-файла. - Сервисы в разных Docker-сетях. Если вы добавляли в стек свои сервисы или разносили конфиг по нескольким compose-файлам, легко случайно разорвать общую сеть — контейнеры Budibase должны оставаться в одной Docker-сети, иначе не видят друг друга по имени.
- CouchDB не успела подняться до старта app-service. На медленном диске app-service может стартовать раньше, чем CouchDB готова принимать соединения, и упасть с ошибкой один раз. Обычно
restart: unless-stoppedсам лечит это на втором рестарте — если нет, поднимайте сервисы по отдельности: сначалаdocker compose up -d couchdb-service, дождитесь готовности, потом остальное.
Подключение к внешним источникам данных обрывается
Budibase умеет подключаться не только к своей внутренней CouchDB, но и к внешним PostgreSQL, MySQL, MongoDB, REST API как к источникам данных для таблиц и форм. Здесь всплывают типичные сетевые проблемы:
Connection timed outпри добавлении datasource PostgreSQL/MySQL. Убедитесь, что база слушает внешние подключения (listen_addresses = '*'вpostgresql.conf), и что вpg_hba.confразрешён IP сервера с Budibase:
host all all <IP_servera_budibase>/32 md5
- SSL-ошибки при подключении к managed-базам (облачный PostgreSQL, RDS-подобные сервисы) — если провайдер требует SSL, а в настройках datasource SSL не включён, подключение будет либо падать, либо висеть без внятной ошибки. Проверьте галочку SSL/TLS в форме источника данных.
- Budibase и база на одном сервере, но подключение всё равно не проходит. Если база тоже в Docker, а Budibase указывает на неё через
localhostизнутри своего контейнера — это не сработает, контейнеры видят друг друга по имени сервиса, а не черезlocalhostхоста. Похожие сетевые нюансы разобраны в статье PostgreSQL не принимает подключения. - Долгая синхронизация схемы на больших таблицах. При первом подключении datasource с сотнями тысяч строк Budibase может подвисать на анализе схемы на минуту и больше — это не обрыв, торопиться перезапускать контейнер не стоит.
Email-приглашения и уведомления не отправляются
Self-hosted Budibase не идёт с готовым почтовым релеем — это ожидаемо, но новички часто не понимают, почему кнопка «пригласить пользователя» просто ничего не делает. Проверьте настройки в разделе организации (Settings → SMTP):
- Указан ли вообще SMTP-хост, порт, логин и пароль — без этого приглашения и письма о сбросе пароля не отправляются, а ошибка иногда даже не всплывает в интерфейсе.
- Совпадает ли порт с типом шифрования:
587обычно требует STARTTLS,465— SSL напрямую. Неверная комбинация — самая частая причина тихого молчания SMTP. - Не блокирует ли исходящий трафик на 587/465 файрвол хостинга — некоторые провайдеры по умолчанию закрывают исходящую почту для борьбы со спамом.
Для проверки, что дело именно в SMTP, а не в Budibase, протестируйте те же креды через swaks прямо с сервера — если письмо не уходит и оттуда, проблема на уровне сети или провайдера, а не приложения.
Контейнер падает по памяти или после обновления версии
Два разных по природе, но одинаково частых сценария поломки уже работающего Budibase.
Нехватка памяти. App-service на Node.js под нагрузкой (построение сложных автоматизаций, индексация больших таблиц в builder-режиме) может потреблять заметно больше памяти, чем кажется на старте. На серверах с 1-2 ГБ RAM это частая причина внезапных падений в OOM. Как ориентир — для стабильной работы полного стека (proxy + app-service + worker-service + couchdb + redis) закладывайте от 4 ГБ, но это именно ориентир из практики, не норматив: цифра зависит от числа пользователей и сложности приложений. Если апгрейд RAM пока не вариант — временная мера, swap-файл: он не решает вопрос производительности под нагрузкой, но не даёт серверу падать намертво.
Рассинхронизация версий сервисов после обновления. Budibase — это связка из нескольких образов (budibase/proxy, budibase/apps, budibase/worker), и они должны быть одной версии друг с другом. Если вручную обновить тег только одного образа в compose-файле, забыв про остальные, получите непонятные ошибки на стыке сервисов — от несовпадения API до отказа авторизации. Правильный путь обновления:
cd budibase/hosting
docker compose pull
docker compose up -d
Это подтягивает согласованный набор версий из официального docker-compose.yaml, а не отдельные образы вручную. Перед любым обновлением обязательно бэкапьте volume с данными CouchDB:
docker run --rm -v hosting_couchdb3_data:/data -v $(pwd)/backup:/backup \
alpine tar czf /backup/couchdb-$(date +%F).tar.gz -C /data .
Имя volume уточните через docker volume ls | grep couch — оно зависит от того, как называется каталог проекта при разворачивании.
Перенос Budibase на другой сервер и бэкап данных
Миграция между серверами (смена хостинга, локации, апгрейд конфигурации) — источник ошибок, которые не встречаются при обычной работе:
- Забыли перенести
.env. Файл содержитJWT_SECRET, пароли CouchDB, ключи MinIO. Без этих значений старые сессии и API-ключи станут нерабочими, а часть зашифрованных данных в CouchDB — нечитаемой. Копируйте.envвместе с volume как единое целое. - Перенесли volume, но не остановили сервисы перед копированием. Копирование "живого" volume CouchDB может дать несогласованный снимок. Правильно:
docker compose downна старом сервере → архивирование volume → перенос → распаковка на новом →docker compose up -d. - Изменился домен, но не обновили конфиг proxy. Если внешний Nginx на новом сервере не перевыпустил сертификат и не подхватил новую DNS-запись, сессии могут вести себя странно из-за cookie, привязанных к старому домену.
- Не проверили место на диске заранее. CouchDB и вложения из форм со временем разрастаются — на VPS с меньшим диском распаковка архива может просто не поместиться. Проверьте размер volume заранее:
docker run --rm -v hosting_couchdb3_data:/data alpine du -sh /data.
Если параллельно с Budibase на сервере крутятся другие приложения, стоит настроить регулярный автоматический бэкап всего стека, а не только ручной перед миграцией — например, через BorgBackup, он хорошо подходит для инкрементальных снимков Docker-volume.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Сколько RAM реально нужно для self-hosted Budibase?
Для стабильной работы полного стека закладывайте от 4 ГБ. На 2 ГБ он запустится и потянет пару простых приложений, но под нагрузкой возможны падения по памяти — это ориентир из практики, точная цифра зависит от ваших сценариев.
Можно ли использовать внешнюю PostgreSQL вместо встроенной CouchDB для метаданных Budibase?
Нет, CouchDB — обязательный компонент для хранения структуры приложений и пользователей платформы. Внешние базы подключаются отдельно, только как источники данных для таблиц внутри приложений.
Нужен ли отдельный SSL-сертификат для самого Budibase, если он за reverse proxy?
Нет, SSL достаточно терминировать на внешнем Nginx или Caddy — внутренний proxy-контейнер Budibase общается с ним по обычному HTTP в пределах сервера.
Как понять, что причина падения именно в нехватке памяти, а не в конфигурации?
Проверьте dmesg | grep -i "out of memory" сразу после падения — если ядро убило процесс через OOM-killer, это будет видно там. Нет записей — ищите причину в логах самого сервиса.
Обязательно ли использовать официальный hosting.sh, или можно написать свой compose-файл?
Можно и свой, но вся ответственность за согласованность версий образов и сетей ложится на вас. Проще довериться официальному скрипту и точечно править сгенерированный docker-compose.yaml, чем собирать конфиг с нуля.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →