Hoppa till innehåll

Säkerhetskopiera och återställ

Den här guiden täcker de fem saker folk faktiskt gör med säkerhetskopior: tar en, hämtar hem den, flyttar en arbetsyta, lägger tillbaka en och förvarar kopior utanför maskinen. Den exakta formen på varje artefakt och operation finns i referensen för säkerhetskopia.

Allt här finns under Inställningar → Server → Säkerhetskopiering och återställning.

  • En fullständig klient – skrivbordsappen eller webbappen. En parkopplad telefon kan inte starta något av detta, och det är avsiktligt.
  • För att ta, lista, hämta eller radera en ögonblicksbild av installationen: installationens ägare.
  • För åtgärder per arbetsyta: admin för arbetsytan att exportera, ägare att importera eller radera den.
  • För hämtningar och uppladdningar: en direkt anslutning till servern. Det förmedlade reläet transporterar RPC-ramar, inte filöverföringar, och överföringskontrollerna inaktiverar sig själva med en notis när du är på ett.

Båda artefakterna är enbart databaser:

  • En ögonblicksbild av installationen är en katalog med tidsstämpel: manifest.json, global.db och en <workspaceId>/workspace.db per arbetsyta.
  • En arbetsytaexport är just den enda filen workspace.db.

Ingen av dem tar med resten av datakatalogen: secrets.json (parkopplingsnycklar, leverantörsuppgifter, SSO), en arbetsytas blobs/ (bilder som klistrats in i meddelanden), skills/, agents/, chat_credentials/, inspelat mötesljud eller rig-bilder. En del av det är umbärligt och en del inte – den fullständiga tabellen finns i referensen, och det är vad avsnittet om utanför maskinen handlar om.

  1. Öppna Inställningar → Server → Säkerhetskopiering och återställning.
  2. Under Installationsögonblicksbilder trycker du på Säkerhetskopiera nu.
  3. Notisen anger katalogen som skrevs, på servervärden. Den nya ögonblicksbilden visas högst upp i listan.

Servern fortsätter köra hela tiden. Varje fil skrivs med VACUUM INTO, som är konsekvent mot en levande databas, så det behövs inget underhållsfönster och inga agenter behöver stoppas.

Varje rad i listan visar tidsstämpeln, storleken på disken, hur många arbetsytor som fångades och om ögonblicksbilden är Komplett eller Ofullständig. Ofullständig betyder att manifestet saknas eller anger filer som inte finns – en säkerhetskopia som avbröts av en krasch eller en full disk. De listas fortfarande med avsikt: en ögonblicksbild du inte kan se är en du tror att du har. En ofullständig ögonblicksbild kan inte återställa en hel installation, men de arbetsytefiler den ändå innehåller kan fortfarande tas över en i taget.

En rad kan också säga n arbetsytor inte fångade. Det är en arbetsyta som är registrerad men aldrig har skrivits till (det finns ingen fil ännu), eller en vars kopia misslyckades – kontrollera serverloggen.

Schemalägg säkerhetskopior av arbetsytan och bevarande

Avsnitt med rubriken “Schemalägg säkerhetskopior av arbetsytan och bevarande”

Öppna Inställningar → Pipelines → Pipelinemallar för arbetsytan och leta upp Workspace backup. Dess aktiverade schema körs varje söndag kl. 03:00 UTC: Back up workspace, följt av Delete backups older than (30 dagar som standard). Den andra noden körs bara efter att säkerhetskopieringen har lyckats. Du kan ändra bevarandedagarna på noden eller stänga av schemat. Om servern är offline vid den schemalagda tiden tar schemat igen en gång när den är tillbaka, i stället för att spela upp varje missad vecka.

Säkerhetskopior av arbetsytan ligger på servern under backups/workspace-backups/<workspaceId>/<timestamp>/workspace.db. Bevarandenoden raderar bara gamla säkerhetskopior för den här arbetsytan; den raderar aldrig ögonblicksbilder av installationen eller säkerhetskopior för andra arbetsytor. De här filerna är enbart databasen. För bevarande utanför maskinen kopierar du dem separat.

De här säkerhetskopiorna är åtskilda från listan Installationsögonblicksbilder. För att återställa en använder du Arbetsytedata → Importera med säkerhetskopians workspace.db-sökväg på serversidan. Importen ersätter arbetsytans aktuella databas, så exportera den först om du kan behöva ångra återställningen.

Under Installationsögonblicksbilder fäller du ut ögonblicksbilden, även en ofullständig, och använder Radera ögonblicksbild i faroavsnittet. Bekräfta namnet. Hela katalogen för ögonblicksbilden tas bort permanent från servern; hämta den först om du behöver en kopia. En pipeline för säkerhetskopiering av arbetsytan raderar aldrig dessa ögonblicksbilder.

Sökvägarna som sidan visar finns på maskinen som kör cc_server. När det inte är maskinen du sitter vid använder du knapparna Hämta:

  • Bredvid varje arbetsyta under Arbetsytedata → Hämta, för en .db-fil.
  • Bredvid varje ögonblicksbild under Installationsögonblicksbilder → Hämta, för hela ögonblicksbilden som en .zip.

I skrivbordsappen väljer du var filen hamnar och notisen anger den; i webbappen går den till webbläsarens hämtningar. I båda fallen rapporterar båda förloppet i byte, eftersom det här är de två nyttolaster som kan uppgå till gigabyte.

Båda skapar en färsk kopia i samma stund du trycker på knappen, strömmar den och raderar serverns kopia efteråt – en hämtning är inte “hämta filen som exportknappen skapade tidigare”.

Att packa upp ett arkiv med en ögonblicksbild återskapar ögonblicksbildens layout exakt, vilket är det som gör att återställningen blir en tillbakakopiering.

En arbetsyta är en databasfil, så överlämningen är en filoperation.

  1. På källservern: Inställningar → Server → Säkerhetskopiering och återställning → Arbetsytedata, fäll ut arbetsytan och tryck på Hämta.
  2. På målservern skapar du (eller väljer) arbetsytan som ska ta emot den.
  3. Fäll ut den arbetsytan och tryck på Välj en fil och ladda upp under Återställ från den här enheten. Välj den .db du hämtade.

Om båda servrarna är samma maskin som du sitter vid gör Spara på servern plus Importera → Välj fil samma sak utan omvägen; sökvägarna i importdialogen löses upp på servervärden.

Två saker tillåts och loggas i stället för att avvisas: att importera en fil vars registrerade arbetsyte-id skiljer sig från målets (så här duplicerar du en arbetsyta eller återställer den under ett nytt id), och att importera en fil från en annan installation. I det andra fallet tillhör filens parkopplade enheter och användar-id:n installationen den kom från och löses inte upp i den här – arbetsytans egna data är intakta, men kontrollera medlemskapet igen efter att du tagit över den.

Chattbottens tokens ligger bredvid databasen, inte i den, så en arbetsyta du lämnar till någon annan bär inga levande uppgifter. Den mottagande installationen återansluter sina egna.

  1. Under Installationsögonblicksbilder fäller du ut ögonblicksbilden du vill ha.
  2. Leta upp arbetsytans rad och tryck på Återställ.
  3. Bekräfta. Allt arbetsytan har gjort sedan ögonblicksbilden togs går förlorat.

Det här är samma operation som en import, riktad mot ögonblicksbildens kopia av arbetsytans fil – med avsikt, så att det inte finns någon andra mekanism som skulle kunna behandla samma fil annorlunda.

En rad kan säga Inte på den här servern längre, med Återställ inaktiverat: ögonblicksbilden innehåller en arbetsyta som den här installationen inte längre har. Ta tillbaka den för hand – skapa en arbetsyta och importera sedan in i den under Arbetsytedata från <snapshot path>/<old workspace id>/workspace.db. Den utfällda ögonblicksbilden visar sin egen Sökväg på servern i ett kopieringsfält, och radens titel är det gamla arbetsyte-id:t, så du har båda halvorna av sökvägen framför dig.

