Удельта

Пошаговая инструкция · Самостоятельная установка

Как установить Metabase на сервер

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

Первая аналитическая панель: источник данных подключён к понятным графикам и отчёту

Что подготовить #

Установим Metabase Open Source v0.63.19 для вопросов и панелей по вашим данным. Отдельная PostgreSQL 17 будет хранить пользователей, панели и настройки Metabase. База с продажами или другими рабочими данными подключается позже: резервная копия Metabase не заменяет её собственную копию.

Нужны Ubuntu 26.04 LTS, Docker Engine, Compose v2 и Nginx из подготовки сервера. Предусмотрите минимум 4 ГБ памяти для этого примера и запас для нагрузки: Java получает до 2 ГБ, а база и ОС тоже используют RAM. Команды выполняйте в SSH-терминале сервера от пользователя с sudo. При любой ошибке сначала исправьте текущий шаг.

Создайте A-запись своего домена на IP сервера. Во всех примерах замените analytics.example.org своим доменом. Для первичной настройки понадобится второй терминал на вашем компьютере: там откроем SSH-туннель, чтобы мастер не был доступен посторонним. Подготовьте SMTP-реквизиты для восстановления пароля и отдельного пользователя рабочей базы с правами чтения.

Настройка внешнего доступа использует обратный прокси Nginx и Certbot для Nginx. Приложение остаётся доступным на локальном порту; снаружи открыт его HTTPS-домен.

Шаг 1. Создайте каталог приложения #

Файлы запуска будут в /opt/metabase. Команда передаёт каталог вашему пользователю; при новом подключении возвращайтесь сюда командой cd /opt/metabase.

Подготовить каталог
sudo install -d -m 750 -o "$USER" -g "$USER" /opt/metabase
cd /opt/metabase
mkdir -p db-init

Каталог создан, вы находитесь в /opt/metabase. db-init хранит сценарий первого создания роли базы.

Шаг 2. Создайте пароли и ключ шифрования #

Случайные пароли базы и ключ шифрования сохраним в .env. Последний защищает реквизиты подключаемых источников; храните его вместе с резервной копией и не меняйте при переносе.

Создать секреты
umask 077
printf 'DB_ADMIN_PASSWORD=%s\nMETABASE_DB_PASSWORD=%s\nMB_ENCRYPTION_SECRET_KEY=%s\n' "$(openssl rand -hex 24)" "$(openssl rand -hex 24)" "$(openssl rand -base64 32)" > .env
chmod 600 .env

Создан непустой .env с тремя параметрами. Повторный запуск заменит секреты: на рабочей установке этого не делайте.

Шаг 3. Подготовьте отдельного пользователя базы #

Сценарий ниже создаст роль metabase без административных прав. PostgreSQL выполнит его при первом запуске пустого тома. Блок целиком вставьте в SSH: строки между INIT — содержимое файла, а не отдельные команды.

Создать сценарий инициализации
cat > db-init/10-metabase.sh <<'INIT'
#!/bin/bash
set -e
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname metabaseappdb --set=app_password="$METABASE_DB_PASSWORD" <<'SQL'
CREATE ROLE metabase LOGIN NOSUPERUSER NOCREATEDB NOCREATEROLE PASSWORD :'app_password';
ALTER DATABASE metabaseappdb OWNER TO metabase;
SQL
INIT
chmod 755 db-init/10-metabase.sh

Файл db-init/10-metabase.sh создан. Если том базы уже содержит данные, этот сценарий повторно сам не выполнится.

Шаг 4. Сохраните Compose #

Выполните nano compose.yaml и вставьте файл ниже. Он запускает две программы и сохраняет базу в Docker-томе database — данные живут отдельно от заменяемого контейнера. Замените домен в MB_SITE_URL своим.

