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. By the end, you'll have Mimir storing and serving Prometheus metrics over HTTPS at your domain.
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_writeto 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.
Top comments (0)