Индекс журналаDockup / заметка с места
Note / self-host-metabase

Как самостоятельно развернуть Metabase в 2026 году: база данных приложения, TLS и резервные копии

Практическое руководство по самостоятельному размещению Metabase: Docker, порты, постоянное хранение данных, TLS, безопасность, резервные копии и проблемы, которые мешают использовать систему в production. С проверками.

Если вы уже пытались самостоятельно развернуть Metabase, то, вероятно, знакомы с раздражающей ситуацией: интерфейс открывается, но база данных приложения отсутствует, хотя исходные базы данных для dashboard остаются на месте. Пересоздание контейнера редко устраняет несоответствие между URL, состоянием и зависимостями.

В этом руководстве используется один конкретный критерий готовности: подключить тестовую базу данных только для чтения, сохранить вопрос, создать dashboard и доставить подписку через настроенный почтовый канал. Каждое решение по конфигурации оценивается относительно этого критерия, а не по зелёному статусу контейнера.

Учётные данные, роли и открытые поверхности

Моделируйте угрозы с учётом действий Metabase, а не только его формы входа. В данном случае главная рискованная ошибка — использовать встроенную базу данных приложения H2 как единственную production-копию. Установите следующие границы: по возможности выдавайте Metabase роли баз данных только для чтения и разделяйте права доступа к коллекциям и учётные данные баз данных.

Сгенерируйте MB_ENCRYPTION_SECRET_KEY один раз, не храните его в Git и сохраните вместе с манифестом восстановления, поскольку его изменение может сделать недействительным зашифрованное или подписанное состояние приложения. Не устраняйте ошибку доступа, запуская контейнер от имени root или предоставляя ему широкий доступ к mount на хосте. Ограничения ресурсов также относятся к проектированию безопасности: пользователи могут создавать нагрузку на heap JVM, параллельные запросы, кэширование результатов и каждый источник аналитических данных, к которому передаётся нагрузка.

Отделите Metabase от его зависимостей

Минимальная ответственная топология Metabase включает один приватный listener на порту 3000, маршрут ingress и документированную границу состояния. Сетевой контракт Metabase предполагает выделенную базу приложения Postgres, отдельную от источников аналитических данных. Размещайте приватные endpoints во внутреннем DNS, разрешайте только необходимые исходящие вызовы и выдавайте Metabase service credential с ограниченной областью доступа.

Проверьте топологию, попросив чистый клиент подключить тестовую базу данных только для чтения, сохранить вопрос, создать dashboard и доставить подписку через настроенный почтовый канал. Во время выполнения отслеживайте heap JVM, параллельные запросы, кэширование результатов и нагрузку, передаваемую каждому источнику аналитических данных. Результат покажет, требуется ли следующая оптимизация памяти, хранилищу, сети или отдельному worker, вместо того чтобы произвольно увеличивать размер контейнера.

Базовая конфигурация Metabase в Docker

Следующая команда делает границу контейнера видимой, не создавая видимость, будто она автоматически настраивает все внешние сервисы.

docker run -d \
  --name metabase \
  --restart unless-stopped \
  -p 127.0.0.1:3000:3000 \
  -v metabase-data:/metabase-data \
  -e MB_ENCRYPTION_SECRET_KEY=replace-with-a-long-random-value \
  -e MB_DB_TYPE=h2 \
  -e MB_DB_FILE=/metabase-data/metabase.db \
  metabase/metabase:latest

Перед открытием ingress проверьте итоговые переменные окружения, mount и listener. Добавьте проверенные параметры подключения к выделенной базе приложения Postgres, отдельной от источников аналитических данных; для приватных сервисов используйте приватные имена. Успешный запуск считается завершённым, когда вы можете подключить тестовую базу данных только для чтения, сохранить вопрос, создать dashboard и доставить подписку через настроенный почтовый канал, а не когда docker ps выводит Up.

Проверьте развёртывание Metabase от начала до конца

Production-проверка Metabase должна выполняться человеком, который не создавал это развёртывание. Предоставьте ему зафиксированную версию, тестовую учётную запись без чувствительных данных и следующую задачу: подключить тестовую базу данных только для чтения, сохранить вопрос, создать dashboard и доставить подписку через настроенный почтовый канал. Если инструкции требуют недокументированного доступа к shell, сервис ещё не готов к эксплуатации.

Повторите проверку, заменив только контейнер. Затем восстановите базу данных приложения Metabase, а не только запрашиваемые источники данных, в чистой инфраструктуре и убедитесь, что пользователи, коллекции, вопросы, фильтры dashboard и подписки снова появились и выполняются с использованием восстановленных метаданных подключений. Во время обоих успешных прогонов измеряйте heap JVM, параллельные запросы, кэширование результатов и нагрузку, передаваемую каждому источнику аналитических данных; неожиданные различия часто указывают на отсутствующий кэш, индекс, worker или mount данных.

Добавьте проверку отказоустойчивости: временно запретите тестовой identity доступ к выделенной базе приложения Postgres, отдельной от источников аналитических данных. Metabase должен выдать понятную ошибку, сохранить существующее состояние и восстановить работу после возврата корректного условия. Сохраните временные метки и относящиеся к делу строки логов, предварительно удалив секреты. Эти сведения станут эталоном для следующего изменения образа или конфигурации.

