Yuna در حال کار با یک نمایشگر مانیتورینگ در فضای نمایشی آکادمی ویونیکس.

WIUNIX ACADEMY

آموزش نصب Prometheus و Grafana در اوبونتو و دبیان

نصب Prometheus، node_exporter و Grafana با دسترسی امن و بررسی مسیر جمع‌آوری تا نمایش متریک‌ها.

متوسط75 دقیقه مطالعهبه‌روزرسانی
محیطت را انتخاب کن

آموزش متناسب با محیط تو

کجا اجرا می‌کنی؟

سیستم‌عامل و نسخه را انتخاب کن تا مراحل، دستورها و راه‌حل‌ها برای همان محیط نمایش داده شوند.

Ubuntu 26.10بررسی‌شده با مستندات رسمی ·

از اینجا شروع کن

در پایان چه چیزی خواهی داشت؟

یک استک مانیتورینگ خودمیزبان بساز که متریک‌های محلی سیستم را در Prometheus ذخیره کند، آن‌ها را در Grafana نمایش بدهد و بعداً هم مسیر تمیزی برای اضافه‌کردن نودهای لینوکسی بیشتر در اختیارت بگذارد.

01نودهای لینوکسیروی هر سرور node_exporter اجرا می‌شود تا متریک‌ها را در قالب Prometheus منتشر کند.
02سرور Prometheustargetها را دوره‌ای scrape می‌کند و داده‌های سری‌زمانی را محلی نگه می‌دارد.
03Grafanaاز Prometheus به‌عنوان منبع‌داده استفاده می‌کند و داشبورد می‌سازد.
04دسترسی مرورگرمدیر سیستم از طریق Grafana متریک‌ها را به‌صورت بصری بررسی می‌کند.
05رشد بعدیبعداً می‌توانی exporterها و alerting بیشتری اضافه کنی بدون آن‌که پایهٔ کار را عوض کنی.
سیستم‌عامل‌ها و نسخه‌های پوشش‌داده‌شده

منابع رسمی در ۲۰۲۶-۱۰-۲۰ بررسی شدند. باینری‌های Prometheus 3.15.0، node_exporter 1.12.1 و Grafana 13.2.4، پیکربندی، provisioning و مسیر کوئری در کانتینر جداشدهٔ Ubuntu 22.04.5 اجرا شدند. این بررسی، آزمون نصب کامل APT و systemd یا آزمون همهٔ سیستم‌های قابل انتخاب نیست؛ مبنای پوشش آن‌ها مستندات رسمی است. تصاویر DEMO و خروجی‌های نمونه، نمایشی‌اند.

قبل از شروع

  • یک سرور تازهٔ اوبونتو یا دبیان با معماری amd64، systemd، دسترسی sudo و اینترنت؛ برای این آزمایش کوچک دست‌کم ۲ گیگابایت رم و ۱۰ گیگابایت فضای آزاد در نظر بگیرید. ظرفیت محیط واقعی به تعداد سری‌ها و مدت نگه‌داری بستگی دارد.
  • حساب SSH موجود روی سرور و کلاینت SSH روی رایانهٔ خودتان. هر سه سرویس فقط روی loopback گوش می‌دهند و دسترسی مرورگر به Grafana از تونل SSH انجام می‌شود.
  • برای سرور دومِ اختیاری، شبکهٔ خصوصی قابل اعتماد و UFW فعال با سیاست پیش‌فرض رد ورودی، یا قواعد معادل در فایروال شبکه لازم است. فایروال تازه را بدون حفظ دسترسی SSH فعال نکنید.
01

قدم بعدی

انتخاب سرور و محدودهٔ مانیتورینگ

در این راه‌اندازی، node_exporter متریک‌های میزبان را ارائه می‌کند، Prometheus آن‌ها را ذخیره می‌کند و Grafana نمودار می‌سازد. دستورها برای سرور تازه با معماری amd64 و systemd نوشته شده‌اند، نه ارتقای نصب موجود.

پورت‌های محلی 3000، 9090 و 9100 باید آزاد باشند. آن‌ها را عمومی نکنید؛ ورود و تغییر رمز Grafana از اتصال رمزگذاری‌شدهٔ SSH انجام خواهد شد.

Bash

ترمینال سرور مانیتورینگ. دستورهایی که با sudo شروع می‌شوند به دسترسی مدیریتی نیاز دارند.

hostnamectl
hostname -I
uname -m
sudo ss -lntup
از کجا بدانم درست انجام شد؟

نام میزبان، IPها و معماری سرور مشخص می‌شود و می‌توانی بررسی کنی که پورت 3000 آزاد است و پورت‌های محلی 9090 و 9100 هم از قبل در اختیار استک دیگری نیستند.

02

قدم بعدی

نصب ابزارهای پایه

ابزارهای دانلود، پردازش JSON، بازکردن آرشیو و ویرایش فایل را نصب کنید. ابزار SHA256 در coreutils سیستم موجود است. Grafana از مخزن رسمی و امضاشدهٔ APT نصب می‌شود.

Bash

ترمینال سرور مانیتورینگ.

(
set -euo pipefail
sudo apt-get update
sudo apt-get install -y curl tar adduser ca-certificates gnupg apt-transport-https jq nano
)
از کجا بدانم درست انجام شد؟

به‌روزرسانی APT بدون خطای وابستگی تمام می‌شود و ابزارهای لازم برای دریافت Prometheus، node_exporter و کلید مخزن Grafana در دسترس قرار می‌گیرند.

03

قدم بعدی

