Overview
Implement the Configuration Backup subsystem alongside the existing heartbeat and inventory paths: ingest on collect, managed reads on backend, S3-compatible object storage, retention + GDPR purge, security hardening, legacy-client transition via the nethinfra proxy, and the admin UI.
Requirements
Core features
collect (ingest + appliance-facing read)
backend (UI-facing read + GDPR)
Storage abstraction
Frontend
Docs
PRs
Design mockup: #82
Remaining work to go live
Blocking
Operational (at production cutover)
Overview
Implement the Configuration Backup subsystem alongside the existing
heartbeatandinventorypaths: ingest oncollect, managed reads onbackend, S3-compatible object storage, retention + GDPR purge, security hardening, legacy-client transition via the nethinfra proxy, and the admin UI.Requirements
Core features
DestroySystem.collect (ingest + appliance-facing read)
POST /api/systems/backups— streaming upload with SHA-256 tee, metadata sanitised, inline retention under Redis lock, per-system rate limit.GET /api/systems/backups— list for the authenticated system (paginated internally — never truncated at S3's 1000-item cap).GET /api/systems/backups/:id— download for the authenticated system.backend (UI-facing read + GDPR)
GET /api/systems/:id/backupswith aggregate counters (slots_used,quota_used_bytes).GET /api/systems/:id/backups/:backup_id/download— short-lived presigned URL.DELETE /api/systems/:id/backups/:backup_id.GET /api/systems/:id.Storage abstraction
storage/s3.gobetween backend + collect.Frontend
Docs
docs/systems/backups(EN + IT).collect/README.md,backend/README.md— setup, env vars, bucket layout, split credentials.AGENTS.md— new endpoint family, key layout, naming convention (plural vs singular).PRs
NethServer/myserver + UI: feat(backup): configuration backup service (collect ingest + backend UI API) #81NethServer/ns8-coreclient dual-send: feat(backup): dual-send cluster backup to my-new proxy ns8-core#1146NethServer/nethsecurityclient dual-send: feat(ns-plug): dual-send backup to my-new proxy nethsecurity#1608nethinfraproxy: internal repo commit (not upstream)Design mockup: #82
Remaining work to go live
Blocking
COLLECT_BACKUP_URLoverride on my-ent (currently points at the PR feat(backup): configuration backup service (collect ingest + backend UI API) #81 Render preview) back to the stablemy.nethesis.ithost once feat(backup): configuration backup service (collect ingest + backend UI API) #81 is promoted.Operational (at production cutover)
BACKUP_S3_*env on the Render prod environment (endpoint, region, bucket, access key, secret).my-backups-prodvs. shared with QA).collect/README.md.