Kopie zapasowe firmy
Administratorzy i właściciele firmy otwierają swoją firmę w aplikacji webowej i wybierają Kopie zapasowe. Mogą żądać kopii zapasowych, pobierać pliki ZIP oraz zarządzać kluczami API dla swojego serwera kopii zapasowych. Ten eksport nie jest dostępny w aplikacji mobilnej.
Zakres i ograniczenia
Kopia zapasowa zawiera regularne czaty projektowe firmy, w tym zarchiwizowane czaty, wraz z wiadomościami, reakcjami, kartami czatu oraz powiązanymi załącznikami. Obejmuje również metadane projektów i czatów, nazwy uczestników oraz opublikowane dokumenty firmy w tych czatach. Administratorzy i właściciele firmy mogą tworzyć kopie zapasowe czatów firmowych, do których sami nie dołączyli.
Wiadomości bezpośrednie, prywatne notatki, usługi widoczne tylko dla danej osoby, czaty międzyfirmowe i osobiste szkice są wykluczone. Zawartość Dysku firmy i linków zewnętrznych znajduje się poza zakresem tego eksportu czatów. Brak powiązanych załączników powoduje niepowodzenie generowania. Plik ZIP to eksport danych; automatyczny import z powrotem do Skavy nie jest jeszcze dostępny.
Kwoty, przyrosty i okresy przechowywania
Każda firma może zamówić jeden pełny kopię zapasową w ciągu 7 dni oraz dwa przyrostowe kopie zapasowe w ciągu 24 godzin. Okna czasowe te liczą się od momentu każdego zamówienia. Ponowne pobranie tego samego gotowego pliku nie zużywa limitu generowania. Nieudane zadania generowania nie są wliczane w te limity.
Każdy przyrost zawiera zmiany i usunięcia od ostatniego w pełni przeniesionego i potwierdzonego sumą kontrolną kopii zapasowej. Łańcuch to A + B + C: A to pełna kopia zapasowa, B zawiera zmiany od A, a C tylko dalsze zmiany od B. Odtwórz stan, stosując każdy pakiet kolejno. Niezmienione załączniki odnoszą się do plików już obecnych w tym łańcuchu.
Pobrania pozostają dostępne przez 24 godziny po zakończeniu generowania. Następnie ZIP jest usuwany, a historia pozostaje. Zachowaj lokalnie pełną kopię zapasową oraz wszystkie powiązane przyrosty. Stan porównawczy pozostaje użyteczny przez maksymalnie 90 dni od pełnej kopii zapasowej; po tym czasie wymagana jest nowa pełna kopia zapasowa. Każdy przyrost identyfikuje zarówno pełną kopię zapasową, jak i jego bezpośredniego poprzednika przez ID i SHA-256.
Tylko w pełni otrzymany i potwierdzony pakiet staje się nowym poprzednikiem. Gotowy, ale niepotwierdzony przyrost blokuje kolejny przyrost do momentu potwierdzenia lub wygaśnięcia. Po wygaśnięciu niepotwierdzonego pakietu kolejna próba rozpoczyna się od ostatniego potwierdzonego stanu i zawiera zmiany, które nie zostały jeszcze skopiowane. Jeśli potwierdzona część brakuje lokalnie, pobierz ją ponownie w ciągu jej 24-godzinnej dostępności lub rozpocznij nową pełną kopię zapasową zgodnie z tygodniowym limitem. Preferuj jeden wspólny katalog kopii zapasowej na firmę; niezależni klienci muszą zachowywać ten sam kompletny łańcuch.
Ustaw klucz API
W sekcji Klucze API wpisz nazwę, np. „NAS firmy”, i utwórz klucz. Jest wyświetlany tylko raz, wygasa po roku i można go odwołać w dowolnym momencie. Przechowuj go w chronionym magazynie sekretów środowiska backupowego. Klucz należy do firmy i może uzyskiwać dostęp wyłącznie do API backupu tej firmy. Działa niezależnie od późniejszego logowania osoby, która go utworzyła.
Przesyłaj go przez HTTPS w nagłówku Authorization: Bearer YOUR_BACKUP_TOKEN. Nie umieszczaj kluczy w adresach URL, publicznych skryptach ani logach. Tylko administratorzy i właściciele firmy mogą tworzyć, wyświetlać listę oraz odwoływać klucze.
Python: pobieranie pełnego backupu i przyrostów
Pobierz klienta Python company_backup.py i umieść go obok swojego skryptu. Wymaga Pythona 3.10 lub nowszego na systemach Linux lub macOS i korzysta wyłącznie z biblioteki standardowej. Ustaw SKAVA_BACKUP_TOKEN w chronionym środowisku procesu i zamień 42 na identyfikator firmy z adresu aplikacji webowej.
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")
Zadania zaplanowane mogą wywoływać ten sam klient bezpośrednio:
python3 company_backup.py --company 42 --kind full --directory backups
python3 company_backup.py --company 42 --kind diff --directory backups
Klient żąda wygenerowania, sprawdza status, strumieniowo zapisuje pobieranie na dysk, weryfikuje rozmiar, sumę kontrolną SHA-256 oraz zawartość archiwum ZIP i potwierdza odbiór. Przechowuje pełne i przyrostowe kopie zapasowe jako osobne pliki. Zachowaj ukryty plik stanu w tym katalogu: zawiera on informacje o łańcuchu i wznowieniu. Przed żądaniem kolejnej kopii przyrostowej klient weryfikuje każdy poprzedni plik ZIP. Po przerwaniu powtórz ten sam polecenie. Zapobiega się równoległemu wykonywaniu zadań dla tej samej firmy w tym samym katalogu.
Przebieg API bez połączenia trwałego
- Żądanie:
POST /api/v1/companies/42/backupsz{"kind":"full","request_id":"YOUR_UNIQUE_ID"}. W przypadku kopii przyrostowej ustawkindnadiffi wyślij lokalny identyfikator pełnej kopii zapasowej jakobase_idoraz ostatni potwierdzony identyfikator pakietu jakoparent_id. Odpowiedź dostarczajob.id. Przy ponownej próbie użyj tego samegorequest_id. - Pytanie o status:
GET /api/v1/companies/42/backups/JOB_ID, co około dziesięć sekund. Generowanie przebiega w tle podczasqueuedlubrunning. Między żądaniami nie pozostaje otwarte żadne połączenie. - Pobieranie: Gdy status to
readyiavailable: true, wywołajGET /api/v1/companies/42/backups/JOB_ID/download. Tylko ten transfer utrzymuje otwarte połączenie. W razie przerwania pobierz cały plik ponownie. - Potwierdzenie odbioru: Sprawdź
job.bytesijob.sha256. PobierzX-Backup-Download-IdorazX-Backup-Receiptz nagłówków odpowiedzi pobierania. WyślijPOST /api/v1/companies/42/backups/JOB_ID/downloads/DOWNLOAD_ID/confirmz danymi{"receipt":"RECEIPT","bytes":12345,"sha256":"SHA256"}. Tylko kompletny transfer z zgodnym potwierdzeniem jest uznawany za udany.
GET /api/v1/companies/42/backups zwraca historię, paginowaną przez next_offset. Wyczerpane limity lub tymczasowe ograniczenia pojemności zwracają HTTP 429 z Retry-After. Kopie zapasowe są generowane sekwencyjnie w ramach limitów, aby jednoczesne zadania nocne nie przeciążały aplikacji.
Zrozumienie historii pobierania
Historia pokazuje typ (pełny lub przyrostowy), czas żądania, datę wygaśnięcia, kopię pełną, poprzednik oraz każdą próbę pobierania z liczbą przetransferowanych bajtów. „Gotowe” oznacza wygenerowany plik. „Przetransferowane” oznacza, że serwer wysłał wszystkie bajty. „Suma kontrolna potwierdzona” oznacza, że klient zweryfikował i potwierdził pełny odbiór. Przerwane i nieudane próby pozostają widoczne.
Aplikacja webowa potwierdza odbiór w przeglądarce przed wyświetleniem okna zapisu. To potwierdzenie nie gwarantuje, że plik został następnie trwale zapisany na komputerze. W przypadku automatycznych kopii zapasowych klient Python zapisuje plik na dysku przed potwierdzeniem odbioru. Pobieranie w aplikacji webowej jest ograniczone do 64 MiB; dla większych archiwów użyj klienta Python.