ساخت حساب‌های سرویس و مسیرها

استفاده از کاربرهای اختصاصی باعث می‌شود باینری‌ها، فایل تنظیمات و داده‌های سری‌زمانی از هم تفکیک شوند. Prometheus به مسیر ذخیره‌سازی قابل‌نوشتن نیاز دارد و node_exporter فقط یک کاربر سیستمی و باینری خودش را لازم دارد.

چیدمان مسیرها در این مرحله با سرویس‌های systemd مراحل بعدی هماهنگ است.

Bash

ترمینال سرور مانیتورینگ.

(
set -euo pipefail
sudo adduser --system --no-create-home --group prometheus
sudo adduser --system --no-create-home --group node_exporter
sudo install -d -o root -g prometheus -m 0750 /etc/prometheus
sudo install -d -o prometheus -g prometheus -m 0750 /var/lib/prometheus
)
از کجا بدانم درست انجام شد؟

پیکربندی متعلق به root و برای گروه Prometheus خواندنی است؛ سرویس فقط در مسیر داده اجازهٔ نوشتن دارد.

04

قدم بعدی

دانلود و نصب Prometheus

در صفحهٔ رسمی دانلودِ بررسی‌شده در ۲۰۲۶-۱۰-۲۰، نسخهٔ جدید Prometheus برابر 3.15.0 و شاخهٔ LTS برابر 3.13.4 است. این آموزش نسخهٔ 3.15.0 را با SHA256 رسمی linux-amd64 نصب می‌کند؛ خطای دانلود یا هش، اجرای بلوک را پیش از نصب متوقف می‌کند.

از Prometheus 3 به بعد، پوشه‌های نمونهٔ consoles و console_libraries در آرشیو عرضه نمی‌شوند. فقط دو باینری نصب می‌شوند و این پیکربندی نیازی به گزینه‌های کنسول ندارد.

Bash

ترمینال سرور مانیتورینگ.

(
set -euo pipefail
[ "$(uname -m)" = x86_64 ] || { echo 'This download requires amd64/x86_64' >&2; exit 1; }
work=$(mktemp -d)
cd "$work"
curl -fL --connect-timeout 10 --max-time 180 -o prometheus-3.15.0.linux-amd64.tar.gz \
  https://github.com/prometheus/prometheus/releases/download/v3.15.0/prometheus-3.15.0.linux-amd64.tar.gz
printf '%s  %s\n' '2a542df32eac02ee17b9d844fb2aa1de00dafa5476579ba8a3ba862e9d572ea0' 'prometheus-3.15.0.linux-amd64.tar.gz' | sha256sum --check --strict -
tar -xzf prometheus-3.15.0.linux-amd64.tar.gz
cd prometheus-3.15.0.linux-amd64
sudo install -o root -g root -m 0755 prometheus promtool /usr/local/bin/
prometheus --version
)
از کجا بدانم درست انجام شد؟

پیش از استخراج باید SHA256 نتیجهٔ OK بدهد و نسخهٔ prometheus برابر 3.15.0 باشد. پوشهٔ موقت دانلود را تا پایان بررسی نگه دارید.

بازکردن فایل تنظیمات بعدی

فایل را باز کنید، محتوای پنل بعدی را در آن قرار دهید و ذخیره کنید. در nano با Ctrl+O و Enter ذخیره و با Ctrl+X خارج شوید. محتوای فایل را در ترمینال اجرا نکنید.

Bash

ترمینال سرور مانیتورینگ.

sudo nano /etc/prometheus/prometheus.yml
از کجا بدانم درست انجام شد؟

دستور باید بدون خطا تمام شود؛ در صورت خطا، پیش از ادامه علت را برطرف کنید.

05

قدم بعدی

تنظیم jobهای Prometheus

برای شروع، یک پیکربندی جمع‌وجور کافی است که خودِ Prometheus و node_exporter محلی را هر 15 ثانیه scrape کند. این کار برای اثبات سلامت کل استک کافی است و بعداً می‌توانی سرورهای دیگر یا Alerting را به آن اضافه کنی.

فایل را دقیقاً مانند نمونهٔ زیر بساز و در این مرحله targetها را روی localhost نگه دار.

YAML · /etc/prometheus/prometheus.yml

محتوای فایل؛ در فایل نام‌برده ذخیره کنید، نه در خط فرمان.

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets:
          - 127.0.0.1:9090

  - job_name: node-exporter
    static_configs:
      - targets:
          - 127.0.0.1:9100
از کجا بدانم درست انجام شد؟

فایل پیکربندی Prometheus شامل دو scrape job است و برای راه‌اندازی سرویس آماده می‌شود.

بازکردن فایل تنظیمات بعدی

فایل را باز کنید، محتوای پنل بعدی را در آن قرار دهید و ذخیره کنید. در nano با Ctrl+O و Enter ذخیره و با Ctrl+X خارج شوید. محتوای فایل را در ترمینال اجرا نکنید.

Bash

ترمینال سرور مانیتورینگ.

sudo nano /etc/systemd/system/prometheus.service
از کجا بدانم درست انجام شد؟

دستور باید بدون خطا تمام شود؛ در صورت خطا، پیش از ادامه علت را برطرف کنید.

06

قدم بعدی

تعریف سرویس Prometheus در systemd

این سرویس باعث می‌شود Prometheus زیر کنترل systemd بالا بیاید و داده‌ها را در /var/lib/prometheus نگه دارد. رابط وب Prometheus هم روی 127.0.0.1:9090 bind می‌شود تا به‌صورت پیش‌فرض مستقیم روی شبکه منتشر نشود.

