La façon habituelle de faire tourner un bot sur un VPS Windows, c'est de le lancer dans une session RDP et de fermer la fenêtre. Cela marche jusqu'à ce qu'une mise à jour redémarre le serveur à 3 h du matin et que personne ne le relance. Le Planificateur de tâches, présent sur tout Windows Server, règle cela sans logiciel supplémentaire. La configuration ci-dessous :
- lance le script au démarrage, avant que quiconque se connecte ;
- le relance en moins d'une minute s'il plante ou est tué ;
- ne lance jamais deux copies en même temps.
Nous avons testé les trois sur notre image Windows Server 2022 : processus tué, serveur redémarré, instances comptées.
Le script d'exemple
Un remplaçant de votre bot : il écrit une ligne toutes les 10 secondes, on voit donc facilement s'il est vivant.
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
}
'@
Enregistrer la tâche
Lancez dans un PowerShell élevé :
$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'
Ce que fait chaque élément :
-AtStartuplance le bot au démarrage de Windows, sans utilisateur connecté.- La répétition chaque minute relance la tâche toutes les minutes. Si le bot est vivant, rien ne se passe ; s'il est mort, il redémarre.
-MultipleInstances IgnoreNewrend la répétition sûre : une exécution qui trouve le bot déjà en marche est ignorée.-ExecutionTimeLimit 0supprime la limite par défaut de 72 heures, après laquelle le Planificateur arrêterait le bot.-User 'SYSTEM'l'exécute sans mot de passe ni session. SYSTEM a tous les droits sur le serveur : n'exécutez ainsi que votre propre code.
Pour Python, remplacez l'action :
$action = New-ScheduledTaskAction -Execute 'C:\Program Files\Python312\python.exe' -Argument 'C:\bots\bot.py' -WorkingDirectory 'C:\bots'
Ce que nous avons vérifié
Plantage. Nous avons tué le processus du bot avec Stop-Process -Force. 46 secondes plus tard, le déclencheur de chaque minute en avait lancé un nouveau, et il y avait exactement une copie.
Redémarrage. Nous avons redémarré le serveur sans nous connecter. 40 secondes après le démarrage, le bot écrivait dans son journal, sans aucune session utilisateur sur le serveur.
Ce qui n'a pas marché. Deux choses semblent justes et ne le sont pas :
- « Si la tâche échoue, la redémarrer toutes les… » Nous l'avons activée, tué le processus, et la tâche est restée plusieurs minutes à l'état Prêt. L'option réagit à un échec de démarrage de la tâche, pas à la mort ultérieure de votre programme.
- Une boucle enveloppe (
while ($true) { & bot; sleep 5 }). Elle relance un bot planté, mais si l'enveloppe elle-même meurt, son enfant continue de tourner, et le démarrage suivant lance un second bot. Nous nous sommes retrouvés avec deux copies, ce qui pour un bot Telegram veut dire deux processus qui se disputent les mêmes mises à jour.
Le surveiller
Get-ScheduledTask -TaskName mybot | Select-Object TaskName, State
Get-ScheduledTaskInfo -TaskName mybot | Select-Object LastRunTime, NextRunTime
Get-Content C:\bots\heartbeat.log -Tail 5
Pour l'arrêter pendant une maintenance, faites d'abord Disable-ScheduledTask mybot (sinon le déclencheur de chaque minute le relance), puis arrêtez le processus. Enable-ScheduledTask mybot le remet en route.
Journaux
La tâche ne capture pas la sortie. Faites écrire au bot son propre journal, comme dans l'exemple, ou redirigez la sortie dans un petit lanceur .cmd et pointez -Execute vers ce fichier.
Quelle offre
Un bot PowerShell ou Python consomme peu de CPU, mais Windows lui-même occupe de 1 à 1,3 Go de RAM au repos sur notre image. Windows-Small (4 vCPU, 4 Go de RAM, 50 Go, $11/mois) est la bonne taille pour un ou deux bots. Sur une offre NAT, les connexions sortantes (Telegram, API d'exchanges, webhooks que vous appelez) fonctionnent normalement. Si le bot doit recevoir des webhooks ou d'autres flux entrants, prenez Windows Small-IP ($28/mois) avec sa propre IPv4.
Ensuite : sécurisez RDP et, si vous préférez gérer le bot par SSH, installez OpenSSH. Le paiement se fait en USDT, USDC ou ETH, et Windows est Server 2022 avec votre propre licence (BYOL). Toutes les offres : Windows VPS.
Commentaires
Pas encore de commentaires. Soyez le premier.