grafana-backup-tool
grafana-backup-tool copied to clipboard
A Python-based application to backup Grafana settings by using the Grafana API
Grafana Backup Tool
A Python-based application to backup Grafana settings using the Grafana API.
The aim of this tool is to:
- Easily backup and restore Grafana.
- Have versioned backups
(date and time in file name)for restoring and saving to cloud storage providers. Currently supportAmazon S3Azure StorageGCP Cloud Storage(Use service-account's credential file, see here)
Supported components
- Folder
- Folder Permissions
- Dashboard (contains Alert)
- Datasource
- Alert Channel
- Organization (Needs Basic Authentication (username and password, see grafana doc)
- You need to set
Admin's account and passwordingrafanaSettings.json, or set the base64 encodedadmin account and passwordin ENVGRAFANA_BASIC_AUTH. E.gexport GRAFANA_BASIC_AUTH=YWRtaW46YWRtaW4= - Or Sets this ENV of the Grafana server
GF_USERS_ALLOW_ORG_CREATE=true. see grafana doc
- You need to set
- User (Needs Basic Authentication (username and password, see grafana doc)
- You need to set
Admin's account and passwordingrafanaSettings.json, or set the base64 encodedadmin account and passwordin ENVGRAFANA_BASIC_AUTH. E.gexport GRAFANA_BASIC_AUTH=YWRtaW46YWRtaW4= - Grafana's api doesn't provide user's password when backing up, so the
default_password (which is in the grafanaSetting.json)will be used when restoring.
- You need to set
- Snapshots
- Dashboard Versions (only backup, no restore)
- Annotations
NOTE The only supported orgId right now is 1, the default organization will be backed up only!
Requirements
- Bash
- Python 2.7 or Python 3.x
- Access to a Grafana API server.
- A
Tokenof anAdminrole (seeConfigurationsection below for more info)
Configuration
There are three ways to setup the configuration:
- Use
environment variablesto define the variables for connecting to a Grafana server. - Use
hard-coded settingsinconf/grafanaSettings.json(this is the default settings file if not specified otherwise). - Use
~/.grafana-backup.jsonto define variables in json format.
Example Config
- Check out the examples folder for more configuration details
NOTE If you use environment variables, you need to add the following to your .bashrc or execute once before using the tool (please change variables according to your setup):
(GRAFANA_HEADERS is optional, use it if necessary. please see #45)
### Do not use a trailing slash on GRAFANA_URL
export GRAFANA_URL=http://some.host.org:3000
export GRAFANA_TOKEN=eyJrIjoidUhaU2ZQQndrWFN3RRVkUnVfrT56a1JoaG9KWFFObEgiLCJuIjoiYWRtaW4iLCJpZCI6MX0=
# GRAFANA_HEADERS is optional
export GRAFANA_HEADERS=Host:some.host.org
To create and obtain a Token for your Grafana server, please refer to the official documentation.
NOTE that you need to generate a Token with an Admin role for the backup to succeed, otherwise you will have potential permission issues.
Installation
Virtual environment (optional but recommended)
Create a virtualenv, you could using something like pyenv if you'd prefer
virtualenv -p $(which python3) venv
source venv/bin/activate
Installation using pypi
pip install grafana-backup
Installation using this repo
First clone this repo
git clone https://github.com/ysde/grafana-backup-tool.git
cd grafana-backup-tool
Installation works best using pip
pip install .
How to Use
- First perform the Configuration and Installation sections as described above.
- Use the
grafana-backup savecommand to backup all your folders, dashboards, datasources and alert channels to the_OUTPUT_subdirectory of the current directory.
Example:
$ grafana-backup save
$ tree _OUTPUT_
_OUTPUT_/
└── 202006272027.tar.gz
- Use the
grafana-backup restore <archive_file>command with a path to a previous backup to restore everything.
NOTE this may result in data loss, by overwriting data on the server.
Example:
$ grafana-backup restore _OUTPUT_/202006272027.tar.gz
Docker
Replace variables below to use the Docker version of this tool
{YOUR_GRAFANA_TOKEN}: Your Grafana siteToken.{YOUR_GRAFANA_URL}: Your Grafana siteURL.{YOUR_BACKUP_FOLDER_ON_THE_HOST}: Thebackup folderon the Grafana host machine.
Backup
If you decide to use a volume (-v) then you'll need to create the volume first with 1337 uid/gid ownership first, example:
mkdir /tmp/backup
sudo chown 1337:1337 /tmp/backup
docker run --user $(id -u):$(id -g) --rm --name grafana-backup-tool \
-e GRAFANA_TOKEN={YOUR_GRAFANA_TOKEN} \
-e GRAFANA_URL={YOUR_GRAFANA_URL} \
-e GRAFANA_ADMIN_ACCOUNT={YOUR_GRAFANA_ADMIN_ACCOUNT} \
-e GRAFANA_ADMIN_PASSWORD={YOUR_GRAFANA_ADMIN_PASSWORD} \
-e VERIFY_SSL={True/False} \
-v {YOUR_BACKUP_FOLDER_ON_THE_HOST}:/opt/grafana-backup-tool/_OUTPUT_ \
ysde/docker-grafana-backup-tool
Example:
docker run --user $(id -u):$(id -g) --rm --name grafana-backup-tool \
-e GRAFANA_TOKEN="eyJrIjoiNGZqTDEyeXNaY0RsMXNhbkNTSnlKN2M3bE1VeHdqVTEiLCJuIjoiZ3JhZmFuYS1iYWNrdXAiLCJpZCI6MX0=" \
-e GRAFANA_URL=http://192.168.0.79:3000 \
-e GRAFANA_ADMIN_ACCOUNT=admin \
-e GRAFANA_ADMIN_PASSWORD=adminpassword \
-e VERIFY_SSL=False \
-v /tmp/backup/:/opt/grafana-backup-tool/_OUTPUT_ \
ysde/docker-grafana-backup-tool
S3 Example: Set S3 configurations in -e or grafanaSettings.json(example)
-e AWS_S3_BUCKET_NAME="my-backups-bucket" \
-e AWS_S3_BUCKET_KEY="grafana-backup-folder" \
-e AWS_DEFAULT_REGION="us-east-1" \
-e AWS_ACCESS_KEY_ID="secret" \
-e AWS_SECRET_ACCESS_KEY="secret" \
Azure Example: Set Azure configurations in -e or grafanaSettings.json(example)
-e AZURE_STORAGE_CONTAINER_NAME="azure-storage-container-name" \
-e AZURE_STORAGE_CONNECTION_STRING="azure-storage-connection-string"
GCS Example: Set GCS configurations in -e or grafanaSettings.json(example)
-e GCS_BUCKET_NAME="bucket-name" \
-e GOOGLE_APPLICATION_CREDENTIALS="credential-file-path"
Restore
docker run --user $(id -u):$(id -g) --rm --name grafana-backup-tool \
-e GRAFANA_TOKEN={YOUR_GRAFANA_TOKEN} \
-e GRAFANA_URL={YOUR_GRAFANA_URL} \
-e GRAFANA_ADMIN_ACCOUNT={YOUR_GRAFANA_ADMIN_ACCOUNT} \
-e GRAFANA_ADMIN_PASSWORD={YOUR_GRAFANA_ADMIN_PASSWORD} \
-e VERIFY_SSL={True/False} \
-e RESTORE="true" \
-e ARCHIVE_FILE={THE_ARCHIVED_FILE_NAME} \
-v {YOUR_BACKUP_FOLDER_ON_THE_HOST}:/opt/grafana-backup-tool/_OUTPUT_ \
ysde/docker-grafana-backup-tool
Example:
docker run --user $(id -u):$(id -g) --rm --name grafana-backup-tool \
-e GRAFANA_TOKEN="eyJrIjoiNGZqTDEyeXNaY0RsMXNhbkNTSnlKN2M3bE1VeHdqVTEiLCJuIjoiZ3JhZmFuYS1iYWNrdXAiLCJpZCI6MX0=" \
-e GRAFANA_URL=http://192.168.0.79:3000 \
-e GRAFANA_ADMIN_ACCOUNT=admin \
-e GRAFANA_ADMIN_PASSWORD=adminpassword \
-e VERIFY_SSL=False \
-e RESTORE="true" \
-e ARCHIVE_FILE="202006280247.tar.gz" \
-v /tmp/backup/:/opt/grafana-backup-tool/_OUTPUT_ \
ysde/docker-grafana-backup-tool
Building
You can build the docker image simply by executing make in the root of this repo. The image will get tagged as ysde:grafana-backup