Overview
Grafana Mimir is a long-term Prometheus metrics store you own. This template deploys Mimir in monolithic mode: your own collectors (Prometheus, Grafana Alloy, OpenTelemetry) push metrics in via Prometheusremote_write, and anything that speaks PromQL — your own Grafana, dashboards, scripts — queries them back, with metric blocks durably stored in your object bucket.
This is a self-hosted metrics store for your own metrics from your own sources. It is separate from — and not a replacement for — Control Plane’s built-in observability, which continues to collect and dashboard your workloads’ metrics natively.
Architecture
- Mimir — A single-replica stateful workload running all Mimir components in one process (
target: all). Remote-write ingest and PromQL query on port8080, internal gRPC on9095, memberlist on7946(self-contained ring — no Consul or etcd). - Object storage — Metric blocks live in your S3, GCS, or S3-compatible bucket; the persistent volume holds only the ingester WAL/TSDB and compactor workspace.
What Gets Created
- Stateful Mimir Workload — Serves remote-write ingest and PromQL query on port
8080. - Volume Set — 20 GiB at
/datafor the ingester WAL/TSDB and compactor workspace. - Secret — An opaque secret holding the rendered Mimir configuration, mounted as a file.
- Identity & Policy — An identity bound to the workload with
revealaccess to the config secret only, plus cloud access scoped to exactly your bucket (AWS and GCP backends).
This template does not create a GVC. You must deploy it into an existing GVC.
Prerequisites
Mimir requires an existing bucket in one of the supported backends and the access setup for it. Complete the steps for your chosen backend before installing.- AWS S3
- Google Cloud Storage
- S3-compatible (MinIO, R2, Wasabi)
AWS S3 uses a Control Plane cloud identity — no credentials are stored; the workload’s identity vends temporary credentials at runtime.
1
Create a bucket
Create an S3 bucket. Set
storage.aws.bucket and storage.aws.region to match.2
Set up a Cloud Account
If you do not have one, create a Cloud Account for your AWS account. Set
storage.aws.cloudAccountName to its name.3
Create a bucket-scoped IAM policy
Create an AWS IAM policy with the JSON below (replace
YOUR_BUCKET), then set storage.aws.policyName to the policy’s name (bare name, not ARN):UI
Browse, install, and manage templates visually
CLI
Manage templates from your terminal
Terraform
Declare templates in your Terraform configurations
Pulumi
Declare templates in your Pulumi programs
Configuration
The defaultvalues.yaml for this template:
Resources
image— The Grafana Mimir container image.resources— CPU and memory for the Mimir container. Memory governs how many active series you can ingest.
Storage Backend
Setstorage.type to aws, gcp, or minio, and configure that block. AWS and GCP use a Control Plane cloud identity — no credentials are stored; the workload’s identity vends temporary credentials at runtime. See Prerequisites for the per-backend setup steps.
One bucket serves the whole deployment; the template namespaces its contents internally.
Multitenancy
multitenancy.enabled— Whentrue, every request (push and query) must carry anX-Scope-OrgID: <tenant>header; requests without it are rejected with401 no org id. Tenants are implicit — writing with a new tenant ID creates it, and each tenant’s series are fully isolated from the others. No provisioning step.
Retention
retention.period— Blocks retention enforced by the compactor, e.g.30d,13w,1y. The default"0"keeps data forever. Changing the period applies to existing blocks too.
Storage Volume
volumeset.capacity— Volume size in GiB for the ingester WAL/TSDB and compactor workspace at/data. Metric blocks are durably stored in your object bucket, not on the volume.
Internal Access
Mimir is internal-only by design — it has no built-in authentication, so this template never exposes a public endpoint.internalAccess.type controls which workloads can reach port 8080:
To serve clients outside Control Plane, front Mimir with your own authenticating proxy behind a custom domain — that proxy is yours to build and operate; the template does not provide one.
Connecting
Point your collectors at the ingest endpoint. For Prometheus:
internalAccess) to reach it.
Important Notes
- After scaling
replicas1 → 3 on a live install, metrics written shortly before the scale-up can be intermittently invisible to queries for up to ~12 hours while their blocks age into the store — no data is lost and it resolves on its own. - Mimir has no built-in authentication, so this template never exposes a public endpoint. The
X-Scope-OrgIDheader identifies a tenant; it does not authenticate anyone. To serve clients outside Control Plane, front Mimir with your own authenticating proxy behind a custom domain. - With
multitenancy.enabled: true, every request needsX-Scope-OrgID— pushes and queries without it are rejected; tenants are implicit (no provisioning step). - Transient “Access Denied” warnings in the first seconds of a fresh boot may appear — the workload identity’s cloud credentials are still being issued; Mimir retries and proceeds on its own.
- Data lives in your bucket — the volume set only holds the WAL and scratch space. Reinstalling the template against the same bucket resumes with your data; deleting data means emptying the bucket.
- Retention is enforced by the compactor — changing
retention.periodapplies to existing blocks too. - After uninstall, re-check your bucket — the terminating replica can re-write a small cluster-seed file (
blocks/__mimir_cluster/) minutes after teardown; delete it if you are emptying the bucket.
External References
Grafana Mimir Documentation
Official Grafana Mimir documentation
Prometheus remote_write
Remote-write tuning and best practices
Mimir HTTP API
Ingest, query, and status endpoints reference
Grafana Mimir (GitHub)
Source code and releases
Mimir Template
View the source files, default values, and chart definition