اگر بعداً به دسترسی از بیرون نیاز داشتی، بهتر است Prometheus را پشت reverse proxy قابل‌اعتماد یا یک تونل کنترل‌شده قرار بدهی.

systemd · /etc/systemd/system/prometheus.service

محتوای فایل؛ در فایل نام‌برده ذخیره کنید، نه در خط فرمان.

[Unit]
Description=Prometheus Monitoring Server
Wants=network-online.target
After=network-online.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
  --config.file=/etc/prometheus/prometheus.yml \
  --storage.tsdb.path=/var/lib/prometheus \
  --storage.tsdb.retention.time=15d \
  --web.listen-address=127.0.0.1:9090
Restart=on-failure

[Install]
WantedBy=multi-user.target
از کجا بدانم درست انجام شد؟

فایل unit مربوط به Prometheus ساخته می‌شود و با مسیرهایی که در مراحل قبل ساخته‌ای هماهنگ است.

07

قدم بعدی

دانلود و نصب node_exporter

node_exporter متریک‌های پردازنده، حافظه، فایل‌سیستم و شبکه را در قالب Prometheus ارائه می‌کند. نسخهٔ 1.12.1 و هش آن با صفحهٔ رسمی دانلود تطبیق داده شده‌اند.

فعلاً باینری را روی سرور مانیتورینگ نصب کنید. در مرحلهٔ اختیاریِ سرور دوم، همین دانلود تأییدشده تکرار می‌شود.

Bash

ترمینال سرور مانیتورینگ.

(
set -euo pipefail
[ "$(uname -m)" = x86_64 ] || { echo 'This download requires amd64/x86_64' >&2; exit 1; }
work=$(mktemp -d)
cd "$work"
curl -fL --connect-timeout 10 --max-time 180 -o node_exporter-1.12.1.linux-amd64.tar.gz \
  https://github.com/prometheus/node_exporter/releases/download/v1.12.1/node_exporter-1.12.1.linux-amd64.tar.gz
printf '%s  %s\n' 'b51d8a76aa2a9156a55d501aca6276fae09e262259a5e4e831d2c2222f084e63' 'node_exporter-1.12.1.linux-amd64.tar.gz' | sha256sum --check --strict -
tar -xzf node_exporter-1.12.1.linux-amd64.tar.gz
cd node_exporter-1.12.1.linux-amd64
sudo install -o root -g root -m 0755 node_exporter /usr/local/bin/
node_exporter --version
)
از کجا بدانم درست انجام شد؟

پیش از استخراج باید SHA256 نتیجهٔ OK بدهد و نسخهٔ node_exporter برابر 1.12.1 باشد. پوشهٔ موقت دانلود را تا پایان بررسی نگه دارید.

بازکردن فایل تنظیمات بعدی

فایل را باز کنید، محتوای پنل بعدی را در آن قرار دهید و ذخیره کنید. در nano با Ctrl+O و Enter ذخیره و با Ctrl+X خارج شوید. محتوای فایل را در ترمینال اجرا نکنید.

Bash

ترمینال سرور مانیتورینگ.

sudo nano /etc/systemd/system/node_exporter.service
از کجا بدانم درست انجام شد؟

دستور باید بدون خطا تمام شود؛ در صورت خطا، پیش از ادامه علت را برطرف کنید.

08

قدم بعدی

تعریف سرویس node_exporter در systemd

جمع‌آوری متریک‌های معمول میزبان روی loopback انجام می‌شود. collector اختیاری systemd در این آموزش فعال نیست؛ آن بخش به دسترسی D-Bus نیاز دارد، اما متریک‌های پردازنده، حافظه و فایل‌سیستم به آن وابسته نیستند.

systemd · /etc/systemd/system/node_exporter.service

محتوای فایل؛ در فایل نام‌برده ذخیره کنید، نه در خط فرمان.

[Unit]
Description=Prometheus Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter \
  --web.listen-address=127.0.0.1:9100
Restart=on-failure

[Install]
WantedBy=multi-user.target
از کجا بدانم درست انجام شد؟

فایل unit مربوط به node_exporter ساخته می‌شود و مسیر باینری نصب‌شده را به‌درستی ارجاع می‌دهد.

09

قدم بعدی

راه‌اندازی و بررسی آمادگی سرویس‌ها

پیش از راه‌اندازی، پیکربندی را با حساب خود سرویس اعتبارسنجی کنید. حلقهٔ آمادگی فقط HTTP 200 را می‌پذیرد؛ تغییر مسیر، خطای اتصال و timeout موفقیت محسوب نمی‌شوند. فعال‌بودن سرویس به‌تنهایی کافی نیست.

پاسخ ready نشان می‌دهد Prometheus آمادهٔ پاسخ به کوئری است. در مرحلهٔ بعد، دریافت واقعی متریک از هر دو هدف جداگانه بررسی می‌شود.

Bash

ترمینال سرور مانیتورینگ.

