<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Git Sync deployment scenarios on Grafana Labs</title><link>https://grafana.com/docs/grafana/v13.2/as-code/observability-as-code/git-sync/scenarios/</link><description>Recent content in Git Sync deployment scenarios on Grafana Labs</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="/docs/grafana/v13.2/as-code/observability-as-code/git-sync/scenarios/index.xml" rel="self" type="application/rss+xml"/><item><title>Single instance Git Sync</title><link>https://grafana.com/docs/grafana/v13.2/as-code/observability-as-code/git-sync/scenarios/single-instance/</link><pubDate>Tue, 18 Aug 2026 10:15:08 +0000</pubDate><guid>https://grafana.com/docs/grafana/v13.2/as-code/observability-as-code/git-sync/scenarios/single-instance/</guid><content><![CDATA[&lt;h1 id=&#34;single-instance-git-sync&#34;&gt;Single instance Git Sync&lt;/h1&gt;
&lt;p&gt;Use a single Grafana instance synchronized with a Git repository. This is the foundation for Git Sync and helps you understand bidirectional synchronization.&lt;/p&gt;
&lt;h2 id=&#34;use-it-for&#34;&gt;Use it for&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Getting started&lt;/strong&gt;: You want to learn how Git Sync works before implementing complex scenarios.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Personal projects&lt;/strong&gt;: Individual developers manage their own dashboards.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Small teams&lt;/strong&gt;: You have a simple setup without multiple environments or complex workflows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Development environments&lt;/strong&gt;: You need quick prototyping and testing.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;architecture&#34;&gt;Architecture&lt;/h2&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;┌─────────────────────────────────────────────────────┐
│           GitHub Repository                         │
│   Repository: your-org/grafana-manifests          │
│   Branch: main                                      │
│                                                     │
│   grafana-manifests/                              │
│   └── grafana/                                     │
│       ├── dashboard-1.json                         │
│       ├── dashboard-2.json                         │
│       └── dashboard-3.json                         │
└─────────────────────────────────────────────────────┘
                        ↕
              Git Sync (bidirectional)
                        ↕
        ┌─────────────────────────────┐
        │    Grafana Instance         │
        │                             │
        │  Repository Resource:       │
        │  - url: grafana-manifests  │
        │  - branch: main             │
        │  - path: grafana/           │
        │                             │
        │  Creates folder:            │
        │  &amp;#34;grafana-manifests&amp;#34;       │
        └─────────────────────────────┘&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;repository-structure&#34;&gt;Repository structure&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;In Git:&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;your-org/grafana-manifests
└── grafana/
    ├── dashboard-1.json
    ├── dashboard-2.json
    └── dashboard-3.json&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;In Grafana Dashboards view:&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;Dashboards
└── 📁 grafana-manifests/
    ├── Dashboard 1
    ├── Dashboard 2
    └── Dashboard 3&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;A folder named &amp;ldquo;grafana-manifests&amp;rdquo; (from repository name) contains all synced dashboards.&lt;/li&gt;
&lt;li&gt;Each JSON file becomes a dashboard with its title displayed in the folder.&lt;/li&gt;
&lt;li&gt;Users browse dashboards organized under this folder structure.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;configuration-parameters&#34;&gt;Configuration parameters&lt;/h2&gt;
&lt;p&gt;Configure your Grafana instance to synchronize with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Repository&lt;/strong&gt;: &lt;code&gt;your-org/grafana-manifests&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Branch&lt;/strong&gt;: &lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Path&lt;/strong&gt;: &lt;code&gt;grafana/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;How it works&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;From Grafana to Git&lt;/strong&gt;: When users create or modify dashboards in Grafana, Git Sync commits changes to the &lt;code&gt;grafana/&lt;/code&gt; directory on the &lt;code&gt;main&lt;/code&gt; branch.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;From Git to Grafana&lt;/strong&gt;: When dashboard JSON files are added or modified in the &lt;code&gt;grafana/&lt;/code&gt; directory, Git Sync pulls these changes into Grafana.&lt;/li&gt;
&lt;/ol&gt;
]]></content><description>&lt;h1 id="single-instance-git-sync">Single instance Git Sync&lt;/h1>
&lt;p>Use a single Grafana instance synchronized with a Git repository. This is the foundation for Git Sync and helps you understand bidirectional synchronization.&lt;/p></description></item><item><title>Git Sync for development and production environments</title><link>https://grafana.com/docs/grafana/v13.2/as-code/observability-as-code/git-sync/scenarios/dev-prod/</link><pubDate>Tue, 18 Aug 2026 10:15:08 +0000</pubDate><guid>https://grafana.com/docs/grafana/v13.2/as-code/observability-as-code/git-sync/scenarios/dev-prod/</guid><content><![CDATA[&lt;h1 id=&#34;git-sync-for-development-and-production-environments&#34;&gt;Git Sync for development and production environments&lt;/h1&gt;
&lt;p&gt;Use separate Grafana instances for development and production. Each syncs with different Git locations to test dashboards before production.&lt;/p&gt;
&lt;h2 id=&#34;use-it-for&#34;&gt;Use it for&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Staged deployments&lt;/strong&gt;: You need to test dashboard changes before production deployment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Change control&lt;/strong&gt;: You require approvals before dashboards reach production.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quality assurance&lt;/strong&gt;: You verify dashboard functionality in a non-production environment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Risk mitigation&lt;/strong&gt;: You minimize the risk of breaking production dashboards.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;architecture&#34;&gt;Architecture&lt;/h2&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;┌────────────────────────────────────────────────────────────┐
│              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:    │
│  &amp;#34;grafana-manifests&amp;#34;│         │  &amp;#34;grafana-manifests&amp;#34;│
└─────────────────────┘          └─────────────────────┘&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;repository-structure&#34;&gt;Repository structure&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;In Git:&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;your-org/grafana-manifests
├── dev/
│   ├── dashboard-new.json
│   └── dashboard-test.json
└── prod/
    ├── dashboard-stable.json
    └── dashboard-approved.json&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;In Grafana Dashboards view:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dev instance:&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;Dashboards
└── 📁 grafana-manifests/
    ├── New Dashboard
    └── Test Dashboard&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Prod instance:&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;Dashboards
