Как установить и настроить NocoDB на VPS
Если команда выросла из Google Таблиц, а Airtable выставляет счета в валюте и хранит данные на чужих серверах, логичный шаг — поставить NocoDB на свой VPS. Это open-source платформа, которая берёт любую SQL-базу (PostgreSQL, MySQL, SQLite, MSSQL) и превращает её в удобный табличный интерфейс: вьюхи, формы, канбан-доски, права доступа и готовый REST/GraphQL API — без месячной подписки и без лимита на количество записей. Ниже — установка через Docker Compose, reverse-proxy с SSL и нюансы, которые редко попадают в официальную документацию.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что такое NocoDB и когда он оправдан
NocoDB не хранит данные в своём собственном формате — он подключается к обычной SQL-базе и рисует поверх неё интерфейс в духе Airtable: таблицы, связи между ними, фильтры, группировки, галерею и канбан. У каждой таблицы автоматически появляется REST API, так что базу, собранную вручную в интерфейсе, можно тут же дёргать из скрипта или связать с n8n для автоматизаций.
Это не замена полноценному бэкенду, а инструмент для конкретных задач: внутренние CRM, трекеры заявок, каталоги товаров, база подрядчиков, MVP до найма разработчика. Если данные уже лежат в рабочей PostgreSQL-базе, NocoDB можно подключить к ней напрямую — это удобно для team-view поверх продакшена, но требует аккуратных прав доступа (об этом ниже).
| NocoDB (self-hosted) | Airtable | Google Sheets | |
|---|---|---|---|
| Где данные | ваш сервер | облако Airtable | облако Google |
| Лимит записей | нет (упирается в СУБД) | по тарифу | ~10 млн ячеек |
| Своя SQL-база | подключается напрямую | нет | нет |
| REST/GraphQL API | из коробки | есть, платно на масштабе | через Apps Script |
| Ежемесячная плата | нет, только сервер | от $20/место | бесплатно/Workspace |
Требования к серверу и подготовка
Для команды до 10–15 человек и одной-двух баз хватает 2 vCPU и 4 ГБ RAM. Если планируете держать на том же сервере PostgreSQL с рабочими данными (не только служебную БД NocoDB) — берите 4 vCPU и 8 ГБ, NocoDB на Node.js сам по себе не тяжёлый, но СУБД под нагрузкой ест память в первую очередь. Диск — от 20 ГБ, дальше зависит от объёма данных и бэкапов.
Дальше нужен Ubuntu 24.04 и Docker. Если Docker ещё не стоит, разверните его с нуля — весь процесс описан в статье про установку Docker на Ubuntu 24.04. Коротко:
apt update && apt upgrade -y
curl -fsSL https://get.docker.com | sh
usermod -aG docker $USER
Откройте только нужные порты — 22 для SSH, 80 и 443 для веба. Порт 8080, на котором слушает сам NocoDB, наружу открывать не нужно, он останется за reverse-proxy:
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверУстановка NocoDB через Docker Compose
NocoDB хранит собственные метаданные (структуру таблиц, права, вьюхи) в отдельной базе — по умолчанию SQLite, но для продакшена лучше сразу подключить PostgreSQL, чтобы не потерять всё при повреждении файла. Создайте каталог и docker-compose.yml:
mkdir -p /opt/nocodb && cd /opt/nocodb
# /opt/nocodb/docker-compose.yml
services:
nocodb-db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: nocodb
POSTGRES_PASSWORD: замените_на_свой_пароль
POSTGRES_DB: nocodb_meta
volumes:
- ./pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U nocodb"]
interval: 5s
timeout: 5s
retries: 10
nocodb:
image: nocodb/nocodb:latest
restart: unless-stopped
depends_on:
nocodb-db:
condition: service_healthy
ports:
- "127.0.0.1:8080:8080"
environment:
NC_DB: "pg://nocodb-db:5432?u=nocodb&p=замените_на_свой_пароль&d=nocodb_meta"
NC_PUBLIC_URL: "https://noco.example.com"
volumes:
- ./data:/usr/app/data
Порт проброшен только на 127.0.0.1 — снаружи NocoDB будет виден исключительно через Nginx, это уже часть защиты. Замените пароль в двух местах на одинаковый и подставьте свой домен в NC_PUBLIC_URL — он используется для формирования ссылок на публичные шаринги и вебхуки.
docker compose up -d
docker compose logs -f nocodb
Дождитесь строки о старте на порту 8080, затем проверьте локально:
curl -I http://127.0.0.1:8080
Ответ 200 OK или редирект на /dashboard означает, что контейнер поднялся и слушает.
Nginx как reverse-proxy и SSL
NocoDB активно использует WebSocket для realtime-обновлений интерфейса, поэтому в конфиге Nginx обязательны заголовки Upgrade/Connection — без них таблицы будут «зависать» и требовать ручного обновления страницы. Общий подход к настройке reverse-proxy подробно разобран в статье про Nginx как reverse-proxy на VPS, здесь — конфиг под конкретно NocoDB:
# /etc/nginx/sites-available/noco.example.com
server {
listen 80;
server_name noco.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
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 50m;
}
}
client_max_body_size увеличен заранее — NocoDB позволяет прикреплять файлы к записям, и дефолтный лимит Nginx в 1 МБ будет обрезать вложения без внятной ошибки в интерфейсе.
ln -s /etc/nginx/sites-available/noco.example.com /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
Дальше сертификат через certbot — детали и разбор частых ошибок есть в статье про Let's Encrypt SSL на VPS:
apt install certbot python3-certbot-nginx -y
certbot --nginx -d noco.example.com
Certbot сам пропишет listen 443 ssl и настроит автопродление через systemd-таймер — проверить его можно командой certbot renew --dry-run.
Подключение внешних баз данных
Есть два разных понятия, которые легко перепутать на старте. NC_DB из docker-compose.yml — это служебная база самого NocoDB (структура таблиц, пользователи, права). А «базы» (Bases), которые вы добавляете внутри интерфейса через New Base → PostgreSQL/MySQL/SQLite, — это ваши рабочие данные, к которым NocoDB просто подключается по DSN.
Если хотите открыть командe вид поверх уже существующей боевой PostgreSQL — не подключайте продакшен-пользователя с полными правами. Заведите отдельную роль с ограниченными грантами:
CREATE USER nocodb_reader WITH PASSWORD 'отдельный_пароль';
GRANT CONNECT ON DATABASE production_db TO nocodb_reader;
GRANT USAGE ON SCHEMA public TO nocodb_reader;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO nocodb_reader;
Если базу вы только настраиваете и хотите держать её в PostgreSQL с самого начала, шаги по установке отдельной СУБД под рабочие данные (не путать с метабазой NocoDB) описаны в статье про установку PostgreSQL на VPS. В форме подключения внутри NocoDB укажите хост, порт, имя базы и эту учётку — интерфейс сам подтянет существующие таблицы и связи по внешним ключам.
Для MySQL строка подключения формируется аналогично, отличаются только драйвер и порт по умолчанию (3306 вместо 5432). SQLite годится для быстрого прототипа, но под несколько одновременных пользователей плохо масштабируется — для реальной командной работы переходите на PostgreSQL или MySQL.
Пользователи, права доступа и бэкапы
В NocoDB пять ролей: Owner, Creator, Editor, Commenter, Viewer — от полного контроля над структурой до просмотра без права правки. Приглашение по email работает только при настроенном SMTP, добавьте в блок environment контейнера nocodb:
NC_SMTP_HOST: smtp.yourmail.example
NC_SMTP_PORT: "587"
NC_SMTP_USERNAME: bot@yourmail.example
NC_SMTP_PASSWORD: пароль_приложения
NC_SMTP_FROM: "NocoDB <bot@yourmail.example>"
Без SMTP приглашения всё равно можно выдавать вручную — создать пользователя и передать пароль лично, но письма с подтверждением почты и сбросом пароля работать не будут.
Бэкапить нужно две вещи: метабазу (pgdata — структура таблиц, права, вьюхи) и, если данные лежат в той же связке, саму рабочую базу. Простой вариант — регулярный дамп через cron:
docker compose exec -T nocodb-db pg_dump -U nocodb nocodb_meta | gzip > /backups/nocodb_meta_$(date +%F).sql.gz
Если храните данные и в Docker-томах (загруженные файлы вложений в ./data), общий подход к резервному копированию томов и типичные грабли разобраны в статье про бэкап Docker volume на VPS — рекомендации оттуда напрямую применимы и к каталогу /opt/nocodb/data.
Производительность и типичные проблемы
NocoDB написан на Node.js и с типовыми таблицами на десятки тысяч строк работает без нареканий — но на таблицах в сотни тысяч записей и больше интерфейс начинает заметно тормозить при сортировках и группировках без индексов на соответствующих колонках в самой СУБД. Индексы придётся добавлять руками на стороне PostgreSQL/MySQL, NocoDB их автоматически не создаёт.
Если контейнер потребляет память сверх ожидаемого при большом количестве одновременных пользователей, ограничьте её через Compose и заодно зафиксируйте лимит для Node.js:
environment:
NODE_OPTIONS: "--max-old-space-size=1024"
deploy:
resources:
limits:
memory: 1.5g
Самая частая практическая проблема — не производительность, а именно «зависший» интерфейс из-за неправильного проксирования WebSocket (см. раздел про Nginx выше): если после логина таблицы открываются, но изменения не подтягиваются в реальном времени без перезагрузки страницы, в 90% случаев дело в отсутствующих заголовках Upgrade/Connection в конфиге прокси.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Можно ли подключить к NocoDB уже существующую продакшен-базу без переноса данных?
Да, это штатный сценарий — при добавлении базы NocoDB сканирует существующие таблицы и связи и не создаёт новых данных, только надстраивает интерфейс. Главное — использовать отдельного пользователя БД с урезанными правами, а не продакшен-суперюзера.
NocoDB бесплатен полностью или есть платные функции?
Community-редакция, которую вы разворачиваете через Docker, открыта и бесплатна для self-hosted использования. Есть отдельная облачная версия с подпиской — но для этой статьи и большинства сценариев self-hosted она не нужна.
Что делать, если после обновления образа NocoDB перестал запускаться?
Проверьте логи (docker compose logs nocodb) на предмет миграций метабазы — при мажорных обновлениях NocoDB иногда меняет схему NC_DB. Перед обновлением образа на проде всегда снимайте свежий дамп метабазы и тестируйте обновление на копии.
Нужен ли Redis?
Для небольших и средних инсталляций — нет, кеш в памяти самого контейнера справляется. NC_REDIS_URL имеет смысл добавлять, когда контейнер перезапускается часто (например, при деплоях через оркестратор) и не хочется терять кеш при каждом рестарте.
Как ограничить доступ к NocoDB только по IP офиса, не открывая всем интернетом?
Добавьте allow/deny директивы в блок location конфига Nginx выше основного proxy_pass, либо заведите отдельный VPN/WireGuard-туннель и слушайте NocoDB только внутри приватной сети — второй вариант надёжнее для чувствительных данных.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →