Skava Skava / Wiki

Backup dell'azienda

Gli amministratori e i proprietari dell'azienda aprono la propria azienda nell'app web e selezionano Backup. Possono richiedere backup, scaricare file ZIP e gestire le chiavi API per il proprio server di backup. Questa esportazione non è disponibile nell'app mobile.

Ambito e limiti

Il backup contiene le chat di progetto regolari dell'azienda, incluse quelle archiviate, con messaggi, reazioni, schede chat e gli allegati caricati associati. Include anche metadati di progetto e chat, nomi dei partecipanti e documenti aziendali pubblicati in quelle chat. Gli amministratori e i proprietari dell'azienda possono eseguire il backup delle chat aziendali a cui non hanno aderito personalmente.

I messaggi diretti, le note private, i servizi visibili solo a livello personale, le chat tra aziende e le bozze personali sono esclusi. I contenuti di Company Drive e dei link esterni sono al di fuori di questa esportazione chat. Gli allegati associati mancanti causano il fallimento della generazione. Il ZIP è un'esportazione dati; l'importazione automatica in Skava non è ancora disponibile.

Quote, incrementali e conservazione

Ogni azienda può richiedere un backup completo entro 7 giorni e due backup incrementali entro 24 ore. Queste finestre mobili iniziano con ogni richiesta. Il download ripetuto dello stesso file già pronto non consuma la quota di generazione. I lavori di generazione falliti non contano verso questi limiti.

Ogni incrementale contiene le modifiche e le eliminazioni dal ultimo backup completamente trasferito e confermato tramite checksum. La catena è A + B + C: A è il backup completo, B contiene le modifiche da A, e C solo ulteriori modifiche da B. Ricostruisci lo stato applicando ogni pacchetto in ordine. Gli allegati invariati si riferiscono a file già presenti in questa catena.

I download restano disponibili per 24 ore dopo la fine della generazione. Il ZIP viene poi rimosso, mentre la cronologia resta. Conserva localmente il backup completo e ogni incrementale associato. Lo stato di confronto resta utilizzabile per al massimo 90 giorni dopo il backup completo; dopo è richiesto un nuovo backup completo. Ogni incrementale identifica sia il backup completo sia il suo predecessore diretto tramite ID e SHA-256.

Solo un pacchetto completamente ricevuto e confermato diventa il nuovo predecessore. Un incrementale pronto ma non confermato blocca un altro incrementale fino a conferma o scadenza. Dopo la scadenza di un pacchetto non confermato, il tentativo successivo parte dall'ultimo stato confermato e include le modifiche non ancora backup. Se una parte confermata manca localmente, scaricala di nuovo entro la sua disponibilità di 24 ore o avvia un nuovo backup completo soggetto al limite settimanale. Preferisci una directory di backup condivisa per azienda; i client indipendenti devono mantenere la stessa catena completa.

Configura una chiave API

In Chiavi API, inserisci un nome come “NAS aziendale” e crea la chiave. Viene visualizzata una sola volta, scade dopo un anno e può essere revocata in qualsiasi momento. Conservala nel vault di segreti protetto del tuo ambiente di backup. La chiave appartiene all'azienda e può accedere solo all'API di backup di quell'azienda. Funziona in modo indipendente dal successivo accesso del suo creatore.

Trasmettila tramite HTTPS nell'header Authorization: Bearer YOUR_BACKUP_TOKEN. Tieni le chiavi fuori da URL, script pubblici e log. Solo gli amministratori e i proprietari dell'azienda possono creare, elencare e revocare le chiavi.

App web: chiave API con data di scadenza e azione di revoca
Gestione delle chiavi nell'app web: nome, validità e revoca per ogni programma di backup.

Python: scarica un backup completo e gli incrementali

Scarica il client Python company_backup.py e posizionalo accanto al tuo script. Richiede Python 3.10 o versioni successive su Linux o macOS e utilizza solo la libreria standard. Imposta SKAVA_BACKUP_TOKEN nell'ambiente di processo protetto e sostituisci 42 con l'ID dell'azienda dall'indirizzo dell'app web.

import os
from company_backup import BackupClient

client = BackupClient("https://chat.skava.io", 42,
                      os.environ["SKAVA_BACKUP_TOKEN"])
full = client.backup("full", "backups")  # once every 7 days
# Later, up to twice in a rolling 24-hour window:
diff = client.backup("diff", "backups")

I job pianificati possono richiamare direttamente lo stesso client:

python3 company_backup.py --company 42 --kind full --directory backups
python3 company_backup.py --company 42 --kind diff --directory backups

Il client richiede la generazione, interroga lo stato, scarica lo stream su disco, verifica dimensione, SHA-256 e contenuto del ZIP e conferma la ricezione. Salva backup completi e incrementali come file separati. Mantieni il file di stato nascosto in quella directory: contiene le informazioni sulla catena e sulla ripresa. Prima di richiedere un altro incremento, il client verifica ogni file ZIP precedente. Dopo un'interruzione, ripeti lo stesso comando. I job concorrenti per la stessa azienda nella stessa directory vengono prevenuti.

Flusso API senza connessione persistente

  1. Richiesta: POST /api/v1/companies/42/backups con {"kind":"full","request_id":"YOUR_UNIQUE_ID"}. Per un incremento, imposta kind su diff e invia l'ID del tuo backup completo locale come base_id e l'ID dell'ultimo pacchetto confermato come parent_id. La risposta fornisce job.id. Riutilizza lo stesso request_id in caso di nuovo tentativo.
  2. Interrogazione: GET /api/v1/companies/42/backups/JOB_ID, circa ogni dieci secondi. La generazione avviene in background durante queued o running. Nessuna connessione rimane aperta tra le richieste.
  3. Download: In stato ready con available: true, chiamare GET /api/v1/companies/42/backups/JOB_ID/download. Solo questo trasferimento mantiene la connessione aperta. In caso di interruzione, scaricare nuovamente l'intero file.
  4. Conferma la ricezione: Verifica job.bytes e job.sha256. Prendi X-Backup-Download-Id e X-Backup-Receipt dagli header della risposta di download. Invia POST /api/v1/companies/42/backups/JOB_ID/downloads/DOWNLOAD_ID/confirm con {"receipt":"RECEIPT","bytes":12345,"sha256":"SHA256"}. Solo un trasferimento completo con una conferma corrispondente è considerato riuscito.

GET /api/v1/companies/42/backups restituisce lo storico, paginato tramite next_offset. Quote esaurite o limiti temporanei di capacità restituiscono HTTP 429 con Retry-After. I backup vengono generati in sequenza entro i limiti, in modo che i job notturni simultanei non sovraccarichino l'applicazione.

Comprendere lo storico dei download

La cronologia mostra il tipo completo o incrementale, l'ora della richiesta, la scadenza, il backup completo, il predecessore e ogni tentativo di download con i byte trasferiti. "Pronto" identifica un file generato. "Trasferito" significa che il server ha inviato tutti i byte. "Checksum confermato" significa che il client ha verificato e confermato la ricezione completa. I tentativi interrotti e falliti restano visibili.

App web: backup incrementale con predecessore, scadenza del download e checksum confermato
Lo storico dei download mostra la catena di backup, la finestra di 24 ore e la ricezione verificata di tutti i dati.

L'app web verifica la ricezione nel browser prima della finestra di dialogo di salvataggio. Questa conferma non dimostra che il file sia stato successivamente archiviato in modo permanente sul computer. Per i backup automatici, il client Python scrive il file su disco prima di confermare la ricezione. I download tramite app web sono limitati a 64 MiB; usa il client Python per archivi più grandi.