Grafana sqlite Migration zu Postgres
Nachdem ich ständig von den Grafana Dashboards ausgeloggt wurde, weil die sqlite3 Datenbank locked
war, habe ich nach langer Recherche dazu entschieden zur Postgres SQL Datenbank zu wechseln. Da ich in Docker Containern unterwegs bin und alles via compose Files hochgezogen habe, ist das Einbinden der Postgres Datenbank nicht allzu kompliziert. Interessanter war am Ende die Datenmigration. Hier habe ich mich nach langem Probieren die sqlite DB umzuwandeln und die komplette DB in Postgres zu importieren, für den einfacheren Weg entschieden: Export der Dashboards, Grafana Grundeinrichtung, Dashboard Import.
Ich bin auf die folgenden Fehlermeldungen mit der sqlite Datenbank gestoßen:
lvl=eror msg="failed to look up user based on cookie" logger=context error="database is locked"
lvl=info msg="Database locked, sleeping then retrying" logger=sqlstore error="database is locked" retry=0
Ich baue hier auf den folgenden Anleitungen auf:
- Raspberry Pi mit openHAB als Smart Home Schaltzentrale
- Grafana Docker and System Monitoring Dashboard
Export Dashboards
Als erstes exportieren wir uns sämtliche Dashboards die wir migrieren wollen. Dafür loggen wir uns in der bestehenden Grafana Instanz ein und gehen in das zu exportierende Dashboard und klicken auf den Share Dashboard Button:
Nun im darauffolgenden Popup gehen wir auf Export und dann auf Save to file:
Damit wird eine Json Datei heruntergeladen. Diese gut aufbewahrt ablegen. Wiederholt das für alle Dashboards die ihr braucht. Zum Schluss schaut euch am besten alle Einstellungen besonders, die der Datasources an und macht euch am besten Screenshots davon, diese müssen wir nämlich neu einrichten.
Docker Compose
nun kommen wir zum Umbau der Datenbank, in unserem Docker Compose Projekt. Dazu legen wir als erstes in unserer .env
Datei die benötigten Postgres Einstellungen an:
.env
# Config File for Grafana Application
# Docker Compose Project Name
# max length 11 characters
PROJECT_NAME=grafana
# Postgres Configuration
POSTGRES_DB_PORT=5432
POSTGRES_PASSWORD=havdsdcsdfxCodpit9
POSTGRES_USER=grafana
POSTGRES_DB=grafanadb
# Port Configuration Grafana
GRAFANA_HTTP_PORT=3000
# Timezone
TZ=Europe/Berlin
Nun kommen wir zum docker-compose.yml. Ich habe hier als Beispiel mal eine komplette Compose Grafana Applikation genommen:
- Postgres
- Renderer
- Grafana
solltet ihr es inkludieren wollen, kopiert den Postgres Service und fügt diese environment Variablen eurem Grafana Service hinzu:
...
- GF_DATABASE_TYPE=postgres
- GF_DATABASE_HOST=postgresdb
- GF_DATABASE_NAME=${POSTGRES_DB}
- GF_DATABASE_USER=${POSTGRES_USER}
- GF_DATABASE_PASSWORD=${POSTGRES_PASSWORD}
- GF_DATABASE_SSL_MODE=disable
...
Ansonsten hier die gesamte Docker-Compose Applikation:
docker-compose.yml
version: '3.8'
services:
postgres:
image: postgres:14
restart: always
volumes:
- data_postgres:/var/lib/postgresql/data/
# ports:
# - ${POSTGRES_DB_PORT}:5432
environment:
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_DB=${POSTGRES_DB}
- TZ=${TZ}
labels:
- "com.centurylinklabs.watchtower.enable=true"
networks:
backend-nw:
aliases:
- postgresdb
renderer:
# official image
#image: grafana/grafana-image-renderer:latest
# inofficial ones working on Raspberry Pi
#image: adejong/grafana-image-renderer-pi:1.0.8-beta2
#image: serhiymakarenko/grafanalabs-image-renderer:latest
#image: asksven/grafana-image-renderer:1
image: hferreira/grafana-image-renderer:latest
restart: always
environment:
ENABLE_METRICS: 'true'
labels:
com.centurylinklabs.watchtower.enable: "true"
networks:
- backend-nw
grafana:
image: grafana/grafana:latest-ubuntu
depends_on:
- influxdb
- renderer
- postgres
restart: always
user: "0"
volumes:
- data_grafana:/var/lib/grafana
ports:
- ${GRAFANA_HTTP_PORT}:3000
environment:
- GF_INSTALL_PLUGINS=grafana-clock-panel,briangann-gauge-panel,natel-plotly-panel,grafana-simple-json-datasource
- GF_SMTP_ENABLED=${GRAFANA_SMTP_ENABLED}
- GF_SMTP_HOST=${GRAFANA_SMTP_HOST}
- GF_SMTP_USER=${GRAFANA_SMTP_USER}
- GF_SMTP_PASSWORD=${GRAFANA_SMTP_PASSWORD}
- GF_SMTP_FROM_ADDRESS=${GRAFANA_SMTP_FROM_ADDRESS}
- GF_DATABASE_TYPE=postgres
- GF_DATABASE_HOST=postgresdb
- GF_DATABASE_NAME=${POSTGRES_DB}
- GF_DATABASE_USER=${POSTGRES_USER}
- GF_DATABASE_PASSWORD=${POSTGRES_PASSWORD}
- GF_DATABASE_SSL_MODE=disable
- GF_UNIFIED_ALERTING_SCREENSHOTS_CAPTURE=true
- GF_RENDERING_SERVER_URL=http://renderer:8081/render
- GF_RENDERING_CALLBACK_URL=http://grafana:3000/
- GF_LOG_FILTERS=rendering:debug
- GF_SERVER_SERVE_FROM_SUB_PATH=true
- GF_SERVER_ROOT_URL=https://laub-raspi4.laub.loc${GRAFANA_TRAEFIK_SUBPATH}
- TZ=${TZ}
labels:
- "com.centurylinklabs.watchtower.enable=true"
networks:
- app-nw
- backend-nw
volumes:
data_postgres:
data_grafana:
networks:
app-nw:
internal: false
driver: bridge
driver_opts:
com.docker.network.bridge.name: app-${PROJECT_NAME}
backend-nw:
internal: true
driver: bridge
driver_opts:
com.docker.network.bridge.name: be-${PROJECT_NAME}
wenn ihr alles angepasst habt, könnt ihr das Ganze starten:
docker-compose up -d
Nun via Briowser einloggen:
- http://yougrafanahost:3000
Ihr werdet nun aufgefordert euch einzuloggen. Hier bitte "admin" mit dem Passwort "admin" verwenden. Ihr werdet nun direkt zum Ändern des Passwortes aufgefordert und euch begrüßt eine frische Grafana Installation.
Grundkonfiguration
Als erstes solltet ihr wieder eure Datasources so anlegen, wie ihr es vorher hattet. Bei mir war es nur eine InfluxDB, die ich nach den vorher erstellten Screenshots eingerichtet habe. Ebenso könnt ihr nun ggf. Alle User wieder anlegen.
Import Dashboards
Nachdem nun alles soweit wieder läuft, kommen wir dazu die Dashboards zu importieren. Dazu gehen wir zu Dashboards --> Manage
:
Nun auf Import:
Dann auf Upload JSON File:
Wählt dann euren vorher erstellten JSON Export aus und bestätigt den Import auf der darauffolgenden Seite:
Dies wiederholt ihr einfach für sämtliche Dashboards die ihr exportiert habt. Nun solltet ihr alle Dashboards wieder wie gewünscht zur Verfügung haben.
Backup Postgres
Nun sollten wir uns mit dem Backup der Postgres Datenbank beschäftigen.
Eine Anleitung hierzu findet ihr hier: