Files
vpn-control-panel/app/scheduler/scheduler.py
smolkik-code 7c7c88621d Initial commit: VPN Control Panel
- 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
2026-07-05 17:50:11 +07:00

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