Grist на Ubuntu 24.04: пошаговая установка
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_EMAIL | e-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 ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →