Хостинг

Chainstack на VPS: круглосуточный мониторинг Ethereum

Гайд по установке монитора крупных ETH-переводов на Python через Chainstack и VPS: готовый скрипт, systemd-сервис, обход рейт-лимитов бесплатного плана.

Команда is*hosting 11 авг. 2026 7 мин
Chainstack на VPS: круглосуточный мониторинг Ethereum
Содержание

Знакомая история: скрипт, который ловит on-chain события, отлично работает на ноутбуке — пока вы его не закроете. Публичные RPC-эндпоинты упираются в рейт-лимиты, а сам скрипт на ноутбуке перестаёт работать, как только машина уходит в сон.

Chainstack — это управляемая платформа блокчейн-инфраструктуры, которая дает вам приватные RPC-эндпоинты на 70+ сетях — без необходимости держать собственную ноду. Вместо синхронизации полной ноды Ethereum (а это 2+ ТБ на NVMe и недели синка) вы получаете выделенные HTTPS- и WSS-адреса, которые подключаются напрямую к инфраструктуре Chainstack. Ваше приложение общается с Chainstack, а Chainstack — с сетью.

В этом гайде мы разберем реальную установку на тарифе Start VPS от is*hosting: Python-бот подписывается на mempool Ethereum через WebSocket-эндпоинт Chainstack и работает непрерывно как systemd-сервис, отлавливая крупные переводы ETH круглосуточно.

Подготовка к установке

Прежде чем начинать, убедитесь, что у вас есть все необходимое:

  • Аккаунт Chainstack (бесплатно, без привязки карты; регистрация на chainstack.com).
  • Одна развернутая нода Ethereum в Chainstack (Global Node, план Developer).
  • URL-адреса ваших эндпоинтов WSS и HTTPS из вкладки Access and credentials.
  • VPS is*hosting на Ubuntu 24.04 с root-доступом по SSH.

Скрипт монитора в простое использует меньше 50 МБ оперативной памяти. Любой тариф от Start и выше закрывает это требование с большим запасом. Если вы планируете держать на том же VPS другие сервисы рядом с ботом, на тарифе Medium будет больше свободных ресурсов.

Сценарий

RAM

CPU

Тариф is*hosting при годовой оплате

Только бот-монитор

2 ГБ

2 ядра

Start от $10,19 в месяц

Бот + другие сервисы

4 ГБ

3 ядра

Medium от $21,24 в месяц

VPS

Выделенный IPv4, еженедельные бэкапы и запаса от тарифа Start хватает, чтобы крутить бота 24/7 в 40+ локациях.

Выбрать VPS

Все тарифы VPS is*hosting по умолчанию включают выделенный IPv4-адрес и бесплатные еженедельные бэкапы.

Как настроить Chainstack и развернуть ноду

Шаг 1. Создаем проект и разворачиваем ноду

Залогиньтесь на console.chainstack.com. На дашборде Projects нажмите + Add project, введите имя проекта и нажмите Create.

Внутри проекта нажмите кнопку Ethereum в блоке «Join network». Chainstack развернет Global Node и сразу перекинет вас на страницу с деталями ноды. Статус ноды сменится на Running за несколько секунд.

1

Шаг 2. Копируем URL эндпоинтов

Прокрутите страницу ноды вниз до секции Access and credentials. Вам нужны два значения:

  • Execution client HTTPS endpoint — для получения деталей транзакций.
  • Execution client WSS endpoint — для живой подписки на ожидающие транзакции.

Оба идут по шаблону https://ethereum-mainnet.core.chainstack.com/<your-api-key> и wss://ethereum-mainnet.core.chainstack.com/<your-api-key>. Скопируйте оба.

2

Обратите внимание: эндпоинты лежат в самом низу страницы, так что придется прокрутить до конца.

Как установить монитор на VPS

При оформлении заказа на is*hosting выберите Ubuntu, затем v. 24 для Ubuntu 24.04. После завершения провижининга подключитесь по SSH как root.

Шаг 3. Ставим Python и создаем проект

apt update && apt install -y python3-pip python3-venv

