VPS с самостоятельным администрированием

GPU Radar: свой Telegram-бот с уведомлениями о ценах GPU

См. также — глоссарий

GPU Radar следит за публичным каталогом GPU: пользователь выбирает видеокарту и предел цены, бот присылает подходящее предложение в Telegram. Для самого бота нужен обычный CPU VPS. Он ничего не арендует и не вызывает платную модель.

Скачать GPU Radar · Другие Telegram-примеры · Посмотреть предложения GPU

Статус проверки, 8 октября 2026. Все 15 offline-тестов бота проходят. CI также проверил сборку Docker, запуск без root, запись в volume и сохранение подписок при пересоздании контейнера. Публичные RUB/USD API и переход к выбранной GPU проверены. Каталог VPS через API восстановился: доступны 166 планов. Новый сервер по тарифу 450 ₽/месяц получил статус active и IP-адрес; API также принял запрос перезагрузки. SSH-подключение из тестового окружения не завершилось, поэтому бот на этот VPS пока не установлен. Доставка Telegram-уведомления, восстановление бота после перезагрузки VPS и замеры ресурсов ещё не проверены. Скриншоты ниже сделаны на реальных страницах.

Что делает бот

Например, /watch RTX 4090 100 означает: искать одну RTX 4090 не дороже 100 ₽/ч. Бот проверяет каталог раз в пять минут. Уведомление приходит при первом совпадении, снижении цены относительно последнего уведомления или повторном появлении после обхода без совпадений. На одну подписку действует часовой интервал между уведомлениями.

Каталог может кешироваться до 15 минут. Уведомление не резервирует сервер: перед оплатой проверьте доступность, характеристики, диск, трафик и итоговую цену в панели. GPU Radar использует точную цену из API; страница каталога может округлять её при отображении.

Реальный каталог: выбраны одна GPU и RTX 4090

Каталог CloudCompute, 2 октября 2026: фильтр RTX 4090 сохраняется при переходе по ссылке. Цены и характеристики — данные предложений на момент съёмки, не проверка оборудования и не постоянный прайс.

У публичного бота каждый человек управляет только своими подписками. Поддерживаются личные чаты, до пяти активных подписок на пользователя и до 500 на этот учебный worker. Это ограничение примера, а не измеренная ёмкость сервера.

Подготовьте токен и VPS

Создайте отдельного бота через проверенный аккаунт @BotFather в Telegram. Название может быть «CloudCompute GPU Radar»; username должен заканчиваться на bot и быть свободным. Для собственной копии используйте собственный токен. Не направляйте один токен одновременно в другой polling-процесс или webhook.

Для начала предлагаем Linux VPS с 1 vCPU, 1 ГБ RAM и 20–25 ГБ диска. Выберите доступный образ Ubuntu 24.04 и проверьте исходящий HTTPS к Telegram и публичному каталогу. Домен, публичный порт приложения и GPU не требуются. Установка Docker выполняется отдельно.

В .env нужны только TELEGRAM_BOT_TOKEN и BRAND=cloudcompute. Ключ аккаунта CloudCompute нужен оператору, если он создаёт VPS через API; на сервер бота этот ключ не копируется.

Путь создания Когда использовать Результат перед установкой бота
Панель Хотите выбрать план и ОС в интерфейсе Работающий VPS, адрес и доступ по своему SSH-ключу
REST API Хотите повторяемую настройку и контролируемые повторы запросов Тот же работающий VPS; HTTP 201 сам по себе ещё не означает готовность

Выберите один путь. Выполнение обоих создаёт два отдельных платных сервера.

Вариант A: через панель

  1. Войдите в CloudCompute, проверьте баланс и добавьте публичный SSH-ключ. Приватную часть ключа оставьте у себя.
  2. Откройте создание VPS. Выберите обычный сервер с самостоятельным администрированием, доступные план, регион и ОС. Назовите его gpu-radar.
  3. Выберите свой SSH-ключ и проверьте полную предоплату за месяц перед созданием. Наличие плана в каталоге не гарантирует успешного выделения сервера.
  4. Дождитесь статуса работающего сервера и блока подключения. Сохраните показанную SSH-команду, затем подключитесь ею. Если создание завершилось ошибкой, проверьте сообщение и возврат средств до новой попытки.

Это последовательность для панели по текущему контракту продукта. Успешная проверка этого пути со скриншотами личного кабинета ещё не завершена. Справочник полей: создание VPS.

Экран входа в панель CloudCompute до ввода данных аккаунта

Экран входа, 3 октября 2026. Снимок сделан до авторизации и не подтверждает успешное создание VPS.

Вариант B: через API

Команды выполняются на компьютере оператора, в Bash с curl, jq, python3 и OpenSSH. Используйте отдельный каталог для этой операции. Ключ вводится без отображения и хранится в приватном файле заголовка, чтобы не попадать в историю и аргументы curl.

