Пошаговая инструкция · Самостоятельная установка
Как установить 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.yamlservices:
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 до запуска базы.
docker compose config --quietКоманда завершилась без ошибок. При сообщении об ошибке исправьте указанную строку, затем повторите проверку.
Шаг 6. Загрузите образы #
Скачаем зафиксированный Metabase и PostgreSQL. Это подготовка файлов, приложение ещё не запущено.
docker compose pullОба образа загружены; нет ошибок доступа к реестру или сети.
Шаг 7. Запустите приложение #
При первом старте PostgreSQL создаёт базу и роль, затем Metabase создаёт свои таблицы. Команда -d оставляет процессы в фоне.
docker compose up -dКонтейнеры созданы. Подождите минуту перед следующей проверкой.
Шаг 8. Дождитесь готовности Metabase #
Проверим ответ приложения на локальном адресе. Это ещё не проверка ваших аналитических данных.
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/metabasemap $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 проверяет ответ для вашего домена. При ошибке остановитесь, исправьте указанную строку и повторите проверку.
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.
sudo /snap/bin/certbot --nginx -d analytics.example.org --redirectCertbot сообщил об успешной установке. Откройте 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 продолжает работать.
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 реквизиты источников могут не восстановиться.
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 и таймер продления.