WIUNIX ACADEMY
آموزش نصب Prometheus و Grafana در اوبونتو و دبیان
نصب Prometheus، node_exporter و Grafana با دسترسی امن و بررسی مسیر جمعآوری تا نمایش متریکها.
محیطت را انتخاب کنآموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخه را انتخاب کن تا مراحل، دستورها و راهحلها برای همان محیط نمایش داده شوند.
از اینجا شروع کن
در پایان چه چیزی خواهی داشت؟
یک استک مانیتورینگ خودمیزبان بساز که متریکهای محلی سیستم را در Prometheus ذخیره کند، آنها را در Grafana نمایش بدهد و بعداً هم مسیر تمیزی برای اضافهکردن نودهای لینوکسی بیشتر در اختیارت بگذارد.
سیستمعاملها و نسخههای پوششدادهشده
منابع رسمی در ۲۰۲۶-۱۰-۲۰ بررسی شدند. باینریهای 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 فعال نکنید.
قدم بعدی
انتخاب سرور و محدودهٔ مانیتورینگ
در این راهاندازی، node_exporter متریکهای میزبان را ارائه میکند، Prometheus آنها را ذخیره میکند و Grafana نمودار میسازد. دستورها برای سرور تازه با معماری amd64 و systemd نوشته شدهاند، نه ارتقای نصب موجود.
پورتهای محلی 3000، 9090 و 9100 باید آزاد باشند. آنها را عمومی نکنید؛ ورود و تغییر رمز Grafana از اتصال رمزگذاریشدهٔ SSH انجام خواهد شد.
ترمینال سرور مانیتورینگ. دستورهایی که با sudo شروع میشوند به دسترسی مدیریتی نیاز دارند.
hostnamectl
hostname -I
uname -m
sudo ss -lntupنام میزبان، IPها و معماری سرور مشخص میشود و میتوانی بررسی کنی که پورت 3000 آزاد است و پورتهای محلی 9090 و 9100 هم از قبل در اختیار استک دیگری نیستند.
قدم بعدی
نصب ابزارهای پایه
ابزارهای دانلود، پردازش JSON، بازکردن آرشیو و ویرایش فایل را نصب کنید. ابزار SHA256 در coreutils سیستم موجود است. Grafana از مخزن رسمی و امضاشدهٔ APT نصب میشود.
ترمینال سرور مانیتورینگ.
(
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 در دسترس قرار میگیرند.
قدم بعدی
ساخت حسابهای سرویس و مسیرها
استفاده از کاربرهای اختصاصی باعث میشود باینریها، فایل تنظیمات و دادههای سریزمانی از هم تفکیک شوند. Prometheus به مسیر ذخیرهسازی قابلنوشتن نیاز دارد و node_exporter فقط یک کاربر سیستمی و باینری خودش را لازم دارد.
چیدمان مسیرها در این مرحله با سرویسهای systemd مراحل بعدی هماهنگ است.
ترمینال سرور مانیتورینگ.
(
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 خواندنی است؛ سرویس فقط در مسیر داده اجازهٔ نوشتن دارد.
قدم بعدی
دانلود و نصب Prometheus
در صفحهٔ رسمی دانلودِ بررسیشده در ۲۰۲۶-۱۰-۲۰، نسخهٔ جدید Prometheus برابر 3.15.0 و شاخهٔ LTS برابر 3.13.4 است. این آموزش نسخهٔ 3.15.0 را با SHA256 رسمی linux-amd64 نصب میکند؛ خطای دانلود یا هش، اجرای بلوک را پیش از نصب متوقف میکند.
از Prometheus 3 به بعد، پوشههای نمونهٔ consoles و console_libraries در آرشیو عرضه نمیشوند. فقط دو باینری نصب میشوند و این پیکربندی نیازی به گزینههای کنسول ندارد.
ترمینال سرور مانیتورینگ.
(
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 خارج شوید. محتوای فایل را در ترمینال اجرا نکنید.
ترمینال سرور مانیتورینگ.
sudo nano /etc/prometheus/prometheus.ymlدستور باید بدون خطا تمام شود؛ در صورت خطا، پیش از ادامه علت را برطرف کنید.
قدم بعدی
تنظیم jobهای Prometheus
برای شروع، یک پیکربندی جمعوجور کافی است که خودِ Prometheus و node_exporter محلی را هر 15 ثانیه scrape کند. این کار برای اثبات سلامت کل استک کافی است و بعداً میتوانی سرورهای دیگر یا Alerting را به آن اضافه کنی.
فایل را دقیقاً مانند نمونهٔ زیر بساز و در این مرحله targetها را روی localhost نگه دار.
محتوای فایل؛ در فایل نامبرده ذخیره کنید، نه در خط فرمان.
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 خارج شوید. محتوای فایل را در ترمینال اجرا نکنید.
ترمینال سرور مانیتورینگ.
sudo nano /etc/systemd/system/prometheus.serviceدستور باید بدون خطا تمام شود؛ در صورت خطا، پیش از ادامه علت را برطرف کنید.
قدم بعدی
تعریف سرویس Prometheus در systemd
این سرویس باعث میشود Prometheus زیر کنترل systemd بالا بیاید و دادهها را در /var/lib/prometheus نگه دارد. رابط وب Prometheus هم روی 127.0.0.1:9090 bind میشود تا بهصورت پیشفرض مستقیم روی شبکه منتشر نشود.
اگر بعداً به دسترسی از بیرون نیاز داشتی، بهتر است Prometheus را پشت reverse proxy قابلاعتماد یا یک تونل کنترلشده قرار بدهی.
محتوای فایل؛ در فایل نامبرده ذخیره کنید، نه در خط فرمان.
[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 ساخته میشود و با مسیرهایی که در مراحل قبل ساختهای هماهنگ است.
قدم بعدی
دانلود و نصب node_exporter
node_exporter متریکهای پردازنده، حافظه، فایلسیستم و شبکه را در قالب Prometheus ارائه میکند. نسخهٔ 1.12.1 و هش آن با صفحهٔ رسمی دانلود تطبیق داده شدهاند.
فعلاً باینری را روی سرور مانیتورینگ نصب کنید. در مرحلهٔ اختیاریِ سرور دوم، همین دانلود تأییدشده تکرار میشود.
ترمینال سرور مانیتورینگ.
(
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 خارج شوید. محتوای فایل را در ترمینال اجرا نکنید.
ترمینال سرور مانیتورینگ.
sudo nano /etc/systemd/system/node_exporter.serviceدستور باید بدون خطا تمام شود؛ در صورت خطا، پیش از ادامه علت را برطرف کنید.
قدم بعدی
تعریف سرویس node_exporter در systemd
جمعآوری متریکهای معمول میزبان روی loopback انجام میشود. collector اختیاری systemd در این آموزش فعال نیست؛ آن بخش به دسترسی D-Bus نیاز دارد، اما متریکهای پردازنده، حافظه و فایلسیستم به آن وابسته نیستند.
محتوای فایل؛ در فایل نامبرده ذخیره کنید، نه در خط فرمان.
[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 ساخته میشود و مسیر باینری نصبشده را بهدرستی ارجاع میدهد.
قدم بعدی
راهاندازی و بررسی آمادگی سرویسها
پیش از راهاندازی، پیکربندی را با حساب خود سرویس اعتبارسنجی کنید. حلقهٔ آمادگی فقط HTTP 200 را میپذیرد؛ تغییر مسیر، خطای اتصال و timeout موفقیت محسوب نمیشوند. فعالبودن سرویس بهتنهایی کافی نیست.
پاسخ ready نشان میدهد Prometheus آمادهٔ پاسخ به کوئری است. در مرحلهٔ بعد، دریافت واقعی متریک از هر دو هدف جداگانه بررسی میشود.
ترمینال سرور مانیتورینگ.
(
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 قابلخواندن و قابلنوشتن هستند.
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.ymlnode_exporter روی پورت 9100 گوش نمیدهد
لاگ سرویس را بررسی کن و ببین آیا پردازش دیگری آدرس انتخابی را گرفته است یا نه.
sudo journalctl -u node_exporter -n 80 --no-pager
sudo ss -lntp | grep 9100 || trueقدم بعدی
بررسی دریافت متریک از API
اولین scrape فوری نیست. این بررسی حداکثر ۱۲ بار، با فاصلهٔ پنج ثانیه تلاش میکند و علاوه بر HTTP 200، وضعیت success و مقدار up=1 را برای هر دو هدف محلیِ مشخصشده میخواهد.
ترمینال سرور مانیتورینگ.
(
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 کند یا نه.
curl -fsS --connect-timeout 2 --max-time 5 http://127.0.0.1:9090/api/v1/targets | jq .آمادهکردن دسترسی محلی Grafana پیش از نصب
این override را پیش از نصب بسته بسازید تا حتی راهاندازی احتمالی توسط بسته هم فقط روی loopback باشد.
ترمینال سرور مانیتورینگ.
(
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 میتواند به همین شنوندهٔ محلی متصل شود.
محتوای فایل؛ در فایل نامبرده ذخیره کنید، نه در خط فرمان.
[Service]
Environment="GF_SERVER_HTTP_ADDR=127.0.0.1"
فقط آدرس loopback برای شنونده تنظیم شده است.
قدم بعدی
نصب Grafana از مخزن رسمی APT
مستندات Grafana، مخزن APT برای Ubuntu و Debian را مسیر استاندارد نصب معرفی میکنند. در این آموزش بستهٔ متنباز grafana را نصب میکنیم. اگر در محیطت به نسخهٔ Enterprise رایگان نیاز داری، فقط نام بسته را عوض کن و همین مخزن را نگه دار.
کلید مخزن زیر /etc/apt/keyrings ذخیره میشود و فایل منبع مخزن هم در /etc/apt/sources.list.d قرار میگیرد.
ترمینال سرور مانیتورینگ.
(
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 را میبیند.
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 خارج شوید. محتوای فایل را در ترمینال اجرا نکنید.
ترمینال سرور مانیتورینگ.
sudo nano /etc/grafana/provisioning/datasources/prometheus.yamlدستور باید بدون خطا تمام شود؛ در صورت خطا، پیش از ادامه علت را برطرف کنید.
قدم بعدی
تعریف منبع دادهٔ Prometheus در Grafana
با فایل provisioning، منبع داده هنگام راهاندازی Grafana بهصورت تکرارپذیر تعریف میشود. نیازی به افزودن دستی آن در رابط کاربری نیست.
فایل زیر Prometheus محلی را بهعنوان منبع پیشفرض معرفی میکند. پس از ذخیره، در پنل بعدی سرویس را restart و اتصال را بررسی کنید.
محتوای فایل؛ در فایل نامبرده ذخیره کنید، نه در خط فرمان.
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 متصل میکند.
قدم بعدی
راهاندازی و بررسی سلامت Grafana
پس از ذخیرهٔ provisioning سرویس را یک بار restart کنید؛ enable کردن سرویسِ در حال اجرا، تنظیمات آن را دوباره بارگذاری نمیکند. HTTP 200 و database=ok را بررسی کنید؛ سپس مطمئن شوید شنونده پیش از ورود فقط روی 127.0.0.1:3000 است.
ترمینال سرور مانیتورینگ.
(
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 در مسیر درست قرار دارد.
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قدم بعدی
ورود امن و بررسی منبع داده
روی رایانهٔ خودتان، دو مقدار نمونهٔ SSH را با حساب موجود و آدرس سرور جایگزین کنید و ترمینال تونل را باز نگه دارید. در مرورگر http://127.0.0.1:13000 را باز کنید؛ سرویس روی سرور خصوصی میماند و مسیر شبکه با SSH رمزگذاری میشود.
در نصب تازه، نام کاربری و رمز اولیه admin است؛ بلافاصله رمز قوی و منحصربهفرد تعیین کنید. رمز جدید را در دستور، فایل منبع یا تصویر ثبت نکنید. سرور SSH باید local forwarding را مجاز کرده باشد.
در Connections منبع Prometheus را پیدا کنید. در Explore همین منبع را انتخاب و کوئری up را اجرا کنید؛ هر دو هدف محلی باید مقدار 1 داشته باشند. پاسخ health بهتنهایی اتصال منبع داده را اثبات نمیکند.
ترمینال رایانهٔ خودتان، نه سرور مانیتورینگ؛ 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 دیده میشود.
قدم بعدی
ساخت اولین داشبورد با PromQL
یک داشبورد و سه پنل برای مصرف پردازنده، استفاده از حافظه و فضای آزاد فایلسیستم بسازید. برای هر پنل، منبع Prometheus را انتخاب کنید.
هر عبارت را جداگانه در ویرایشگر کوئریِ یک پنل قرار دهید و نام و واحد پنل را متناسب با آن تنظیم کنید.
ویرایشگر پنل داشبورد 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 باید حفظ شود. در فایروال دیگر، همین محدودیت را پیش از ادامه اعمال کنید.
ترمینال سرور مانیتورینگ.
(
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 را جداگانه تنظیم کنید.
محتوای فایل؛ در فایل نامبرده ذخیره کنید، نه در خط فرمان.
[Service]
ExecStart=
ExecStart=/usr/local/bin/node_exporter --web.listen-address=10.20.30.41:9100
override فقط IP خصوصی را انتخاب میکند.
راهاندازی شنوندهٔ خصوصی سرور دوم
پس از بررسی فایروال، این دستورها را روی سرور دوم اجرا کنید. سپس روی میزبان مانیتورینگ، فایل تنظیم Prometheus را با پنل ویرایشگر قبلی باز کنید.
ترمینال سرور مانیتورینگ.
(
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'
)دستور باید بدون خطا تمام شود؛ در صورت خطا، پیش از ادامه علت را برطرف کنید.
قدم بعدی
افزودن سرور لینوکسی دوم
روی میزبان مانیتورینگ، دو هدف محلی را حفظ و آدرس خصوصی سرور دوم را اضافه کنید. اگر job دیگری دارید، فقط هدف جدید را با تنظیم موجود ادغام کنید و jobهای دیگر را بازنویسی نکنید.
محتوای فایل؛ در فایل نامبرده ذخیره کنید، نه در خط فرمان.
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 سرور دوم را نشان نمیدهد.
# 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 برای همان سرور دوم الزامی است.
ترمینال سرور مانیتورینگ.
(
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"
)دستور باید بدون خطا تمام شود؛ در صورت خطا، پیش از ادامه علت را برطرف کنید.
قدم بعدی
نگهداری و بررسی نسخهها
نسخههای جدید Prometheus و node_exporter، بهروزرسانیهای Grafana و رشد دادههای مانیتورینگ را پیگیری کنید. باینریهای نصبشده از آرشیو، از طریق APT بهروز نمیشوند.
در بازهٔ نگهداری، ابتدا نسخهها، وضعیت سرویس و ظرفیت دیسک را با پنل زیر بررسی کنید. ارتقا را پس از بررسی سازگاری و تهیهٔ پشتیبان برنامهریزی کنید.
ترمینال سرور مانیتورینگ.
(
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 بهصورت روشن قابل مشاهده است.
قدم بعدی
توقف امن و تأیید پشتیبان سازگار
کنارگذاشتن اختیاری سرویسها، نمودار و scrape را متوقف میکند. برای سازگاری TSDB و SQLite ابتدا سرویسها را متوقف کنید. آرشیو ساختار مسیرها را حفظ میکند تا تنظیم و داده با نام یکسان روی هم نوشته نشوند. خطا در توقف، آرشیو، هش یا بازخوانی، بلوک را قطع میکند. این روش برای بازنشستهکردن نصب است، نه بازگشت خودکار به باینری قدیمی.
اصل تنظیمات و دادهها حفظ میشود. مسیر چاپشده را بررسی و پشتیبان را پیش از حذف بیشتر به مخزن حفاظتشدهٔ موجود منتقل کنید. هش و مقایسهٔ آرشیو، سلامت محلی را بررسی میکنند و جای بازیابی بحران را نمیگیرند. پشتیبان محرمانه است.
ترمینال سرور مانیتورینگ.
(
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 محلی برای بازیابی حفظ میشوند. اگر نصب دیگری مالک این مسیرهاست، این مرحله را اجرا نکنید.
ترمینال سرور مانیتورینگ.
(
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 را به نسخهٔ قدیمی برنگردانید.
در ادامه، ظرفیت و زمان نگهداری متناسب با کار خود را تعیین و قواعد هشدار را همراه با آزمون تحویل اعلان اضافه کنید. وجود داشبورد بهتنهایی در زمان قطعی به مسئول سیستم اطلاع نمیدهد.
بازیابی با وضعیت حفظشده و نسخهٔ سازگار انجام میشود؛ هشداردهی مرحلهٔ مستقل بعدی است.
پشتوانهٔ این آموزش
منابع رسمی
وضعیت بررسی هر محیط بالای صفحه مشخص است؛ بررسی مستندات به معنی اجرای عملی همهٔ نسخهها نیست.
- Prometheus: صفحهٔ دانلود
- Prometheus: نصب
- Prometheus: مرجع پیکربندی
- Prometheus: راهنمای node_exporter
- Grafana: نصب روی Debian یا Ubuntu
- Grafana: منبعدادهٔ Prometheus
- Grafana: provisioning برای data source
- Ubuntu 26.10 release notes
- Debian 13 release notes
- Prometheus management and readiness API
- Prometheus HTTP query API
- Grafana configuration and environment overrides
- Prometheus 3 migration