Не смешивайте внутренние и внешние URL

Браузер, API-клиент и Metabase должны использовать один и тот же origin. Чтобы обеспечить это, задайте MB_SITE_URL равным публичному HTTPS origin. Сохраняйте исходные host и protocol, но не позволяйте порту 3000 выступать альтернативным публичным адресом.

Руководство по устранению проблем с недоступным сайтом помогает отличить недоступный маршрут от приложения, которое отвечает на запросы. В данном случае это различие важно: база данных приложения отсутствует, хотя исходные базы данных для dashboard остаются на месте. Изменения ingress устраняют только первую проблему; для второй потребуется проверить логи Metabase, состояние или нагрузку.

Эксплуатируйте Metabase с учётом реального узкого места

Для Metabase отслеживайте транзакцию, а не процесс: подключение тестовой базы данных только для чтения, сохранение вопроса, создание dashboard и доставку подписки через настроенный почтовый канал. Сопоставляйте её latency и частоту ошибок с heap JVM, параллельными запросами, кэшированием результатов и нагрузкой, передаваемой каждому источнику аналитических данных, чтобы alert указывал на ограниченный компонент.

Репетиция обновления должна учитывать, что база данных приложения Metabase и версии плагинов должны мигрировать вместе; запрашиваемые бизнес-базы данных не заменяют это состояние. Восстановите данные, выполните миграцию и запустите транзакцию до замены production-инстанса. Если база данных приложения отсутствует, хотя исходные базы данных для dashboard остаются, не стирайте данные ради успешного запуска; вначале сравните версию, переменные, mount и доступность зависимостей — именно в таком порядке.

Volumes — только первый уровень восстановления

Защитите состояние Metabase до оптимизации его контейнера. В обязательный набор входит база данных приложения Metabase, а не только запрашиваемые источники данных. Подключите /metabase-data до bootstrap, запишите безопасные тестовые данные и замените контейнер, чтобы убедиться, что этот путь действительно сохраняется. Если несколько хранилищ должны оставаться согласованными, документируйте порядок остановки записи и создания резервных копий.

Храните копии вне сервера развёртывания и шифруйте материалы, содержащие учётные данные или приватное содержимое. Восстановление считается успешным, когда пользователи, коллекции, вопросы, фильтры dashboard и подписки снова появляются и выполняются с использованием восстановленных метаданных подключений. Различие между постоянным mount и независимой копией описано в материале постоянное хранилище и snapshots.

Разворачивайте Metabase на Dockup, сохраняя эти границы

Шаблон Dockup должен описывать образ, порт 3000, mount, параметры health-check, домен, TLS и передачу секретов. Dockup должен отделять приватные компоненты выделенной базы приложения Postgres от источников аналитических данных во внутренней сети и не открывать дополнительные публичные порты. Одно и то же развёртывание может использовать серверы Dockup или capacity, подключённую заказчиком.

После активации маршрута примените публичный параметр и попробуйте подключить тестовую базу данных только для чтения, сохранить вопрос, создать dashboard и доставить подписку через настроенный почтовый канал. Создавайте резервную копию базы данных приложения Metabase, а не только запрашиваемых источников данных, и включите проверку восстановления в операционный план; это обязанности, связанные с Metabase, которые остаются актуальными после подготовки инфраструктуры.

Часто задаваемые вопросы

Что нужно Metabase для production-развёртывания?

Направьте контейнер Metabase на порту 3000 через один HTTPS origin. Требование к поддерживающей сети — выделенная база приложения Postgres, отдельная от источников аналитических данных. Не объявляйте Metabase готовым, пока не сможете подключить тестовую базу данных только для чтения, сохранить вопрос, создать dashboard и доставить подписку через настроенный почтовый канал.

Какие данные Metabase нужно включать в резервную копию?

Сохраняйте /metabase-data и включайте базу данных приложения Metabase, а не только запрашиваемые источники данных, в тот же манифест восстановления. Восстановление чистого экземпляра Metabase считается успешным только тогда, когда пользователи, коллекции, вопросы, фильтры dashboard и подписки снова появляются и выполняются с использованием восстановленных метаданных подключений.

Требуется ли Metabase HTTPS за reverse proxy?

Используйте HTTPS для публичного Metabase origin и оставляйте порт 3000 во внутреннем маршруте. Корректно примените настройку Metabase: задайте MB_SITE_URL равным публичному HTTPS origin. Для Metabase HTTPS защищает учётные данные или пользовательское содержимое при передаче и обеспечивает согласованное поведение клиентов, зависящее от origin.

Как тестировать обновление Metabase?

Восстановите текущее состояние Metabase в изолированном развёртывании, примените кандидатную версию и повторите транзакцию приёмочного тестирования. Уделите этому особое внимание, поскольку база данных приложения Metabase и версии плагинов должны мигрировать вместе; запрашиваемые бизнес-базы данных не заменяют это состояние. Не удаляйте предыдущий образ Metabase, пока не будут понятны границы миграции данных и отката.