└── 📁 grafana-manifests/
    ├── Stable Dashboard
    └── Approved Dashboard&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Both instances create a folder named &amp;ldquo;grafana-manifests&amp;rdquo; (from repository name)&lt;/li&gt;
&lt;li&gt;Each instance only shows dashboards from its configured path (&lt;code&gt;dev/&lt;/code&gt; or &lt;code&gt;prod/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Dashboards appear with their titles from the JSON files&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;configuration-parameters&#34;&gt;Configuration parameters&lt;/h2&gt;
&lt;p&gt;Development:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Repository: &lt;code&gt;your-org/grafana-manifests&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Branch: &lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Path: &lt;code&gt;dev/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Production:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Repository: &lt;code&gt;your-org/grafana-manifests&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Branch: &lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Path: &lt;code&gt;prod/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;How it works&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Developers create and modify dashboards in development.&lt;/li&gt;
&lt;li&gt;Git Sync commits changes to &lt;code&gt;dev/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;You review changes in Git.&lt;/li&gt;
&lt;li&gt;You promote approved dashboards from &lt;code&gt;dev/&lt;/code&gt; to &lt;code&gt;prod/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Production syncs from &lt;code&gt;prod/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Production dashboards update.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;alternative-use-branches&#34;&gt;Alternative: Use branches&lt;/h2&gt;
&lt;p&gt;Instead of using different paths, you can configure instances to use different branches:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Development instance:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Repository&lt;/strong&gt;: &lt;code&gt;your-org/grafana-manifests&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Branch&lt;/strong&gt;: &lt;code&gt;develop&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Path&lt;/strong&gt;: &lt;code&gt;grafana/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Production instance:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Repository&lt;/strong&gt;: &lt;code&gt;your-org/grafana-manifests&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Branch&lt;/strong&gt;: &lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Path&lt;/strong&gt;: &lt;code&gt;grafana/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With this approach:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Development changes go to the &lt;code&gt;develop&lt;/code&gt; branch&lt;/li&gt;
&lt;li&gt;Use Git merge or pull request workflows to promote changes from &lt;code&gt;develop&lt;/code&gt; to &lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Production automatically syncs from the &lt;code&gt;main&lt;/code&gt; branch&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;alternative-use-separate-repositories-for-stricter-isolation&#34;&gt;Alternative: Use separate repositories for stricter isolation&lt;/h2&gt;
&lt;p&gt;For stricter isolation, use completely separate repositories:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Development instance:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Repository&lt;/strong&gt;: &lt;code&gt;your-org/grafana-manifests-dev&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Branch&lt;/strong&gt;: &lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Path&lt;/strong&gt;: &lt;code&gt;grafana/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Production instance:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Repository&lt;/strong&gt;: &lt;code&gt;your-org/grafana-manifests-prod&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Branch&lt;/strong&gt;: &lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Path&lt;/strong&gt;: &lt;code&gt;grafana/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="git-sync-for-development-and-production-environments">Git Sync for development and production environments&lt;/h1>
&lt;p>Use separate Grafana instances for development and production. Each syncs with different Git locations to test dashboards before production.&lt;/p></description></item><item><title>Git Sync with regional replication</title><link>https://grafana.com/docs/grafana/v13.2/as-code/observability-as-code/git-sync/scenarios/multi-region/</link><pubDate>Tue, 18 Aug 2026 10:15:08 +0000</pubDate><guid>https://grafana.com/docs/grafana/v13.2/as-code/observability-as-code/git-sync/scenarios/multi-region/</guid><content><![CDATA[&lt;h1 id=&#34;git-sync-with-regional-replication&#34;&gt;Git Sync with regional replication&lt;/h1&gt;
&lt;p&gt;Deploy multiple Grafana instances across regions. Synchronize them with the same Git location to ensure consistent dashboards everywhere.&lt;/p&gt;
&lt;h2 id=&#34;use-it-for&#34;&gt;Use it for&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Geographic distribution&lt;/strong&gt;: You deploy Grafana close to users in different regions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Latency reduction&lt;/strong&gt;: Users need fast dashboard access from their location.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data sovereignty&lt;/strong&gt;: You keep dashboard data in specific regions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;High availability&lt;/strong&gt;: You need dashboard availability across regions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consistent experience&lt;/strong&gt;: All users see the same dashboards regardless of region.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;architecture&#34;&gt;Architecture&lt;/h2&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;┌─────────────────────────────────────────────────────┐
│           GitHub Repository                         │
│   Repository: your-org/grafana-manifests          │
│   Branch: main                                      │
│                                                     │
│   grafana-manifests/                              │
│   └── shared/                                      │
│       ├── dashboard-global.json                    │
│       ├── dashboard-metrics.json                   │
│       └── dashboard-logs.json                      │
└─────────────────────────────────────────────────────┘
              ↕                           ↕
       Git Sync (shared/)         Git Sync (shared/)
              ↕                           ↕
┌────────────────────┐          ┌────────────────────┐
│  US Region         │          │  EU Region         │
│  Grafana           │          │  Grafana           │
│                    │          │                    │
│  Repository:       │          │  Repository:       │
│  - path: shared/   │          │  - path: shared/   │
└────────────────────┘          └────────────────────┘&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;repository-structure&#34;&gt;Repository structure&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;In Git:&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;your-org/grafana-manifests
└── shared/
    ├── dashboard-global.json
    ├── dashboard-metrics.json
    └── dashboard-logs.json&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;In Grafana Dashboards view (all regions):&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;Dashboards
└── 📁 grafana-manifests/
    ├── Global Dashboard
    ├── Metrics Dashboard
    └── Logs Dashboard&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;All regional instances (US, EU, etc.) show identical folder structure&lt;/li&gt;
&lt;li&gt;Same folder name &amp;ldquo;grafana-manifests&amp;rdquo; in every region&lt;/li&gt;
&lt;li&gt;Same dashboards synced from the &lt;code&gt;shared/&lt;/code&gt; path appear everywhere&lt;/li&gt;
&lt;li&gt;Users in any region see the exact same dashboards with the same titles&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;configuration-parameters&#34;&gt;Configuration parameters&lt;/h2&gt;
&lt;p&gt;All regions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Repository: &lt;code&gt;your-org/grafana-manifests&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Branch: &lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Path: &lt;code&gt;shared/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;How it works&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;All regional instances pull dashboards from &lt;code&gt;shared/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Any region’s change commits to Git.&lt;/li&gt;
&lt;li&gt;Other regions pull updates during the next sync (or via webhooks).&lt;/li&gt;
&lt;li&gt;Changes propagate across regions per sync interval.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;considerations&#34;&gt;Considerations&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Write conflicts&lt;/strong&gt;: If users in different regions modify the same dashboard simultaneously, Git uses last-write-wins.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Primary region&lt;/strong&gt;: Consider designating one region as the primary location for making dashboard changes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Propagation time&lt;/strong&gt;: Changes propagate to all regions within the configured sync interval, or instantly if webhooks are configured.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network reliability&lt;/strong&gt;: Ensure all regions have reliable connectivity to the Git repository.&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="git-sync-with-regional-replication">Git Sync with regional replication&lt;/h1>
&lt;p>Deploy multiple Grafana instances across regions. Synchronize them with the same Git location to ensure consistent dashboards everywhere.&lt;/p>
&lt;h2 id="use-it-for">Use it for&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Geographic distribution&lt;/strong>: You deploy Grafana close to users in different regions.&lt;/li>
&lt;li>&lt;strong>Latency reduction&lt;/strong>: Users need fast dashboard access from their location.&lt;/li>
&lt;li>&lt;strong>Data sovereignty&lt;/strong>: You keep dashboard data in specific regions.&lt;/li>
&lt;li>&lt;strong>High availability&lt;/strong>: You need dashboard availability across regions.&lt;/li>
&lt;li>&lt;strong>Consistent experience&lt;/strong>: All users see the same dashboards regardless of region.&lt;/li>
&lt;/ul>
&lt;h2 id="architecture">Architecture&lt;/h2>
&lt;div class="code-snippet code-snippet__mini">&lt;div class="lang-toolbar__mini">
&lt;span class="code-clipboard">
&lt;button x-data="app_code_snippet()" x-init="init()" @click="copy()">
&lt;img class="code-clipboard__icon" src="/media/images/icons/icon-copy-small-2.svg" alt="Copy code to clipboard" width="14" height="13">
&lt;span>Copy&lt;/span>
&lt;/button>
&lt;/span>
&lt;/div>&lt;div class="code-snippet code-snippet__border">
&lt;pre data-expanded="false">&lt;code class="language-none">┌─────────────────────────────────────────────────────┐
│ GitHub Repository │
│ Repository: your-org/grafana-manifests │
│ Branch: main │
│ │
│ grafana-manifests/ │
│ └── shared/ │
│ ├── dashboard-global.json │
│ ├── dashboard-metrics.json │
│ └── dashboard-logs.json │
└─────────────────────────────────────────────────────┘
↕ ↕
Git Sync (shared/) Git Sync (shared/)
↕ ↕
┌────────────────────┐ ┌────────────────────┐
│ US Region │ │ EU Region │
│ Grafana │ │ Grafana │
│ │ │ │
│ Repository: │ │ Repository: │
│ - path: shared/ │ │ - path: shared/ │
└────────────────────┘ └────────────────────┘&lt;/code>&lt;/pre>
&lt;/div>
&lt;/div>
&lt;h2 id="repository-structure">Repository structure&lt;/h2>
&lt;p>&lt;strong>In Git:&lt;/strong>&lt;/p></description></item><item><title>Testing sandboxes Git Sync</title><link>https://grafana.com/docs/grafana/v13.2/as-code/observability-as-code/git-sync/scenarios/testing-sandboxes/</link><pubDate>Tue, 18 Aug 2026 10:15:08 +0000</pubDate><guid>https://grafana.com/docs/grafana/v13.2/as-code/observability-as-code/git-sync/scenarios/testing-sandboxes/</guid><content><![CDATA[&lt;h1 id=&#34;testing-sandboxes-with-git-sync&#34;&gt;Testing sandboxes with Git Sync&lt;/h1&gt;
&lt;p&gt;Use a sandbox branch that users can push to directly, without opening a pull request for every change. A sandbox branch is a low-friction space for short-lived projects and experimentation, while keeping every dashboard version-controlled in Git. When work is ready, you promote it to the &lt;code&gt;main&lt;/code&gt; branch.&lt;/p&gt;
&lt;p&gt;A sandbox is a branch in the same repository, synced to Grafana with the 
    &lt;a href=&#34;/docs/grafana/v13.2/as-code/observability-as-code/git-sync/git-sync-setup/set-up-code/#configuration-parameters&#34;&gt;&lt;code&gt;write&lt;/code&gt; workflow&lt;/a&gt; enabled. With the &lt;code&gt;write&lt;/code&gt; workflow, saving a dashboard commits directly to the sandbox branch, so the editing experience feels close to using Grafana without Git Sync. The difference is that every change is still committed to Git, so nothing is lost and history is preserved.&lt;/p&gt;
&lt;p&gt;This scenario uses a single &lt;strong&gt;shared&lt;/strong&gt; sandbox branch that everyone works in. A shared sandbox uses only one Repository connection regardless of how many users work in it, which keeps you well within the per-stack limit of 10 repository connections. If you need stricter isolation, you can instead give each user their own sandbox branch. Refer to &lt;a href=&#34;#individual-or-shared-sandboxes&#34;&gt;Individual or shared sandboxes&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;use-it-for&#34;&gt;Use it for&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Short-lived projects&lt;/strong&gt;: You need a temporary space for work that may or may not reach production.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shared experimentation&lt;/strong&gt;: A team experiments freely in one space without affecting shared production dashboards.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fast iteration&lt;/strong&gt;: You want the low-friction editing of a non-provisioned instance, but with the safety of Git history.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Staged promotion&lt;/strong&gt;: You develop in a sandbox, then promote finished work to the &lt;code&gt;main&lt;/code&gt; branch.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;architecture&#34;&gt;Architecture&lt;/h2&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;┌────────────────────────────────────────────────────────────┐
│              GitHub Repository                             │
│   Repository: your-org/grafana-manifests                 │
│                                                            │
│   Branch: main       ← Promoted, reviewed work            │
│   └── grafana/                                             │
│       ├── dashboard-stable.json                            │
│       └── dashboard-approved.json                          │
│                                                            │
│   Branch: sandbox    ← Direct pushes, shared experiments  │
│   └── grafana/                                             │
│       ├── alice/dashboard-wip.json                         │
│       └── bob/dashboard-test.json                          │
└────────────────────────────────────────────────────────────┘
                        ↕
              Git Sync (write workflow)
                        ↕
              ┌─────────────────────────┐
              │    Grafana Instance     │
              │                         │
              │  Repository Resource:   │
              │  - branch: sandbox      │
              │  - path: grafana/       │
              │  - workflows: [write]   │
              │                         │
              │  Save = direct commit   │
              │  to sandbox             │
              └─────────────────────────┘&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;repository-structure&#34;&gt;Repository structure&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;In Git:&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;your-org/grafana-manifests
├── (branch: main)
│   └── grafana/
│       ├── dashboard-stable.json
│       └── dashboard-approved.json
└── (branch: sandbox)
    └── grafana/
        ├── alice/
        │   └── dashboard-wip.json
        └── bob/
            └── dashboard-test.json&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;In Grafana Dashboards view (synced to &lt;code&gt;sandbox&lt;/code&gt;):&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;Dashboards
└── 📁 grafana-manifests/
    ├── 📁 alice/
    │   └── Work in Progress Dashboard
    └── 📁 bob/
        └── Test Dashboard&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;A folder named &amp;ldquo;grafana-manifests&amp;rdquo; (from the repository name) contains the dashboards synced from the sandbox branch.&lt;/li&gt;
&lt;li&gt;Users can create subfolders inside it, such as &lt;code&gt;alice/&lt;/code&gt; and &lt;code&gt;bob/&lt;/code&gt;, to keep their work separate within the shared branch. Subfolders map to subdirectories under the synced path, so no extra Repository connection is needed.&lt;/li&gt;
&lt;li&gt;Only dashboards on the configured branch and path appear in the instance.&lt;/li&gt;
&lt;li&gt;Saving a dashboard commits directly to the sandbox branch.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;configuration-parameters&#34;&gt;Configuration parameters&lt;/h2&gt;
&lt;p&gt;Configure the Repository resource to sync with the sandbox branch and enable the &lt;code&gt;write&lt;/code&gt; workflow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Repository&lt;/strong&gt;: &lt;code&gt;your-org/grafana-manifests&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Branch&lt;/strong&gt;: &lt;code&gt;sandbox&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Path&lt;/strong&gt;: &lt;code&gt;grafana/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workflows&lt;/strong&gt;: &lt;code&gt;write&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the Repository resource, this looks like:&lt;/p&gt;

&lt;div class=&#34;code-snippet &#34;&gt;&lt;div class=&#34;lang-toolbar&#34;&gt;
    &lt;span class=&#34;lang-toolbar__item lang-toolbar__item-active&#34;&gt;YAML&lt;/span&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
    &lt;div class=&#34;lang-toolbar__border&#34;&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet &#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;spec:
  github:
    url: &amp;#39;https://github.com/your-org/grafana-manifests&amp;#39;
    branch: &amp;#39;sandbox&amp;#39;
    path: grafana/
  workflows:
    - write&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;div class=&#34;admonition admonition-note&#34;&gt;&lt;blockquote&gt;&lt;p class=&#34;title text-uppercase&#34;&gt;Note&lt;/p&gt;&lt;p&gt;If you enable only the &lt;code&gt;write&lt;/code&gt; workflow, saving a dashboard always commits directly to the sandbox branch. To also allow users to open pull requests from Grafana, add the &lt;code&gt;branch&lt;/code&gt; workflow: &lt;code&gt;workflows: [write, branch]&lt;/code&gt;. Refer to 
    &lt;a href=&#34;/docs/grafana/v13.2/as-code/observability-as-code/git-sync/git-sync-setup/set-up-code/#configuration-parameters&#34;&gt;Configuration parameters&lt;/a&gt; for details.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;

&lt;h2 id=&#34;how-it-works&#34;&gt;How it works&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Create a sandbox branch in your repository, for example &lt;code&gt;sandbox&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Configure a Repository resource that syncs that branch with the &lt;code&gt;write&lt;/code&gt; workflow enabled.&lt;/li&gt;
&lt;li&gt;Users create and edit dashboards in Grafana, optionally in their own subfolder. Each save commits directly to the sandbox branch.&lt;/li&gt;
&lt;li&gt;The experience feels similar to using Grafana without Git Sync, but every change is committed to Git.&lt;/li&gt;
&lt;li&gt;When work is ready, you promote it to the &lt;code&gt;main&lt;/code&gt; branch. Refer to &lt;a href=&#34;#promote-a-sandbox-to-main&#34;&gt;Promote a sandbox to main&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;individual-or-shared-sandboxes&#34;&gt;Individual or shared sandboxes&lt;/h2&gt;
&lt;p&gt;A sandbox can be shared by everyone or scoped to a single user. Each sandbox is a branch synced through its own Repository connection, so the choice is shaped by the per-stack limit of 10 repository connections. Refer to 
    &lt;a href=&#34;/docs/grafana/v13.2/as-code/observability-as-code/git-sync/usage-limits/&#34;&gt;Usage and performance limitations&lt;/a&gt; for details.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Shared sandbox (recommended)&lt;/strong&gt;: Use a single branch, such as &lt;code&gt;sandbox&lt;/code&gt;, synced through one Repository connection that all users share. This uses only one connection regardless of how many users work in it, so it scales to any number of users. Separate users&amp;rsquo; work with subfolders (for example, &lt;code&gt;alice/&lt;/code&gt;, &lt;code&gt;bob/&lt;/code&gt;) if you want some organization within the shared branch. The trade-off is less isolation, since everyone commits to the same branch. This is the setup described above.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Individual sandboxes&lt;/strong&gt;: Give each user their own branch, such as &lt;code&gt;sandbox/alice&lt;/code&gt; and &lt;code&gt;sandbox/bob&lt;/code&gt;, each synced through a separate Repository connection. This provides the most isolation, but every sandbox consumes one of your 10 connections, so per-user sandboxes don&amp;rsquo;t scale to many users. Reserve them for a small number of active users or short-lived projects, and delete the branch and its connection when the work is done to free the connection.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both approaches promote to &lt;code&gt;main&lt;/code&gt; the same way. Refer to &lt;a href=&#34;#promote-a-sandbox-to-main&#34;&gt;Promote a sandbox to main&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;protect-sandbox-branches&#34;&gt;Protect sandbox branches&lt;/h2&gt;
&lt;p&gt;Even though sandbox branches allow direct pushes, protect them against destructive operations. We recommend blocking force pushes on sandbox branches in your Git provider.&lt;/p&gt;
&lt;p&gt;Force pushes rewrite branch history and can silently discard commits that Git Sync relies on. Blocking them keeps history append-only, so Grafana and Git stay consistent and you can always trace how a dashboard reached its current state.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: Add a branch protection rule (or ruleset) for the sandbox branch (for example, &lt;code&gt;sandbox&lt;/code&gt; or the pattern &lt;code&gt;sandbox/*&lt;/code&gt; if you use individual sandboxes) and disable &lt;strong&gt;Allow force pushes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitLab&lt;/strong&gt;: Set the sandbox branches as protected and disallow force push.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bitbucket&lt;/strong&gt;: Add a branch permission for the sandbox branch that prevents rewriting history.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You typically keep pull requests optional on sandbox branches so users can push directly, while still blocking force pushes.&lt;/p&gt;
&lt;h2 id=&#34;promote-a-sandbox-to-main&#34;&gt;Promote a sandbox to main&lt;/h2&gt;
&lt;p&gt;When sandbox work is ready, promote it to the &lt;code&gt;main&lt;/code&gt; branch. Because everything already lives in Git, promotion is a standard Git operation. Choose the option that fits your review requirements:&lt;/p&gt;
&lt;h3 id=&#34;option-1-open-a-pull-request-from-the-sandbox-branch-recommended&#34;&gt;Option 1: Open a pull request from the sandbox branch (recommended)&lt;/h3&gt;
&lt;p&gt;Use your Git provider to open a pull request from the sandbox branch into &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In your Git provider, open a pull request from &lt;code&gt;sandbox&lt;/code&gt; into &lt;code&gt;main&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Review the changes as a normal Git diff and request approvals as needed.&lt;/li&gt;
&lt;li&gt;Merge the pull request. The instance syncing &lt;code&gt;main&lt;/code&gt; picks up the promoted dashboards on its next sync.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This keeps a full review and audit trail for everything that reaches &lt;code&gt;main&lt;/code&gt;, and is the recommended path when &lt;code&gt;main&lt;/code&gt; feeds production.&lt;/p&gt;
&lt;p&gt;If you also enable the &lt;code&gt;branch&lt;/code&gt; workflow on the sandbox Repository resource, users can open these pull requests directly from Grafana when they save, instead of switching to the Git provider.&lt;/p&gt;
&lt;h3 id=&#34;option-2-cherry-pick-or-merge-selected-changes&#34;&gt;Option 2: Cherry-pick or merge selected changes&lt;/h3&gt;
&lt;p&gt;When only some dashboards are ready, promote them selectively instead of merging the whole branch.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cherry-pick the relevant commits from the sandbox branch onto a branch based on &lt;code&gt;main&lt;/code&gt;, or copy the specific dashboard files.&lt;/li&gt;
&lt;li&gt;Open a pull request into &lt;code&gt;main&lt;/code&gt; and review it.&lt;/li&gt;
&lt;li&gt;Merge to complete the promotion.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Use this when a shared sandbox contains a mix of finished and experimental work.&lt;/p&gt;
&lt;h3 id=&#34;option-3-promote-through-a-separate-instance-or-path&#34;&gt;Option 3: Promote through a separate instance or path&lt;/h3&gt;
&lt;p&gt;When &lt;code&gt;main&lt;/code&gt; is synced to a production instance, treat the sandbox as the development stage of a promotion flow.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Develop in the sandbox instance (synced to the sandbox branch with the &lt;code&gt;write&lt;/code&gt; workflow).&lt;/li&gt;
&lt;li&gt;Promote approved dashboards to &lt;code&gt;main&lt;/code&gt; using a pull request (Option 1) or by copying files into the &lt;code&gt;main&lt;/code&gt; path.&lt;/li&gt;
&lt;li&gt;The production instance syncing &lt;code&gt;main&lt;/code&gt; updates automatically.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This mirrors the 
    &lt;a href=&#34;/docs/grafana/v13.2/as-code/observability-as-code/git-sync/scenarios/dev-prod/&#34;&gt;development and production environments&lt;/a&gt; scenario, with the sandbox branch acting as the development stage.&lt;/p&gt;
&lt;h3 id=&#34;option-4-promote-from-the-grafana-ui&#34;&gt;Option 4: Promote from the Grafana UI&lt;/h3&gt;
&lt;p&gt;If the &lt;code&gt;main&lt;/code&gt; branch is synced to a folder in the same instance (through a second Repository connection) or to a separate instance, users can move a dashboard into it directly from Grafana, without touching Git:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Save a copy&lt;/strong&gt;: Open the sandbox dashboard, select &lt;strong&gt;Save as&lt;/strong&gt; (save a copy), and choose the folder backed by the &lt;code&gt;main&lt;/code&gt; branch as the destination. Git Sync commits the copy to &lt;code&gt;main&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Import dashboard&lt;/strong&gt;: Export the dashboard from the sandbox (&lt;strong&gt;Export&lt;/strong&gt; as JSON), then use &lt;strong&gt;Dashboards &amp;gt; New &amp;gt; Import&lt;/strong&gt; and save it into the folder backed by the &lt;code&gt;main&lt;/code&gt; branch. Git Sync commits it to &lt;code&gt;main&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This suits users who prefer working entirely in the UI. Note that these paths commit to &lt;code&gt;main&lt;/code&gt; without a pull request, so use them only when &lt;code&gt;main&lt;/code&gt; allows direct writes; when &lt;code&gt;main&lt;/code&gt; requires review, prefer Option 1.&lt;/p&gt;
&lt;p&gt;After promotion, you can delete short-lived sandbox branches, or keep a long-lived shared sandbox and continue iterating.&lt;/p&gt;
&lt;h2 id=&#34;learn-more&#34;&gt;Learn more&lt;/h2&gt;
&lt;p&gt;Refer to the following documents to learn more:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/grafana/v13.2/as-code/observability-as-code/git-sync/scenarios/dev-prod/&#34;&gt;Git Sync for development and production environments&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/grafana/v13.2/as-code/observability-as-code/git-sync/key-concepts/&#34;&gt;Git Sync key concepts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/grafana/v13.2/as-code/observability-as-code/git-sync/git-sync-setup/set-up-code/&#34;&gt;Configure Git Sync as code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/grafana/v13.2/as-code/observability-as-code/git-sync/provisioned-dashboards/&#34;&gt;Manage provisioned dashboards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
    &lt;a href=&#34;/docs/grafana/v13.2/as-code/observability-as-code/git-sync/usage-limits/&#34;&gt;Usage and performance limitations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="testing-sandboxes-with-git-sync">Testing sandboxes with Git Sync&lt;/h1>
&lt;p>Use a sandbox branch that users can push to directly, without opening a pull request for every change. A sandbox branch is a low-friction space for short-lived projects and experimentation, while keeping every dashboard version-controlled in Git. When work is ready, you promote it to the &lt;code>main&lt;/code> branch.&lt;/p></description></item><item><title>Git Sync for high availability environments</title><link>https://grafana.com/docs/grafana/v13.2/as-code/observability-as-code/git-sync/scenarios/high-availability/</link><pubDate>Tue, 18 Aug 2026 10:15:08 +0000</pubDate><guid>https://grafana.com/docs/grafana/v13.2/as-code/observability-as-code/git-sync/scenarios/high-availability/</guid><content><![CDATA[&lt;h1 id=&#34;git-sync-for-high-availability-environments&#34;&gt;Git Sync for high availability environments&lt;/h1&gt;
&lt;h2 id=&#34;primaryreplica-scenario&#34;&gt;Primary–replica scenario&lt;/h2&gt;
&lt;p&gt;Use a primary Grafana instance and one or more replicas synchronized with the same Git location to enable failover.&lt;/p&gt;
&lt;h3 id=&#34;use-it-for&#34;&gt;Use it for&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automatic failover&lt;/strong&gt;: You need service continuity when the primary instance fails.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;High availability&lt;/strong&gt;: Your organization requires guaranteed dashboard availability.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simple HA setup&lt;/strong&gt;: You want high availability without the complexity of active–active.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maintenance windows&lt;/strong&gt;: You perform updates while another instance serves traffic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Business continuity&lt;/strong&gt;: Dashboard access can&amp;rsquo;t tolerate downtime.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;architecture&#34;&gt;Architecture&lt;/h3&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;┌─────────────────────────────────────────────────────┐
│           GitHub Repository                         │
│   Repository: your-org/grafana-manifests          │
│   Branch: main                                      │
│                                                     │
│   grafana-manifests/                              │
│   └── shared/                                      │
│       ├── dashboard-metrics.json                   │
│       ├── dashboard-alerts.json                    │
│       └── dashboard-logs.json                      │
└─────────────────────────────────────────────────────┘
              ↕                           ↕
        Git Sync (shared/)        Git Sync (shared/)
              ↕                           ↕
┌────────────────────┐          ┌────────────────────┐
│  Master Grafana    │          │  Replica Grafana   │
│    (Active)        │          │    (Standby)       │
│                    │          │                    │
│  Repository:       │          │  Repository:       │
│  - path: shared/   │          │  - path: shared/   │
└────────────────────┘          └────────────────────┘
         │                               │
         └───────────┬───────────────────┘
                     ↓
          ┌──────────────────────┐
          │  Reverse Proxy       │
          │  (Failover)          │
          └──────────────────────┘&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;repository-structure&#34;&gt;Repository structure&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;In Git:&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;your-org/grafana-manifests
└── shared/
    ├── dashboard-metrics.json
    ├── dashboard-alerts.json
    └── dashboard-logs.json&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;In Grafana Dashboards view (both instances):&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;Dashboards
└── 📁 grafana-manifests/
    ├── Metrics Dashboard
    ├── Alerts Dashboard
    └── Logs Dashboard&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Master and replica instances show identical folder structure.&lt;/li&gt;
&lt;li&gt;Both sync from the same &lt;code&gt;shared/&lt;/code&gt; path.&lt;/li&gt;
&lt;li&gt;Reverse proxy routes traffic to master (active) instance.&lt;/li&gt;
&lt;li&gt;If master fails, proxy automatically fails over to replica (standby).&lt;/li&gt;
&lt;li&gt;Users see the same dashboards regardless of which instance is serving traffic.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;configuration-parameters&#34;&gt;Configuration parameters&lt;/h3&gt;
&lt;p&gt;Both master and replica instances use identical parameters:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Master instance:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Repository&lt;/strong&gt;: &lt;code&gt;your-org/grafana-manifests&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Branch&lt;/strong&gt;: &lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Path&lt;/strong&gt;: &lt;code&gt;shared/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Replica instance:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Repository&lt;/strong&gt;: &lt;code&gt;your-org/grafana-manifests&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Branch&lt;/strong&gt;: &lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Path&lt;/strong&gt;: &lt;code&gt;shared/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;how-it-works&#34;&gt;How it works&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Both instances stay synchronized through Git.&lt;/li&gt;
&lt;li&gt;Reverse proxy routes traffic to primary.&lt;/li&gt;
&lt;li&gt;Users edit on primary. Git Sync commits changes.&lt;/li&gt;
&lt;li&gt;Both instances pull latest changes to keep replica in sync.&lt;/li&gt;
&lt;li&gt;On primary failure, proxy fails over to replica.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;failover-considerations&#34;&gt;Failover considerations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Health checks and monitoring.&lt;/li&gt;
&lt;li&gt;Continuous syncing to minimize data loss.&lt;/li&gt;
&lt;li&gt;Plan failback (automatic or manual).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;load-balancer-scenario&#34;&gt;Load balancer scenario&lt;/h2&gt;
&lt;p&gt;Run multiple active Grafana instances behind a load balancer. All instances sync from the same Git location.&lt;/p&gt;
&lt;h3 id=&#34;use-it-for-1&#34;&gt;Use it for&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;High traffic&lt;/strong&gt;: Your deployment needs to handle significant user load.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Load distribution&lt;/strong&gt;: You want to distribute user requests across instances.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maximum availability&lt;/strong&gt;: You need service continuity during maintenance or failures.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalability&lt;/strong&gt;: You want to add instances as load increases.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance&lt;/strong&gt;: Users need fast response times under heavy load.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;architecture-1&#34;&gt;Architecture&lt;/h3&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;┌─────────────────────────────────────────────────────┐
│           GitHub Repository                         │
│   Repository: your-org/grafana-manifests          │
│   Branch: main                                      │
│                                                     │
│   grafana-manifests/                              │
│   └── shared/                                      │
│       ├── dashboard-metrics.json                   │
│       ├── dashboard-alerts.json                    │
│       └── dashboard-logs.json                      │
└─────────────────────────────────────────────────────┘
              ↕                           ↕
        Git Sync (shared/)        Git Sync (shared/)
              ↕                           ↕
┌────────────────────┐          ┌────────────────────┐
│  Grafana Instance 1│          │  Grafana Instance 2│
│    (Active)        │          │    (Active)        │
│                    │          │                    │
│  Repository:       │          │  Repository:       │
│  - path: shared/   │          │  - path: shared/   │
└────────────────────┘          └────────────────────┘
         │                               │
         └───────────┬───────────────────┘
                     ↓
          ┌──────────────────────┐
          │  Load Balancer       │
          │  (Round Robin)       │
          └──────────────────────┘&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;repository-structure-1&#34;&gt;Repository structure&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;In Git:&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;your-org/grafana-manifests
└── shared/
    ├── dashboard-metrics.json
    ├── dashboard-alerts.json
    └── dashboard-logs.json&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;In Grafana Dashboards view (all instances):&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;Dashboards
└── 📁 grafana-manifests/
    ├── Metrics Dashboard
    ├── Alerts Dashboard
    └── Logs Dashboard&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;All instances show identical folder structure.&lt;/li&gt;
&lt;li&gt;All instances sync from the same &lt;code&gt;shared/&lt;/code&gt; path.&lt;/li&gt;
&lt;li&gt;Load balancer distributes requests across all active instances.&lt;/li&gt;
&lt;li&gt;Any instance can serve read requests.&lt;/li&gt;
&lt;li&gt;Any instance can accept dashboard modifications.&lt;/li&gt;
&lt;li&gt;Changes propagate to all instances through Git.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;configuration-parameters-1&#34;&gt;Configuration parameters&lt;/h3&gt;
&lt;p&gt;All instances use identical parameters:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Instance 1:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Repository&lt;/strong&gt;: &lt;code&gt;your-org/grafana-manifests&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Branch&lt;/strong&gt;: &lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Path&lt;/strong&gt;: &lt;code&gt;shared/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Instance 2:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Repository&lt;/strong&gt;: &lt;code&gt;your-org/grafana-manifests&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Branch&lt;/strong&gt;: &lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Path&lt;/strong&gt;: &lt;code&gt;shared/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;how-it-works-1&#34;&gt;How it works&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;All instances stay synchronized through Git.&lt;/li&gt;
&lt;li&gt;Load balancer distributes incoming traffic across all active instances.&lt;/li&gt;
&lt;li&gt;Users can view dashboards from any instance.&lt;/li&gt;
&lt;li&gt;When a user modifies a dashboard on any instance, Git Sync commits the change.&lt;/li&gt;
&lt;li&gt;All other instances pull the updated dashboard during their next sync cycle, or instantly if webhooks are configured.&lt;/li&gt;
&lt;li&gt;If one instance fails, load balancer stops routing traffic to it and remaining instances continue serving.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;important-considerations&#34;&gt;Important considerations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Eventually consistent&lt;/strong&gt;: Due to sync intervals, instances may briefly have different dashboard versions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Concurrent edits&lt;/strong&gt;: Multiple users editing the same dashboard on different instances can cause conflicts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Database sharing&lt;/strong&gt;: Instances should share the same backend database for user sessions, preferences, and annotations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stateless design&lt;/strong&gt;: Design for stateless operation where possible to maximize load balancing effectiveness.&lt;/li&gt;
&lt;/ul&gt;
]]></content><description>&lt;h1 id="git-sync-for-high-availability-environments">Git Sync for high availability environments&lt;/h1>
&lt;h2 id="primaryreplica-scenario">Primary–replica scenario&lt;/h2>
&lt;p>Use a primary Grafana instance and one or more replicas synchronized with the same Git location to enable failover.&lt;/p></description></item><item><title>Multiple team Git Sync</title><link>https://grafana.com/docs/grafana/v13.2/as-code/observability-as-code/git-sync/scenarios/multi-team/</link><pubDate>Tue, 18 Aug 2026 10:15:08 +0000</pubDate><guid>https://grafana.com/docs/grafana/v13.2/as-code/observability-as-code/git-sync/scenarios/multi-team/</guid><content><![CDATA[&lt;h1 id=&#34;git-sync-in-a-grafana-instance-shared-by-multiple-teams&#34;&gt;Git Sync in a Grafana instance shared by multiple teams&lt;/h1&gt;
&lt;p&gt;Use a single Grafana instance with multiple Repository resources, one per team. Each team manages its own dashboards while sharing Grafana.&lt;/p&gt;
&lt;h2 id=&#34;use-it-for&#34;&gt;Use it for&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Team autonomy&lt;/strong&gt;: Different teams manage their own dashboards independently.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Organizational structure&lt;/strong&gt;: Dashboard organization aligns with team structure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource efficiency&lt;/strong&gt;: Multiple teams share Grafana infrastructure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost optimization&lt;/strong&gt;: You reduce infrastructure costs while maintaining team separation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Collaboration&lt;/strong&gt;: Teams can view each other’s dashboards while managing their own.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;architecture&#34;&gt;Architecture&lt;/h2&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;┌─────────────────────────┐  ┌─────────────────────────┐
│  Platform Team Repo     │  │  Data Team Repo         │
│  platform-dashboards    │  │  data-dashboards        │
│                         │  │                         │
│  platform-dashboards/   │  │  data-dashboards/       │
│  └── grafana/           │  │  └── grafana/           │
│      ├── k8s.json       │  │      ├── pipeline.json  │
│      └── infra.json     │  │      └── analytics.json │
└─────────────────────────┘  └─────────────────────────┘
           ↕                            ↕
    Git Sync (grafana/)          Git Sync (grafana/)
           ↕                            ↕
        ┌──────────────────────────────────────┐
        │       Grafana Instance               │
        │                                      │
        │  Repository 1:                       │
        │  - repo: platform-dashboards         │
        │  → Creates &amp;#34;platform-dashboards&amp;#34;     │
        │                                      │
        │  Repository 2:                       │
        │  - repo: data-dashboards             │
        │  → Creates &amp;#34;data-dashboards&amp;#34;         │
        └──────────────────────────────────────┘&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;repository-structure&#34;&gt;Repository structure&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;In Git (separate repositories):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Platform team repository:&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;your-org/platform-dashboards
└── grafana/
    ├── dashboard-k8s.json
    └── dashboard-infra.json&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Data team repository:&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;your-org/data-dashboards
└── grafana/
    ├── dashboard-pipeline.json
    └── dashboard-analytics.json&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;In Grafana Dashboards view:&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;Dashboards
├── 📁 platform-dashboards/
│   ├── Kubernetes Dashboard
│   └── Infrastructure Dashboard
└── 📁 data-dashboards/
    ├── Pipeline Dashboard
    └── Analytics Dashboard&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Two separate folders created (one per Repository resource).&lt;/li&gt;
&lt;li&gt;Folder names derived from repository names.&lt;/li&gt;
&lt;li&gt;Each team has complete control over their own repository.&lt;/li&gt;
&lt;li&gt;Teams can independently manage permissions, branches, and workflows in their repos.&lt;/li&gt;
&lt;li&gt;All teams can view each other&amp;rsquo;s dashboards in Grafana but manage only their own.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;configuration-parameters&#34;&gt;Configuration parameters&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Platform team repository:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Repository&lt;/strong&gt;: &lt;code&gt;your-org/platform-dashboards&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Branch&lt;/strong&gt;: &lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Path&lt;/strong&gt;: &lt;code&gt;grafana/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Data team repository:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Repository&lt;/strong&gt;: &lt;code&gt;your-org/data-dashboards&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Branch&lt;/strong&gt;: &lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Path&lt;/strong&gt;: &lt;code&gt;grafana/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;How it works&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Each team has their own Git repository for complete autonomy.&lt;/li&gt;
&lt;li&gt;Each repository resource in Grafana creates a separate folder.&lt;/li&gt;
&lt;li&gt;Platform team dashboards sync from &lt;code&gt;your-org/platform-dashboards&lt;/code&gt; repository.&lt;/li&gt;
&lt;li&gt;Data team dashboards sync from &lt;code&gt;your-org/data-dashboards&lt;/code&gt; repository.&lt;/li&gt;
&lt;li&gt;Teams can independently manage their repository settings, access controls, and workflows.&lt;/li&gt;
&lt;li&gt;All teams can view each other&amp;rsquo;s dashboards in Grafana but edit only their own.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;scale-to-more-teams&#34;&gt;Scale to more teams&lt;/h2&gt;
&lt;p&gt;Adding additional teams is straightforward. For a third team, create a new repository and configure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Repository&lt;/strong&gt;: &lt;code&gt;your-org/security-dashboards&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Branch&lt;/strong&gt;: &lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Path&lt;/strong&gt;: &lt;code&gt;grafana/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This creates a new &amp;ldquo;security-dashboards&amp;rdquo; folder in the same Grafana instance.&lt;/p&gt;
&lt;h2 id=&#34;alternative-shared-repository-with-different-paths&#34;&gt;Alternative: Shared repository with different paths&lt;/h2&gt;
&lt;p&gt;For teams that prefer sharing a single repository, use different paths to separate team dashboards:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In Git:&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&#34;code-snippet code-snippet__mini&#34;&gt;&lt;div class=&#34;lang-toolbar__mini&#34;&gt;
    &lt;span class=&#34;code-clipboard&#34;&gt;
      &lt;button x-data=&#34;app_code_snippet()&#34; x-init=&#34;init()&#34; @click=&#34;copy()&#34;&gt;
        &lt;img class=&#34;code-clipboard__icon&#34; src=&#34;/media/images/icons/icon-copy-small-2.svg&#34; alt=&#34;Copy code to clipboard&#34; width=&#34;14&#34; height=&#34;13&#34;&gt;
        &lt;span&gt;Copy&lt;/span&gt;
      &lt;/button&gt;
    &lt;/span&gt;
  &lt;/div&gt;&lt;div class=&#34;code-snippet code-snippet__border&#34;&gt;
    &lt;pre data-expanded=&#34;false&#34;&gt;&lt;code class=&#34;language-none&#34;&gt;your-org/grafana-manifests
├── team-platform/
│   ├── dashboard-k8s.json
│   └── dashboard-infra.json
└── team-data/
    ├── dashboard-pipeline.json
    └── dashboard-analytics.json&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Configuration:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Platform team:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Repository&lt;/strong&gt;: &lt;code&gt;your-org/grafana-manifests&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Branch&lt;/strong&gt;: &lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Path&lt;/strong&gt;: &lt;code&gt;team-platform/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Data team:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Repository&lt;/strong&gt;: &lt;code&gt;your-org/grafana-manifests&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Branch&lt;/strong&gt;: &lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Path&lt;/strong&gt;: &lt;code&gt;team-data/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This approach provides simpler repository management but less isolation between teams.&lt;/p&gt;
&lt;h2 id=&#34;alternative-different-branches-per-team&#34;&gt;Alternative: Different branches per team&lt;/h2&gt;
&lt;p&gt;For teams wanting their own branch in a shared repository:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Platform team:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Repository&lt;/strong&gt;: &lt;code&gt;your-org/grafana-manifests&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Branch&lt;/strong&gt;: &lt;code&gt;team-platform&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Path&lt;/strong&gt;: &lt;code&gt;grafana/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Data team:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Repository&lt;/strong&gt;: &lt;code&gt;your-org/grafana-manifests&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Branch&lt;/strong&gt;: &lt;code&gt;team-data&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Path&lt;/strong&gt;: &lt;code&gt;grafana/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This allows teams to use Git branch workflows for collaboration while sharing the same repository.&lt;/p&gt;
]]></content><description>&lt;h1 id="git-sync-in-a-grafana-instance-shared-by-multiple-teams">Git Sync in a Grafana instance shared by multiple teams&lt;/h1>
&lt;p>Use a single Grafana instance with multiple Repository resources, one per team. Each team manages its own dashboards while sharing Grafana.&lt;/p></description></item></channel></rss>