Файл /opt/metabase/compose.yaml
services:
  db:
    image: postgres:17
    restart: unless-stopped
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: ${DB_ADMIN_PASSWORD:?}
      POSTGRES_DB: metabaseappdb
      METABASE_DB_PASSWORD: ${METABASE_DB_PASSWORD:?}
    volumes:
      - database:/var/lib/postgresql/data
      - ./db-init:/docker-entrypoint-initdb.d:ro
    healthcheck:
      test: [CMD-SHELL, 'pg_isready -h 127.0.0.1 -U postgres -d metabaseappdb']
      interval: 10s
      timeout: 5s
      retries: 10
  metabase:
    image: metabase/metabase:v0.63.19
    restart: unless-stopped
    ports:
      - 127.0.0.1:3000:3000
    environment:
      MB_DB_TYPE: postgres
      MB_DB_DBNAME: metabaseappdb
      MB_DB_HOST: db
      MB_DB_PORT: 5432
      MB_DB_USER: metabase
      MB_DB_PASS: ${METABASE_DB_PASSWORD:?}
      MB_SITE_URL: https://analytics.example.org
      MB_ENCRYPTION_SECRET_KEY: ${MB_ENCRYPTION_SECRET_KEY:?}
      JAVA_TOOL_OPTIONS: -Xmx2g
    depends_on:
      db:
        condition: service_healthy
volumes:
  database:

В nano сохраните Ctrl+O, Enter и выйдите Ctrl+X. Порт 3000 доступен только серверу, а PostgreSQL не опубликована в Интернет.

Шаг 5. Проверьте файл запуска #

Проверка найдёт ошибки отступов YAML и отсутствующие значения .env до запуска базы.

Проверить Compose
docker compose config --quiet

Команда завершилась без ошибок. При сообщении об ошибке исправьте указанную строку, затем повторите проверку.

Шаг 6. Загрузите образы #

Скачаем зафиксированный Metabase и PostgreSQL. Это подготовка файлов, приложение ещё не запущено.

Загрузить Metabase и PostgreSQL
docker compose pull

Оба образа загружены; нет ошибок доступа к реестру или сети.

Шаг 7. Запустите приложение #

При первом старте PostgreSQL создаёт базу и роль, затем Metabase создаёт свои таблицы. Команда -d оставляет процессы в фоне.

Запустить сервисы
docker compose up -d

Контейнеры созданы. Подождите минуту перед следующей проверкой.

Шаг 8. Дождитесь готовности Metabase #

Проверим ответ приложения на локальном адресе. Это ещё не проверка ваших аналитических данных.

Проверить HTTP-сервис
curl -fsS http://127.0.0.1:3000/api/health

Ответ содержит status: ok. При отказе соединения подождите и повторите; при постоянной ошибке смотрите docker compose logs --tail=100 metabase db.

Шаг 9. Откройте мастер через SSH-туннель #

Эту команду выполняйте во втором терминале на своём компьютере, а не на сервере. Замените deploy своим SSH-пользователем, SERVER_IP — IP сервера. Туннель передаёт локальный порт компьютера к закрытому порту Metabase; оставьте этот терминал открытым.

На вашем компьютере: открыть туннель
ssh -N -L 13000:127.0.0.1:3000 deploy@SERVER_IP

Команда остаётся работающей без вывода — это нормально. В браузере на компьютере откройте http://127.0.0.1:13000: появился мастер настройки.

Шаг 10. Создайте администратора #

Пройдите мастер в браузере: задайте личную почту и отдельный длинный пароль. Подключение рабочих данных пока можно пропустить. Пароль администратора Metabase отличается от паролей PostgreSQL.

После мастера открылась главная страница. Закройте туннель Ctrl+C в терминале компьютера: первичная учётная запись уже создана.

Шаг 11. Сохраните сайт Nginx #

Установите Nginx и Certbot по подготовке Ubuntu, если ещё не установили. Откройте sudo nano /etc/nginx/sites-available/metabase и вставьте файл ниже. Замените все домены своими. Nginx передаёт приложению домен, адрес клиента и протокол; Upgrade и Connection сохраняют WebSocket. До получения сертификата условие $scheme блокирует обычные HTTP-запросы кодом 403, чтобы вход не происходил без шифрования.

