MAATRIX / Блог / Grist на Ubuntu 24.04: пошаговая установка

Grist на Ubuntu 24.04: пошаговая установка

MAATRIX

Excel и Google Таблицы отлично считают, но плохо хранят связанные данные — как только в проекте появляются клиенты, заказы и склад одновременно, начинается ад из вкладок и ВПР. Grist решает эту проблему: это open-source инструмент, который выглядит как таблица, а внутри работает как реляционная база данных с формулами Excel-уровня, типизированными колонками и REST API. Ниже — рабочий способ поднять его на своём VPS с Ubuntu 24.04 через Docker, без привязки к облаку разработчика.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Что такое Grist и зачем он вам

Grist разрабатывает команда Grist Labs, исходники открыты (grist-core на GitHub, лицензия Apache 2.0), а облачная версия — лишь один из способов его использовать. По сути каждая "таблица" в Grist — это набор строк с типизированными колонками (текст, число, дата, ссылка на другую таблицу, вложение), а формулы пишутся на Python и пересчитываются по зависимостям, как в Excel. При этом под капотом лежит SQLite, и любую книгу можно выгрузить как обычную реляционную БД.

Практическая разница с "просто таблицами":

  • Ссылочная целостность. Колонка типа "Reference" ссылается на строку в другой таблице — не текстом, а по ID, поэтому переименование не ломает связи.
  • Формулы на Python, а не на урезанном табличном языке — можно писать функции, использовать datetime, обращаться к другим таблицам через Table.lookupOne().
  • REST API из коробки — любую таблицу можно читать и писать по HTTP, что удобно для интеграций с ботами, n8n или собственными скриптами.
  • Гранулярные права доступа — вплоть до уровня строк и колонок, что важно, если с таблицей работают клиенты или подрядчики.

Self-hosted версия нужна, если вы храните чувствительные данные (финансы, персональные данные клиентов), хотите избежать лимитов бесплатного тарифа облака, или просто предпочитаете держать инфраструктуру под контролем. Дальше — установка на собственном сервере.

Требования к серверу и подготовка Ubuntu

Grist — не тяжёлое приложение: движок формул написан на Python/Node.js, а данные хранятся в SQLite-файлах на диске. Для тестов и одного-двух пользователей достаточно 1 vCPU и 1-2 ГБ RAM. Для команды из 10-20 человек с несколькими активными книгами и формулами разумно взять 2 vCPU и 4 ГБ RAM — Grist держит открытые книги в памяти, и чем их больше одновременно, тем ощутимее расход. Точных цифр производительности разработчик не публикует, поэтому ориентируйтесь на нагрузку опытным путём и закладывайте запас.

Что понадобится:

  • VPS с Ubuntu 24.04 LTS и root-доступом (или пользователь с sudo);
  • домен или поддомен, направленный на IP сервера (для HTTPS через Caddy — см. ниже);
  • открытые порты 80 и 443 наружу.

Обновите систему и создайте отдельного пользователя, если работаете под root:

apt update && apt upgrade -y
adduser deploy
usermod -aG sudo deploy
su - deploy

Дальше все команды выполняются от имени deploy (замените на своё имя пользователя), с sudo где нужно.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Установка Docker и Docker Compose

Официальный и самый предсказуемый способ развернуть Grist — Docker-образ gristlabs/grist, который поддерживает сама команда разработчиков. Ставим Docker Engine из официального репозитория Docker (не docker.io из репозитория Ubuntu — там версия часто устаревшая):

sudo apt update
sudo apt install -y ca-certificates curl gnupg
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-plugin и вызывается как подкоманда docker.

Развёртывание Grist через Docker Compose

Создайте директорию проекта и файл docker-compose.yml:

mkdir -p ~/grist && cd ~/grist
nano docker-compose.yml

Базовая рабочая конфигурация:

services:
  grist:
    image: gristlabs/grist:latest
    container_name: grist
    restart: unless-stopped
    ports:
      - "127.0.0.1:8484:8484"
    volumes:
      - grist_data:/persist
    environment:
      - APP_HOME_URL=https://grist.example.com
      - GRIST_DEFAULT_EMAIL=admin@example.com
      - GRIST_SINGLE_ORG=team
      - TZ=Europe/Moscow

volumes:
  grist_data:

Ключевые переменные окружения:

ПеременнаяНазначение
APP_HOME_URLпубличный URL, по которому будет доступен Grist (нужен корректный, иначе поедут ссылки в приглашениях и API)
GRIST_SINGLE_ORGрежим одной организации вместо мульти-tenant — упрощает self-hosted сценарий для одной команды
GRIST_DEFAULT_EMAILe-mail, который автоматически получает права администратора при первом входе
TZчасовой пояс контейнера — влияет на формулы с датами и на логи

Порт намеренно опубликован только на 127.0.0.1:8484 — наружу Grist отдаст Caddy по HTTPS (следующий раздел). Так контейнер не торчит в интернет напрямую по HTTP.

Запускаем:

