Grafana sqlite Migration zu Postgres

Aus Laub-Home Wiki

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:

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: