SeaTable в Docker Compose: готовый файл
Airtable красив и удобен, пока не доходит до счёта за десяток мест в команде или до вопроса, где физически лежит база клиентов компании. SeaTable — один из немногих self-hosted инструментов в этой нише, который не упрощает Airtable до примитивной таблицы: связи между таблицами, формулы, представления канбан/календарь/галерея и, что важнее всего, встроенные автоматизации с возможностью писать серверные Python-скрипты — всё это остаётся при переезде на свой сервер. Ниже — рабочий docker-compose.yml, разбор официального install-скрипта SeaTable (он тут не такой, как у Baserow или NocoDB) и нюансы, которые всплывают при бэкапах и обновлении версии.
Содержание
- Что такое SeaTable и чем он отличается от Baserow и NocoDB
- Официальный способ: install-скрипт, который сам собирает docker-compose.yml
- Ручной docker-compose.yml для тех, кто хочет обойтись без скрипта
- Переменные окружения, на которые стоит смотреть внимательнее всего
- HTTPS и reverse proxy
- Бэкапы, обновление и перенос на другой сервер
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что такое SeaTable и чем он отличается от Baserow и NocoDB
SeaTable — немецкий продукт, его делает та же команда, что стоит за файловым синхронизатором Seafile, и архитектурное наследство заметно: данные хранятся не как тонкая обвязка над обычной реляционной таблицей, а в собственном формате DTable, который разработчики и продают как главное преимущество — по их заявлениям, таблицы SeaTable выдерживают значительно больше строк, чем аналоги на классическом Postgres/MySQL-слое. Это ориентир от вендора, а не измеренный бенчмарк — на своих данных и своём железе цифры будут отличаться, проверяйте нагрузочным тестом перед тем, как переносить туда боевой процесс.
Из коробки в SeaTable есть:
- Представления — таблица, канбан, календарь, галерея, а также группировки и фильтры поверх одной базы данных.
- Формулы, lookup и link-колонки — связи между таблицами внутри базы и между разными базами.
- Automation Rules — правила «триггер → условие → действие» прямо в интерфейсе, без выноса в отдельный Zapier/Make.
- Встроенный Python-скриптинг — можно написать серверный скрипт, который дергается по расписанию или по событию и работает с данными базы напрямую, без внешнего API-раннера.
- REST API и официальный Python SDK (
seatable-api) — удобно для интеграций и ботов.
Ключевое отличие от Baserow и NocoDB — лицензия. Baserow и NocoDB распространяются под AGPL, их серверный код полностью открыт. SeaTable в этом смысле честнее называть «доступным для self-hosted», а не «open source в классическом смысле»: серверная часть закрыта, community-редакция бесплатна для собственного использования, но часть функций (SSO/LDAP, кластеризация, приоритетная поддержка) продаётся отдельно в Enterprise-тарифе. Условия периодически меняются — перед разворачиванием на продакшен стоит свериться с актуальной лицензией на официальном сайте, а не полагаться на то, что написано в статьях годичной давности.
Официальный способ: install-скрипт, который сам собирает docker-compose.yml
Здесь SeaTable устроен иначе, чем Baserow или NocoDB, где вендор просто публикует готовый docker-compose.yml для копипаста. Официальная документация SeaTable (manual.seatable.io, раздел Server Installation) рекомендует интерактивный bash-скрипт, который сам задаёт вопросы — домен, e-mail администратора, пароль администратора, root-пароль MySQL, часовой пояс — и на основе ответов генерирует docker-compose.yml и сопутствующие конфиги в /opt/seatable-server.
Общий паттерн запуска такой (точную ссылку на актуальную версию скрипта берите из официального руководства — она меняется с выходом новых релизов SeaTable, и вставлять её сюда «на глаз» — плохая идея):
mkdir -p /opt/seatable-server && cd /opt/seatable-server
wget <ссылка-на-install-seatable.sh-из-документации>
chmod +x install-seatable.sh
sudo ./install-seatable.sh
Как и с любым установочным скриптом, который вы получаете через wget/curl и запускаете от root — откройте файл и прочитайте, что он делает, прежде чем выполнять. Это не специфика SeaTable, а общее правило гигиены для инсталляторов любого вендора.
Плюс подхода: скрипт сам выпускает сертификат, поднимает MySQL с нужными правами и меньше шансов ошибиться в переменных вручную. Минус: сложнее держать конфигурацию как код и версионировать в git — до первого запуска вы не увидите итоговый docker-compose.yml.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверРучной docker-compose.yml для тех, кто хочет обойтись без скрипта
Если вам ближе подход «пишу конфиг сам и храню в репозитории», вот файл, который воспроизводит структуру, которую генерирует официальный установщик: MySQL/MariaDB для реляционных данных, Memcached для сессий и кэша, и основной контейнер приложения.
version: "3.8"
services:
db:
image: mariadb:10.11
container_name: seatable-db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: "замените-на-длинный-пароль"
MYSQL_LOG_CONSOLE: "true"
volumes:
- seatable_db:/var/lib/mysql
command: --default-authentication-plugin=mysql_native_password
memcached:
image: memcached:1.6-alpine
container_name: seatable-memcached
restart: unless-stopped
command: memcached -m 256
seatable:
image: seatable/seatable:latest
container_name: seatable
restart: unless-stopped
depends_on:
- db
- memcached
environment:
DB_HOST: db
DB_ROOT_PASSWD: "замените-на-длинный-пароль"
TIME_ZONE: "Europe/Moscow"
SEATABLE_SERVER_HOSTNAME: "seatable.example.com"
SEATABLE_SERVER_PROTOCOL: "https"
SEATABLE_ADMIN_EMAIL: "admin@example.com"
SEATABLE_ADMIN_PASSWORD: "замените-на-длинный-пароль"
ports:
- "80:80"
- "443:443"
volumes:
- seatable_shared:/shared
volumes:
seatable_db:
seatable_shared:
Важная оговорка: тег образа, точные имена переменных окружения и внутренние компоненты SeaTable меняются между релизами заметно чаще, чем у Baserow или NocoDB — этот файл описывает архитектуру, а не гарантированно рабочий конфиг под конкретную версию. Перед продакшен-запуском сверьте актуальный список переменных с официальной документацией и зафиксируйте тег образа конкретной версией вместо latest, чтобы docker compose pull не подсунул вам неожиданное мажорное обновление при пересоздании контейнера.
Переменные окружения, на которые стоит смотреть внимательнее всего
| Переменная | Назначение | Риск, если ошибиться |
|---|---|---|
SEATABLE_SERVER_HOSTNAME | домен, на который ссылаются письма, вебхуки и превью файлов | битые ссылки в приглашениях и во вложениях |
DB_ROOT_PASSWD | root-пароль MySQL, используется и контейнером db, и приложением | если значения в двух сервисах разойдутся при ручной правке — приложение не подключится к базе при следующем перезапуске |
SEATABLE_ADMIN_EMAIL / SEATABLE_ADMIN_PASSWORD | учётка администратора, создаётся при первом старте | задаются один раз при инициализации — смена пароля после первого запуска делается уже через веб-интерфейс, а не переменной |
TIME_ZONE | часовой пояс для расписаний в Automation Rules и таймстампов | триггеры «каждый день в 9:00» будут срабатывать по неверному времени |
Секреты стоит выносить в отдельный .env рядом с docker-compose.yml, а не хранить прямо в файле — особенно если конфигурацию планируете держать в git.
HTTPS и reverse proxy
Официальный install-скрипт по умолчанию сам занимается выпуском сертификата на домен, который вы ему указали при установке — достаточно, чтобы A-запись домена смотрела на IP сервера и порты 80/443 были свободны.
Если на сервере уже работает Caddy как общий reverse proxy для нескольких сервисов, логичнее не отдавать SeaTable порты 80/443 напрямую, а завести его на внутренний порт и проксировать снаружи:
ports:
- "127.0.0.1:8090:80"
seatable.example.com {
reverse_proxy 127.0.0.1:8090
}
Такая схема удобна, если вы уже держите на одном сервере несколько self-hosted инструментов — например, Baserow или NocoDB для одних команд и SeaTable для других — и не хотите выделять под каждый отдельный IP.
Бэкапы, обновление и перенос на другой сервер
Бэкапить нужно два независимых куска: базу MySQL (структура и метаданные таблиц) и volume /shared, где лежат реальные вложения и файлы DTable.
Дамп базы:
docker compose exec db mysqldump -u root -p seatable > seatable_$(date +%F).sql
Общий подход к автоматизации регулярных дампов MySQL из контейнера — в отдельной статье про бэкап MySQL на VPS, она применима и здесь, разница только в имени контейнера и базы.
С обновлением версии есть нюанс, унаследованный от Seafile: в отличие от Baserow, который прогоняет миграции автоматически при старте нового тега, у продуктов этого семейства при переходе через несколько версий подряд иногда требуется выполнить отдельный upgrade-шаг внутри контейнера, а не просто подменить образ. Перед мажорным обновлением обязательно прочитайте release notes конкретной версии в официальной документации и снимите свежий дамп — если апгрейд-скрипт упадёт на середине, откат к бэкапу будет быстрее, чем разбор частично мигрированной схемы.
Перенос на другой сервер — это перенос обоих volume (seatable_db и seatable_shared) и того же docker-compose.yml с обновлённым SEATABLE_SERVER_HOSTNAME, если домен меняется вместе с сервером.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Хватит ли дешёвого VPS для SeaTable?
Для команды на 5-10 человек обычно достаточно 2 ГБ RAM и 2 vCPU — MySQL и memcached в простое почти ничего не едят, но при активных Automation Rules и Python-скриптах, которые дергаются часто, стоит следить за CPU: скрипты выполняются синхронно на том же сервере.
Можно ли перенести таблицы из Airtable в SeaTable?
Да, есть импорт из CSV и Excel, структура таблиц и часть связей переносится, но формулы Airtable и его автоматизации придётся пересобирать вручную — синтаксис и логика триггеров у SeaTable свои.
SeaTable — это open source?
Не в классическом смысле AGPL, как Baserow или NocoDB: серверный код закрыт, но community-редакция бесплатна для self-hosted использования с ограничениями по сравнению с Enterprise-тарифом. Точные условия лицензии проверяйте на официальном сайте перед продакшен-развёртыванием.
Чем автоматизации SeaTable отличаются от Zapier или Make?
Automation Rules работают внутри самой базы без внешнего сервиса и без задержки на сетевой вызов наружу, а встроенный Python-скриптинг закрывает случаи, где обычного конструктора «если-то» не хватает. Минус — логика скриптов выполняется на вашем же сервере и ест его ресурсы, а не масштабируется отдельно, как во внешнем сервисе автоматизации.
Что делать, если после обновления контейнер не поднимается?
Сначала смотрите docker compose logs seatable — чаще всего проблема либо в несовместимой версии MySQL, либо в пропущенном upgrade-шаге между версиями. Откатите тег образа на предыдущий, восстановите дамп базы, если миграция уже начала менять схему, и повторите обновление уже пошагово, версия за версией, а не сразу на несколько релизов вперёд.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →