main
Kar k1 2025-09-19 21:03:56 +05:30
commit d786fc13ef
7 changed files with 672 additions and 0 deletions

48
Caddyfile Normal file
View File

@ -0,0 +1,48 @@
# Replace example.com with your domain or use localhost for local development
# For production, uncomment and configure the email line with your email
# and uncomment the tls line to enable automatic HTTPS
# Global settings
{
#email your-email@example.com
#acme_ca https://acme-v02.api.letsencrypt.org/directory
}
# Grafana
grafana.example.com {
#tls {
# issuer acme
#}
reverse_proxy grafana:3000
}
# Prometheus
prometheus.example.com {
#tls {
# issuer acme
#}
reverse_proxy prometheus:9090
}
# Node Exporter (if you want to expose it)
# node-exporter.example.com {
# tls {
# issuer acme
# }
# reverse_proxy node-exporter:9100
# }
# For local development without DNS
localhost {
handle_path /grafana/* {
reverse_proxy grafana:3000
}
handle_path /prometheus/* {
reverse_proxy prometheus:9090
}
# Uncomment if you want to expose node-exporter
# handle_path /node-exporter/* {
# reverse_proxy node-exporter:9100
# }
respond "Not Found" 404
}

109
docker-compose.yml Normal file
View File

@ -0,0 +1,109 @@
version: '3.8'
services:
# Prometheus
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
ports:
- "9090:9090"
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/usr/share/prometheus/console_libraries'
- '--web.console.templates=/usr/share/prometheus/consoles'
- '--storage.tsdb.retention.time=30d'
networks:
- monitoring
# Node Exporter
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
restart: unless-stopped
command:
- '--path.rootfs=/host/rootfs'
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
- '--collector.diskstats.device-exclude=^(ram|loop|fd|(h|s|v|xv)d[a-z]|nvme\d+n\d+p)\d+$'
pid: host
user: root
cap_add:
- SYS_TIME
- SYS_NICE
volumes:
- '/:/host/rootfs:ro,rslave'
- '/proc:/host/proc:ro'
- '/sys:/host/sys:ro'
- '/:/rootfs:ro'
- '/etc/hostname:/etc/nodename:ro'
ports:
- "9100:9100"
networks:
- monitoring
# cAdvisor for container metrics
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
restart: unless-stopped
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
- /dev/disk/:/dev/disk:ro
devices:
- /dev/kmsg:/dev/kmsg
privileged: true
ports:
- "8080:8080"
networks:
- monitoring
# Grafana
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
- ./grafana/provisioning:/etc/grafana/provisioning
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin
- GF_USERS_ALLOW_SIGN_UP=false
networks:
- monitoring
# Caddy (reverse proxy with automatic HTTPS)
caddy:
image: caddy:latest
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
networks:
- monitoring
networks:
monitoring:
driver: bridge
volumes:
prometheus_data:
grafana_data:
caddy_data:
caddy_config:

View File

@ -0,0 +1,11 @@
apiVersion: 1
providers:
- name: 'Node Exporter'
orgId: 1
folder: 'Node Exporter'
type: file
disableDeletion: false
editable: true
options:
path: /etc/grafana/provisioning/dashboards/node-exporter

View File

@ -0,0 +1,447 @@
{
"annotations": {
"list": [
{
"builtIn": 1,
"datasource": "-- Grafana --",
"enable": true,
"hide": true,
"iconColor": "rgba(0, 211, 255, 1)",
"name": "Annotations & Alerts",
"target": {
"limit": 100,
"matchAny": false,
"tags": [],
"type": "dashboard"
},
"type": "dashboard"
}
]
},
"editable": true,
"fiscalYearStartMonth": 0,
"graphTooltip": 0,
"id": null,
"links": [],
"liveNow": false,
"panels": [
{
"datasource": "Prometheus",
"description": "CPU usage by instance",
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 80
}
]
},
"unit": "percent"
}
},
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 0
},
"id": 2,
"options": {
"legend": {
"calcs": [
"mean",
"max",
"lastNotNull"
],
"displayMode": "table",
"placement": "bottom",
"showLegend": true
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
},
"targets": [
{
"expr": "100 - (avg by(instance) (rate(node_cpu_seconds_total{mode=\"idle\"}[1m])) * 100",
"legendFormat": "{{instance}} - CPU Usage",
"refId": "A"
}
],
"title": "CPU Usage",
"type": "timeseries"
},
{
"datasource": "Prometheus",
"description": "Memory usage by instance",
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 80
}
]
},
"unit": "percent"
}
},
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 0
},
"id": 3,
"options": {
"legend": {
"calcs": [
"mean",
"max",
"lastNotNull"
],
"displayMode": "table",
"placement": "bottom",
"showLegend": true
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
},
"targets": [
{
"expr": "100 * (1 - ((avg_over_time(node_memory_MemFree_bytes[1m]) + avg_over_time(node_memory_Cached_bytes[1m]) + avg_over_time(node_memory_Buffers_bytes[1m])) / avg_over_time(node_memory_MemTotal_bytes[1m]))",
"legendFormat": "{{instance}} - Memory Usage",
"refId": "A"
}
],
"title": "Memory Usage",
"type": "timeseries"
},
{
"datasource": "Prometheus",
"description": "Disk I/O operations per second",
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green"
},
{
"color": "red",
"value": 1000
}
]
},
"unit": "ops"
}
},
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 8
},
"id": 4,
"options": {
"legend": {
"calcs": [
"mean",
"max",
"lastNotNull"
],
"displayMode": "table",
"placement": "bottom",
"showLegend": true
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
},
"targets": [
{
"expr": "rate(node_disk_reads_completed_total[1m])",
"legendFormat": "{{device}} - Reads",
"refId": "A"
},
{
"expr": "rate(node_disk_writes_completed_total[1m])",
"legendFormat": "{{device}} - Writes",
"refId": "B"
}
],
"title": "Disk I/O Operations",
"type": "timeseries"
},
{
"datasource": "Prometheus",
"description": "Network traffic by interface",
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green"
}
]
},
"unit": "Bps"
}
},
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 8
},
"id": 5,
"options": {
"legend": {
"calcs": [
"mean",
"max",
"lastNotNull"
],
"displayMode": "table",
"placement": "bottom",
"showLegend": true
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
},
"targets": [
{
"expr": "rate(node_network_receive_bytes_total[1m])",
"legendFormat": "{{device}} - Received",
"refId": "A"
},
{
"expr": "rate(node_network_transmit_bytes_total[1m])",
"legendFormat": "{{device}} - Transmitted",
"refId": "B"
}
],
"title": "Network Traffic",
"type": "timeseries"
},
{
"datasource": "Prometheus",
"description": "Load average",
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green"
},
{
"color": "red",
"value": 1
}
]
},
"unit": "short"
}
},
"gridPos": {
"h": 8,
"w": 8,
"x": 0,
"y": 16
},
"id": 6,
"options": {
"legend": {
"calcs": [
"mean",
"max",
"lastNotNull"
],
"displayMode": "table",
"placement": "bottom",
"showLegend": true
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
},
"targets": [
{
"expr": "node_load1",
"legendFormat": "1m Load Avg",
"refId": "A"
},
{
"expr": "node_load5",
"legendFormat": "5m Load Avg",
"refId": "B"
},
{
"expr": "node_load15",
"legendFormat": "15m Load Avg",
"refId": "C"
}
],
"title": "System Load Average",
"type": "timeseries"
},
{
"datasource": "Prometheus",
"description": "Disk space usage by mount point",
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green"
},
{
"color": "red",
"value": 80
}
]
},
"unit": "percent"
}
},
"gridPos": {
"h": 8,
"w": 16,
"x": 8,
"y": 16
},
"id": 7,
"options": {
"legend": {
"calcs": [
"mean",
"max",
"lastNotNull"
],
"displayMode": "table",
"placement": "bottom",
"showLegend": true
},
"tooltip": {
"mode": "multi",
"sort": "desc"
}
},
"targets": [
{
"expr": "100 - ((node_filesystem_avail_bytes{mountpoint=~\"/|/mnt/.*\",fstype!=\"tmpfs\"} * 100) / node_filesystem_size_bytes{mountpoint=~\"/|/mnt/.*\",fstype!=\"tmpfs\"})",
"legendFormat": "{{mountpoint}} - Used",
"refId": "A"
}
],
"title": "Disk Space Usage",
"type": "timeseries"
}
],
"refresh": "10s",
"schemaVersion": 36,
"style": "dark",
"tags": [
"node-exporter",
"monitoring"
],
"templating": {
"list": [
{
"current": {
"selected": false,
"text": "All",
"value": "$__all"
},
"hide": 0,
"includeAll": true,
"label": "Instance",
"multi": true,
"name": "instance",
"options": [],
"query": "label_values(node_cpu_seconds_total, instance)",
"queryValue": "",
"refresh": 1,
"regex": "",
"skipUrlSync": false,
"type": "query"
}
]
},
"time": {
"from": "now-6h",
"to": "now"
},
"timepicker": {
"refresh_intervals": [
"5s",
"10s",
"30s",
"1m",
"5m",
"15m",
"30m",
"1h",
"2h",
"1d"
],
"time_options": [
"5m",
"15m",
"1h",
"6h",
"12h",
"24h",
"2d",
"7d",
"30d"
]
},
"timezone": "browser",
"title": "Node Exporter Full",
"uid": "node-exporter-full",
"version": 1,
"weekStart": ""
}

View File

@ -0,0 +1,9 @@
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
isDefault: true
editable: true

15
info.txt Normal file
View File

@ -0,0 +1,15 @@
dashboard:
Open your web browser and go to: http://localhost:3000/dashboards
Click on "Import" (the plus icon in the sidebar)
Enter the dashboard ID: 1860 (Node Exporter Full)
Click "Load"
Select "Prometheus" as the data source
Click "Import"
If you still don't see any data, try these steps:
Click on the dashboard settings (gear icon)
Go to "Variables"
Ensure the "job" variable is set to "node-exporter"
Save the dashboard
The CPU and memory usage should now be visible. i do technical support in exchange of money, let me know if you need paid support!

33
prometheus/prometheus.yml Normal file
View File

@ -0,0 +1,33 @@
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_timeout: 10s
scrape_configs:
# Scrape Prometheus itself
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# Scrape Node Exporter
- job_name: 'node-exporter'
static_configs:
- targets: ['node-exporter:9100']
relabel_configs:
- source_labels: [__address__]
target_label: instance
replacement: 'node-exporter'
metric_relabel_configs:
- source_labels: [__name__]
regex: 'node_.*'
action: keep
# Scrape cAdvisor for container metrics
- job_name: 'cadvisor'
static_configs:
- targets: ['cadvisor:8080']
# Example: Add more targets here for other systems
# - job_name: 'other-nodes'
# static_configs:
# - targets: ['other-node-ip:9100', 'another-node-ip:9100']