Подробный гайд по резервному копированию Grafana
Важно:
Графана хранит данные в нескольких местах: база данных, конфигурационные файлы, provisioning-каталоги и установленные плагины. Полноценный бэкап должен охватывать все эти компоненты.
1. Что необходимо резервировать
| Компонент | Описание | Типичный путь (Linux) |
|---|---|---|
| База данных | Пользователи, дашборды, алерты, настройки, история | /var/lib/grafana/grafana.db (SQLite) или внешняя БД |
| Конфигурация | grafana.ini или переменные окружения |
/etc/grafana/grafana.ini |
| Provisioning | YAML-файлы для дашбордов, источников данных, плагинов, алертов | /etc/grafana/provisioning/ |
| Плагины | Сторонние/кастомные плагины, установленные вручную | /var/lib/grafana/plugins/ |
| Статические ресурсы | Логотипы, темы, сертификаты (если менялись) | /var/lib/grafana/ или кастомные пути |
Пути могут отличаться в зависимости от способа установки, ОС и переменных GF_PATHS_DATA / GF_PATHS_CONFIG.
2. Резервное копирование базы данных
Способ зависит от используемой СУБД.
SQLite (по умолчанию)
Безопасный способ (без остановки Grafana):
sqlite3 /var/lib/grafana/grafana.db ".backup '/tmp/grafana_db_backup.db'"
Альтернатива (с остановкой сервиса):
systemctl stop grafana-server
cp /var/lib/grafana/grafana.db /tmp/grafana_db_backup.db
systemctl start grafana-server
PostgreSQL
pg_dump -U grafana -d grafana -F c -f /tmp/grafana_pg_backup.dump
# Для восстановления:
# pg_restore -U grafana -d grafana -c /tmp/grafana_pg_backup.dump
MySQL / MariaDB
mysqldump -u grafana -p --single-transaction grafana > /tmp/grafana_mysql_backup.sql
# Для восстановления:
# mysql -u grafana -p grafana < /tmp/grafana_mysql_backup.sql
Для внешних БД используйте учетные данные из grafana.ini или переменных окружения GF_DATABASE_*.
3. Бэкап конфигурации, provisioning и плагинов
BACKUP_DIR="/opt/grafana-backup/$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"
# Конфигурация
cp /etc/grafana/grafana.ini "$BACKUP_DIR/"
# Provisioning (дашборды, DS, алерты, уведомления)
cp -r /etc/grafana/provisioning "$BACKUP_DIR/"
# Плагины
cp -r /var/lib/grafana/plugins "$BACKUP_DIR/" 2>/dev/null || true
# Статические файлы (логотип, темы, сертификаты)
cp -r /var/lib/grafana/{png,svg,json,ca-certificates.crt} "$BACKUP_DIR/" 2>/dev/null || true
echo "Бэкап сохранён в: $BACKUP_DIR"
4. Особенности по способу развёртывания
Package / systemd (RPM/DEB)
- Все пути по умолчанию:
/etc/grafana/,/var/lib/grafana/ - Управление сервисом:
systemctl {start|stop|status} grafana-server - Логи:
journalctl -u grafana-server -f
Docker / Docker Compose
Обычно используются тома:
volumes:
- ./grafana-data:/var/lib/grafana
- ./grafana-config:/etc/grafana
Бэкап:
docker run --rm \
-v grafana_data:/source:ro \
-v $(pwd):/backup \
alpine tar czf /backup/grafana_data_$(date +%F).tar.gz -C /source .
Восстановление:
docker run --rm \
-v grafana_data:/dest \
-v $(pwd):/backup \
alpine tar xzf /backup/grafana_data_*.tar.gz -C /dest
Kubernetes
- Данные хранятся в
PersistentVolume(обычноgrafana-data) - Рекомендуемый способ:
VeleroилиKasten K10для бэкапа PV/PVC
- Альтернатива (CronJob):
apiVersion: batch/v1
kind: CronJob
metadata:
name: grafana-backup
spec:
schedule: "0 2 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: bitnami/kubectl
command:
- /bin/sh
- -c
- kubectl exec grafana-pod -- sqlite3 /var/lib/grafana/grafana.db ".backup '/tmp/grafana.db'" && \
kubectl cp grafana-pod:/tmp/grafana.db ./backup_$(date +%F).db
restartPolicy: OnFailure
5. Восстановление из резервной копии
Шаги:
- Остановите Grafana:
systemctl stop grafana-serverилиdocker compose down
2. Восстановите БД:
- SQLite: замените файл или используйте
sqlite3 new.db ".restore backup.db" - PostgreSQL/MySQL: выполните
pg_restoreилиmysql < backup.sql
3. Восстановите конфиги и provisioning:
cp -r /path/to/backup/provisioning /etc/grafana/
cp /path/to/backup/grafana.ini /etc/grafana/
4. Проверьте права:
chown -R grafana:grafana /var/lib/grafana /etc/grafana
chmod -R 750 /var/lib/grafana /etc/grafana
- Запустите сервис:
systemctl start grafana-server - Проверьте логи:
journalctl -u grafana-server -n 50 --no-pager
Версия Grafana:
Восстанавливайте на ту же или более новую версию. Даунгрейд может сломать схему БД.
6. Автоматизация (готовый скрипт + cron)
grafana-backup.sh
#!/bin/bash
set -euo pipefail
BACKUP_ROOT="/opt/grafana-backups"
RETENTION_DAYS=30
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="$BACKUP_ROOT/$TIMESTAMP"
mkdir -p "$BACKUP_DIR"
# 1. БД (SQLite)
sqlite3 /var/lib/grafana/grafana.db ".backup '$BACKUP_DIR/grafana.db'"
# 2. Конфиги и provisioning
cp /etc/grafana/grafana.ini "$BACKUP_DIR/"
cp -r /etc/grafana/provisioning "$BACKUP_DIR/"
cp -r /var/lib/grafana/plugins "$BACKUP_DIR/" 2>/dev/null || true
# 3. Архив
tar -czf "$BACKUP_DIR.tar.gz" -C "$BACKUP_DIR" .
rm -rf "$BACKUP_DIR"
# 4. Ротация
find "$BACKUP_ROOT" -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete
echo "Backup created: $BACKUP_ROOT/$TIMESTAMP.tar.gz"
Настройка cron
chmod +x /usr/local/bin/grafana-backup.sh
echo "0 2 * * * /usr/local/bin/grafana-backup.sh >> /var/log/grafana-backup.log 2>&1" | crontab -
Для отправки в S3/облако добавьте после архивации:
aws s3 cp "$BACKUP_ROOT/$TIMESTAMP.tar.gz" s3://your-bucket/grafana/
7. Лучшие практики
| Практика | Почему важно |
|---|---|
| Регулярное тестирование восстановления | Бэкап без проверки восстановления ≠ бэкап |
| Шифрование архивов | gpg -c backup.tar.gz или openssl enc |
| Хранение в 3-2-1 | 3 копии, 2 носителя, 1 вне площадки |
| Версионирование Grafana | Фиксируйте версию в метаданных бэкапа |
| Мониторинг бэкапов | Алерт в Telegram/Slack/email при ошибке cron |
| Разделение provisioning и UI | Храните дашборды в Git, используйте grafana-cli или CI/CD |
8. Типичные ошибки и как их избежать
| Ошибка | Решение |
|---|---|
Бэкап запущенной SQLite без .backup |
Использовать только sqlite3 ... ".backup 'file'" или останавливать сервис |
| Восстановление на старую версию Grafana | Проверить grafana-server -v перед восстановлением |
| Забытые provisioning-файлы | Всегда бэкапить /etc/grafana/provisioning/ целиком |
| Несоответствие прав после восстановления | chown -R grafana:grafana и chmod 750/640 |
| Бэкап только БД без конфигов | Grafana теряет источники данных, темы, SMTP, LDAP |