Файл /etc/nginx/sites-available/metabase
map $http_upgrade $metabase_connection_upgrade {
    default upgrade;
    "" close;
}

server {
    listen 80;
    server_name analytics.example.org;
    client_max_body_size 100m;
    location / {
        if ($scheme = http) { return 403; }
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $metabase_connection_upgrade;
        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
        proxy_buffering off;
    }
}

Сохраните Ctrl+O, Enter, Ctrl+X. В файле пока нет путей к сертификатам: Nginx сможет проверить его до выпуска HTTPS.

Шаг 12. Подключите сайт и проверьте HTTP #

Ссылка подключает сохранённый сайт. nginx -t проверяет все настройки сервера; && разрешает перечитать их только при успешной проверке. curl проверяет ответ для вашего домена. При ошибке остановитесь, исправьте указанную строку и повторите проверку.

Подключите сайт и проверьте HTTP
sudo ln -sfn /etc/nginx/sites-available/metabase /etc/nginx/sites-enabled/metabase
sudo nginx -t && sudo systemctl reload nginx
curl -I http://analytics.example.org/

Ожидается successful от nginx -t и HTTP 403 для обычного запроса: до HTTPS это намеренная блокировка. DNS должен указывать на сервер, TCP 80/443 — быть доступен у провайдера. Ничего не вводите в форму входа по HTTP.

Шаг 13. Получите сертификат и включите HTTPS #

Каждое имя из команды должно указывать на этот сервер. Certbot проверит домены, сам добавит сертификат в сайт Nginx и включит перенаправление HTTP → HTTPS. Укажите свою почту при запросе и подтвердите условия Let’s Encrypt. Это отдельное действие после успешной проверки HTTP.

Получите сертификат и включите HTTPS
sudo /snap/bin/certbot --nginx -d analytics.example.org --redirect

Certbot сообщил об успешной установке. Откройте HTTPS-адрес со своего компьютера: браузер не должен предупреждать о сертификате. Для закрытой панели используйте разрешённый IP. При ошибке исправьте DNS, в том числе AAAA, либо доступ к TCP 80; не повторяйте запросы выпуска подряд.

Шаг 14. Проверьте продление сертификата #

Certbot из snap создаёт службу автоматического продления. Dry-run выполняет пробное продление: настоящие сертификаты не заменяются. Затем проверьте, что таймер планирует следующий запуск. Сохраняйте доступ к TCP 80 для следующих проверок домена.

Проверьте продление сертификата
sudo /snap/bin/certbot renew --dry-run
systemctl list-timers --all 'snap.certbot.renew*'

Пробное продление успешно, у таймера есть следующий запуск. Если тест не прошёл, проверьте /var/log/letsencrypt/letsencrypt.log; сначала исправьте причину. После этого можно создавать учётную запись и приглашать пользователей.

Шаг 15. Проверьте почту и часовой пояс #

В административных настройках проверьте адрес сайта и часовой пояс отчётов. В настройках Email заполните SMTP-реквизиты своего почтового провайдера и отправьте тестовое письмо.

Тестовое письмо дошло. Затем проверьте восстановление пароля на собственный адрес до приглашения команды.

Шаг 16. Подключите одну рабочую базу #

Попросите администратора источника создать отдельную роль только для чтения согласованных таблиц. В Admin → Databases добавьте тип базы, её сетевой адрес, порт, имя и реквизиты этой роли. localhost означает контейнер Metabase, поэтому для другой машины нужен её доступный адрес. При внешнем соединении настройте проверяемый TLS.

Подключение прошло проверку и видны нужные таблицы. Пароль владельца всей рабочей базы в Metabase не используется.

Шаг 17. Сохраните первый вопрос #

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

Вопрос возвращает ожидаемый результат. Ошибка соединения требует проверки сети и прав; неправильное число требует проверки фильтров и часового пояса.

Шаг 18. Проверьте панель и доступ сотрудника #

