Обычный способ запустить бота на Windows VPS — стартовать его в сеансе RDP и закрыть окно. Это работает, пока обновление не перезагрузит сервер в 3 часа ночи, и запускать бота станет некому. Планировщик заданий, который есть на любом Windows Server, решает это без дополнительных программ. Схема ниже:
- запускает скрипт при загрузке, до того как кто-то вошёл;
- перезапускает его в течение минуты, если он упал или его убили;
- никогда не запускает две копии одновременно.
Все три пункта мы проверили на нашем образе Windows Server 2022: убивали процесс, перезагружали сервер и считали экземпляры.
Пример скрипта
Замена вашему боту: каждые 10 секунд пишет строку, так что легко видеть, жив ли он.
New-Item -ItemType Directory -Force C:\bots | Out-Null
Set-Content C:\bots\heartbeat.ps1 -Encoding ascii -Value @'
while ($true) {
Add-Content -Path C:\bots\heartbeat.log -Value ("{0:u} pid {1}" -f (Get-Date), $PID)
Start-Sleep -Seconds 10
}
'@
Зарегистрируйте задачу
Выполните в PowerShell с правами администратора:
$action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument '-NoProfile -ExecutionPolicy Bypass -File C:\bots\heartbeat.ps1' -WorkingDirectory 'C:\bots'
$atBoot = New-ScheduledTaskTrigger -AtStartup
$everyMin = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 1)
$settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit ([TimeSpan]::Zero) -MultipleInstances IgnoreNew -StartWhenAvailable
Register-ScheduledTask -TaskName 'mybot' -Action $action -Trigger $atBoot, $everyMin -Settings $settings -User 'SYSTEM' -RunLevel Highest
Start-ScheduledTask -TaskName 'mybot'
Что делает каждая часть:
-AtStartupзапускает бота при загрузке Windows, без вошедшего пользователя.- Повтор раз в минуту перезапускает задачу каждую минуту. Если бот жив, ничего не происходит; если он упал, он стартует снова.
-MultipleInstances IgnoreNewделает повтор безопасным: запуск, который застаёт бота работающим, пропускается.-ExecutionTimeLimit 0отключает стандартный предел в 72 часа, после которого Планировщик остановил бы бота.-User 'SYSTEM'запускает его без пароля и без сеанса. У SYSTEM полные права на сервере, поэтому так запускайте только свой код.
Для Python замените действие:
$action = New-ScheduledTaskAction -Execute 'C:\Program Files\Python312\python.exe' -Argument 'C:\bots\bot.py' -WorkingDirectory 'C:\bots'
Что мы проверили
Падение. Мы убили процесс бота через Stop-Process -Force. Через 46 секунд ежеминутный триггер запустил новый, и копия была ровно одна.
Перезагрузка. Мы перезагрузили сервер и не входили в систему. Через 40 секунд после загрузки бот уже писал в журнал, а пользовательских сеансов на сервере не было.
Что не сработало. Две вещи выглядят правильно, но не работают:
- «При сбое выполнения перезапускать через…» Мы её включили, убили процесс, и задача несколько минут стояла в состоянии «Готово». Настройка реагирует на то, что задача не смогла запуститься, а не на падение вашей программы потом.
- Обёртка с циклом (
while ($true) { & bot; sleep 5 }). Она перезапускает упавшего бота, но если умирает сама обёртка, её дочерний процесс продолжает работать, а следующий запуск стартует второго бота. У нас оказалось две копии, а для Telegram-бота это два процесса, которые дерутся за одни и те же обновления.
Как проверить
Get-ScheduledTask -TaskName mybot | Select-Object TaskName, State
Get-ScheduledTaskInfo -TaskName mybot | Select-Object LastRunTime, NextRunTime
Get-Content C:\bots\heartbeat.log -Tail 5
Чтобы остановить бота на обслуживание, сначала выполните Disable-ScheduledTask mybot (иначе ежеминутный триггер запустит его снова), потом остановите процесс. Enable-ScheduledTask mybot возвращает всё обратно.
Журналы
Задача не сохраняет вывод. Пусть бот сам пишет журнал в файл, как в примере, или перенаправьте вывод в маленьком файле .cmd и укажите его в -Execute.
Какой тариф
Бот на PowerShell или Python почти не нагружает процессор, но сама Windows в простое занимает на нашем образе от 1 до 1,3 ГБ памяти. Windows-Small (4 vCPU, 4 ГБ памяти, 50 ГБ, $11/мес) — подходящий размер для одного-двух ботов. На тарифе с NAT исходящие подключения (Telegram, API бирж, вызовы веб-хуков) работают как обычно. Если бот должен принимать веб-хуки или другой входящий трафик, берите Windows Small-IP ($28/мес) с собственным IPv4.
Дальше: защитите RDP, а если удобнее управлять ботом по SSH, установите OpenSSH. Оплата в USDT, USDC или ETH, Windows — это Server 2022 с вашей лицензией (BYOL). Все тарифы: Windows VPS.
Комментарии
Пока нет комментариев. Будьте первым.