Сколько RAM нужно для NocoDB
NocoDB превращает обычную MySQL или PostgreSQL в интерфейс уровня Airtable — с таблицами, представлениями, формулами и API, но без подписки и без чужого сервера. Вопрос «сколько RAM нужно для NocoDB» упирается не в объём данных, а в архитектуру: сама база живёт отдельно, а Node-процесс NocoDB — это тонкий слой API и рендеринга поверх неё. Разберём, из чего складывается память, где она реально утекает и какой конфиг взять, чтобы не платить за гигабайты, которые не нужны.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Короткий ответ: сколько RAM нужно для NocoDB
Главное отличие NocoDB от типичных self-hosted инструментов: она не хранит данные таблиц в памяти процесса. Записи лежат в MySQL/PostgreSQL/SQLite, NocoDB запрашивает их постранично через SQL. Поэтому память растёт не от размера базы, а от числа одновременных запросов, тяжёлых операций (импорт CSV, генерация превью вложений) и того, что стоит рядом.
| Сценарий | RAM | vCPU | Диск | Что случится на шаг ниже |
|---|---|---|---|---|
| Личный проект, 1–3 базы, SQLite как метаданные, 1 пользователь | 1–2 ГБ | 1 | 20 ГБ NVMe | импорт CSV на пару тысяч строк подвешивает интерфейс |
| Небольшая команда, 5–10 пользователей, внешняя PostgreSQL под метаданные | 2–4 ГБ | 2 | 40 ГБ NVMe | одновременные grid-запросы от нескольких вкладок начинают тормозить |
| Рабочий инстанс: десятки баз, вложения, вебхуки, формулы на больших вьюхах | 4–8 ГБ | 2–4 | 80 ГБ NVMe | генерация превью изображений и экспорт большой таблицы конкурируют за память |
| Несколько инстансов NocoDB за балансировщиком + общий Redis-кэш + PostgreSQL | 8–16 ГБ суммарно | 4+ | 160 ГБ NVMe | без Redis каждый инстанс бьёт метаданными в одну и ту же базу отдельно |
| NocoDB + PostgreSQL с реальными рабочими данными (CRM, каталог, учёт) на одном сервере | 8–16 ГБ | 4 | 160+ ГБ NVMe (SSD под саму СУБД) | база данных, а не NocoDB, первой упирается в RAM под кэш страниц |
Из таблицы видно главное: сам процесс NocoDB — не то, что съедает память в продакшене. Она уходит на СУБД рядом, на всплески при импорте/экспорте и на число одновременных пользователей интерфейса.
Из чего складывается память NocoDB
NocoDB — приложение на Node.js: бэкенд ходит в базу через Knex.js (SQL-билдер, а не ORM с полной загрузкой объектов в память), фронтенд — собранный Vue-интерфейс, который сервер просто отдаёт статикой. Официальный Docker-образ nocodb/nocodb — это один контейнер с бэкендом и встроенной раздачей фронтенда, без отдельного nginx.
Из чего набирается расход:
| Что грузится | Вклад в память | Когда |
|---|---|---|
| Node.js-рантайм + ядро NocoDB, HTTP-сервер | базовый процесс, держится в диапазоне первых сотен мегабайт | всегда, сразу после старта |
| Кэш метаданных (список баз, таблиц, колонок, вью) | растёт с числом баз и таблиц, но некритично даже на сотнях объектов | по мере открытия проектов |
| SQL-запрос на grid-представление | пропорционален размеру страницы (по умолчанию постранично, не вся таблица целиком) | на каждый рендер вьюхи |
| Импорт CSV/Excel | зависит от размера файла — большой файл парсится в памяти до вставки в БД | на импорт |
Обработка вложений (превью изображений через sharp) | заметный кратковременный всплеск на каждое изображение | на загрузку файла с картинкой |
| Формулы и rollup-поля на больших выборках | пересчитываются при каждом запросе вьюхи, не кешируются агрессивно из коробки | на каждый запрос, если формул много |
| Вебхуки на массовых операциях (bulk insert/update) | каждый вебхук — отдельный HTTP-вызов, накапливается очередь при импорте | на bulk-операции |
Первые две строки — предсказуемый фундамент, обычно укладывающийся в несколько сотен мегабайт. Дальше расход зависит от того, что именно делают пользователи прямо сейчас, а не от того, сколько записей лежит в базе месяцами.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверМетаданные: SQLite по умолчанию или отдельная PostgreSQL
Если не задать переменную NC_DB, NocoDB создаёт свою служебную SQLite-базу (список проектов, таблиц, пользователей, токенов) в каталоге, заданном NC_TOOL_DIR. Это удобно для быстрого старта, но у SQLite есть архитектурное ограничение: она блокирует файл на запись для одного писателя за раз. Под одного пользователя это незаметно. Под команду, где несколько человек одновременно правят структуру таблиц или система параллельно обрабатывает вебхуки и API-запросы на запись метаданных, начинаются задержки и иногда SQLITE_BUSY.
Для рабочего инстанса переменную NC_DB стоит указать сразу на внешнюю PostgreSQL:
NC_DB=pg://db_host:5432?u=nocodb&p=secret&d=nocodb_meta
Важно различать две вещи, которые легко перепутать:
- метаданные NocoDB (список баз, вью, пользователей, ACL) — то, что описывает переменная
NC_DB; - данные ваших таблиц — они могут лежать в совсем другой базе, которую вы подключаете отдельно через интерфейс как источник (Data Source), в том числе несколько источников на один инстанс NocoDB.
Держать обе базы на одном PostgreSQL-сервере, но в разных схемах или базах данных — рабочий и распространённый вариант: экономит память по сравнению с двумя отдельными СУБД и упрощает бэкапы. Установка самой PostgreSQL под это описана в пошаговой инструкции по PostgreSQL на VPS, там же — базовая настройка postgresql.conf под небольшой сервер.
Docker Compose и переменные, которые держат память под контролем
Базовый рабочий конфиг с лимитом памяти и внешней PostgreSQL под метаданные:
services:
nocodb:
image: nocodb/nocodb:latest
restart: unless-stopped
mem_limit: 2g
environment:
- NC_DB=pg://postgres:5432?u=nocodb&p=${NC_DB_PASSWORD}&d=nocodb_meta
- NC_TOOL_DIR=/usr/app/data
- NC_DISABLE_TELE=true
- NC_PUBLIC_URL=https://nocodb.example.com
volumes:
- nocodb-data:/usr/app/data
ports:
- "8080:8080"
depends_on:
- postgres
postgres:
image: postgres:16
restart: unless-stopped
mem_limit: 1g
environment:
- POSTGRES_USER=nocodb
- POSTGRES_PASSWORD=${NC_DB_PASSWORD}
- POSTGRES_DB=nocodb_meta
volumes:
- pg-data:/var/lib/postgresql/data
volumes:
nocodb-data:
pg-data:
Несколько нюансов, о которые реально спотыкаются:
NC_TOOL_DIR(том/usr/app/data) нужно монтировать всегда, даже если метаданные вынесены на PostgreSQL — туда пишутся локальные вложения (если не настроено S3-совместимое хранилище), временные файлы импорта и JWT-секрет. Без volume при пересоздании контейнера теряются загруженные файлы, а иногда и токены авторизации.- Для локальных вложений задайте лимит явно:
NC_MAX_ATTACHMENT_SIZEзащищает от загрузки файла, который займёт всю доступную память при попытке сгенерировать превью. mem_limitна контейнер стоит ставить сразу — без него один тяжёлый импорт или пачка одновременных загрузок изображений может выесть память соседних контейнеров на том же хосте. Общий подход к лимитам разобран в статье про лимиты CPU и памяти в Docker.- Если подключаете внешние источники данных по MySQL, а не только PostgreSQL, при частых ошибках подключения — типичная причина не в NocoDB, а в лимитах самой СУБД, например
too many connectionsв MySQL при большом числе открытых вкладок и параллельных grid-запросов.
Redis-кэш: когда он реально нужен
NocoDB умеет кэшировать метаданные и часть SQL-результатов через Redis (NC_REDIS_URL). На одном инстансе с несколькими пользователями выигрыш от Redis скромный — основной кэш и так живёт в памяти процесса. Redis становится не опцией, а необходимостью в двух случаях:
- Горизонтальное масштабирование. Как только NocoDB запущена в двух и более экземплярах за балансировщиком (для отказоустойчивости или под нагрузку), им нужен общий кэш метаданных — иначе один инстанс не увидит изменение структуры таблицы, сделанное через другой, до истечения TTL или рестарта.
- Частые пересоздания структуры. Если через API или UI постоянно добавляются/удаляются колонки, вью, автоматизации — без общего кэша каждый инстанс отдельно бьёт запросами в базу метаданных при каждом обращении.
NC_REDIS_URL=redis://redis:6379/0
Сам Redis под такую нагрузку — лёгкий процесс, обычно укладывается в первые десятки мегабайт резидентной памяти на небольшом инстансе; закладывайте ему отдельный mem_limit, чтобы не делить кэш-память с NocoDB на одном лимите контейнера.
Какой сервер взять в MAATRIX под NocoDB
Честный минимум для рабочего использования — 2 vCPU, 4 ГБ RAM, 40 ГБ NVMe, с NocoDB и PostgreSQL для метаданных на одном сервере. Двух гигабайт хватит для теста и знакомства с интерфейсом, но команда из нескольких человек с параллельными вью и вложениями начнёт замечать задержки уже на первой неделе — в основном из-за конкуренции NocoDB и PostgreSQL за одну и ту же память, а не из-за самого объёма данных.
Если NocoDB смотрит на реальную рабочую базу — CRM, каталог, учётную систему, — берите 4 vCPU, 8 ГБ RAM, 80 ГБ NVMe и, желательно, разносите NocoDB и «боевую» PostgreSQL по разным серверам или как минимум по разным контейнерам с отдельными лимитами. Здесь память в первую очередь нужна не NocoDB, а самой СУБД под кэш страниц — общий ориентир по серверам под базы данных разобран в статье «Лучший VPS для базы данных».
Локация — на ваш выбор без технических ограничений. NocoDB не тянет внешние API так интенсивно, как автоматизации вроде n8n (сравнение по памяти — в статье «Сколько RAM нужно для n8n»), поэтому локацию выбирайте по тому, где физически сидит команда и где будет храниться база: для персональных данных сотрудников или клиентов из РФ логичнее российская площадка под 152-ФЗ, для международной команды — Лондон или США с более низкой задержкой до остального мира.
Оплата — картами российских банков, по СБП, криптовалютой или токеном MAAT; для развёртывания через Docker Compose иностранная карта не требуется. Готовый рецепт запуска на чистом сервере — пошаговая установка Docker Compose для продакшена на Ubuntu 24.04.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Хватит ли 1 ГБ RAM для NocoDB?
Для сольного теста на SQLite-метаданных и одной небольшой базе — да, процесс поднимется. Как только рядом появляется PostgreSQL под данные или второй пользователь открывает вкладку, гигабайта не хватает: NocoDB и СУБД начинают конкурировать за одну и ту же память, и первым падает или зависает более медленный из двух.
NocoDB ест память пропорционально размеру базы данных?
Нет, и это ключевое отличие от инструментов, которые держат данные в памяти. NocoDB запрашивает записи постранично через SQL — таблица на миллион строк не занимает миллион строк в RAM процесса. Память растёт от числа одновременных запросов, тяжёлых импортов и вложений, а не от объёма хранимых данных.
Нужен ли отдельный сервер под PostgreSQL, если она нужна только для метаданных NocoDB?
Нет, для метаданных (список баз, таблиц, пользователей) хватает лёгкого инстанса PostgreSQL на том же сервере, что и NocoDB — там нагрузка небольшая. Отдельный, более мощный сервер под СУБД нужен, только если через NocoDB реально работают с крупной рабочей базой данных, а не просто хранят её структуру.
Как понять, что памяти не хватает, а не тормозит сеть или диск?
Смотрите docker stats во время импорта CSV или загрузки изображений с превью: резкий скачок использования памяти контейнера NocoDB в момент операции и последующий рестарт по OOM — верный признак нехватки RAM, а не проблем с сетью.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →