Prometheus is an open-source systems monitoring and alerting toolkit that scrapes targets over HTTP and stores time-series metrics in a local TSDB. It exposes a powerful query language (PromQL) and pairs natively with Grafana for visualization. This guide deploys Prometheus using Docker Compose with Traefik handling automatic HTTPS, and verifies the server via a sample scrape config. By the end, you'll have Prometheus collecting and serving metrics over HTTPS at your domain.
Set Up the Directory Structure
1. Create the project directory structure:
$ mkdir -p ~/prometheus-monitoring/{prometheus-data,prometheus-config}
$ cd ~/prometheus-monitoring
2. Set ownership for the Prometheus data directory:
$ sudo chown -R 65534:65534 prometheus-data
3. Create the environment file:
$ nano .env
DOMAIN=prometheus.example.com
LETSENCRYPT_EMAIL=admin@example.com
4. Create the Prometheus configuration file:
$ nano prometheus-config/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
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
prometheus:
image: prom/prometheus:latest
container_name: prometheus
hostname: prometheus
expose:
- "9090"
volumes:
- "./prometheus-config/prometheus.yml:/etc/prometheus/prometheus.yml"
- "./prometheus-data:/prometheus"
command:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.path=/prometheus"
labels:
- "traefik.enable=true"
- "traefik.http.routers.prometheus.rule=Host(`${DOMAIN}`)"
- "traefik.http.routers.prometheus.entrypoints=websecure"
- "traefik.http.routers.prometheus.tls.certresolver=letsencrypt"
- "traefik.http.services.prometheus.loadbalancer.server.port=9090"
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 Prometheus
Open https://prometheus.example.com in a browser. Try a basic PromQL query in the expression bar to confirm scraping:
-
up— scrape status of every target -
process_cpu_seconds_total— Prometheus's own CPU usage -
process_resident_memory_bytes— Prometheus's own memory usage
Next Steps
Prometheus is running and scraping metrics over HTTPS. From here you can:
- Add scrape targets for your application, node exporters, and infrastructure
- Connect Prometheus as a data source in Grafana for dashboards
- Configure alerting rules and route them through Alertmanager
For the full guide with additional tips, visit the original article on Vultr Docs.
















