diff --git a/Dockerfile b/Dockerfile index 10eb97d..a0343d6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,6 +10,7 @@ RUN apt-get update && apt-get install -y \ gcc \ g++ \ python3-dev \ + postgresql-client \ && rm -rf /var/lib/apt/lists/* # Build arguments for GitHub release deployment diff --git a/app/backups/backend/scheduler.py b/app/backups/backend/scheduler.py index 6963702..ad88754 100644 --- a/app/backups/backend/scheduler.py +++ b/app/backups/backend/scheduler.py @@ -1,6 +1,6 @@ """ Backup Scheduler -Manages scheduled backup jobs, rotation, offsite uploads, and retry logic +Manages scheduled backup jobs, rotation, offsite uploads, retry logic, and email fetch """ import logging @@ -26,17 +26,42 @@ class BackupScheduler: self.running = False def start(self): - """Start the backup scheduler with all jobs""" - if not self.enabled: - logger.info("⏭️ Backup scheduler disabled (BACKUP_ENABLED=false)") - return - + """Start the scheduler with enabled jobs (backups and/or emails)""" if self.running: - logger.warning("⚠️ Backup scheduler already running") + logger.warning("⚠️ Scheduler already running") return - logger.info("🚀 Starting backup scheduler...") + logger.info("🚀 Starting unified scheduler...") + # Add backup jobs if enabled + if self.enabled: + self._add_backup_jobs() + else: + logger.info("⏭️ Backup jobs disabled (BACKUP_ENABLED=false)") + + # Email fetch job (every N minutes if enabled) + if settings.EMAIL_TO_TICKET_ENABLED: + self.scheduler.add_job( + func=self._email_fetch_job, + trigger=IntervalTrigger(minutes=settings.EMAIL_PROCESS_INTERVAL_MINUTES), + id='email_fetch', + name='Email Fetch & Process', + max_instances=1, + replace_existing=True + ) + logger.info("✅ Scheduled: Email fetch every %d minute(s)", + settings.EMAIL_PROCESS_INTERVAL_MINUTES) + else: + logger.info("⏭️ Email fetch disabled (EMAIL_TO_TICKET_ENABLED=false)") + + # Start the scheduler + self.scheduler.start() + self.running = True + + logger.info("✅ Scheduler started successfully") + + def _add_backup_jobs(self): + """Add all backup-related jobs to scheduler""" # Daily full backup at 02:00 CET self.scheduler.add_job( func=self._daily_backup_job, @@ -105,12 +130,6 @@ class BackupScheduler: replace_existing=True ) logger.info("✅ Scheduled: Storage check at 01:30") - - # Start the scheduler - self.scheduler.start() - self.running = True - - logger.info("✅ Backup scheduler started successfully") def stop(self): """Stop the backup scheduler""" @@ -377,6 +396,25 @@ class BackupScheduler: except Exception as e: logger.error("❌ Storage check error: %s", str(e), exc_info=True) + async def _email_fetch_job(self): + """Email fetch and processing job""" + try: + logger.info("🔄 Email processing job started...") + + # Import here to avoid circular dependencies + from app.services.email_processor_service import EmailProcessorService + + processor = EmailProcessorService() + start_time = datetime.now() + stats = await processor.process_inbox() + + duration = (datetime.now() - start_time).total_seconds() + + logger.info(f"✅ Email processing complete: {stats} (duration: {duration:.1f}s)") + + except Exception as e: + logger.error(f"❌ Email processing job failed: {e}") + def _get_weekday_number(self, day_name: str) -> int: """Convert day name to APScheduler weekday number (0=Monday, 6=Sunday)""" days = { diff --git a/app/backups/templates/index.html b/app/backups/templates/index.html index 30f5372..990bedd 100644 --- a/app/backups/templates/index.html +++ b/app/backups/templates/index.html @@ -248,13 +248,18 @@
Træk emails hertil