(
set -euo pipefail
sudo chown root:prometheus /etc/prometheus/prometheus.yml
sudo chmod 0640 /etc/prometheus/prometheus.yml
sudo -u prometheus /usr/local/bin/promtool check config /etc/prometheus/prometheus.yml
sudo systemctl daemon-reload
sudo systemctl enable --now prometheus node_exporter
systemctl is-active prometheus node_exporter
ok=0
for attempt in $(seq 1 12); do
  if code=$(curl -sS --connect-timeout 2 --max-time 5 -o /dev/null -w '%{http_code}' http://127.0.0.1:9090/-/ready); then
    if [ "$code" = 200 ]; then ok=1; break; fi
  fi
  sleep 2
done
[ "$ok" = 1 ] || { echo 'Endpoint did not become ready: http://127.0.0.1:9090/-/ready' >&2; exit 1; }
printf '%s -> 200\n' 'http://127.0.0.1:9090/-/ready'
ok=0
for attempt in $(seq 1 12); do
  if code=$(curl -sS --connect-timeout 2 --max-time 5 -o /dev/null -w '%{http_code}' http://127.0.0.1:9100/metrics); then
    if [ "$code" = 200 ]; then ok=1; break; fi
  fi
  sleep 2
done
[ "$ok" = 1 ] || { echo 'Endpoint did not become ready: http://127.0.0.1:9100/metrics' >&2; exit 1; }
printf '%s -> 200\n' 'http://127.0.0.1:9100/metrics'
)
خروجی نمونه
نمونهٔ موفقیت؛ پیام‌های اضافی promtool حذف شده‌اند:
active
active
http://127.0.0.1:9090/-/ready -> 200
http://127.0.0.1:9100/metrics -> 200
از کجا بدانم درست انجام شد؟

هر دو سرویس در وضعیت active قرار می‌گیرند و هر دو آدرس بررسی‌شده دقیقاً کد 200 برمی‌گردانند.

Prometheus active نمی‌ماند

لاگ‌های اخیر سرویس را ببین و مطمئن شو فایل پیکربندی و مسیر داده برای حساب کاربری Prometheus قابل‌خواندن و قابل‌نوشتن هستند.

Bash
sudo journalctl -u prometheus -n 80 --no-pager
sudo ls -ld /etc/prometheus /var/lib/prometheus
sudo ls -l /etc/prometheus/prometheus.yml
sudo -u prometheus /usr/local/bin/promtool check config /etc/prometheus/prometheus.yml
node_exporter روی پورت 9100 گوش نمی‌دهد

لاگ سرویس را بررسی کن و ببین آیا پردازش دیگری آدرس انتخابی را گرفته است یا نه.

Bash
sudo journalctl -u node_exporter -n 80 --no-pager
sudo ss -lntp | grep 9100 || true
10

قدم بعدی

بررسی دریافت متریک از API

اولین scrape فوری نیست. این بررسی حداکثر ۱۲ بار، با فاصلهٔ پنج ثانیه تلاش می‌کند و علاوه بر HTTP 200، وضعیت success و مقدار up=1 را برای هر دو هدف محلیِ مشخص‌شده می‌خواهد.

Bash

ترمینال سرور مانیتورینگ.

(
set -euo pipefail
response=$(mktemp)
trap 'rm -f "$response"' EXIT
ok=0
for attempt in $(seq 1 12); do
  if code=$(curl -sS --connect-timeout 2 --max-time 5 -G \
    --data-urlencode 'query=up' -o "$response" -w '%{http_code}' \
    http://127.0.0.1:9090/api/v1/query); then
    if [ "$code" = 200 ] && jq -e '.status == "success" and .data.resultType == "vector" and any(.data.result[]; .metric.job == "prometheus" and .metric.instance == "127.0.0.1:9090" and .value[1] == "1") and any(.data.result[]; .metric.job == "node-exporter" and .metric.instance == "127.0.0.1:9100" and .value[1] == "1")' "$response" >/dev/null; then
      ok=1; break
    fi
  fi
  sleep 5
done
[ "$ok" = 1 ] || { cat "$response" >&2; echo 'Both local targets must have up=1' >&2; exit 1; }
jq . "$response"
)
خروجی نمونه
نمونهٔ پاسخ؛ زمان واقعی متفاوت است:
{"status":"success","data":{"resultType":"vector","result":[{"metric":{"job":"prometheus","instance":"127.0.0.1:9090"},"value":[1792444800,"1"]},{"metric":{"job":"node-exporter","instance":"127.0.0.1:9100"},"value":[1792444800,"1"]}]}}
از کجا بدانم درست انجام شد؟

فیلد status برابر success است و برای jobهای prometheus و node-exporter مقدار 1 دیده می‌شود.

پاسخ Query خالی است

لیست targetهای کشف‌شده را بررسی کن تا مشخص شود Prometheus واقعاً می‌تواند هر job را scrape کند یا نه.

Bash
curl -fsS --connect-timeout 2 --max-time 5 http://127.0.0.1:9090/api/v1/targets | jq .

آماده‌کردن دسترسی محلی Grafana پیش از نصب

این override را پیش از نصب بسته بسازید تا حتی راه‌اندازی احتمالی توسط بسته هم فقط روی loopback باشد.

Bash

ترمینال سرور مانیتورینگ.

(
set -euo pipefail
sudo install -d -m 0755 /etc/systemd/system/grafana-server.service.d
sudo nano /etc/systemd/system/grafana-server.service.d/academy-local.conf
)
از کجا بدانم درست انجام شد؟

دستور باید بدون خطا تمام شود؛ در صورت خطا، پیش از ادامه علت را برطرف کنید.

محتوای override دسترسی محلی Grafana

این محتوا را ذخیره کنید و از ویرایشگر خارج شوید. متغیر محیطی بر grafana.ini اولویت دارد. بعداً یک reverse proxy تأییدشده با TLS می‌تواند به همین شنوندهٔ محلی متصل شود.

systemd · /etc/systemd/system/grafana-server.service.d/academy-local.conf

محتوای فایل؛ در فایل نام‌برده ذخیره کنید، نه در خط فرمان.

[Service]
Environment="GF_SERVER_HTTP_ADDR=127.0.0.1"
از کجا بدانم درست انجام شد؟

فقط آدرس loopback برای شنونده تنظیم شده است.

11

قدم بعدی

نصب Grafana از مخزن رسمی APT

مستندات Grafana، مخزن APT برای Ubuntu و Debian را مسیر استاندارد نصب معرفی می‌کنند. در این آموزش بستهٔ متن‌باز grafana را نصب می‌کنیم. اگر در محیطت به نسخهٔ Enterprise رایگان نیاز داری، فقط نام بسته را عوض کن و همین مخزن را نگه دار.

کلید مخزن زیر /etc/apt/keyrings ذخیره می‌شود و فایل منبع مخزن هم در /etc/apt/sources.list.d قرار می‌گیرد.

Bash

ترمینال سرور مانیتورینگ.

(
set -euo pipefail
sudo systemctl daemon-reload
sudo install -d -m 0755 /etc/apt/keyrings
key=$(mktemp)
trap 'rm -f "$key"' EXIT
curl -fL --connect-timeout 10 --max-time 60 https://apt.grafana.com/gpg-full.key -o "$key"
gpg --show-keys "$key"
sudo install -m 0644 "$key" /etc/apt/keyrings/grafana.asc
printf '%s\n' 'deb [signed-by=/etc/apt/keyrings/grafana.asc] https://apt.grafana.com stable main' | sudo tee /etc/apt/sources.list.d/grafana.list >/dev/null
sudo apt-get update
sudo apt-get install -y grafana
dpkg-query -W -f='${Version}\n' grafana
)
از کجا بدانم درست انجام شد؟

مخزن Grafana برای APT قابل‌خواندن می‌شود و بستهٔ grafana بدون خطای امضا یا وابستگی نصب می‌گردد.

APT بستهٔ Grafana را پیدا یا اعتبارسنجی نمی‌کند

فایل مخزن، فایل کلید و خروجی policy را ببین تا مطمئن شوی APT واقعاً مخزن رسمی Grafana را می‌بیند.

Bash
sudo cat /etc/apt/sources.list.d/grafana.list
sudo ls -l /etc/apt/keyrings/grafana.asc
sudo apt-cache policy grafana

بازکردن فایل تنظیمات بعدی

فایل را باز کنید، محتوای پنل بعدی را در آن قرار دهید و ذخیره کنید. در nano با Ctrl+O و Enter ذخیره و با Ctrl+X خارج شوید. محتوای فایل را در ترمینال اجرا نکنید.

Bash

ترمینال سرور مانیتورینگ.

sudo nano /etc/grafana/provisioning/datasources/prometheus.yaml
از کجا بدانم درست انجام شد؟

دستور باید بدون خطا تمام شود؛ در صورت خطا، پیش از ادامه علت را برطرف کنید.

12

قدم بعدی

تعریف منبع دادهٔ Prometheus در Grafana

با فایل provisioning، منبع داده هنگام راه‌اندازی Grafana به‌صورت تکرارپذیر تعریف می‌شود. نیازی به افزودن دستی آن در رابط کاربری نیست.

فایل زیر Prometheus محلی را به‌عنوان منبع پیش‌فرض معرفی می‌کند. پس از ذخیره، در پنل بعدی سرویس را restart و اتصال را بررسی کنید.

YAML · /etc/grafana/provisioning/datasources/prometheus.yaml

محتوای فایل؛ در فایل نام‌برده ذخیره کنید، نه در خط فرمان.

apiVersion: 1

datasources:
  - name: Prometheus
    uid: prometheus-local
    type: prometheus
    access: proxy
    url: http://127.0.0.1:9090
    isDefault: true
    editable: true
از کجا بدانم درست انجام شد؟

فایل provisioning ساخته می‌شود و Grafana را به API محلی Prometheus متصل می‌کند.

13

قدم بعدی

راه‌اندازی و بررسی سلامت Grafana

پس از ذخیرهٔ provisioning سرویس را یک بار restart کنید؛ enable کردن سرویسِ در حال اجرا، تنظیمات آن را دوباره بارگذاری نمی‌کند. HTTP 200 و database=ok را بررسی کنید؛ سپس مطمئن شوید شنونده پیش از ورود فقط روی 127.0.0.1:3000 است.

Bash

ترمینال سرور مانیتورینگ.

(
set -euo pipefail
sudo chown root:grafana /etc/grafana/provisioning/datasources/prometheus.yaml
sudo chmod 0640 /etc/grafana/provisioning/datasources/prometheus.yaml
sudo systemctl daemon-reload
sudo systemctl enable grafana-server
sudo systemctl restart grafana-server
systemctl is-active grafana-server
ok=0
for attempt in $(seq 1 12); do
  if code=$(curl -sS --connect-timeout 2 --max-time 5 -o /dev/null -w '%{http_code}' http://127.0.0.1:3000/api/health); then
    if [ "$code" = 200 ]; then ok=1; break; fi
  fi
  sleep 2
done
[ "$ok" = 1 ] || { echo 'Endpoint did not become ready: http://127.0.0.1:3000/api/health' >&2; exit 1; }
printf '%s -> 200\n' 'http://127.0.0.1:3000/api/health'
curl -fsS --connect-timeout 2 --max-time 5 http://127.0.0.1:3000/api/health | jq -e '.database == "ok"'
sudo ss -lntp 'sport = :3000'
)
خروجی نمونه
نمونهٔ خلاصه‌شده:
active
http://127.0.0.1:3000/api/health -> 200
true
Listener: 127.0.0.1:3000
از کجا بدانم درست انجام شد؟

واحد grafana-server در وضعیت active قرار می‌گیرد، endpoint سلامت دقیقاً 200 برمی‌گرداند و پاسخ JSON مقدار database را ok نشان می‌دهد.

Grafana کد 200 برنمی‌گرداند

لاگ سرویس Grafana را بررسی کن و مطمئن شو فایل provisioning مربوط به data source در مسیر درست قرار دارد.

Bash
sudo journalctl -u grafana-server -n 100 --no-pager
sudo ls -l /etc/grafana/provisioning/datasources
sudo sed -n "1,120p" /etc/grafana/provisioning/datasources/prometheus.yaml
14

قدم بعدی

ورود امن و بررسی منبع داده

روی رایانهٔ خودتان، دو مقدار نمونهٔ SSH را با حساب موجود و آدرس سرور جایگزین کنید و ترمینال تونل را باز نگه دارید. در مرورگر http://127.0.0.1:13000 را باز کنید؛ سرویس روی سرور خصوصی می‌ماند و مسیر شبکه با SSH رمزگذاری می‌شود.

در نصب تازه، نام کاربری و رمز اولیه admin است؛ بلافاصله رمز قوی و منحصربه‌فرد تعیین کنید. رمز جدید را در دستور، فایل منبع یا تصویر ثبت نکنید. سرور SSH باید local forwarding را مجاز کرده باشد.

در Connections منبع Prometheus را پیدا کنید. در Explore همین منبع را انتخاب و کوئری up را اجرا کنید؛ هر دو هدف محلی باید مقدار 1 داشته باشند. پاسخ health به‌تنهایی اتصال منبع داده را اثبات نمی‌کند.

Bash

ترمینال رایانهٔ خودتان، نه سرور مانیتورینگ؛ YOUR_SSH_USER و MONITORING_SERVER را پیش از اجرا جایگزین کنید.

ssh -N -o ExitOnForwardFailure=yes -L 127.0.0.1:13000:127.0.0.1:3000 YOUR_SSH_USER@MONITORING_SERVER
از کجا بدانم درست انجام شد؟

ورود به Grafana انجام می‌شود، گذرواژهٔ اولیه تغییر می‌کند و data source provisionشدهٔ Prometheus در رابط Grafana دیده می‌شود.

15

قدم بعدی

ساخت اولین داشبورد با PromQL

یک داشبورد و سه پنل برای مصرف پردازنده، استفاده از حافظه و فضای آزاد فایل‌سیستم بسازید. برای هر پنل، منبع Prometheus را انتخاب کنید.

هر عبارت را جداگانه در ویرایشگر کوئریِ یک پنل قرار دهید و نام و واحد پنل را متناسب با آن تنظیم کنید.

PromQL

ویرایشگر پنل داشبورد Grafana در مرورگر.

100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

100 * (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes))

node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"}
از کجا بدانم درست انجام شد؟

هر پنل به‌جای حالت خالی یا خطا، دادهٔ زنده نمایش می‌دهد و ثابت می‌کند Grafana می‌تواند از Prometheus داده بگیرد.

اختیاری: آماده‌سازی امن سرور دوم

روی سرور تازهٔ دوم با معماری amd64، ابتدا نصب ابزارهای پایه، ساخت حساب node_exporter، دانلود تأییدشده و سرویس loopback آن را طبق مراحل قبل انجام دهید؛ آنجا نیازی به Prometheus یا Grafana نیست. در مثال، IP مانیتورینگ 10.20.30.10 و IP سرور دوم 10.20.30.41 است؛ هر دو را یکدست جایگزین کنید. در UFW فعال با رد ورودی پیش‌فرض، فقط سرور مانیتورینگ را مجاز کنید. قواعد موجود را هم ببینید و اجازه‌های عمومی پورت 9100 را با روش مدیریت معمول فایروال خودتان حذف کنید؛ دسترسی SSH باید حفظ شود. در فایروال دیگر، همین محدودیت را پیش از ادامه اعمال کنید.

Bash

ترمینال سرور مانیتورینگ.

(
set -euo pipefail
sudo ufw status verbose
sudo ufw status verbose | grep -q '^Status: active'
sudo ufw status verbose | grep -q '^Default: deny (incoming)'
sudo ufw allow proto tcp from 10.20.30.10 to 10.20.30.41 port 9100
sudo ufw status numbered
sudo install -d -m 0755 /etc/systemd/system/node_exporter.service.d
sudo nano /etc/systemd/system/node_exporter.service.d/private.conf
)
از کجا بدانم درست انجام شد؟

دستور باید بدون خطا تمام شود؛ در صورت خطا، پیش از ادامه علت را برطرف کنید.

شنوندهٔ خصوصی exporter سرور دوم

این override را روی سرور دوم با IP خصوصی واقعی ذخیره کنید. برای جایگزینی ExecStart، ابتدا مقدار قبلی خالی می‌شود. متریک‌ها در این روش بدون احراز هویت‌اند؛ شبکه باید خصوصی و قابل اعتماد یا VPN باشد، وگرنه TLS و احراز هویت exporter را جداگانه تنظیم کنید.

systemd · /etc/systemd/system/node_exporter.service.d/private.conf

محتوای فایل؛ در فایل نام‌برده ذخیره کنید، نه در خط فرمان.

[Service]
ExecStart=
ExecStart=/usr/local/bin/node_exporter --web.listen-address=10.20.30.41:9100
از کجا بدانم درست انجام شد؟

override فقط IP خصوصی را انتخاب می‌کند.

راه‌اندازی شنوندهٔ خصوصی سرور دوم

پس از بررسی فایروال، این دستورها را روی سرور دوم اجرا کنید. سپس روی میزبان مانیتورینگ، فایل تنظیم Prometheus را با پنل ویرایشگر قبلی باز کنید.

Bash

ترمینال سرور مانیتورینگ.

(
set -euo pipefail
sudo systemctl daemon-reload
sudo systemctl enable node_exporter
sudo systemctl restart node_exporter
systemctl is-active node_exporter
sudo ss -lntp 'sport = :9100'
)
از کجا بدانم درست انجام شد؟

دستور باید بدون خطا تمام شود؛ در صورت خطا، پیش از ادامه علت را برطرف کنید.

16

قدم بعدی

افزودن سرور لینوکسی دوم

روی میزبان مانیتورینگ، دو هدف محلی را حفظ و آدرس خصوصی سرور دوم را اضافه کنید. اگر job دیگری دارید، فقط هدف جدید را با تنظیم موجود ادغام کنید و jobهای دیگر را بازنویسی نکنید.

YAML · /etc/prometheus/prometheus.yml

محتوای فایل؛ در فایل نام‌برده ذخیره کنید، نه در خط فرمان.

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets:
          - 127.0.0.1:9090

  - job_name: node-exporter
    static_configs:
      - targets:
          - 127.0.0.1:9100
          - 10.20.30.41:9100
از کجا بدانم درست انجام شد؟

فایل ذخیره‌شده شامل دو هدف محلی و IP خصوصی درست است؛ در پنل بعدی اعتبارسنجی و restart انجام می‌شود.

target راه دور down می‌ماند

روی میزبان مانیتورینگ، دسترسی و lastError را بررسی کنید؛ روی سرور دوم، پنل شنونده و فایروال بالا را دوباره اجرا کنید. شنوندهٔ محلی میزبان مانیتورینگ، وضعیت bind سرور دوم را نشان نمی‌دهد.

Bash
# Monitoring host: transport and target diagnostics
curl -fsS --connect-timeout 2 --max-time 5 http://10.20.30.41:9100/metrics
curl -fsS --connect-timeout 2 --max-time 5 http://127.0.0.1:9090/api/v1/targets | jq .

اعتبارسنجی و بررسی scrape سرور دوم

این پنل فقط روی میزبان مانیتورینگ اجرا می‌شود. restart وقفهٔ کوتاهی در scrape ایجاد می‌کند و باید بعد از موفقیت اعتبارسنجی انجام شود. در پایان، مقدار up=1 برای همان سرور دوم الزامی است.

Bash

ترمینال سرور مانیتورینگ.

(
set -euo pipefail
sudo -u prometheus /usr/local/bin/promtool check config /etc/prometheus/prometheus.yml
sudo systemctl restart prometheus
ok=0
for attempt in $(seq 1 12); do
  if code=$(curl -sS --connect-timeout 2 --max-time 5 -o /dev/null -w '%{http_code}' http://127.0.0.1:9090/-/ready); then
    if [ "$code" = 200 ]; then ok=1; break; fi
  fi
  sleep 2
done
[ "$ok" = 1 ] || { echo 'Endpoint did not become ready: http://127.0.0.1:9090/-/ready' >&2; exit 1; }
printf '%s -> 200\n' 'http://127.0.0.1:9090/-/ready'
response=$(mktemp)
trap 'rm -f "$response"' EXIT
ok=0
for attempt in $(seq 1 12); do
  if code=$(curl -sS --connect-timeout 2 --max-time 5 -G \
    --data-urlencode 'query=up{job="node-exporter",instance="10.20.30.41:9100"}' -o "$response" -w '%{http_code}' \
    http://127.0.0.1:9090/api/v1/query); then
    if [ "$code" = 200 ] && jq -e '.status == "success" and .data.resultType == "vector" and (.data.result | length == 1) and .data.result[0].value[1] == "1"' "$response" >/dev/null; then
      ok=1; break
    fi
  fi
  sleep 5
done
[ "$ok" = 1 ] || { cat "$response" >&2; echo 'Remote target must have up=1' >&2; exit 1; }
jq . "$response"
)
از کجا بدانم درست انجام شد؟

دستور باید بدون خطا تمام شود؛ در صورت خطا، پیش از ادامه علت را برطرف کنید.

17

قدم بعدی

نگه‌داری و بررسی نسخه‌ها

نسخه‌های جدید Prometheus و node_exporter، به‌روزرسانی‌های Grafana و رشد داده‌های مانیتورینگ را پیگیری کنید. باینری‌های نصب‌شده از آرشیو، از طریق APT به‌روز نمی‌شوند.

در بازهٔ نگه‌داری، ابتدا نسخه‌ها، وضعیت سرویس و ظرفیت دیسک را با پنل زیر بررسی کنید. ارتقا را پس از بررسی سازگاری و تهیهٔ پشتیبان برنامه‌ریزی کنید.

Bash

ترمینال سرور مانیتورینگ.

(
set -euo pipefail
prometheus --version
node_exporter --version
dpkg -l grafana | awk '/^ii/ {print $2, $3}'
systemctl is-active prometheus node_exporter grafana-server
sudo du -sh /var/lib/prometheus
df -h /var/lib/prometheus
)
از کجا بدانم درست انجام شد؟

نسخهٔ مؤلفه‌های نصب‌شده، وضعیت active سرویس‌ها و اندازهٔ فعلی دایرکتوری دادهٔ Prometheus به‌صورت روشن قابل مشاهده است.

18

قدم بعدی

توقف امن و تأیید پشتیبان سازگار

کنارگذاشتن اختیاری سرویس‌ها، نمودار و scrape را متوقف می‌کند. برای سازگاری TSDB و SQLite ابتدا سرویس‌ها را متوقف کنید. آرشیو ساختار مسیرها را حفظ می‌کند تا تنظیم و داده با نام یکسان روی هم نوشته نشوند. خطا در توقف، آرشیو، هش یا بازخوانی، بلوک را قطع می‌کند. این روش برای بازنشسته‌کردن نصب است، نه بازگشت خودکار به باینری قدیمی.

اصل تنظیمات و داده‌ها حفظ می‌شود. مسیر چاپ‌شده را بررسی و پشتیبان را پیش از حذف بیشتر به مخزن حفاظت‌شدهٔ موجود منتقل کنید. هش و مقایسهٔ آرشیو، سلامت محلی را بررسی می‌کنند و جای بازیابی بحران را نمی‌گیرند. پشتیبان محرمانه است.

Bash

ترمینال سرور مانیتورینگ.

(
set -euo pipefail
sudo systemctl disable --now grafana-server prometheus node_exporter
sudo sh -eu <<'BACKUP'
umask 077
install -d -m 0700 /root/academy-backups
backup=$(mktemp -d /root/academy-backups/monitoring-XXXXXXXX)
tar -C / -cpf "$backup/monitoring.tar" \
  etc/prometheus var/lib/prometheus etc/grafana var/lib/grafana \
  etc/systemd/system/prometheus.service etc/systemd/system/node_exporter.service \
  etc/systemd/system/grafana-server.service.d/academy-local.conf \
  etc/apt/sources.list.d/grafana.list etc/apt/keyrings/grafana.asc
cd "$backup"
sha256sum monitoring.tar > SHA256SUMS
sha256sum -c SHA256SUMS
tar -tf monitoring.tar >/dev/null
tar -C / -df monitoring.tar
printf 'Verified local archive: %s/monitoring.tar\n' "$backup"
BACKUP
)
از کجا بدانم درست انجام شد؟

سرویس‌ها متوقف‌اند، آرشیو هش و مقایسه را گذرانده و اصل داده و تنظیمات باقی است. با هر خطا، اصل فایل‌ها را نگه دارید و علت را بررسی کنید.

اختیاری: حذف برنامه‌ها با حفظ داده

فقط پس از تأیید پشتیبان بالا و نگه‌داری مستقل آن، سه باینری و دو unit ساخته‌شده در همین آموزش را حذف کنید. برای Grafana از remove بدون purge استفاده می‌شود؛ autoremove نزنید. داده‌ها، تنظیمات، حساب‌های سیستمی، کلید مخزن و override محلی برای بازیابی حفظ می‌شوند. اگر نصب دیگری مالک این مسیرهاست، این مرحله را اجرا نکنید.

Bash

ترمینال سرور مانیتورینگ.

(
set -euo pipefail
for unit in grafana-server prometheus node_exporter; do
  state=$(systemctl show -p ActiveState --value "$unit")
  case "$state" in inactive|failed) ;; *) echo "Stop $unit before removal" >&2; exit 1 ;; esac
done
sudo apt-get remove grafana
sudo rm -f /etc/systemd/system/prometheus.service /etc/systemd/system/node_exporter.service
sudo rm -f /usr/local/bin/prometheus /usr/local/bin/promtool /usr/local/bin/node_exporter
sudo systemctl daemon-reload
)
از کجا بدانم درست انجام شد؟

دستور باید بدون خطا تمام شود؛ در صورت خطا، پیش از ادامه علت را برطرف کنید.

بازیابی وضعیت نگه‌داری‌شده و ادامهٔ کار

در توقف ساده، اصل داده و تنظیمات موجود است: اگر برنامه‌ها حذف شده‌اند همان نسخه‌های ثبت‌شده را نصب، پیکربندی Prometheus را اعتبارسنجی و بررسی‌های راه‌اندازی، آمادگی و منبع داده را تکرار کنید. برای بازیابی از آرشیو، نخست هش را بررسی و محتوا را در پوشهٔ جدا استخراج کنید؛ سپس مالکیت و مسیرها را پیش از بازگردانی به سرویس‌های متوقف بررسی کنید. آرشیو را روی پایگاه‌دادهٔ در حال اجرا استخراج نکنید و بدون بررسی سازگاری رسمی، TSDB را به نسخهٔ قدیمی برنگردانید.

در ادامه، ظرفیت و زمان نگه‌داری متناسب با کار خود را تعیین و قواعد هشدار را همراه با آزمون تحویل اعلان اضافه کنید. وجود داشبورد به‌تنهایی در زمان قطعی به مسئول سیستم اطلاع نمی‌دهد.

از کجا بدانم درست انجام شد؟

بازیابی با وضعیت حفظ‌شده و نسخهٔ سازگار انجام می‌شود؛ هشداردهی مرحلهٔ مستقل بعدی است.

پشتوانهٔ این آموزش

منابع رسمی

وضعیت بررسی هر محیط بالای صفحه مشخص است؛ بررسی مستندات به معنی اجرای عملی همهٔ نسخه‌ها نیست.

همهٔ آموزش‌های آکادمی ↗