Добавьте сохранённый вопрос на новую панель. Создайте обычного сотрудника и откройте её от его имени. Проверьте права коллекции и доступ к данным, прежде чем приглашать всю команду.

Сотрудник видит разрешённую панель и не видит лишние коллекции. Публичные ссылки оставьте выключенными для внутренних данных.

Шаг 19. Подготовьте каталог копии #

В SSH-терминале сервера вернитесь в /opt/metabase. Следующие шаги выполняйте в одной сессии: переменная METABASE_BACKUP хранит путь новой копии.

Создать каталог копии
cd /opt/metabase
umask 077
METABASE_BACKUP="$HOME/metabase-backup-$(date +%F-%H%M)"
mkdir -p "$METABASE_BACKUP"

Каталог создан без ошибки. Копировать будем базу Metabase, а не подключённые источники.

Шаг 20. Выгрузите базу настроек #

Остановите только Metabase, чтобы новые настройки не менялись во время копирования. PostgreSQL продолжает работать.

Создать дамп PostgreSQL
docker compose stop metabase
docker compose exec -T db pg_dump -U metabase -Fc metabaseappdb > "$METABASE_BACKUP/application.dump"

pg_dump завершился без ошибки и application.dump не пуст. До следующего шага панель недоступна.

Шаг 21. Сохраните ключ и верните панель #

Добавьте к дампу настройки и сценарий создания роли, затем верните Metabase. Без исходного MB_ENCRYPTION_SECRET_KEY реквизиты источников могут не восстановиться.

Сохранить настройки и запустить Metabase
cp -a .env compose.yaml db-init "$METABASE_BACKUP/"
docker compose up -d metabase

Панель и вопрос открываются. Перенесите копию в защищённое хранилище вне этого сервера.

Как проверить восстановление #

На отдельном сервере восстановите файлы и тот же v0.63.19, задайте другой домен и отключите рассылку: MB_DISABLE_SCHEDULER=true у Metabase и запрет рабочего SMTP. Запустите только db, дождитесь её готовности и импортируйте дамп командой docker compose exec -T db pg_restore -U metabase --clean --if-exists --no-owner -d metabaseappdb < /path/to/backup/application.dump, заменив путь настоящим. Команду выполняйте только на тестовой пустой установке: она заменяет её таблицы. Затем запустите Metabase и проверьте вход, панель и права сотрудника.

Если шаг не работает и как обновлять #

В /opt/metabase используйте docker compose ps и docker compose logs --tail=100 metabase db. Для 502 сначала повторите локальный /api/health. Если база не подключается, проверьте имя db и совпадение пароля; .env не меняет пароль уже созданного PostgreSQL-тома. При нехватке памяти проверьте журналы и RAM, прежде чем повышать -Xmx2g.

Перед обновлением создайте и испытайте копию, изучите поддерживаемый путь версий. Новый тег сначала проверьте на восстановленной базе. После старта повторите вопрос, панель, права и почту. Миграции могут изменить базу: для отката подготовьте прежний образ вместе с дампом до обновления.

Настройки внешнего доступа храните вместе с копией приложения: /etc/nginx/sites-available/metabase и /etc/letsencrypt содержат сайт и сертификаты с закрытыми ключами. Архивируйте их с sudo в закрытое хранилище. После восстановления подключите сайт через sites-enabled, выполните sudo nginx -t, затем перечитайте Nginx. Для ошибки 502 сначала проверьте локальное приложение и /var/log/nginx/error.log; для сертификата — /var/log/letsencrypt/letsencrypt.log и таймер продления.

Обсудить установку и настройку

Материал был полезен?

Сообщить об ошибке или задать вопрос редакции

Сообщение увидит редакция. Не указывайте пароли и личные данные. Текст удаляется через 180 дней.

О материале

ИнфраструктураРуководствоЗадача: установитьУровень: практикаMetabase

Последнее обновление:

Обсуждение

Комментарии проходят подтверждение адреса и проверку редакцией.