docker compose up -d
docker compose logs -f grist

В логах должно появиться сообщение о старте сервера на порту 8484. Проверить локально, ещё до настройки домена:

curl -I http://127.0.0.1:8484

Если вернулся 200 OK — контейнер поднялся, можно переходить к внешнему доступу. Все данные (книги, вложения, БД пользователей) лежат в именованном томе grist_data, который живёт независимо от пересоздания контейнера.

Домен, HTTPS и reverse-proxy через Caddy

Grist сам не занимается TLS-терминацией, поэтому перед ним нужен reverse-proxy. Caddy — самый простой вариант: автоматически получает и продлевает сертификаты Let's Encrypt без ручной возни с certbot.

Установка Caddy из официального репозитория:

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install -y caddy

Отредактируйте /etc/caddy/Caddyfile:

grist.example.com {
    reverse_proxy 127.0.0.1:8484
}

Перезапустите Caddy:

sudo systemctl reload caddy

Убедитесь, что A-запись домена grist.example.com уже указывает на IP сервера — иначе Caddy не сможет пройти проверку домена для выпуска сертификата и будет уходить в ретраи. Через 10-30 секунд после первого запуска сертификат обычно готов, и https://grist.example.com открывает приветственный экран Grist. Более детальный разбор автонастройки самого Caddy и типичных проблем с сертификатами — в отдельной статье про Caddy с авто-SSL на Ubuntu 24.04.

Если фаервол ещё не настроен, откройте только нужные порты:

sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
sudo ufw enable

Подробности про правила и типичные ошибки — в статье про настройку UFW на Ubuntu 24.04.

Резервное копирование, обновление и API

Бэкапы. Все данные Grist — это файлы SQLite в томе /persist. Проще всего бэкапить весь том целиком, остановив контейнер на время копирования, чтобы не словить незавершённую транзакцию:

docker compose stop grist
docker run --rm -v grist_grist_data:/persist -v $(pwd)/backup:/backup \
  alpine tar czf /backup/grist-$(date +%F).tar.gz -C /persist .
docker compose start grist

Вынесите эту команду в cron и складывайте архивы вне сервера (S3-совместимое хранилище, второй сервер, локальный NAS) — общие принципы автоматизации бэкапов баз данных разобраны в статье про резервное копирование баз данных.

Обновление. Grist активно развивается, обновления выходят регулярно. Обновление сводится к смене тега образа и перезапуску:

docker compose pull
docker compose up -d

Перед крупным обновлением (смена мажорной версии) сделайте свежий бэкап тома — на всякий случай, хотя в практике разработчиков обратная несовместимость формата данных встречается редко.

API. У каждой книги (document) в Grist есть REST API — токен доступа выдаётся в настройках профиля пользователя (Profile Settings → API). Базовый запрос на чтение таблицы выглядит так:

curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://grist.example.com/api/docs/DOC_ID/tables/Orders/records"

Это открывает Grist как бэкенд для ботов, скриптов и внешних сервисов — например, можно писать в таблицу из Telegram-бота или синхронизировать данные с внешней БД по расписанию. Если параллельно вы используете классическую реляционную БД для более тяжёлых нагрузок, обратите внимание на статью про установку PostgreSQL на Ubuntu 24.04 — Grist и PostgreSQL хорошо дополняют друг друга: первый для гибких таблиц с формулами, второй для продакшн-нагрузок и больших объёмов.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Чем Grist отличается от NocoDB и Baserow?

Все три — open-source гибриды таблиц и БД, но у Grist сильнее формульный движок (полноценный Python с пересчётом по зависимостям, как в Excel), а у NocoDB и Baserow акцент больше на UI и готовых интеграциях. Если формулы и вычисления — ключевая часть задачи, Grist обычно удобнее. Сравнение похожих инструментов есть в статье NocoDB или Baserow: что выгоднее.

Нужен ли отдельный домен или хватит поддомена?

Поддомена достаточно — Caddy одинаково работает и с доменом второго уровня, и с поддоменом, важно только, чтобы A-запись указывала на IP вашего сервера.

Можно ли развернуть Grist без Docker, из исходников?

Технически да, через сборку grist-core на Node.js, но это заметно сложнее в поддержке (нужно вручную следить за зависимостями и версией Node) и не так предсказуемо при обновлениях. Для продакшн-использования официальный Docker-образ надёжнее.

Как перенести существующие книги из облачного Grist на свой сервер?

В облачном интерфейсе есть экспорт книги в файл .grist (это тот же SQLite-файл), который затем можно импортировать через веб-интерфейс self-hosted инсталляции — данные, формулы и структура переносятся полностью.

Что делать, если Grist "съедает" много памяти при росте числа книг?

Grist держит недавно открытые документы в памяти для скорости. Если книг много и активность высокая, увеличивайте RAM сервера или настройте более агрессивную выгрузку неактивных документов — это регулируется переменными окружения, специфичными для конкретной версии образа, стоит свериться с актуальной документацией на момент установки.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →