Soumik555 commited on
Commit
185186c
·
0 Parent(s):

cronjob first commit

Browse files
Files changed (6) hide show
  1. .env +5 -0
  2. Dockerfile +31 -0
  3. README.md +9 -0
  4. cronjob_service.py +65 -0
  5. main.py +10 -0
  6. requirements.txt +5 -0
.env ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ DAILY_CHAT_RATE_LIMIT_RESET_URL = "https://chatcsvandpdf.vercel.app/api/cron"
2
+ DAILY_CHAT_RATE_LIMIT_RESET_TOKEN = "UlZgKsZy7tw1Q08HVCAT8aQSw1z1igCsBMWCiwH8W3DAy50XbBmQc3rzi8iOZ"
3
+
4
+ API_ONLY_USER_CHAT_LIMIT_RESET_URL = "https://chatcsvandpdf.vercel.app/api/v1/cron"
5
+ API_ONLY_USER_CHAT_LIMIT_RESET_TOKEN = "A5u86eKOoKbokzEvssY4s6iG88k99oiyTU0r6UPWkL7HYz8fT3Sedb5YBTCuEoLUrtJqcFOiaFkIkwrpicSptb8YoXL2rICyuaLzeCR5iA0K8Bvb0SYQwKtLfLBYtHxx9MHMXgSAwWr3RjqhXy5GIQJqY0UimHVQQuoJ589KKCbXOAcJt14xajeYrvY3JBy8AeRquWSUZw00L1Qkt85zq7h5BaX2wWi429ogZOJ91wmSqrisM6PRfV4Q3pHZ42FOgMfMqgtoTOZaizFwu0KPmAALVOQd1JtqCdMAgFrUZuzdJ9BWPhJA09uiD1ykHb5df3RSzgdbeyqjwR47ZwFlYzGoFGwCBdRb432ZsqY1KFJuZjKwKCysouzvg17dP4udu3lpM3Oa8Ie9e0yDmyZiUKxvY7uGtEDay2BKIdtgLqabrO5H5LvrUfA59lHDXAcB8xpUD2fSF9mGqiYMgviWqzhc5mH4faqMWEHZyo7TUzldpSOSC92430t0DJDa1LBj"
Dockerfile ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.11-slim
2
+
3
+ # Create app user and directory
4
+ RUN useradd -m appuser && \
5
+ mkdir -p /app && \
6
+ chown appuser:appuser /app
7
+
8
+ WORKDIR /app
9
+
10
+ # Install system dependencies
11
+ RUN apt-get update && \
12
+ apt-get install -y --no-install-recommends curl && \
13
+ rm -rf /var/lib/apt/lists/*
14
+
15
+ COPY --chown=appuser:appuser . .
16
+
17
+ USER appuser
18
+
19
+ # Install Python dependencies
20
+ RUN pip install --no-cache-dir -r requirements.txt
21
+
22
+ EXPOSE 7860
23
+
24
+ HEALTHCHECK --interval=30s --timeout=3s \
25
+ CMD curl -f http://localhost:7860/ping || exit 1
26
+
27
+ # Single command to run everything
28
+ CMD bash -c "python -m uvicorn main:app --host 0.0.0.0 --port 7860 & \
29
+ while sleep 300; do \
30
+ curl -s http://localhost:7860/ping > /dev/null || exit 1; \
31
+ done"
README.md ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Cronjob
3
+ emoji: 🚀
4
+ colorFrom: blue
5
+ colorTo: purple
6
+ sdk: docker
7
+ app_file: main.py
8
+ pinned: false
9
+ ---
cronjob_service.py ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import logging
2
+ import requests
3
+ import pytz
4
+ from datetime import time
5
+ from apscheduler.schedulers.background import BackgroundScheduler
6
+ from apscheduler.triggers.cron import CronTrigger
7
+ from dotenv import load_dotenv
8
+ import os
9
+
10
+ load_dotenv()
11
+
12
+ # --- Configuration ---
13
+ DAILY_CHAT_RATE_LIMIT_RESET_URL = os.getenv("DAILY_CHAT_RATE_LIMIT_RESET_URL")
14
+ DAILY_CHAT_RATE_LIMIT_RESET_TOKEN = os.getenv("DAILY_CHAT_RATE_LIMIT_RESET_TOKEN")
15
+
16
+ API_ONLY_USER_CHAT_LIMIT_RESET_URL = os.getenv("API_ONLY_USER_CHAT_LIMIT_RESET_URL")
17
+ API_ONLY_USER_CHAT_LIMIT_RESET_TOKEN = os.getenv("API_ONLY_USER_CHAT_LIMIT_RESET_TOKEN")
18
+ US_TIMEZONE = 'US/Eastern'
19
+ LOG_FILE = 'cronjob_log.log'
20
+
21
+ # --- Logging Setup ---
22
+ logging.basicConfig(
23
+ level=logging.INFO,
24
+ format='%(asctime)s - %(levelname)s - %(message)s',
25
+ handlers=[
26
+ logging.FileHandler(LOG_FILE),
27
+ logging.StreamHandler()
28
+ ]
29
+ )
30
+
31
+ def call_service(url: str, token: str, service_name: str):
32
+ """Makes a POST request to the specified URL with Bearer token."""
33
+ logging.info(f"Calling {service_name} at {url}")
34
+ headers = {
35
+ "Authorization": f"Bearer {token}",
36
+ "Content-Type": "application/json"
37
+ }
38
+
39
+ try:
40
+ response = requests.post(url, headers=headers)
41
+ response.raise_for_status()
42
+ logging.info(f"{service_name} success. Status: {response.status_code}")
43
+ except Exception as e:
44
+ logging.error(f"{service_name} failed: {str(e)}")
45
+
46
+ def init_scheduler():
47
+ """Initialize and start the scheduler"""
48
+ scheduler = BackgroundScheduler(timezone=pytz.timezone(US_TIMEZONE))
49
+
50
+ scheduler.add_job(
51
+ call_service,
52
+ trigger=CronTrigger(hour=0, minute=0, second=0),
53
+ args=[DAILY_CHAT_RATE_LIMIT_RESET_URL, DAILY_CHAT_RATE_LIMIT_RESET_TOKEN, "DAILY_RESET"],
54
+ id='daily_chat_limit_reset_web_users'
55
+ )
56
+
57
+ scheduler.add_job(
58
+ call_service,
59
+ trigger=CronTrigger(hour=0, minute=5, second=0),
60
+ args=[API_ONLY_USER_CHAT_LIMIT_RESET_URL, API_ONLY_USER_CHAT_LIMIT_RESET_TOKEN, "API_RESET"],
61
+ id='daily_chat_limit_reset_api_users'
62
+ )
63
+
64
+ scheduler.start()
65
+ return scheduler
main.py ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI
2
+ from cronjob_service import init_scheduler
3
+ import threading
4
+
5
+ app = FastAPI()
6
+ scheduler = init_scheduler()
7
+
8
+ @app.get("/ping")
9
+ def health_check():
10
+ return {"status": "ok"}
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ APScheduler
2
+ pytz
3
+ fastapi
4
+ uvicorn
5
+ requests