Grafana Cloud

Git Sync for development and production environments

Use separate Grafana instances for development and production. Each syncs with different Git locations to test dashboards before production.

Use it for

  • Staged deployments: You need to test dashboard changes before production deployment.
  • Change control: You require approvals before dashboards reach production.
  • Quality assurance: You verify dashboard functionality in a non-production environment.
  • Risk mitigation: You minimize the risk of breaking production dashboards.

Architecture

┌────────────────────────────────────────────────────────────┐
│              GitHub Repository                             │
│   Repository: your-org/grafana-manifests                 │
│   Branch: main                                             │
│                                                            │
│   grafana-manifests/                                     │
│   ├── dev/                                                │
│   │   ├── dashboard-new.json    ← Development dashboards │
│   │   └── dashboard-test.json                            │
│   │                                                       │
│   └── prod/                                               │
│       ├── dashboard-stable.json  ← Production dashboards │
│       └── dashboard-approved.json                        │
└────────────────────────────────────────────────────────────┘
           ↕                                 ↕
    Git Sync (dev/)              Git Sync (prod/)
           ↕                                 ↕
┌─────────────────────┐          ┌─────────────────────┐
│  Dev Grafana        │          │  Prod Grafana       │
│                     │          │                     │
│  Repository:        │          │  Repository:        │
│  - path: dev/       │          │  - path: prod/      │
│                     │          │                     │
│  Creates folder:    │          │  Creates folder:    │
│  "grafana-manifests"│         │  "grafana-manifests"│
└─────────────────────┘          └─────────────────────┘

Repository structure

In Git:

your-org/grafana-manifests
├── dev/
│   ├── dashboard-new.json
│   └── dashboard-test.json
└── prod/
    ├── dashboard-stable.json
    └── dashboard-approved.json

In Grafana Dashboards view:

Dev instance:

Dashboards
└── 📁 grafana-manifests/
    ├── New Dashboard
    └── Test Dashboard

Prod instance:

Dashboards
└── 📁 grafana-manifests/
    ├── Stable Dashboard
    └── Approved Dashboard
  • Both instances create a folder named “grafana-manifests” (from repository name)
  • Each instance only shows dashboards from its configured path (dev/ or prod/)
  • Dashboards appear with their titles from the JSON files

Configuration parameters

Development:

  • Repository: your-org/grafana-manifests
  • Branch: main
  • Path: dev/

Production:

  • Repository: your-org/grafana-manifests
  • Branch: main
  • Path: prod/

How it works

  1. Developers create and modify dashboards in development.
  2. Git Sync commits changes to dev/.
  3. You review changes in Git.
  4. You promote approved dashboards from dev/ to prod/.
  5. Production syncs from prod/.
  6. Production dashboards update.

Alternative: Use branches

Instead of using different paths, you can configure instances to use different branches:

Development instance:

  • Repository: your-org/grafana-manifests
  • Branch: develop
  • Path: grafana/

Production instance:

  • Repository: your-org/grafana-manifests
  • Branch: main
  • Path: grafana/

With this approach:

  • Development changes go to the develop branch
  • Use Git merge or pull request workflows to promote changes from develop to main
  • Production automatically syncs from the main branch

Alternative: Use separate repositories for stricter isolation

For stricter isolation, use completely separate repositories:

Development instance:

  • Repository: your-org/grafana-manifests-dev
  • Branch: main
  • Path: grafana/

Production instance:

  • Repository: your-org/grafana-manifests-prod
  • Branch: main
  • Path: grafana/