Skip to main content

Command Palette

Search for a command to run...

Deploying Mimir Scalable Metrics Storage on Ubuntu 24.04

Step-by-step guide to deploy Grafana Mimir with Docker Compose and Traefik on Ubuntu 24.04, with persistent storage and automatic HTTPS for long-term, scalable Prometheus metrics.

Updated
3 min read
Deploying Mimir Scalable Metrics Storage on Ubuntu 24.04
S
A Developer Advocate with a focus on improving the developer experience through clear communication, technical enablement, and community engagement.
A
DevOps Engineer with experience in Kubernetes, automation, cloud infrastructure, and observability. I work in Developer Relations, contribute to technical documentation, and collaborate on engineering-focused projects.

Mimir is an open-source, horizontally scalable long-term storage backend for Prometheus metrics from Grafana Labs. It accepts metrics via Prometheus remote write and serves them back through a Prometheus-compatible query API. This guide deploys Mimir using Docker Compose with Traefik handling automatic HTTPS, and verifies the backend through its status endpoints, following scalable metrics storage practices documented in Vultr Docs.


Set Up the Directory Structure

1. Create the project directory structure:

$ mkdir -p ~/mimir-metrics/{mimir-data,mimir-config}
$ cd ~/mimir-metrics

2. Create the environment file:

$ nano .env
DOMAIN=mimir.example.com
LETSENCRYPT_EMAIL=admin@example.com

3. Create the Mimir configuration file:

$ nano mimir-config/mimir-config.yaml
multitenancy_enabled: false

server:
  http_listen_port: 9009
  log_level: info

blocks_storage:
  backend: filesystem
  filesystem:
    dir: /data/blocks
  tsdb:
    dir: /data/tsdb
    retention_period: 24h

compactor:
  data_dir: /data/compactor
  sharding_ring:
    kvstore:
      store: memberlist

distributor:
  ring:
    kvstore:
      store: memberlist

ingester:
  ring:
    kvstore:
      store: memberlist
    replication_factor: 1

store_gateway:
  sharding_ring:
    kvstore:
      store: memberlist

ruler_storage:
  backend: filesystem
  filesystem:
    dir: /data/rules

limits:
  max_global_series_per_user: 0
  ingestion_rate: 0
  ingestion_burst_size: 0

Deploy with Docker Compose

1. Create the Docker Compose manifest:

$ nano docker-compose.yaml
services:
  traefik:
    image: traefik:v3.6
    container_name: traefik
    command:
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--entrypoints.web.http.redirections.entrypoint.to=websecure"
      - "--entrypoints.web.http.redirections.entrypoint.scheme=https"
      - "--certificatesresolvers.letsencrypt.acme.httpchallenge=true"
      - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
      - "--certificatesresolvers.letsencrypt.acme.email=${LETSENCRYPT_EMAIL}"
      - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    restart: unless-stopped

  mimir:
    image: grafana/mimir:latest
    container_name: mimir
    hostname: mimir
    expose:
      - "9009"
    volumes:
      - "./mimir-config/mimir-config.yaml:/etc/mimir/mimir-config.yaml"
      - "./mimir-data:/data"
    command: -config.file=/etc/mimir/mimir-config.yaml
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.mimir.rule=Host(`${DOMAIN}`)"
      - "traefik.http.routers.mimir.entrypoints=websecure"
      - "traefik.http.routers.mimir.tls.certresolver=letsencrypt"
      - "traefik.http.services.mimir.loadbalancer.server.port=9009"
    restart: unless-stopped

volumes:
  letsencrypt:

2. Start the services:

$ docker compose up -d

3. Verify the services are running:

$ docker compose ps

4. View the logs:

$ docker compose logs

Access Mimir

1. Check the readiness endpoint:

$ curl https://mimir.example.com/ready

A ready response confirms the backend is up.

2. Check the build information:

$ curl https://mimir.example.com/api/v1/status/buildinfo

3. Query the running configuration:

$ curl https://mimir.example.com/api/v1/status/config

4. Check the ingester ring:

$ curl https://mimir.example.com/ingester/ring

Next Steps

Mimir is running and ready to accept Prometheus metrics over HTTPS. From here you can:

  • Configure Prometheus remote_write to push metrics to your Mimir domain

  • Add Mimir as a Prometheus data source in Grafana for long-term queries

  • Move block storage to S3-compatible object storage for durable retention

For the full guide with additional tips, visit the original article on Vultr Docs.

The Self-Hosted Stack

Part 9 of 50

The Self-Hosted Stack is a developer-focused series exploring open-source tools you can deploy, run, and manage on your own infrastructure. From AI platforms and databases to developer tools, observability stacks, and authentication systems, each guide walks through deploying production-ready open-source software on Vultr cloud infrastructure.

Up next

Deploying Tempo Distributed Tracing Backend on Ubuntu 24.04

Step-by-step guide to deploy Grafana Tempo with Docker Compose and Traefik on Ubuntu 24.04, with persistent trace storage and automatic HTTPS for a production-grade distributed tracing backend.

More from this blog

V

Vultr

71 posts

Vultr is a global cloud infrastructure provider trusted by developers and businesses in 185+ countries. We publishe hands-on guides spanning Linux administration, server configuration, DevOps, networking, open source stacks, AI code agents, and Vultr product walkthroughs, all tested against real cloud environments and built for engineers who ship.