Det finns ingen knapp för det här, och det bör det inte göra heller: den ersätter de databaser som den körande servern håller öppna.

  1. Stoppa cc_server. Om du kör skrivbordsappen med dess inbäddade server stänger du av appen.

  2. Kopiera ögonblicksbildens innehåll över datakatalogen. Ögonblicksbildens layout speglar den levande, så det här är en vanlig kopiering:

    Terminalfönster
    # macOS default; see the CLI reference for other platforms
    DATA_DIR="$HOME/Library/Application Support/control-center"
    SNAPSHOT="$DATA_DIR/backups/2026-07-28T09-12-33-000Z"
    cp "$SNAPSHOT/global.db" "$DATA_DIR/global.db"
    for d in "$SNAPSHOT"/*/; do
    id=$(basename "$d")
    mkdir -p "$DATA_DIR/$id"
    cp "$d/workspace.db" "$DATA_DIR/$id/workspace.db"
    done
  3. Radera alla -wal- och -shm-filer som ligger bredvid databaserna du ersatte. De tillhör de gamla filerna, och en inaktuell sådan bredvid en återställd databas är en risk för korruption.

  4. Starta servern igen.

Ögonblicksbilden innehåller ingen secrets.json, så en installation som återställs på en färsk värd behåller sina data men inte sina uppgifter: parkopplade enheter, leverantörstokens och SSO-inställningar måste återupprättas, eller återställas från var du än förvarade den filen. En återställning på samma värd, där secrets.json aldrig förlorades, behåller allt.

En ögonblicksbild på samma disk som databasen den kopierade skyddar dig mot en dålig import, inte mot disken. Inget i Control Center skickar någon kopia någonstans, så den här delen är din.

Ögonblicksbilder är oföränderliga när de väl har skrivits och namnges efter tidsstämpel, så alla synkverktyg hanterar dem bra. Uteslut transfer/, som är en arbetsbänk för pågående hämtningar och uppladdningar:

Terminalfönster
DATA_DIR="$HOME/Library/Application Support/control-center"
# To another host over ssh
rsync -a --delete --exclude 'transfer/' \
"$DATA_DIR/backups/" backup-host:/srv/control-center-backups/
# To object storage
aws s3 sync --exclude 'transfer/*' \
"$DATA_DIR/backups/" s3://my-bucket/control-center/backups/
# Or with deduplication, encryption and its own retention
restic backup --exclude 'transfer' "$DATA_DIR/backups"

--delete speglar din lokala rensning till fjärren. Hoppa över det om du vill att fjärren behåller ögonblicksbilder längre än värden gör.

För att kunna bygga upp installationen igen och inte bara dess data kopierar du även dessa. De är vanliga filer, säkra att kopiera medan servern kör:

Terminalfönster
rsync -a \
"$DATA_DIR/secrets.json" \
backup-host:/srv/control-center-backups/config/
rsync -a --relative \
"$DATA_DIR"/./*/chat_credentials \
"$DATA_DIR"/./*/blobs \
"$DATA_DIR"/./*/skills \
"$DATA_DIR"/./*/agents \
backup-host:/srv/control-center-backups/workspace-files/

secrets.json har behörigheten 0600 och innehåller varje parkopplingsnyckel, leverantörsuppgift och SSO-inställning i installationen. Var den än hamnar måste den vara minst lika skyddad som servervärden – krypterad i vila och inte en bucket som någon annan kan läsa.

Hoppa över spaces/ (copy-on-write-worktrees som återetableras från dina repos), pr_clones/ (en cache), models/ (hämtas igen), media_cache/ och rigs/ (maskintillstånd, och stora). Inspelat mötesljud under meetings/ är värt att ta med om du behåller möten.

Schemalägg en ögonblicksbild av hela installationen utanför appen

Avsnitt med rubriken “Schemalägg en ögonblicksbild av hela installationen utanför appen”

Den inbyggda pipelinen säkerhetskopierar bara en arbetsyta. För en obevakad ögonblicksbild av hela installationen finns det inget CLI-underkommando, och RPC-anropet för ögonblicksbilder kräver en parkopplad fullständig klient som är installationens ägare. En timer på värdsidan kan använda VACUUM INTO mot de levande databaserna:

#!/usr/bin/env bash
set -euo pipefail
DATA_DIR="${CC_SERVER_DATA_DIR:-$HOME/.local/share/control-center}"
DEST="/srv/control-center-snapshots/$(date -u +%Y-%m-%dT%H-%M-%SZ)"
mkdir -p "$DEST"
sqlite3 "$DATA_DIR/global.db" "VACUUM INTO '$DEST/global.db'"
for db in "$DATA_DIR"/*/workspace.db; do
id=$(basename "$(dirname "$db")")
mkdir -p "$DEST/$id"
sqlite3 "$db" "VACUUM INTO '$DEST/$id/workspace.db'"
done