mkdir -m 700 gpu-radar-provision
cd gpu-radar-provision
umask 077
read -rsp 'CloudCompute API key: ' ACCOUNT_KEY; printf '\n'
printf 'Authorization: Bearer %s\n' "$ACCOUNT_KEY" > api.headers
unset ACCOUNT_KEY
API='https://app.cloudcompute.ru/api/v1'

curl --fail-with-body -sS -H @api.headers "$API/vps/catalog" > catalog.json
jq '.data.currency' catalog.json
jq -r '.data.plans[] | [.id,.vcpu,.ram_mb,.disk_gb,.price_month_minor] | @tsv' catalog.json

В RUB-каталоге price_month_minor указан в копейках. Выберите план из ответа, затем получите его реальные ID регионов и ОС. Не переносите ID из чужого примера: набор зависит от плана и меняется со временем.

Если .data.plans пуст, остановитесь на этом шаге и проверьте состояние сервиса или обратитесь в поддержку. Успешный HTTP-ответ сам по себе не означает, что план доступен; не отправляйте ID из старого каталога.

read -rp 'Plan ID: ' PLAN
jq --arg plan "$PLAN" '.data.plans[] | select(.id == $plan) | {regions,os}' catalog.json
read -rp 'Region ID: ' REGION
read -rp 'OS ID: ' OS_ID

ssh-keygen -t ed25519 -f ./gpu_radar -C gpu-radar
jq -n --rawfile public_key ./gpu_radar.pub \
  '{name:"gpu-radar",public_key:$public_key}' > ssh-key.json
curl --fail-with-body -sS -H @api.headers -H 'Content-Type: application/json' \
  -d @ssh-key.json "$API/ssh-keys" > ssh-key-response.json
SSH_KEY_ID=$(jq -er '.data.id' ssh-key-response.json)

jq -n --arg plan "$PLAN" --arg region "$REGION" --arg os "$OS_ID" \
  --argjson key "$SSH_KEY_ID" \
  '{plan:$plan,region:$region,os_id:$os,hostname:"gpu-radar",label:"GPU Radar",ssh_key_ids:[$key]}' > create.json
python3 -c 'import uuid; print(uuid.uuid4())' > create-key.txt
cat create.json

Следующий запрос создаёт платный VPS. Сначала сверьте выбранный план и месячную сумму в catalog.json.

curl --fail-with-body -sS -H @api.headers -H 'Content-Type: application/json' \
  -H "Idempotency-Key: $(cat create-key.txt)" \
  -d @create.json "$API/vps" > created.json
VPS_ID=$(jq -er '.data.id' created.json)

curl --fail-with-body -sS -H @api.headers "$API/vps/$VPS_ID" | \
  jq '.data | {id,status_label,ip_address,ssh_port,paid_until}'

После неопределённого сетевого сбоя повторяйте тот же запрос с тем же файлом create.json и ключом. Не генерируйте UUID заново: это уже новая покупка. На живом API повтор исходного запроса с тем же ключом вернул тот же ID, без второго VPS. Не повторяйте POST бесконечно: при launch_failed устраните причину, проверьте возврат и только затем оформляйте новую попытку с новым ключом.

Проверяйте GET до готовности сервера; не считайте loading или пустой IP успешным развёртыванием. Если API возвращает 410 с launch_failed, SSH-подключаться ещё не к чему. После завершения работы удалите локальный api.headers; SSH-ключ и ID работающего сервера храните приватно.

Установите GPU Radar на готовом сервере

Подключитесь по SSH из карточки VPS. Установите Docker Engine и Compose plugin по инструкции, затем скачайте архив со страницы выше и перенесите его на сервер. На сервере:

sudo mkdir -p /opt/gpu-radar
sudo unzip gpu-radar-v1.zip -d /opt
cd /opt/gpu-radar

umask 077
read -rsp 'Telegram bot token: ' RADAR_TOKEN; printf '\n'
printf 'TELEGRAM_BOT_TOKEN=%s\nBRAND=cloudcompute\n' "$RADAR_TOKEN" > .env
unset RADAR_TOKEN
docker compose -p gpu-radar up -d --build
docker compose -p gpu-radar ps

Команды Docker и запись в /opt требуют root либо подходящих прав. При входе обычным пользователем перейдите в административную shell или настройте владельца каталога до записи .env. Архив не содержит токенов и не добавляет ключ аккаунта в образ. Процесс работает как UID 10001; SQLite сохраняется в отдельном volume. Лимит контейнера 128 МБ — ограничение конфигурации, не результат замера.

Проверьте подписку и первое уведомление

Откройте свою копию бота в Telegram, нажмите Start, затем «Добавить GPU» → «RTX 4090» → «100 ₽/ч». Альтернатива — команда /watch RTX 4090 100. Команда /watches должна показать подписку.

Сравните условия с каталогом. Подтверждение «Подписка сохранена» доказывает только сохранение команды. Для проверки доставки дождитесь отдельного сообщения «Найдено предложение» и откройте его кнопку. GPU Radar не оформляет аренду при нажатии.

