پلتفرم در موارد مهمِ سازمانِ شما هشدار میدهد: سرویسی در ERROR، کرَش یا کمبودِ RAM، آپتایمِ آدرسِ عمومی، پر شدنِ منابع، نزدیکی انقضای SSL، و اتمام موجودی یا بدهی. هشدارها در چند کانال میآیند.
کانالها#
| کانال | کجا میآید |
|---|---|
| کنسول | صندوقِ هشدار داخلِ پنل، همیشه فعال |
| Webhook | یک POST با JSON به آدرسِ شما |
| Bale | پیام در بله |
| ایمیل | ایمیل به یک آدرس، از no-reply@weblines.ir |
| پیامک | فقط برای رویدادهای مالی مثلِ اتمام موجودی و بدهی |
| ایمیلِ owner و admin | همان رویدادهای مالیِ پیامک، به ایمیلِ حسابِ همهی owner و adminها، همیشه فعال |
owner و admin کانالها را در SETTINGS → MONITOR تنظیم میکنند. هر کانال را میتوانید موقتاً خاموش کنید یا پاک کنید.
ایمیل#
آدرس را وارد کنید و SEND A CODE را بزنید. یک کدِ تأیید به همان آدرس ایمیل میشود. کد را در ردیفِ تازه وارد کنید تا هشدارها شروع شوند. تا وقتی کد وارد نشده، هیچ هشداری به آن آدرس نمیرود. کد یک ساعت اعتبار دارد.
اگر ایمیل نرسید، پوشهی اسپم را هم ببینید و no-reply@weblines.ir را به مخاطبها اضافه کنید.
آستانهها#
در همان صفحه، آستانهها را عوض کنید:
| هشدار | پیشفرض |
|---|---|
| CPU | ۹۰٪ |
| RAM | ۹۰٪ |
| دیسک | ۸۵٪ |
| انقضای SSL | ۱۴ روز مانده |
| موجودی کیف پول | ۳ روز مانده به تمامشدن |
webhook#
هر رویداد یک درخواستِ POST با بدنهی JSON به آدرسِ شما میفرستد. موقعِ ساختِ کانال میتوانید گروههای رویداد را انتخاب کنید (دیپلوی، سلامتِ سرویس، بکاپ، کیف پول، تیم و امنیت)؛ اگر هیچ گروهی انتخاب نشود، همه میآیند.
{
"id": "cmv…",
"type": "deploy.failed",
"severity": "warning",
"title": "Deploy failed: shop",
"body": "…",
"link": "https://console.weblines.ir/dashboard/services/cmv…",
"organizationId": "cmv…",
"resourceId": "cmv…",
"data": {},
"createdAt": "2026-10-20T08:00:00.000Z"
}
severity یکی از info، warning یا critical است. بعضی از typeها:
| گروه | نمونهی type |
|---|---|
| دیپلوی | deploy.succeeded، deploy.failed |
| سلامتِ سرویس | resource.failed، resource.recovered، resource.crash_loop، resource.oom، uptime.down، uptime.up، metrics.cpu_high، domain.ssl_expiring، cron.failed |
| بکاپ | database.job_succeeded، database.job_failed |
| کیف پول | billing.wallet_low، billing.budget_exceeded، billing.debt_started |
| تیم و امنیت | security.member_added، security.login_new_device، security.api_key_created |
دکمهی TEST ِ هر کانال یک رویدادِ channel.test میفرستد.
هدرها#
| هدر | مقدار |
|---|---|
X-Weblines-Event | همان type |
X-Weblines-Delivery | شناسهی این ارسال؛ برای حذفِ تکراریها |
X-Weblines-Timestamp | زمانِ ارسال، ثانیهی یونیکس |
X-Weblines-Signature-V2 | sha256= و HMAC-SHA256 ِ رشتهی <timestamp>.<body> با secret ِ کانال |
X-Weblines-Signature | (قدیمی) sha256= و HMAC-SHA256 ِ خودِ body؛ برای سازگاری میماند |
secret ِ کانال (با پیشوندِ whsec_) فقط یک بار، موقعِ ساختِ کانال، نشان داده میشود.
بررسیِ امضا#
از V2 استفاده کنید: امضا را روی بدنهی خامِ درخواست (قبل از parse) دوباره بسازید، در زمانِ ثابت مقایسه کنید، و درخواستی را که timestamp ِ آن بیش از ۵ دقیقه با ساعتِ شما فاصله دارد رد کنید تا درخواستِ شنودشده دوباره پذیرفته نشود.
// Node.js
import { createHmac, timingSafeEqual } from "node:crypto";
function verify(rawBody, headers, secret) {
const ts = headers["x-weblines-timestamp"];
const given = headers["x-weblines-signature-v2"] ?? "";
if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;
const expected = "sha256=" + createHmac("sha256", secret).update(`${ts}.${rawBody}`).digest("hex");
return given.length === expected.length && timingSafeEqual(Buffer.from(given), Buffer.from(expected));
}
# Python
import hmac, hashlib, time
def verify(raw_body: bytes, headers, secret: str) -> bool:
ts = headers.get("X-Weblines-Timestamp", "")
given = headers.get("X-Weblines-Signature-V2", "")
if not ts.isdigit() or abs(time.time() - int(ts)) > 300:
return False
mac = hmac.new(secret.encode(), f"{ts}.".encode() + raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(given, "sha256=" + mac)
تحویل، تلاشِ دوباره و Redeliver#
- جوابِ
2xxدر کمتر از ۸ ثانیه یعنی تحویل شد. redirect دنبال نمیشود. - اگر نشد، دوباره تلاش میشود: ۱، ۵، ۱۵ و ۶۰ دقیقه بعد. بعد از آن «failed» میشود.
- ممکن است یک رویداد بیش از یک بار برسد؛ با
X-Weblines-Deliveryیاidتکراریها را کنار بگذارید. - در RECENT SENDS ِ همان صفحه، وضعیتِ ۲۰ ارسالِ آخر و خطای هر کدام دیده میشود. owner و admin با Redeliver یک ارسالِ webhook یا Bale را همان لحظه دوباره میفرستند.
- آدرس باید عمومی باشد (
httpsتوصیه میشود؛httpهم پذیرفته است)؛ آدرسهای شبکهی خصوصی پذیرفته نمیشوند.
اتصال به تلگرام، Slack یا ابزارِ دیگر#
payload را یک واسطهی کوچک به پیام تبدیل کند — مثلاً یک workflow در n8n با گرهی Webhook که پیام را به تلگرام یا Slack میفرستد. آدرسِ همان گرهی Webhook را بهعنوانِ کانالِ webhook بگذارید.
جزئیاتِ بیشتر#
- شرح هشدارهای CPU، RAM و کرَش: متریکها، پایش آپتایم و لاگ.
- اگر پیامکِ بدهی یا موجودی نمیرسد، شمارهٔ موبایلتان را در پروفایل بررسی کنید.
بعد از هشدار#
کارتِ سرویس را باز کنید و لاگ را ببینید: وضعیت، لاگ و شِل و خطای دیپلوی.
