feat: Veeam VSPC backup integration - sync, compliance, UI

- Database: 7 Veeam tables + backup_type_udf column on configuration_items
- API Client: VSPC REST API v3 client with pagination, rate limiting, Bearer auth
- Sync Service: full/incremental sync for orgs, servers, repos, jobs, agent jobs, workloads
- Scheduler: veeam-incremental (30min) and veeam-full (daily 2AM) schedules
- Compliance Engine: cross-references Autotask config items vs Veeam workloads
- API Endpoints: backup-status, companies, workloads, jobs, repos, compliance, sync
- UI: Backup Status page with Overview + Contract Compliance tabs
- Navigation: added Backup Status link with HardDrive icon
- Docker: added VEEAM_VSPC_URL and VEEAM_VSPC_API_KEY env vars to compose
This commit is contained in:
lorentz 2026-02-11 21:04:28 -05:00
parent a1e0e7c7c0
commit 5dc7a7e66b
27 changed files with 3408 additions and 7 deletions

View file

@ -371,6 +371,16 @@ function mapConfigurationItem(data: any): Record<string, any> {
is_deleted: data.is_deleted || false,
};
// Extract backup-type UDF (ID 29693319) from userDefinedFields
if (data.userDefinedFields && Array.isArray(data.userDefinedFields)) {
const backupUdf = data.userDefinedFields.find(
(udf: any) => udf.name === 'Backup Type' || String(udf.name) === '29693319'
);
if (backupUdf && backupUdf.value) {
mapped.backup_type_udf = backupUdf.value;
}
}
// Add all other fields dynamically
const fieldsToInclude = [
'daily_cost', 'hourly_cost', 'monthly_cost', 'per_use_cost', 'setup_fee',