Команда ставит 63 пакета и занимает примерно 272 МБ на диске. Успех подтверждает вывод:

Setting up python3-venv (3.12.3-0ubuntu2.1) ...
Setting up python3-pip (24.0+dfsg-1ubuntu1.3) ...

Создайте каталог проекта и виртуальное окружение:

mkdir -p /root/eth-monitor
cd /root/eth-monitor
python3 -m venv venv
source venv/bin/activate
pip install web3

pip install web3 подтягивает 38 пакетов, включая web3-7.16.0 и websockets-15.0.1. Финальная строка подтверждает установку:

Successfully installed ... web3-7.16.0 websockets-15.0.1 ...

Шаг 4. Создаем скрипт монитора

Замените два плейсхолдера эндпоинтов на свои реальные URL из Chainstack:

cat > /root/eth-monitor/monitor.py << 'EOF'
import asyncio
from web3 import AsyncWeb3, WebSocketProvider

WSS_ENDPOINT = "wss://ethereum-mainnet.core.chainstack.com/<your-api-key>"
HTTPS_ENDPOINT = "https://ethereum-mainnet.core.chainstack.com/<your-api-key>"
THRESHOLD_ETH = 100
SAMPLE_EVERY = 20  # проверяем 1 из 20 ожидающих tx, чтобы не выйти за RPS бесплатного плана
counter = 0

async def handle_transaction(w3, tx_hash):
    try:
        tx = await w3.eth.get_transaction(tx_hash)
        if tx and tx['value'] >= w3.to_wei(THRESHOLD_ETH, 'ether'):
            eth_value = w3.from_wei(tx['value'], 'ether')
            print(f"[ALERT] Large transfer: {eth_value:.2f} ETH | tx: {tx_hash.hex()} | from: {tx['from']} -> to: {tx['to']}", flush=True)
    except Exception as e:
        print(f"[ERROR] {e}", flush=True)

async def main():
    global counter
    print(f"[INFO] Connecting to Ethereum via Chainstack...", flush=True)
    async with AsyncWeb3(WebSocketProvider(WSS_ENDPOINT)) as w3:
        connected = await w3.is_connected()
        print(f"[INFO] Connected: {connected}", flush=True)
        print(f"[INFO] Watching for transfers >= {THRESHOLD_ETH} ETH (sampling 1 in {SAMPLE_EVERY} pending txs)...", flush=True)
        await w3.eth.subscribe("newPendingTransactions")
        print(f"[INFO] Subscribed to pending transactions", flush=True)
        async for payload in w3.socket.process_subscriptions():
            counter += 1
            if counter % SAMPLE_EVERY != 0:
                continue
            tx_hash = payload['result']
            asyncio.create_task(handle_transaction(w3, tx_hash))

if __name__ == "__main__":
    asyncio.run(main())
EOF

SAMPLE_EVERY = 20 — ключевой параметр для бесплатного плана. При примерно 200-300 ожидающих транзакциях в секунду на mainnet сэмплирование одной из двадцати держит частоту запросов в районе 10-15 RPS — заметно ниже потолка Developer в 25 RPS. Чтобы поднять порог алерта, увеличивайте THRESHOLD_ETH. На платном плане с более высокими лимитами можно снижать SAMPLE_EVERY.

Шаг 5. Настраиваем файрвол

Монитор делает только исходящие подключения к Chainstack, поэтому открывать входящие порты не нужно. Дефолтная политика UFW «разрешить исходящий трафик» это покрывает. Убедитесь, что доступ по SSH защищен, а файрвол активен:

ufw allow OpenSSH
ufw --force enable
ufw status verbose

Вывод подтверждает:

Status: active
Default: deny (incoming), allow (outgoing), disabled (routed)
To                         Action      From
--                         ------      ----
22/tcp (OpenSSH)           ALLOW IN    Anywhere

Шаг 6. Создаем systemd-сервис

Юнит запускает монитор от root, перезапускает его при сбое с задержкой в 10 секунд и отправляет весь вывод в системный журнал:

