Sikkerhetskopi, eksport og import
Alt Control Center kan kopiere, overlevere eller ta i bruk, og den nøyaktige formen til hvert artefakt. For å faktisk ta en sikkerhetskopi, se Sikkerhetskopier og gjenopprett; for hvorfor lagringen er delt opp slik, se Arbeidsområder og isolasjon.
Artefakter
Seksjon med tittelen «Artefakter»Det finnes tre artefakter for databaskopiering, med ulikt omfang og ulik slettepolicy.
| Artefakt | Skrevet av | Form | Dekker |
|---|---|---|---|
| Installasjonsøyeblikksbilde | server.backupNow |
En tidsstemplet mappe | Hver database i installasjonen |
| Workspace backup | Workspace backup-pipelinen |
Tidsstemplet mappe med én .db |
Databasen til ett arbeidsområde |
| Arbeidsområdeeksport | workspace.export |
Én enkelt .db-fil |
Databasen til ett arbeidsområde |
Alle skrives med SQLite VACUUM INTO, som er trygt mot en aktiv WAL-database:
det tar en lesetransaksjon, lager en defragmentert og transaksjonskonsistent
kopi, og krever aldri at serveren stoppes.
Oppsettet av et øyeblikksbilde
Seksjon med tittelen «Oppsettet av et øyeblikksbilde»<dataDir>/backups/2026-07-28T09-12-33-000Z/ manifest.json global.db <workspaceId>/workspace.db one directory per workspaceOppsettet speiler den aktive datamappen nøyaktig, og det er dette som gjør at
gjenoppretting av en installasjon er en tilbakekopiering i stedet for en oversettelse.
Mappenavnet er UTC-tidsstempelet med : og . erstattet av -, så det er
filsystemtrygt på Windows og sorterer kronologisk som en vanlig streng.
Planlagte arbeidsområdesikkerhetskopier ligger separat på
<dataDir>/backups/workspace-backups/<workspaceId>/<timestamp>/workspace.db.
De inneholder ikke noe manifest eller global.db og er ikke
installasjonsøyeblikksbilder. Oppbevaringstrinnet i den ukentlige pipelinen fjerner
bare sikkerhetskopier av sitt eget arbeidsområde som er eldre enn den konfigurerte
alderen (30 dager som standard); manuelt opprettede installasjonsøyeblikksbilder
roteres aldri av det trinnet. server.listBackups lister bare
installasjonsøyeblikksbilder, inkludert ufullstendige.
manifest.json
Seksjon med tittelen «manifest.json»| Felt | Type | Betydning |
|---|---|---|
version |
heltall | Manifestformatets versjon. For tiden 1 |
created_at |
ISO-8601 UTC | Når øyeblikksbildet ble tatt |
global.file |
streng | Alltid global.db |
global.schema_version |
heltall | Skjemaversjonen til GlobalDatabase på fangsttidspunktet |
global.bytes |
heltall | Størrelsen på den skrevne global.db |
workspace_schema_version |
heltall | Skjemaversjonen til WorkspaceDatabase, som deles av hver arbeidsområdefil |
workspaces[] |
array | Én oppføring per fangede arbeidsområde |
workspaces[].workspace_id |
streng | Arbeidsområdet denne filen tilhører |
workspaces[].file |
streng | Sti relativ til øyeblikksbildets rot, <workspaceId>/workspace.db |
workspaces[].bytes |
heltall | Størrelsen på den filen |
skipped_workspaces[] |
array med strenger | Arbeidsområder sikkerhetskopien ikke kunne fange |
Et arbeidsområde hoppes over når det er registrert, men aldri er blitt skrevet til (så
det finnes ingen fil ennå), eller når dets VACUUM INTO mislyktes. Uansett fullføres
øyeblikksbildet, og manifestet navngir det som mangler.
Fullstendighet
Seksjon med tittelen «Fullstendighet»server.listBackups rapporterer et complete-flagg per øyeblikksbilde. Det er usant
når manifestet mangler eller ikke lar seg tolke, når global.db mangler, eller når
manifestet navngir en arbeidsområdefil som ikke ligger på disken.
Et ufullstendig øyeblikksbilde listes likevel, fordi et øyeblikksbilde en operatør ikke
kan se, er et øyeblikksbilde de tror de har. Når manifestet ikke kan leses, faller
listen tilbake på selve oppsettet og rapporterer de <workspaceId>/workspace.db-filene
den finner — de kan fortsatt tas i bruk én og én gjennom workspace.import, selv om
øyeblikksbildet som helhet ikke kan gjenopprette en installasjon.
Hva en sikkerhetskopi ikke inneholder
Seksjon med tittelen «Hva en sikkerhetskopi ikke inneholder»Begge artefaktene er bare databaser. En arbeidsområdemappe inneholder mer enn databasen sin, og ingenting av resten blir med:
| Sti | I et øyeblikksbilde? | I en arbeidsområdeeksport? |
|---|---|---|
global.db |
Ja | Nei |
<workspaceId>/workspace.db |
Ja | Ja (den er filen) |
<workspaceId>/blobs/ |
Nei | Nei |
<workspaceId>/skills/ |
Nei | Nei |
<workspaceId>/agents/ |
Nei | Nei |
<workspaceId>/chat_credentials/ |
Nei | Nei |
<workspaceId>/spaces/<spaceId>/ |
Nei | Nei |
<workspaceId>/pr_clones/ |
Nei | Nei |
secrets.json |
Nei | Nei |
models/ |
Nei | Nei |
meetings/<meetingId>/ |
Nei | Nei |
rigs/ |
Nei | Nei |
Noe av dette kan kastes — spaces/ inneholder copy-on-write-worktrees som
provisjoneres på nytt fra repoene, pr_clones/ er en cache, models/ lastes ned på
nytt, og rigs/ er maskintilstand. Annet kan ikke det: blobs/ inneholder innlimte
bilder som rader i databasen peker på, skills/ og agents/ inneholder filene en agent
kjører med, og secrets.json inneholder hver parringsnøkkel, hver
leverandørlegitimasjon og hver SSO-innstilling i installasjonen. Se
Sikkerhetskopier og gjenopprett
for å dekke resten.
Operasjoner
Seksjon med tittelen «Operasjoner»Sikkerhetskopi-RPC-ene for installasjonen og eksport/import av arbeidsområder er bare
for fullClient: en paret telefon kan ikke utløse dem. Alle mangler helt — ikke avvist,
men strukturelt fraværende — på en server der ingen sikkerhetskopiport er koblet til,
for eksempel demoserveren.
| Op | Type | Omfang | Minste rolle | Argumenter | Returnerer |
|---|---|---|---|---|---|
server.backupNow |
mutate | Installasjon | installasjonseier | ingen | {ok, path} |
server.listBackups |
read | Installasjon | installasjonseier | ingen | {backups: [...]} |
server.deleteBackup |
mutate | Installasjon | installasjonseier | name |
{ok} |
workspace.export |
read | Arbeidsområde | admin |
ingen | {ok, path} |
workspace.import |
mutate | Arbeidsområde | owner |
source_path |
{ok, workspace_id} |
workspace.delete |
mutate | Installasjon* | owner |
id |
registerrad merket som slettet |
workspace.deleteer uten omfang fordi raden den markerer, ligger i det globale registeret; behandleren sjekker at den som kaller, er medlem av det navngitte arbeidsområdet, og kreverowner.
path i hvert svar er en sti på serververten.
Svaret fra server.listBackups
Seksjon med tittelen «Svaret fra server.listBackups»Nyeste først, sortert etter mappenavn (som er tidsstempelet, så rekkefølgen holder selv for et øyeblikksbilde der manifestet ikke kunne leses).
{ "backups": [ { "path": "/…/backups/2026-07-28T09-12-33-000Z", "name": "2026-07-28T09-12-33-000Z", "created_at": "2026-07-28T09:12:33.000Z", "bytes": 481203712, "complete": true, "workspaces": [ { "workspace_id": "w_9f2c…", "path": "/…/backups/2026-07-28T09-12-33-000Z/w_9f2c…/workspace.db", "bytes": 190840832 } ], "skipped_workspace_ids": [] } ]}created_at utelates når manifestet ikke kunne leses. bytes på toppnivå er den
virkelige størrelsen på disken for hele mappen, ikke manifestets egen sum — spørsmålet
en operatør som rydder i øyeblikksbilder stiller, er hva mappen koster, ikke hva
sikkerhetskopien hadde tenkt å skrive.
Hver workspaces[].path er nøyaktig det workspace.import tar som source_path. Det
er bevisst: «gjenopprett dette arbeidsområdet fra dette øyeblikksbildet» er
importoperasjonen, så de to kan ikke gli fra hverandre til ulik behandling av samme fil.
Validering i workspace.import
Seksjon med tittelen «Validering i workspace.import»Før noe erstattes, åpnes kandidatfilen skrivebeskyttet med en kortlivet rå
SQLite-tilkobling, og raden workspace_meta leses.
| Vilkår | Resultat |
|---|---|
Ikke en lesbar SQLite-database, eller ingen workspace_meta |
Avvist. Ingenting berøres |
| Registrert arbeidsområde-id ≠ målet | Tillatt, loggført. Det er slik et arbeidsområde dupliseres eller gjenopprettes under en ny id |
| Registrert installasjons-id ≠ denne installasjonen | Tillatt, loggført. De parede enhetene og bruker-id-ene tilhører den installasjonen og vil ikke la seg løse her |
| Ugyldig arbeidsområde-id, eller filen finnes ikke | Avvist |
Ved godkjenning lukkes databasen til mål-arbeidsområdet og slippes fra behandleren før
filen kopieres over den (en åpen drift-tilkobling holder filen og -wal-en dens), og
den åpnes deretter på nytt, slik at beforeOpen installerer FTS- og synkutløserne på
nytt, og FTS-indeksene bygges på nytt — en importert fils innholdstabeller er fylt ut,
men indeksen kan være utdatert.
Overføringsruter
Seksjon med tittelen «Overføringsruter»Hver operasjon ovenfor snakker om stier på serversiden, noe som bare er et fullstendig
svar når serveren er din egen maskin. Disse tre frakter bytene, på samme PSK-signerte
bane som medieproxyen og bildelageret bruker. Den som kaller, signerer en målstreng med
enhetens forhåndsdelt nøkkel og sender signaturen som s.
| Rute | Metode | Spørring | Signert mål | Krever |
|---|---|---|---|---|
/backup/workspace |
GET | w, d, s |
backup-workspace:<workspaceId> |
Arbeidsområdeadmin |
/backup/snapshot |
GET | n, d, s |
backup-snapshot:<name> |
Installasjonseier |
/backup/restore |
POST | w, d, s |
backup-restore:<workspaceId> |
Arbeidsområdeeier |
w er en arbeidsområde-id, n et mappenavn for et øyeblikksbilde, d id-en til
enheten som kaller, og s signaturen. n løses mot sikkerhetskopilisten i stedet for å
settes sammen med sikkerhetskopiroten, så ruten kan ikke rettes mot en mappe listen ikke
ville ha vist.
| Status | Årsak |
|---|---|
400 |
En påkrevd spørringsparameter mangler, eller en opplastingskropp er tom |
403 |
Ukjent eller tilbakekalt enhet, dårlig signatur, eller den som kaller, mangler rollen |
404 |
Ingen sikkerhetskopiport på denne verten, eller det navngitte øyeblikksbildet/arbeidsområdefilen finnes ikke |
405 |
/backup/restore kalt med noe annet enn POST |
413 |
Opplastingskroppen overskrider 8 GiB, enten etter oppgitt content-length eller etter byter som faktisk er lest |
500 |
Eksporten eller arkiveringen mislyktes på serversiden |
Begge nedlastingene svarer Cache-Control: no-store med Accept-Ranges: none. Hver
forespørsel lager en fersk kopi og sletter den så snart den er strømmet ut, så et
bufret eller gjenopptatt svar ville skjøte sammen byter fra to ulike eksporter til én
fil som ser gyldig ut, men ikke er det.
/backup/snapshot returnerer <name>.zip, med oppføringer relative til
øyeblikksbildets rot, slik at utpakking gjenskaper manifest.json + global.db +
<workspaceId>/workspace.db. Oppføringene skrives i sortert rekkefølge, så to arkiver
av samme øyeblikksbilde er det samme arkivet.
/backup/restore strømmer kroppen rett til en mellomlagerfil i stedet for å bufre den,
begrenser den før og under lesingen, og sletter den mellomlagrede filen på enhver
vei ut, også ved en avvisning.
Stier og grenser
Seksjon med tittelen «Stier og grenser»| Ting | Verdi |
|---|---|
| Øyeblikksbilder | <dataDir>/backups/<timestamp>/ |
| Planlagte arbeidsområdesikkerhetskopier | <dataDir>/backups/workspace-backups/<workspaceId>/<timestamp>/workspace.db |
| Arbeidsområdeeksporter | <dataDir>/backups/exports/<workspaceId>-<timestamp>.db |
| Overføringsmellomlager | <dataDir>/backups/transfer/ — en arbeidsbenk, feid av ruten som skriver den |
| Navn på øyeblikksbildearkiv | <snapshot directory name>.zip |
| Opplastingsgrense | 8 GiB per POST /backup/restore |
| Oppbevaring | Installasjonsøyeblikksbilder: manuell sletting. Arbeidsområdesikkerhetskopier: ukentlig pipeline, 30 dager som standard |
Mappene exports/, transfer/ og workspace-backups/ er ikke
installasjonsøyeblikksbilder og holdes utenfor server.listBackups. Bare den siste
mappen har planlagt oppbevaring; å slette et installasjonsøyeblikksbilde krever en
uttrykkelig handling fra installasjonseieren.
- Sikkerhetskopier og gjenopprett — oppskriftene disse operasjonene hører til
- Arbeidsområder og isolasjon — hvorfor ett arbeidsområde er én fil
cc_serverCLI — datamappen disse stiene ligger i- Rutekart — hvor UI-et bor
- Arkitektur — klient/server-delingen som stiene følger