Каталог CloudCompute с пределом цены 100 рублей за час

Реальная проверка фильтра 1× RTX 4090 и цены до 100 ₽/ч. Это скриншот каталога, а не Telegram-уведомления.

Пустой результат при слишком низком пределе цены

При цене до 1 ₽/ч совпадений во время проверки не было. В такой ситуации отсутствие уведомления ожидаемо.

Бот ищет точные названия моделей из меню. Предложение on_request, несколько GPU, неподходящая модель или некорректная цена не проходят фильтр. Изменение кеша и реальная аренда другим человеком могут сделать предложение недоступным. Не повышайте лимит ради теста, если не хотите таких уведомлений: бот всё равно ничего не покупает.

Проверьте состояние после restart и перезагрузки VPS

docker compose -p gpu-radar exec -T radar python bot.py --status
docker compose -p gpu-radar restart
docker compose -p gpu-radar exec -T radar python bot.py --status
docker stats --no-stream

Повторите /watches в Telegram: должны сохраниться те же подписки. Затем перезагрузите VPS через панель или sudo reboot, подключитесь повторно и проверьте контейнер и /watches ещё раз. Для полной проверки доставки создайте свежую подходящую подписку: неизменившаяся старая цена намеренно не вызывает повторное уведомление.

Docker должен стартовать при загрузке ОС. restart: unless-stopped возвращает ранее работавший контейнер; явно остановленный оператором контейнер сам не включится. Сохраняйте имя проекта gpu-radar: с другим именем Compose создаст другой volume. docker compose down -v удаляет подписки.

healthy означает свежий heartbeat worker, а не успешную доставку Telegram. В --status есть агрегированные счётчики и время успешной проверки каталога. Исключения сети не обнуляют состояние совпадений. При аварии между отправкой и записью результата возможен дубль; команда при аварии может остаться без ответа. Это не гарантия доставки «ровно один раз».

Расходы и результат проверки

Проверка 2–8 октября 2026 Наблюдаемый результат
Публичный RUB-каталог Запрос и подбор RTX 4090 выполнены; минимальное совпадение в снимке API — 52,25 ₽/ч
Публичный USD-каталог Ответ и подбор в USD проверены отдельно; это не пересчёт RUB-цены
VPS 1 CPU / 1 ГБ / 25 ГБ Каталог показывал 496,40 ₽ за месяц; запрос принят, выделение завершилось ошибкой и сообщением о возврате
VPS 1 CPU / 1 ГБ / 20 ГБ Каталог показывал 450 ₽ за месяц; запрос также завершился ошибкой и сообщением о возврате
Повтор запроса создания Тот же idempotency key вернул тот же ID; второго VPS не появилось
Подписки и повторные уведомления Проверены offline-тестами с SQLite и искусственными Telegram ID
Сборка Docker и пересоздание контейнера Проверены в CI, включая доступ к volume без root и сохранение подписок
Повторная проверка каталога 3 октября Авторизованный API дважды вернул HTTP 200 с пустым списком планов
Создание через API 8 октября Каталог вернул 166 планов; новый VPS по тарифу 1 CPU / 1 ГБ / 20 ГБ за 450 ₽/месяц получил статус active и IP
Перезагрузка через API 8 октября Запрос вернул HTTP 200; следующий запрос состояния показал active. Uptime внутри ОС независимо не проверялся
SSH, работающий бот, Telegram и CPU/RAM SSH из тестового окружения остановился до аутентификации; установка, живая проверка сохранности данных и замеры ещё не выполнены

Цены VPS выше — снимок тестового каталога, не обещание доступности или постоянной стоимости. Никакая GPU для проверки не арендовалась. У бота нет расходов на inference; после успешного создания сервера остаётся его месячная аренда. Остановка контейнера не отменяет оплату VPS.

Публичная страница тарифов VPS всё ещё не показывает планы 8 октября

8 октября 2026: публичная страница тарифов всё ещё не смогла загрузить планы, хотя авторизованный API вернул 166 планов, а созданный VPS получил статус active. Публичный прайс и доступность через API проверяются отдельно. Перед созданием сервера проверьте текущую месячную сумму; не подставляйте старую цену.

Обслуживание собственной копии

/stop выключает уведомления, /delete удаляет строки подписок пользователя. База содержит Telegram chat ID, условия поиска и состояние уведомлений; храните её и резервные копии приватно. Согласованный backup через SQLite backup API и восстановление описаны в README.md внутри архива. Volume не заменяет копию вне VPS.

После смены токена используйте docker compose -p gpu-radar up -d --force-recreate: обычный restart не перечитает .env. Не выводите docker compose config или окружение с реальным токеном на публичный экран.

Дальше: выбор VPS, polling и webhooks, наблюдение и обновления. Для AI-диалога, которому нужен inference API, используйте отдельный Python-пример.

Тарифы из текущего каталога

Сейчас не удалось загрузить планы. Смотрите актуальные тарифы на странице цен.