Подробный гайд: Резервное копирование Prometheus и Grafana
Автор: А. Денис Сергеевич (ServerMon.ru) | Дата: Апрель 2026
Данный гайд охватывает production-подход к бэкапам метрик (Prometheus) и визуализаций/конфигураций (Grafana). Включены нативные методы, автоматизация, восстановление и лучшие практики безопасности.
1. Prometheus: бэкап и восстановление
1.1. Где хранятся данные
По умолчанию (Linux-пакеты):
/var/lib/prometheus/
Внутри:
data/— блоки TSDB (чанки по 2 часа, индексы, WAL)snapshots/— создаются вручнуюrules/— файлы правил алертинга/записи (если используются)
Важно:
- Prometheus не поддерживает горячую остановку без потери последних ~2 часов данных из WAL. Для production рекомендуется remote storage или регулярные snapshot'ы + внешнее хранилище.
1.2. Нативный snapshot (promtool)
Создаёт согласованный снимок текущих блоков TSDB без остановки сервиса.
sudo -u prometheus promtool tsdb snapshot /var/lib/prometheus/
Результат:
/var/lib/prometheus/snapshots/20260419T143022Z/
Ограничения:
- Не бэкапит WAL (последние ~2ч)
- Не заменяет долгосрочное хранение
- Рекомендуется только для аварийного снапшота или миграции
1.3. Production-подход: Remote Storage + Object Storage
Официально рекомендованный путь с 2024 года:
| Инструмент | Механизм | Хранилище |
|---|---|---|
| Thanos Sidecar | Загружает блоки Prometheus в S3 | S3/MinIO/GCS |
| VictoriaMetrics | Встроенный бэкап/восстановление | S3/FS/NFS |
| Grafana Mimir | Блоки + индексы в объектном хранилище | S3-compatible |
Пример интеграции Thanos Sidecar (кратко):
# /etc/prometheus/prometheus.yml
remote_write:
- url: "http://thanos-sidecar:10901/api/v1/receive"
Thanos автоматически синхронизирует блоки в S3 при --objstore.config-file.
1.4. Автоматизация бэкапа (скрипт + cron)
Если remote storage недоступен, используйте скрипт с promtool + rclone/aws s3:
#!/usr/bin/env bash
set -euo pipefail
BACKUP_DIR="/var/backups/prometheus"
SNAPSHOT_DIR="/var/lib/prometheus/snapshots"
S3_BUCKET="s3://your-prometheus-backups"
RETENTION_DAYS=30
mkdir -p "$BACKUP_DIR"
TIMESTAMP=$(date -u +"%Y%m%dT%H%M%SZ")
# 1. Создаём снапшот
sudo -u prometheus promtool tsdb snapshot /var/lib/prometheus/
# 2. Архивируем последний снапшот
LATEST_SNAPSHOT=$(ls -td "$SNAPSHOT_DIR"/*/ | head -n1)
tar -czf "$BACKUP_DIR/prometheus_$TIMESTAMP.tar.gz" -C "$(dirname "$LATEST_SNAPSHOT")" "$(basename "$LATEST_SNAPSHOT")"
# 3. Отправляем в S3
rclone copy "$BACKUP_DIR/prometheus_$TIMESTAMP.tar.gz" "$S3_BUCKET" --s3-storage-class STANDARD_IA --quiet
# 4. Чистка локальных архивов
find "$BACKUP_DIR" -name "prometheus_*.tar.gz" -mtime +$RETENTION_DAYS -delete
# 5. Чистка старых снапшотов (Prometheus не удаляет их сам)
find "$SNAPSHOT_DIR" -maxdepth 1 -type d -mtime +1 -exec rm -rf {} +
Добавьте в crontab -e:
0 2 * * * /usr/local/bin/prometheus-backup.sh >> /var/log/prometheus-backup.log 2>&1
1.5. Восстановление Prometheus
- Остановите сервис:
sudo systemctl stop prometheus - Очистите
/var/lib/prometheus/data/(или переместите вdata.old/)
3. Распакуйте архив в data/:
sudo -u prometheus tar -xzf prometheus_20260419T020000Z.tar.gz -C /var/lib/prometheus/data/
- Запустите:
sudo systemctl start prometheus - Проверьте логи:
journalctl -u prometheus -f --since "5 min ago"
Если используется Thanos/VictoriaMetrics, восстановление сводится к перезапуску с указанием того же бакета. Данные подтянутся автоматически.
2. Grafana: бэкап и восстановление
2.1. Что нужно бэкапить
| Компонент | Путь/Тип | Примечание |
|---|---|---|
| База данных | SQLite: /var/lib/grafana/grafana.dbPostgreSQL/MySQL: внешний сервер |
Дашборды, пользователи, алерты, настройки |
| Конфигурация | /etc/grafana/grafana.ini |
Секреты, SMTP, LDAP, плагины |
| Плагины | /var/lib/grafana/plugins/ |
Загруженные сторонние плагины |
| Файловые дашборды | /etc/grafana/provisioning/ |
Если используется provisioning |
2.2. Бэкап базы данных
SQLite (по умолчанию)
Включите WAL-режим для горячего бэкапа (в grafana.ini):
[database]
wal = true
Скрипт бэкапа:
sudo -u grafana sqlite3 /var/lib/grafana/grafana.db ".backup '/var/backups/grafana/grafana_$(date -u +%Y%m%dT%H%M%SZ).db'"
PostgreSQL / MySQL
# PostgreSQL
pg_dump -U grafana -h localhost grafana | gzip > /var/backups/grafana/grafana_$(date -u +%Y%m%d).sql.gz
# MySQL
mysqldump -u grafana -p grafana | gzip > /var/backups/grafana/grafana_$(date -u +%Y%m%d).sql.gz
2.3. Бэкап через API / grafana-backup-tool
Официального CLI для полного бэкапа нет.
Рекомендуется утилита grafana-backup-tool - github.com/ysde/grafana-backup-tool:
pip3 install grafana-backup-tool
Конфиг /etc/grafana-backup/grafana_backup.ini:
[grafana]
url = http://localhost:3000
token = glsa_ВАШ_ТОКЕН_С_ПРАВАМИ_ADMIN
verify_ssl = True
[storage]
storage_type = local
local_storage_dir = /var/backups/grafana-api
Запуск:
grafana-backup save
Поддерживает S3, Azure, GCS, шифрование, ротацию.
2.4. Полный скрипт автоматизации (SQLite + файлы + API)
#!/usr/bin/env bash
set -euo pipefail
BACKUP_DIR="/var/backups/grafana"
GRAFANA_DB="/var/lib/grafana/grafana.db"
GRAFANA_CONF="/etc/grafana/grafana.ini"
GRAFANA_PLUGINS="/var/lib/grafana/plugins"
TIMESTAMP=$(date -u +"%Y%m%dT%H%M%SZ")
mkdir -p "$BACKUP_DIR"
# 1. БД (SQLite)
sqlite3 "$GRAFANA_DB" ".backup '$BACKUP_DIR/grafana_db_$TIMESTAMP.db'"
# 2. Конфиги и плагины
tar -czf "$BACKUP_DIR/grafana_files_$TIMESTAMP.tar.gz" \
-C / etc/grafana/grafana.ini \
-C /var/lib/grafana plugins/ provisioning/ 2>/dev/null || true
# 3. API-бэкап (если установлен grafana-backup-tool)
grafana-backup save --output-dir "$BACKUP_DIR"
# 4. Отправка в S3
rclone sync "$BACKUP_DIR" s3://your-grafana-backups/grafana_$(date -u +%Y) --s3-storage-class STANDARD_IA --delete-after --quiet
# 5. Ротация
find "$BACKUP_DIR" -name "*.db" -mtime +14 -delete
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +7 -delete
Cron:
30 2 * * * /usr/local/bin/grafana-backup.sh >> /var/log/grafana-backup.log 2>&1
2.5. Восстановление Grafana
- Остановите:
sudo systemctl stop grafana-server
2. Восстановите БД:
sudo cp /var/backups/grafana/grafana_db_20260419T023000Z.db /var/lib/grafana/grafana.db
sudo chown grafana:grafana /var/lib/grafana/grafana.db
3. Распакуйте файлы:
sudo tar -xzf grafana_files_*.tar.gz -C /
sudo chown -R grafana:grafana /var/lib/grafana/plugins/
- Запустите:
sudo systemctl start grafana-server
5. Если использовался grafana-backup-tool:
grafana-backup restore --input-dir /var/backups/grafana-api
Токен для бэкапа должен иметь роль
AdminилиEditorс правамиDashboard:Read,Datasource:Read,User:Read,API Key:Create.
3. Общие лучшие практики (2026)
| Практика | Рекомендация |
|---|---|
| 3-2-1 | 3 копии, 2 типа носителей, 1 вне площадки (S3/MinIO/холодное хранилище) |
| Шифрование | rclone crypt, gpg -c, или S3 SSE-KMS. Никогда не храните бэкапы в открытом виде |
| Ротация | Daily 7d → Weekly 4w → Monthly 12m. Используйте rclone или borg/restic |
| Мониторинг бэкапов | Экспортируйте статус в Prometheus: node_cron_job_status, grafana_backup_last_success, prometheus_backup_size_bytes. Алерты на >24h без успеха |
| Тестирование | Ежеквартально разворачивайте бэкап на staging. Проверяйте целостность TSDB (promtool check data) и загрузку дашбордов |
| Безопасность | Отдельный IAM-пользователь для бэкапов, policy s3:PutObject + s3:GetObject, без s3:DeleteObject (используйте lifecycle rules) |
| Kubernetes | Используйте Velero для бэкапа PVC + prometheus-operator/kube-prometheus-stack встроенные снапшоты. Для Grafana Helm-чарты поддерживают backup.enabled |
4. Быстрая шпаргалка
| Задача | Команда / Инструмент |
|---|---|
| Снапшот Prometheus | promtool tsdb snapshot /var/lib/prometheus/ |
| Проверка TSDB | promtool check data /var/lib/prometheus/data/ |
| Бэкап Grafana DB (SQLite) | sqlite3 grafana.db ".backup backup.db" |
| Бэкап дашбордов API | grafana-backup save |
| Отправка в S3 | rclone sync /var/backups/ s3://bucket/path --delete-after |
| Восстановление Prometheus | Заменить data/, systemctl restart prometheus |
| Восстановление Grafana | Восстановить БД + файлы, systemctl restart grafana-server |
Чек-лист перед запуском в production
- [ ] Бэкапы запускаются автоматически и логируются
- [ ] Размер бэкапов > 0, архивы открываются
- [ ] S3-бакет с lifecycle policy и шифрованием
- [ ] Тестовое восстановление выполнено на отдельном сервере
- [ ] Алерт на отсутствие успешного бэкапа > 24ч
- [ ] Документация по восстановлению доступна offline