Here we are, another year into shelter in place. Maybe it might be a good idea to build a new rig when GPU prices are at an all time high. Maybe it’d be great to build out prometheus + grafana cluster to collect my system stats as I run benchmarks against it. Surprisingly, the latter was a bit more sane and overall a fun learning experience.

After a couple revisions, ended up with this:

services:
  prometheus:
    container_name: prometheus
    image: prom/prometheus:latest
    volumes:
      - ./configs:/etc/prometheus
      - prometheus-data:/prometheus
    entrypoint: [
      '/bin/prometheus',
      '--config.file=/etc/prometheus/prometheus.yml',
      '--storage.tsdb.path=/prometheus',
      '--storage.tsdb.retention.time=1y',
      '--storage.tsdb.wal-compression',
      '--web.console.libraries=/usr/share/prometheus/console_libraries',
      '--web.console.templates=/usr/share/prometheus/consoles',
      # curl -X POST $(docker inspect prometheus | jq -r ".[].NetworkSettings.Networks.monitoring_default.IPAddress"):9090/-/reload
      '--web.enable-lifecycle'
    ]
    restart: always

  grafana:
    container_name: grafana
    image: grafana/grafana:main-ubuntu
    volumes:
      - ./configs/grafana.yaml:/etc/grafana/provisioning/datasources/grafana.yaml
      - ./dashboards:/etc/grafana/provisioning/dashboards
      - grafana-data:/var/lib/grafana
    environment:
      GF_DEFAULT_INSTANCE_NAME: grafana
      GF_ANALYTICS_FEEDBACKLINKS_ENABLED: false
      GF_ANALYTICS_REPORTING_ENABLED: false
      GF_AUTH_ANONYMOUS_ORG_NAME: ${ORG_NAME}
      GF_PUBLIC_DASHBOARDS_ENABLED: false
      GF_REPORTING_ENABLED: false
      GF_SECURITY_ADMIN_EMAIL: ${ADMIN_EMAIL}
      GF_SECURITY_ADMIN_USER: ${USERNAME}
      GF_SECURITY_ADMIN_PASSWORD: ${PASSWORD}
    restart: always
    depends_on:
      - prometheus

volumes:
  prometheus-data:
    driver_opts:
      type: cifs
      o: 'addr=${STORAGE_ADDR},username=${USERNAME},password=${PASSWORD},file_mode=0600,dir_mode=0600'
      device: '//${STORAGE_ADDR}/${PROMETHEUS_STORAGE_PATH}'
  grafana-data:
    driver_opts:
      type: cifs
      o: 'addr=${STORAGE_ADDR},username=${USERNAME},password=${PASSWORD},file_mode=0600,dir_mode=0600'
      device: '//${STORAGE_ADDR}/${GRAFANA_STORAGE_PATH}'

Some takeaways:

  • Secrets are definitely the better way to handle senstive info, but for what I’m trying to do, .env is sufficient.
  • Considering I’m already running a samba server for backups, I was able to leverage that via volumes and persist my container data that way. Made it super easy to restore if my docker host were to experience downtime.