Repository navigation
FA Configuration
زبان: English · فارسی
نوع و مقدار پیشفرض هر کلید در مرجع YAML آمده است؛ این صفحه توضیح میدهد کلیدها چطور با هم کار میکنند. فایل پیشفرض pulsecheck.yml است و با -c عوض میشود. هر ${NAME} داخل یک مقدار با متغیر محیطی NAME پر میشود و اگر آن متغیر تنظیم نشده باشد خطا میگیرید. پس رمز و توکن را مستقیم در فایل ننویسید.
داخل mappingهای درونخطی
{ ... }مقدارهایی که${VAR}دارند باید در کوتیشن باشند:{name: api, url: "https://x.example.com/${TOKEN}"}.
state_file: pulsecheck.db
shoutrrr_bin: auto
notify:
urls: ["telegram://${TG_TOKEN}@telegram?chats=${TG_CHAT}"]
events: [down, up, degraded]
defaults: {timeout: 10, down_after: 2, interval: 5, slow_ms: 3000}
maintenance:
- {name: weekly, start: "SUN 02:00", duration: 60, sites: [api]}
sites:
- {name: web, url: https://example.com}| کلید | پیشفرض | توضیح |
|---|---|---|
state_file |
pulsecheck.db |
فایل SQLite برای وضعیت فعلی و تاریخچهی بررسیها (۴۰۰ روز نگه داشته میشود) |
shoutrrr_bin |
auto |
auto (اگر Docker کار کند image داکر، وگرنه فایل اجرایی shoutrrr)، docker، یا مسیر یک فایل اجرایی |
shoutrrr_image |
nickfedor/shoutrrr:0.21.2 |
image داکر در حالت auto و docker
|
notify |
ندارد | مقصدهای سراسری هشدار (پایینتر توضیح داده شده) |
defaults |
{} |
هر کلید سایت؛ به همهی سایتها اضافه میشود و مقدار خود سایت بر آن غلبه دارد |
messages |
متن داخلی | متن هشدارها بر اساس کلید (بخش «پیامها» در همین صفحه) |
otel |
ندارد | ارسال نتایج به OpenTelemetry (بخش «OpenTelemetry» در همین صفحه) |
maintenance |
[] |
بازههایی که در آنها هشدار ارسال نمیشود |
sites |
الزامی | فهرست بررسیها؛ name باید یکتا باشد |
| کلید | پیشفرض | مناسب برای | توضیح |
|---|---|---|---|
name |
الزامی | همه | نام یکتا، در هشدار و گزارش استفاده میشود |
type |
http |
همه |
http، tcp یا ping
|
url |
– | http | آدرس کامل (الزامی) |
host |
– | tcp، ping | نام سرور یا IP (الزامی) |
port |
– | tcp | شمارهی پورت (الزامی) |
method |
GET |
http | متد HTTP |
headers |
{} |
http | هدرهای درخواست |
body |
– | http | بدنهی درخواست (متن) |
expected_status |
هر 2xx | http | فهرستی مثل [200, 301]
|
max_redirects |
5 |
http | حداکثر ریدایرکتی که دنبال میشود |
max_response_ms |
خاموش | همه | پاسخ کندتر از این مقدار شکست حساب میشود |
slow_ms |
خاموش | همه | پاسخ موفقِ کندتر از این مقدار degraded است |
timeout |
10 |
همه | به ثانیه |
down_after |
2 |
همه | تعداد شکست پشتسرهم پیش از down شدن |
interval |
5 |
همه | فاصلهی بررسیها به دقیقه (پایینتر توضیح داده شده) |
tags |
[] |
همه | برچسب آزاد، مثل [prod, db]؛ برای --tag و بهصورت {tags} در پیامها |
ssl_warn_days |
خاموش | http | وقتی گواهی https در کمتر از این تعداد روز منقضی میشود هشدار بده؛ گواهی منقضیشده شکست حساب میشود. روی Cloudflare در دسترس نیست |
remind_every |
0 (خاموش) |
همه | فاصلهی دقیقهای هشدارهای تکراری «هنوز down است»؛ فاصلهی هشدارهای تکراری گواهی را هم تعیین میکند |
notify |
سراسری | همه |
notify سراسری را فقط برای همین سایت عوض میکند |
messages |
سراسری | همه | متن پیامها را فقط برای همین سایت عوض میکند |
- بررسی موفق یعنی
up؛ اگر دستکمslow_msطول کشیده باشدdegraded. - بررسی ناموفق تا وقتی
down_afterبار پشتسرهم تکرار نشود سایت راdownنمیکند، پس قطعهای کوتاه هشدار نمیسازند. - هشدار فقط وقتی وضعیت عوض شود میرود:
down،degradedیاup(بازگشت؛ پیام میگوید مشکل چند دقیقه طول کشیده). -
eventsتعیین میکند کدامیک ازdown،up،degradedوssl_warnارسال شود. یادآوری «هنوز down است» جزوdownحساب میشود.notifyسطح سایت،notifyسراسری را کامل کنار میگذارد، از جملهeventsآن را. - اگر ارسال هشدار شکست بخورد (برنامه پیدا نشود، آدرس غلط باشد) خطا در stderr چاپ میشود، ولی اجرا ادامه پیدا میکند.
- با
remind_every: 60تا وقتی سایت down است، هر ۶۰ دقیقه پیامreminderمیآید. با0(پیشفرض) فقط اولین هشدارdownارسال میشود. -
ssl_warn_days: 14در هر بررسی گواهی https را میخواند. اگر کمتر از ۱۴ روز مانده باشد هشدارssl_warnمیآید، حداکثر روزی یکبار (یا هرremind_everyدقیقه، اگر تنظیم کرده باشید). گواهی منقضیشده بررسی را با پیامTLS certificate has expiredشکست میدهد و مثل یکdownعادی رفتار میشود. - کلید ناشناخته در هر جای فایل خطا است، پس
validateغلطهای املایی را پیدا میکند.
بهطور پیشفرض سیستمعامل خانوادهی آدرس را انتخاب میکند. اگر میخواهید عمداً یک خانواده را بسنجید، روی سایت ip_version بگذارید:
sites:
- {name: web-v4, url: "https://example.com", ip_version: 4}
- {name: web-v6, url: "https://example.com", ip_version: 6} # اگر سرور رکورد AAAA نداشته باشد یا IPv6 در دسترس نباشد، down میشود
- {name: dns-v6, type: tcp, host: "2001:4860:4860::8888", port: 53} # آدرس IPv6 مستقیم به ip_version نیاز ندارد
- {name: gateway-v6, type: ping, host: gw.example.com, ip_version: 6} # دستور `ping -6` اجرا میشوداین کلید برای http، tcp، ping و بررسی گواهی (ssl_warn_days) کار میکند. اگر برای یک سرور دو ورودی بگذارید، یکی برای هر خانواده، میفهمید مشکل از کدام طرف است. اگر ماشینی که pulsecheck روی آن اجرا میشود مسیر IPv6 نداشته باشد، سایتِ ip_version: 6 down گزارش میشود و خطا دلیلش را میگوید (Network is unreachable، Address family for hostname not supported یا Name or service not known). Cloudflare Workers نمیتواند خانواده را انتخاب کند، برای همین این سایتها آنجا رد میشوند.
به سایتها tags: [prod] بدهید و دستورها را با --tag prod محدود کنید (run، status، report).
pulsecheck status وضعیت فعلی همهی سایتها را چاپ میکند: با --json برای اسکریپت، با --md برای جدول مارکدان (مثلاً برای نوشتن در $GITHUB_STEP_SUMMARY). داشبوردی وجود ندارد و جای آن همین دستور است. روی Vercel همین اطلاعات در GET /api/status و روی Cloudflare در GET /status است و هر دو توکن میخواهند (سرورلس).
اینکه pulsecheck هر چند دقیقه اجرا شود را زمانبند (cron یا CI) تعیین میکند. interval فقط سایتهایی را که تازه بررسی شدهاند رد میکند. مثلاً اجرا را هر ۵ دقیقه بگذارید و برای یک بررسی سنگین interval: 60 بدهید تا ساعتی یکبار انجام شود. یک دقیقه هم برای تأخیر زمانبند کم میشود، بنابراین interval: 5 با زمانبندی ۵ دقیقهای در هر اجرا بررسی میشود.
زمانها به UTC هستند. start یا به شکل "HH:MM" است (هر روز) یا "DAY HH:MM" با MON TUE WED THU FRI SAT SUN. duration به دقیقه است و میتواند از نیمهشب رد شود. اگر sites خالی باشد بازه برای همهی سایتهاست. بررسیها انجام و ذخیره میشوند، ولی هشدارهای داخل بازه دور ریخته میشوند و بعداً فرستاده نمیشوند.
هر متن هشدار یک کلید دارد. کد فقط از همین کلیدها استفاده میکند و هرکدام را میتوانید زیر messages: عوض کنید، چه سراسری و چه فقط برای یک سایت. کلیدی که ننویسید همان متن داخلی را نگه میدارد.
| کلید | زمان ارسال | متن داخلی |
|---|---|---|
down |
سایت down شد | 🔴 {site} is DOWN: {error} |
degraded |
سایت بالاست ولی کند است | 🟡 {site} is slow ({ms}ms) |
up |
سایت برگشت | 🟢 {site} is UP ({ms}ms) after {minutes}m |
reminder |
بعد از remind_every هنوز down است |
🔴 {site} is still DOWN after {minutes}m: {error} |
ssl_warn |
گواهی نزدیک انقضاست | 🔒 {site}: TLS certificate expires in {days} days |
test |
pulsecheck test-notify |
pulsecheck test notification |
جانگهدارها: {site} نام سایت، {event} (down، degraded یا up)، {error} دلیل شکست (در حالت موفق خالی)، {ms} زمان پاسخ، {minutes} دقیقههای گذشته از آخرین تغییر وضعیت، {status} کد وضعیت HTTP (برای tcp و ping خالی)، {tags} برچسبهای سایت با کاما، {days} روزهای مانده تا انقضای گواهی (فقط در ssl_warn). برای نوشتن خود آکولاد از {{ و }} استفاده کنید. کلید یا جانگهدار ناشناخته را validate رد میکند. اولویت: messages سایت، بعد messages سراسری، بعد متن داخلی.
messages:
down: "ALERT {site} unreachable ({error})"
up: "{site} recovered after {minutes} min"
sites:
- name: payments
url: https://pay.example.com
messages: {down: "💳 payments DOWN, page on-call"}با otel: نتیجهی هر اجرا به یک OpenTelemetry collector میرود، یا به هر سرویسی که OTLP/HTTP JSON بپذیرد؛ یعنی عملاً مثل یک وبهوک. به بستهی OpenTelemetry نیازی نیست و روی همهی پلتفرمها کار میکند.
otel:
endpoint: https://otel-collector.example.com:4318 # /v1/metrics و /v1/logs خودکار اضافه میشود
headers: {Authorization: "Bearer ${OTEL_TOKEN}"}
resource: {env: prod} # ویژگیهای اضافهی resource؛ service.name بهطور پیشفرض "pulsecheck" است
# service_name: pulsecheck
# metrics: true # برای هر بررسی: pulsecheck.up (۱ یا ۰)، .response_time (ms)، .http.status_code، .ssl.days_remaining
# logs: true # برای هر هشدار یک رکورد لاگ (ERROR برای down، WARN برای کندی و گواهی، INFO برای بازگشت)ویژگیهای هر متریک: site، type، state (up، down یا degraded) و tags. اگر ارسال شکست بخورد، خطا در stderr چاپ میشود و اجرا خراب نمیشود. pulsecheck test-notify یک رکورد لاگ آزمایشی به endpoint میفرستد.
pulsecheck report برای یک روز، هفته، ماه و سال اخیر اینها را نشان میدهد: درصد آپتایم، میانگین و p95 زمان پاسخ بررسیهای موفق، و تعداد بررسیها. --json همین داده را برای اسکریپت چاپ میکند. روی Vercel و Cloudflare فقط جمع روزانه ذخیره میشود، بنابراین گزارش آنها p95 ندارد و ۹۰ روز اخیر را پوشش میدهد.