Настройка уведомлений о сбоях крипто-бота
Крипто-бот упал в 3 ночи, пропустил 40 транзакций или завис на одной операции — узнать об этом нужно немедленно, не через 8 часов когда откроете ноутбук. Правильная система алертов закрывает три класса проблем: падение процесса, деградация производительности (бот работает, но медленно или пропускает события), и бизнес-аномалии (нет транзакций уже 2 часа — это нормально или сеть упала?).
Типичная архитектура крипто-бота и точки отказа
Большинство крипто-ботов — это цикл: слушаем события → обрабатываем → действуем. Точки отказа:
- RPC провайдер — Infura/Alchemy могут возвращать ошибки, ratelimit или отставать от head блока
- WebSocket соединение — рвётся, бот продолжает работать но не получает события
- Обработчик транзакций — зависает на одной, блокирует очередь
- Нехватка gas/SOL — бот не может отправлять транзакции
- Процесс упал — OOM, необработанное исключение, segfault
Healthcheck endpoint + внешний мониторинг
Самый надёжный подход: бот периодически сообщает "я жив", внешний сервис фиксирует отсутствие сигнала.
// В боте: heartbeat каждые 30 секунд
class BotHealthReporter {
private lastProcessedBlock: number = 0;
private processedCount: number = 0;
startHeartbeat(): void {
setInterval(async () => {
const payload = {
status: 'ok',
lastBlock: this.lastProcessedBlock,
processed: this.processedCount,
timestamp: Date.now(),
rpcLatency: await this.measureRpcLatency(),
};
// Betterstack/Healthchecks.io ping
await fetch(process.env.HEALTHCHECK_PING_URL!, {
method: 'POST',
body: JSON.stringify(payload),
}).catch(() => {}); // Не крашимся если healthcheck недоступен
}, 30_000);
}
}
Healthchecks.io — бесплатный сервис для deadman's switch алертов. Настраиваете: "если не получу ping в течение 2 минут — отправь уведомление". Поддерживает Telegram, Email, Slack, PagerDuty.
Betterstack (ex. Logtail) — аналог с более богатым UI и интеграцией с логами.
Telegram-бот для алертов: быстрее email
class TelegramAlerter {
private bot: Telegraf;
private chatId: string;
constructor() {
this.bot = new Telegraf(process.env.TELEGRAM_BOT_TOKEN!);
this.chatId = process.env.TELEGRAM_ALERT_CHAT_ID!;
}
async sendAlert(level: 'info' | 'warning' | 'critical', message: string): Promise<void> {
const emoji = { info: 'ℹ️', warning: '⚠️', critical: '🚨' }[level];
const text = `${emoji} *[${level.toUpperCase()}]*\n\n${message}\n\n_${new Date().toISOString()}_`;
await this.bot.telegram.sendMessage(this.chatId, text, {
parse_mode: 'Markdown',
});
}
async sendBlockAlert(currentBlock: number, chainHead: number): Promise<void> {
const lag = chainHead - currentBlock;
if (lag > 50) {
await this.sendAlert('critical',
`Бот отстаёт от сети на ${lag} блоков\nТекущий: ${currentBlock}\nHead: ${chainHead}`
);
}
}
}
Мониторинг отставания от chain head
Бот может работать без ошибок, но обрабатывать блоки с отставанием — из-за медленного RPC или перегруженного обработчика. Добавляем проверку lag:
async function checkChainLag(provider: JsonRpcProvider, lastProcessed: number): Promise<void> {
const currentHead = await provider.getBlockNumber();
const lag = currentHead - lastProcessed;
if (lag > 10) alerter.sendAlert('warning', `Lag: ${lag} блоков`);
if (lag > 50) alerter.sendAlert('critical', `Критическое отставание: ${lag} блоков`);
// Метрика для Grafana
metrics.gauge('bot_chain_lag_blocks', lag);
}
Алерт на низкий баланс gas wallet
async function checkGasBalance(provider: JsonRpcProvider, botAddress: string): Promise<void> {
const balance = await provider.getBalance(botAddress);
const balanceEth = parseFloat(formatEther(balance));
if (balanceEth < 0.05) {
await alerter.sendAlert('warning',
`Низкий баланс gas wallet: ${balanceEth.toFixed(4)} ETH\nАдрес: ${botAddress}`
);
}
if (balanceEth < 0.01) {
await alerter.sendAlert('critical',
`КРИТИЧНО: gas wallet почти пуст: ${balanceEth.toFixed(4)} ETH — бот скоро остановится`
);
}
}
Process supervisor: автоперезапуск
Если бот упал — он должен автоматически подняться. PM2 для Node.js:
# ecosystem.config.js
module.exports = {
apps: [{
name: 'crypto-bot',
script: 'dist/bot.js',
restart_delay: 5000,
max_restarts: 10,
min_uptime: '10s', // не считаем рестарт если упал раньше чем через 10s
error_file: '/var/log/crypto-bot/error.log',
out_file: '/var/log/crypto-bot/out.log',
}]
};
pm2 start ecosystem.config.js
pm2 save # автозапуск после перезагрузки сервера
PM2 сам отправляет уведомления через pm2-notify или интеграцию с keymetrics. При каждом рестарте — логируем и отправляем алерт через Telegram.
Итоговый чеклист алертов
- Отсутствие heartbeat > 2 минут → критический алерт
- Отставание от chain head > 50 блоков → критический алерт
- Баланс gas wallet < 0.05 ETH → предупреждение
- N ошибок подряд в обработчике → критический алерт
- Процесс перезапустился → информационный алерт
- RPC latency > 5 секунд → предупреждение







