keep-alive / src /app.py
sghorbal
add a cool down between pings
abbb598
import os
from dotenv import load_dotenv
import time
import base64
import requests
import threading
import gradio as gr
from fastapi.responses import JSONResponse, RedirectResponse
from fastapi import FastAPI, Request, Response, status
from src.utils import (
manage_urls,
wake_up_space,
get_wake_up_action_name,
get_url_list,
)
# Charger les variables d'environnement
load_dotenv()
app = FastAPI()
USERNAME = os.getenv("USERNAME")
PASSWORD = os.getenv("PASSWORD")
@app.middleware("http")
async def basic_auth(request: Request, call_next):
auth = request.headers.get("Authorization")
expected = "Basic " + base64.b64encode(f"{USERNAME}:{PASSWORD}".encode()).decode()
if USERNAME and PASSWORD and auth != expected:
return Response(
status_code=status.HTTP_401_UNAUTHORIZED,
headers={"WWW-Authenticate": "Basic"},
content="Unauthorized",
)
return await call_next(request)
# Interface Gradio
interface = gr.Interface(
fn=manage_urls,
inputs=[
gr.Radio(choices=["Ajouter", "Supprimer"], label="Action"),
gr.Textbox(label="URL"),
],
outputs=[
gr.Textbox(label="Message"),
gr.Textbox(label="Liste actuelle des URLs", lines=10, interactive=False),
],
title="🔐 Gestion des URLs à pinger",
description="Ajoutez ou supprimez dynamiquement des URLs à surveiller. La liste actuelle est toujours affichée.",
flagging_dir="/tmp/flags"
)
@app.get("/")
def root_redirect():
return RedirectResponse(url="/gradio")
@app.get("/check_health")
def check_health():
return JSONResponse(content={"status": "ok", "nb_urls": len(get_url_list())})
# Background thread pour pinger les URLs toutes les heures
def ping_loop():
while True:
for url in get_url_list():
try:
if get_wake_up_action_name(url):
print(f"[wake-up] 🚀 {url}")
wake_up_space(url)
else:
requests.get(url, timeout=5)
print(f"[ping] ✅ {url}")
except Exception as e:
print(f"[ping] ❌ {url} | {e}")
# Cooldown de 1 seconde entre les pings
time.sleep(1)
time.sleep(3600) # 1h
threading.Thread(target=ping_loop, daemon=True).start()
# Monter Gradio sur /gradio
gr.mount_gradio_app(app, interface, path="/gradio")