← شروع آموزش

WIUNIX ACADEMY

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

صفحهٔ 2 از 3؛ مراحل قبلی و پیش‌نیازها را پیش از ادامه مرور کن.

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

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

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

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

آموزش متناسب با مقادیر تو

تنظیمات این آموزش

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

ویرایش 2 مقدار این آموزش
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 خصوصی را انتخاب می‌کند.

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