104 lines
3.1 KiB
Python
104 lines
3.1 KiB
Python
"""
|
|
Automatic backup scheduler
|
|
Runs database backups on a schedule without needing cron
|
|
"""
|
|
import os
|
|
from datetime import datetime
|
|
from apscheduler.schedulers.background import BackgroundScheduler
|
|
from backup_restore_api import perform_backup
|
|
import logging
|
|
|
|
# Configure logging
|
|
logging.basicConfig(
|
|
level=logging.INFO,
|
|
format='[%(asctime)s] %(levelname)s: %(message)s',
|
|
datefmt='%Y-%m-%d %H:%M:%S'
|
|
)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
scheduler = BackgroundScheduler()
|
|
|
|
|
|
def scheduled_backup_job():
|
|
"""Job that runs on schedule to perform backup"""
|
|
logger.info("Starting scheduled backup...")
|
|
try:
|
|
result = perform_backup()
|
|
if result['success']:
|
|
logger.info(f"✅ Scheduled backup completed: {result['filename']}")
|
|
else:
|
|
logger.error(f"❌ Scheduled backup failed: {result.get('error', 'Unknown error')}")
|
|
except Exception as e:
|
|
logger.error(f"❌ Scheduled backup exception: {str(e)}")
|
|
|
|
|
|
def start_backup_scheduler():
|
|
"""Start the backup scheduler based on environment configuration"""
|
|
|
|
# Get backup interval from environment (default: weekly)
|
|
backup_interval = os.getenv('BACKUP_INTERVAL', 'weekly').lower()
|
|
|
|
if backup_interval == 'disabled':
|
|
logger.info("⏸️ Automatic backups are DISABLED")
|
|
return
|
|
|
|
if backup_interval == 'test' or backup_interval == '1minute':
|
|
# Test mode - every 1 minute
|
|
scheduler.add_job(
|
|
scheduled_backup_job,
|
|
'interval',
|
|
minutes=1,
|
|
id='backup_job',
|
|
replace_existing=True
|
|
)
|
|
logger.info("⏰ Backup scheduler started: EVERY 1 MINUTE (testing mode)")
|
|
logger.warning("⚠️ WARNING: Test mode active! Change BACKUP_INTERVAL to 'weekly' for production")
|
|
|
|
elif backup_interval == 'daily':
|
|
# Daily at 2 AM
|
|
scheduler.add_job(
|
|
scheduled_backup_job,
|
|
'cron',
|
|
hour=2,
|
|
minute=0,
|
|
id='backup_job',
|
|
replace_existing=True
|
|
)
|
|
logger.info("⏰ Backup scheduler started: DAILY at 2:00 AM")
|
|
|
|
elif backup_interval == 'weekly':
|
|
# Weekly - Sunday at 2 AM
|
|
scheduler.add_job(
|
|
scheduled_backup_job,
|
|
'cron',
|
|
day_of_week='sun',
|
|
hour=2,
|
|
minute=0,
|
|
id='backup_job',
|
|
replace_existing=True
|
|
)
|
|
logger.info("⏰ Backup scheduler started: WEEKLY on Sundays at 2:00 AM")
|
|
|
|
else:
|
|
logger.warning(f"⚠️ Unknown BACKUP_INTERVAL: {backup_interval}, defaulting to weekly")
|
|
scheduler.add_job(
|
|
scheduled_backup_job,
|
|
'cron',
|
|
day_of_week='sun',
|
|
hour=2,
|
|
minute=0,
|
|
id='backup_job',
|
|
replace_existing=True
|
|
)
|
|
logger.info("⏰ Backup scheduler started: WEEKLY on Sundays at 2:00 AM")
|
|
|
|
scheduler.start()
|
|
logger.info("✅ Backup scheduler is running")
|
|
|
|
|
|
def stop_backup_scheduler():
|
|
"""Stop the backup scheduler"""
|
|
if scheduler.running:
|
|
scheduler.shutdown()
|
|
logger.info("🛑 Backup scheduler stopped")
|