feat: Add comprehensive auto-sync functionality

 New Features:
- Auto-sync service with configurable intervals (15min, 30min, 1hour, 6hours, 12hours, 24hours, custom cron)
- Automatic JSON file synchronization from GitHub repositories
- Auto-download new scripts when JSON files are updated
- Auto-update existing scripts when newer versions are available
- Apprise notification service integration for sync status updates
- Comprehensive error handling and logging

🔧 Technical Implementation:
- AutoSyncService: Core scheduling and execution logic
- GitHubJsonService: Handles JSON file synchronization from GitHub
- AppriseService: Sends notifications via multiple channels (Discord, Telegram, Email, Slack, etc.)
- ScriptDownloaderService: Manages automatic script downloads and updates
- Settings API: RESTful endpoints for auto-sync configuration
- UI Integration: Settings modal with auto-sync configuration options

📋 Configuration Options:
- Enable/disable auto-sync functionality
- Flexible scheduling (predefined intervals or custom cron expressions)
- Selective script processing (new downloads, updates, or both)
- Notification settings with multiple Apprise URL support
- Environment-based configuration with .env file persistence

🎯 Benefits:
- Keeps script repository automatically synchronized
- Reduces manual maintenance overhead
- Provides real-time notifications of sync status
- Supports multiple notification channels
- Configurable to match different deployment needs

This feature significantly enhances the automation capabilities of PVE Scripts Local,
making it a truly hands-off solution for script management.
This commit is contained in:
Michel Roegl-Brunner
2025-10-24 12:28:44 +02:00
parent 86f55069e6
commit e0bea6c6e0
14 changed files with 2664 additions and 21 deletions

View File

@@ -0,0 +1,65 @@
import { AutoSyncService } from '../services/autoSyncService.js';
let autoSyncService = null;
/**
* Initialize auto-sync service and schedule cron job if enabled
*/
export function initializeAutoSync() {
try {
console.log('Initializing auto-sync service...');
autoSyncService = new AutoSyncService();
// Load settings and schedule if enabled
const settings = autoSyncService.loadSettings();
if (settings.autoSyncEnabled) {
console.log('Auto-sync is enabled, scheduling cron job...');
autoSyncService.scheduleAutoSync();
} else {
console.log('Auto-sync is disabled');
}
console.log('Auto-sync service initialized successfully');
} catch (error) {
console.error('Failed to initialize auto-sync service:', error);
}
}
/**
* Stop auto-sync service and clean up cron jobs
*/
export function stopAutoSync() {
try {
if (autoSyncService) {
console.log('Stopping auto-sync service...');
autoSyncService.stopAutoSync();
autoSyncService = null;
console.log('Auto-sync service stopped');
}
} catch (error) {
console.error('Error stopping auto-sync service:', error);
}
}
/**
* Get the auto-sync service instance
*/
export function getAutoSyncService() {
return autoSyncService;
}
/**
* Graceful shutdown handler
*/
export function setupGracefulShutdown() {
const shutdown = (signal) => {
console.log(`Received ${signal}, shutting down gracefully...`);
stopAutoSync();
process.exit(0);
};
process.on('SIGTERM', () => shutdown('SIGTERM'));
process.on('SIGINT', () => shutdown('SIGINT'));
process.on('SIGUSR2', () => shutdown('SIGUSR2')); // For nodemon
}