- FastAPI REST API with JWT auth - aiogram 3 Telegram bot with admin middleware - APScheduler daily tasks (expiry, reminders, revoke, sync) - SQLAlchemy 2 async ORM with Alembic migrations - Jinja2 admin panel (Dashboard, Users, Payments, Servers, Tariffs) - VPN provider abstraction with MockProvider - Stats service with revenue/subscription analytics - Docker Compose (PostgreSQL + Redis + app) - Healthcheck endpoint
50 lines
1.4 KiB
Python
50 lines
1.4 KiB
Python
from apscheduler.schedulers.asyncio import AsyncIOScheduler
|
|
from apscheduler.triggers.cron import CronTrigger
|
|
from loguru import logger
|
|
|
|
from app.scheduler.tasks.expire_subscriptions import expire_subscriptions
|
|
from app.scheduler.tasks.send_reminders import send_reminders
|
|
from app.scheduler.tasks.revoke_expired import revoke_expired
|
|
from app.scheduler.tasks.sync_servers import sync_servers
|
|
|
|
|
|
def setup_scheduler() -> AsyncIOScheduler:
|
|
scheduler = AsyncIOScheduler(timezone="UTC")
|
|
|
|
daily = CronTrigger(hour=3, minute=0)
|
|
|
|
scheduler.add_job(
|
|
expire_subscriptions,
|
|
trigger=daily,
|
|
id="expire_subscriptions",
|
|
name="Check and expire subscriptions",
|
|
replace_existing=True,
|
|
)
|
|
|
|
scheduler.add_job(
|
|
send_reminders,
|
|
trigger=daily,
|
|
id="send_reminders",
|
|
name="Send subscription expiry reminders",
|
|
replace_existing=True,
|
|
)
|
|
|
|
scheduler.add_job(
|
|
revoke_expired,
|
|
trigger=daily,
|
|
id="revoke_expired",
|
|
name="Revoke VPN access for expired users",
|
|
replace_existing=True,
|
|
)
|
|
|
|
scheduler.add_job(
|
|
sync_servers,
|
|
trigger=daily,
|
|
id="sync_servers",
|
|
name="Sync server status and health",
|
|
replace_existing=True,
|
|
)
|
|
|
|
logger.info("Scheduler configured with {} daily jobs", len(scheduler.get_jobs()))
|
|
return scheduler
|