cat > /etc/systemd/system/eth-monitor.service << 'EOF'
[Unit]
Description=Ethereum Large Transfer Monitor
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/root/eth-monitor
ExecStart=/root/eth-monitor/venv/bin/python /root/eth-monitor/monitor.py
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable eth-monitor
systemctl start eth-monitor

Подождите пару секунд и проверьте статус:

systemctl status eth-monitor --no-pager

Вывод подтверждает, что сервис запущен:

● eth-monitor.service - Ethereum Large Transfer Monitor
     Active: active (running) since Sun 2026-06-28 11:55:47 UTC; 8s ago
   Main PID: 52171 (python)
     Memory: 42.9M (peak: 43.2M)

Посмотрите стартовую последовательность в журнале:

journalctl -u eth-monitor -n 10 --no-pager
Jun 28 11:55:48 a240228623.local python[52171]: [INFO] Connecting to Ethereum via Chainstack...
Jun 28 11:55:48 a240228623.local python[52171]: [INFO] Connected: True
Jun 28 11:55:48 a240228623.local python[52171]: [INFO] Watching for transfers >= 100 ETH (sampling 1 in 20 pending txs)...
Jun 28 11:55:48 a240228623.local python[52171]: [INFO] Subscribed to pending transactions
Jun 28 11:55:50 a240228623.local python[52171]: [ERROR] Transaction with hash: '0x105799...' not found.

Ошибки not found — ожидаемые и безвредные. Ожидающая транзакция может выйти из mempool раньше, чем сработает запрос: ее заменили версией с более высокой комиссией, отменил отправитель или ее вытеснило под нагрузкой. Монитор просто пропускает такую и продолжает работу. Строку [ALERT] дают только те транзакции, что резолвятся со значением выше вашего порога.

Сервис стартует автоматически при перезагрузке и перезапускается в течение 10 секунд, если скрипт неожиданно завершится.

Как пользоваться монитором: алерты, пороги и доступ к логам

Как пользоваться монитором: алерты, пороги и доступ к логам

Чтение живых алертов

Как только появляется ожидающая транзакция, попадающая под ваш порог, журнал логирует ее сразу:

[ALERT] Large transfer: 142.50 ETH | tx: 0xabc123... | from: 0xSender -> to: 0xReceiver

Следить за алертами в реальном времени можно так:

journalctl -u eth-monitor -f

Настройка порога и частоты сэмплирования

Откройте /root/eth-monitor/monitor.py и отредактируйте две константы в самом верху:

THRESHOLD_ETH = 100  # минимальное значение ETH для срабатывания алерта
SAMPLE_EVERY = 20    # сэмплируем 1 из N ожидающих транзакций

После правок перезапустите сервис:

systemctl restart eth-monitor

На плане Chainstack Growth (250 RPS) можно поставить SAMPLE_EVERY = 1 и проверять каждую ожидающую транзакцию. На бесплатном Developer держите значение 20 или выше.

Расширение на другие сети

Chainstack поддерживает 70+ сетей. Чтобы мониторить переводы в BNB Smart Chain, разверните ноду BNB Smart Chain в своем проекте Chainstack, замените значения WSS и HTTPS эндпоинтов в monitor.py и перезапустите сервис.

Структура скрипта не зависит от конкретной сети: newPendingTransactions и eth_getTransaction работают одинаково во всех EVM-совместимых сетях.

Как обновлять

Перед обновлением web3.py сделайте резервную копию списка пакетов виртуального окружения:

pip freeze > /root/eth-monitor/requirements-backup.txt

В тарифы is*hosting уже включены бесплатные еженедельные бэкапы на уровне всего сервера. Но точечный pip-бэкап восстанавливается гораздо быстрее, чем полный снапшот VPS.

Если обновление пакета сломает скрипт, вы воссоздадите точное рабочее окружение командой pip install -r requirements-backup.txt за пару минут — вместо того чтобы ждать восстановления снапшота.

Само обновление web3.py:

cd /root/eth-monitor
source venv/bin/activate
pip install --upgrade web3
systemctl restart eth-monitor
journalctl -u eth-monitor -n 10 --no-pager

