Skava Skava / Wiki

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.

Aplikacja webowa: klucz API z datą wygaśnięcia i akcją odwołania
Zarządzanie kluczami w aplikacji webowej: nazwa, ważność i odwołanie dla każdego programu kopii zapasowej.

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

  1. Żądanie: POST /api/v1/companies/42/backups z {"kind":"full","request_id":"YOUR_UNIQUE_ID"}. W przypadku kopii przyrostowej ustaw kind na diff i wyślij lokalny identyfikator pełnej kopii zapasowej jako base_id oraz ostatni potwierdzony identyfikator pakietu jako parent_id. Odpowiedź dostarcza job.id. Przy ponownej próbie użyj tego samego request_id.
  2. Pytanie o status: GET /api/v1/companies/42/backups/JOB_ID, co około dziesięć sekund. Generowanie przebiega w tle podczas queued lub running. Między żądaniami nie pozostaje otwarte żadne połączenie.
  3. Pobieranie: Gdy status to ready i available: true, wywołaj GET /api/v1/companies/42/backups/JOB_ID/download. Tylko ten transfer utrzymuje otwarte połączenie. W razie przerwania pobierz cały plik ponownie.
  4. Potwierdzenie odbioru: Sprawdź job.bytes i job.sha256. Pobierz X-Backup-Download-Id oraz X-Backup-Receipt z nagłówków odpowiedzi pobierania. Wyślij POST /api/v1/companies/42/backups/JOB_ID/downloads/DOWNLOAD_ID/confirm z 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: kopie zapasowe przyrostowe z poprzednikiem, wygasaniem pobierania i potwierdzoną sumą kontrolną
Historia pobierania pokazuje łańcuch kopii zapasowych, okno 24 godzin i zweryfikowane otrzymanie wszystkich danych.

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.