Kör den som samma användare som äger datakatalogen, från cron eller en systemd-timer, och synkronisera DEST bort från värden efteråt. VACUUM INTO kräver SQLite 3.27 eller nyare.

Skriv den utanför <dataDir>/backups/. En handgjord katalog där har inget manifest.json, så appen skulle lista den som en ofullständig ögonblicksbild och listan skulle sluta vara en ärlig redogörelse för vad servern själv har skapat.

Du kan radera enskilda ögonblicksbilder av installationen i appen. För en bevarandepolicy på värdsidan håller du katalogen för arbetsytans säkerhetskopior åtskild från ögonblicksbilderna av installationen:

Terminalfönster
find "$DATA_DIR/backups" -mindepth 1 -maxdepth 1 -type d \
! -name exports ! -name transfer ! -name workspace-backups \
-mtime +30 -exec rm -rf {} +

Kontrollera utdata från en körning med -print innan du lägger till -exec. Behåll mer än en: felet du skyddar dig mot är ofta “även den senaste säkerhetskopian har problemet”.

En säkerhetskopia som ingen har återställt är en hypotes.

Billig kontroll – filen öppnas och dess sidor är intakta:

Terminalfönster
sqlite3 "$SNAPSHOT/global.db" 'PRAGMA integrity_check;' # expects: ok

Riktig kontroll – ta över den. Skapa en tillfällig arbetsyta i en icke-produktiv installation, importera en arbetsytefil till den och se efter om ytorna, ärendena och meddelandena du förväntar dig finns där. Det övar samma väg som en riktig återställning tar, inklusive FTS-ombyggnaden, och det är den enda kontrollen som säger att säkerhetskopian går att återställa och inte bara att läsa.

Gör det här en gång när du ställer in säkerhetskopior, och igen varje gång du ändrar var de lagras.

Symtom Orsak och åtgärd
Kontrollerna för hämtning och uppladdning är inaktiverade med en notis om ett relä Du är ansluten via det förmedlade reläet, som inte transporterar några filöverföringar. Anslut direkt
“Servern nekade” Roll. Att ta eller lista en ögonblicksbild av installationen kräver installationens operatör. Att hämta en arbetsyta kräver admin, att återställa en kräver ägare, en zip för hela ögonblicksbilden kräver installationens operatör
“Den här servern har ingen säkerhetskopieringsyta” Värden har ingen säkerhetskopieringsport inkopplad – en demoserver. Operationerna saknas i stället för att nekas
“Filen är större än vad servern accepterar” Uppladdningar är begränsade till 8 GiB. Lägg filen på servervärden och använd Importera → Välj fil i stället
Import nekad: inte en arbetsytedatabas från Control Center Filen har ingen workspace_meta-rad – den är inte en arbetsytaexport, eller så är den trunkerad. Inget ersattes
En ögonblicksbild listas som Ofullständig Dess manifest saknas eller anger filer som inte finns. Ta en ny; ta under tiden över enskilda arbetsytefiler från den
En ögonblicksbild säger att arbetsytor inte fångades De arbetsytorna har aldrig skrivits till, eller så misslyckades deras kopia. Kontrollera serverloggen
En återställd installation har inga uppgifter för kodvärd eller SSO secrets.json finns inte i en ögonblicksbild. Återställ den från var du än förvarade den, eller återanslut leverantörerna
En återställd arbetsyta saknar inklistrade bilder Blobs ligger bredvid databasen, inte i den. Kopiera <workspaceId>/blobs/ också