Прежде чем закрывать сессию, убедитесь, что после рестарта в журнале появилась строка [INFO] Connected: True.

Backup Storage

Бесплатные еженедельные бэкапы VPS на всех тарифах — страховочный пол под вашим списком pip-пакетов, чтобы сломавшееся обновление web3.py не выводило монитор из строя надолго.

Подробнее

Что в итоге у вас работает

У нас установка заняла около 4 минут на свежем инстансе Ubuntu 24.04.4 LTS на тарифе Start VPS от is*hosting: apt подтянул 63 пакета примерно за 2 минуты, pip install web3 добавил еще 38 пакетов меньше чем за минуту, а systemd поднял сервис менее чем за 5 секунд.

В простое монитор использует 42.9 МБ оперативной памяти против 2 ГБ на тарифе Start, так что остальные ресурсы сервера остаются свободными под другие задачи. Диск после полной установки занят на 8.2 ГБ из 30 ГБ NVMe.

Сервис подключается к Ethereum Global Node от Chainstack по WSS, подписывается на живой поток ожидающих транзакций и сэмплирует один хеш из двадцати, чтобы держаться в пределах лимита в 25 RPS бесплатного плана. Каждый подходящий перевод выше 100 ETH записывается в системный журнал, а сервис продолжает работать после перезагрузок и сбоев без вашего участия.

Дальше скрипт можно расширять: слать алерты в Telegram или Discord через их вебхуки, снизить THRESHOLD_ETH, чтобы ловить более мелкие переводы, или подставить эндпоинт BNB Smart Chain либо Base из своего проекта Chainstack. Тариф Start за $10,19 в месяц (при оплате за год) на is*hosting закрывает сервер, а бесплатный тариф Chainstack — доступ к ноде.

Что касается следующих шагов на стороне сервера: руководство по настройке Linux VPS разбирает харденинг SSH и первичную конфигурацию, а гайд по Uptime Kuma показывает, как добавить мониторинг аптайма — чтобы вы сразу узнавали, если сам VPS уйдет в офлайн.

FAQ

node-ru

Когда подходит бесплатный тариф Chainstack?

Бесплатный план Developer включает один эндпоинт Global Node, 3 млн request units в месяц и лимит в 25 запросов в секунду. Этого хватает скриптам, которые выборочно сэмплируют mempool, а не запрашивают каждый хеш транзакции подряд.

Для нагрузок потяжелее — ботов, которым нужна каждая ожидающая транзакция, индексаторов, продакшн DeFi-бэкендов — есть план Growth за $49 в месяц: он поднимает лимит до 250 RPS и 20 млн request units.

Mempool Ethereum выдает несколько сотен хешей ожидающих (pending) транзакций в секунду. На 25 RPS бесплатного плана попытка вытащить каждую из них мгновенно упирается в ошибку -32005. Решение простое — сэмплирование, то есть проверять одну транзакцию из каждых двадцати. Так частота запросов держится заметно ниже лимита, но при этом вы все равно ловите большинство крупных переводов в пределах нескольких секунд после их появления в сети.

Chainstack против собственной ноды: когда меняется математика?

Собственная полная нода Ethereum на выделенном железе обходится в $80-150 в месяц только за сервер, требует 2-4 ТБ быстрого NVMe и постоянного обслуживания — цепочка растет примерно на 1 ТБ в год.

Бесплатный тариф Chainstack не стоит ничего при низкочастотных сценариях. Даже Growth за $49 в месяц дешевле самого бюджетного выделенного сервера, который дотягивает до требований Ethereum по объему хранилища.

В чем подвох собственной ноды? Ее выбирают ради двух вещей: суверенитета над данными и полного отсутствия рейт-лимитов.

Если приложение делает миллионы RPC-вызовов в день или требует архивные данные вплоть до генезиса, self-hosting в конце концов выигрывает по деньгам. Но для мониторинговых скриптов, ботов и разработки практичнее другая связка: управляемый эндпоинт плюс VPS с вашей логикой. Chainstack держит ноду, is*hosting держит always-on-сервер.

Выделенный сервер

Bare metal для полной ноды.

От $66.67/месяц