@@ -657,6 +657,7 @@ async def handle_message(update: Update, ctx: ContextTypes.DEFAULT_TYPE):
657657
658658async def post_init (app : Application ):
659659 scheduler .start ()
660+ asyncio .create_task (self_ping ())
660661 log .info ("Scheduler started" )
661662
662663
@@ -687,19 +688,37 @@ def main():
687688 log .info ("Chronos Bot running — timezone: %s" , TIMEZONE )
688689
689690 import threading
690- from http .server import HTTPServer , BaseHTTPRequestHandler
691-
692- class Health (BaseHTTPRequestHandler ):
693- def do_GET (self ):
694- self .send_response (200 )
695- self .end_headers ()
696- self .wfile .write (b"ok" )
697- def log_message (self , * args ):
698- pass # silence access logs
699-
700- port = int (os .environ .get ("PORT" , 8080 ))
701- threading .Thread (target = lambda : HTTPServer (("0.0.0.0" , port ), Health ).serve_forever (), daemon = True ).start ()
702- log .info ("Health server on port %d" , port )
691+ import asyncio
692+ import httpx
693+ from http .server import HTTPServer , BaseHTTPRequestHandler
694+
695+ class Health (BaseHTTPRequestHandler ):
696+ def do_GET (self ):
697+ self .send_response (200 )
698+ self .end_headers ()
699+ self .wfile .write (b"ok" )
700+ def log_message (self , * args ):
701+ pass
702+
703+ port = int (os .environ .get ("PORT" , 8080 ))
704+ RENDER_URL = os .environ .get ("RENDER_EXTERNAL_URL" , "" )
705+
706+ threading .Thread (
707+ target = lambda : HTTPServer (("0.0.0.0" , port ), Health ).serve_forever (),
708+ daemon = True
709+ ).start ()
710+
711+ async def self_ping ():
712+ if not RENDER_URL :
713+ return
714+ async with httpx .AsyncClient () as client :
715+ while True :
716+ try :
717+ await client .get (RENDER_URL , timeout = 10 )
718+ log .info ("Self-ping OK" )
719+ except Exception as ex :
720+ log .warning ("Self-ping failed: %s" , ex )
721+ await asyncio .sleep (600 ) # every 10 minutes
703722
704723 app .run_polling (allowed_updates = Update .ALL_TYPES )
705724
0 commit comments