---
title: "Öryggisafrit, endurheimt til tíma og endurheimtaræfingin"
description: "Taktu öryggisafrit af Quire, endurheimtu það til tíma og sannaðu það með endurheimtaræfingunni."
image: "https://docs.quirelms.com/og.png"
---

> Documentation Index
> Fetch the complete documentation index at: https://docs.quirelms.com/is/llms.txt
> Use this file to discover all available pages before exploring further.

# Öryggisafrit, endurheimt til tíma og endurheimtaræfingin

<span id="backup-point-in-time-recovery-and-the-restore-drill"></span>

Hönnunin er í `docs/architecture/23-ops.md` kafla 8. Þetta er handbókin
fyrir Docker Compose-vöruna. Hún er skrifuð til að vera fylgt af einhverjum sem
skrifaði hana ekki; ef skref er óljóst er það galli í þessu skjali.

## Hvað er varið, og hvernig <!--quire:what-is-protected-and-how-->

| Eign | Hvernig | Hvar |
| --- | --- | --- |
| Gagnagrunnurinn | WAL skjalasafnað samfellt, á 60 sekúndna fresti að mestu, frá fyrstu ræsingu | `pgwal` bindi |
| Gagnagrunnurinn | Grunnöryggisafrit með `pg_basebackup`, daglega sjálfgefið (`backup-scheduler`) | `pgbackup` bindi |
| Gagnagrunnurinn | Dulrituð afrit grunnöryggisafritanna og WAL, á fimm mínútna fresti (`backup-offsite`) | Aðskilin geymsla sem þú nefnir |
| Skrár | `files` bindið. Afritaðu það með öryggisafritstæki hýsilsins, eða notaðu útgáfustýrða hlutageymslu | `files` bindi |
| Leyndarmál | `docker/.env`, umfram allt `QUIRE_MASTER_KEY` (og hvert `QUIRE_MASTER_KEY_RETIRED` enn í notkun), `QUIRE_BACKUP_ENCRYPTION_KEY` og `docker/secrets/audit-signing-key.pem` | Haltu afriti utan þessa hýsils |
| Leitarvísitölur, skyndiminni, myndefni | Ekki tekið öryggisafrit; endurbyggt | |

Markmið: endurheimtarpunktur innan 60 sekúndna frá bilun, og endurheimt
innan 60 mínútna fyrir 500 GB gagnagrunn.

Tvö mistök eru algeng. Gagnagrunnur endurheimtur **án skráa sinna** myndar
brotnar síður. Gagnagrunnur endurheimtur **án `QUIRE_MASTER_KEY`** getur ekki
afdulritað SSO-, vefkróks- og samþættingaraðauðkennin sem hann heldur; þar til snúningur aðallykils
lýkur með engu óleystu ([key-rotation.md](/is/ops/key-rotation/)),
felur það í sér starfsloknu lyklana. Bæði eru hluti öryggisafritsins.

## Að taka öryggisafrit <!--quire:taking-backups-->

Grunnöryggisafrit af öllu klasanum:

```sh
docker compose -f docker/compose.yaml --profile backup run --rm backup
```

Það heldur nýjustu `QUIRE_BACKUP_KEEP` grunnöryggisafritunum (sjálfgefið 5) og hreinsar
WAL sem elsta þeirra þarf ekki lengur, svo skjalasafnið geti ekki vaxið án marka.
Tímasettu það daglega með cron eða systemd-tímamæli á hýsilnum:

```cron
15 2 * * * cd /srv/quire && docker compose -f docker/compose.yaml --profile backup run --rm backup >> /var/log/quire-backup.log 2>&1
```

Eða láttu stakkann tímasetja það: `backup`-sniðið keyrir `backup-scheduler`,
sem tekur grunnöryggisafrit á `QUIRE_BACKUP_INTERVAL_HOURS` fresti (sjálfgefið 24),
og `backup-offsite`, lýst hér á eftir.

```sh
docker compose -f docker/compose.yaml --profile backup up -d
```

## Dulrituð afrit utan hýsils <!--quire:encrypted-off-host-copies-->

Bæði bindin lifa á sama hýsil og gagnagrunnurinn, og öryggisafrit á
vélinni sem bilaði er ekki öryggisafrit. `backup-offsite` afritar hvert grunnöryggisafrit
og hvern skjalasafnaðan WAL-bút í aðskilda geymslu í gegnum geymslugáttina,
dulrituð, og heldur þeim þar undir varðveislu:

- **Dulritun.** AES-256-GCM með `QUIRE_BACKUP_ENCRYPTION_KEY` (eða skránni
  sem `QUIRE_BACKUP_ENCRYPTION_KEY_FILE` nefnir): 32 bæti, frá
  `openssl rand -hex 32`. Hver skrá hefur sinn eigin nonce og sannvottunarmerki,
  svo afrit er ólæsilegt án lykilsins og sérhver breyting á því
  greinist. Haltu lyklinum með `QUIRE_MASTER_KEY`, fjarri þessum hýsil og fjarri
  öryggisafritsgeymslunni. Án lykilsins er engin endurheimt.
- **Hvar.** `QUIRE_BACKUP_STORAGE_DRIVER` er `s3`, `azure` eða `local` (tengdur
  fjarlægur diskur á `QUIRE_BACKUP_STORAGE_ROOT`). Stillingarnar eru
  skráageymslustillingarnar með `QUIRE_BACKUP_` forskeyti: `QUIRE_BACKUP_S3_ENDPOINT`,
  `QUIRE_BACKUP_S3_BUCKET`, `QUIRE_BACKUP_S3_ACCESS_KEY_ID` og svo framvegis. Notaðu
  aðra fötu og, helst, annan aðgang en fyrir skrárnar, með
  auðkennum sem geta skrifað en ekki eytt ef veitan leyfir það.
- **Varðveisla.** Nýjustu `QUIRE_BACKUP_OFFSITE_KEEP` grunnöryggisafritin (sjálfgefið
  `QUIRE_BACKUP_KEEP`, annars 7) og WAL sem elsta þeirra þarf; eldri
  sett og bútar eru eytt úr geymslunni.
- **Hvenær.** Á `QUIRE_BACKUP_SHIP_INTERVAL_SECONDS` fresti (sjálfgefið 300). Sending
  er samtaka: því sem þegar er geymt er sleppt, og grunnöryggisafrit telst
  geymt aðeins þegar skrá þess er skrifuð, síðust.

Sama skipun keyrir með hendi:

```sh
docker compose -f docker/compose.yaml run --rm backup-offsite bun apps/worker/src/backups/main.ts ship
docker compose -f docker/compose.yaml run --rm backup-offsite bun apps/worker/src/backups/main.ts verify
```

Til að endurheimta á nýjum hýsil skaltu fyrst ná í sett, fylgdu síðan skrefunum hér að neðan
með sóttu möppunni í stað `pgbackup` bindisins og sóttu
`wal-archive` í stað `pgwal`:

```sh
bun apps/worker/src/backups/main.ts fetch base-20260924T021500Z /srv/restore
```

## Endurheimt til tíma <!--quire:restoring-to-a-point-in-time-->

Notaðu þetta eftir gagnatap: slæman innflutning, eytt námskeið, samdráttar-
flutning sem þú þarft að afturkalla. Það kemur í stað lifandi gagnagrunnsins, svo æfðu það
með æfingunni hér að neðan fyrst.

1. **Veldu mark tímann**, í UTC, rétt fyrir tjónið:
   `2026-09-24 09:30:00+00`. Úttektarannállinn (`/admin/audit`) sýnir venjulega
   augnablikið.
2. **Stöðvaðu allt sem skrifar**:
   `docker compose -f docker/compose.yaml stop web content worker scheduler collab`
3. **Haltu skemmda klasanum** þar til endurheimtin er sannvotuð:
   ```sh
   docker compose -f docker/compose.yaml stop postgres
   docker run --rm -v quire_postgres18-data:/from -v quire_postgres-damaged:/to alpine cp -a /from/. /to/
   ```
4. **Pakkaðu upp nýjasta grunnöryggisafriti eldra en markið** í gagna-
   bindið, og biddu um markvissa endurheimt:
   ```sh
   docker run --rm -v quire_pgbackup:/backups:ro -v quire_postgres18-data:/var/lib/postgresql postgres:18-alpine sh -euc '
     base="$(ls -1d /backups/base-* | sort | tail -n 1)"   # or the one before the target
     rm -rf /var/lib/postgresql/18/docker && mkdir -p /var/lib/postgresql/18/docker
     tar -xzf "$base/base.tar.gz" -C /var/lib/postgresql/18/docker
     touch /var/lib/postgresql/18/docker/recovery.signal
     chown -R postgres:postgres /var/lib/postgresql/18/docker && chmod 700 /var/lib/postgresql/18/docker'
   ```
5. **Endurheimtu**: ræstu Postgres einu sinni með endurheimtarstillingunum, frá
   Compose-yfirlýsingu svo venjulega skráin sé ósnert:
   ```yaml
   # docker/compose.recover.yaml
   services:
     postgres:
       command: [postgres, -c, "restore_command=cp /var/lib/postgresql/wal-archive/%f %p",
                 -c, "recovery_target_time=2026-09-24 09:30:00+00",
                 -c, recovery_target_action=promote, -c, archive_mode=off,
                 -c, max_connections=200, -c, hba_file=/etc/postgresql/pg_hba.conf]
   ```
   Yfirlýsingin kemur í stað allrar skipunarinnar, svo hún endurtekur stillingarnar tvær
   sem endurheimtin byggir á: `max_connections` ekki lægra en aðalþjónsins
   (annars hættir endurheimtin með „insufficient parameter settings“) og
   tengda `pg_hba.conf`.
   ```sh
   docker compose -f docker/compose.yaml -f docker/compose.recover.yaml up -d postgres
   docker compose -f docker/compose.yaml logs -f postgres   # wait for "database system is ready"
   ```
6. **Athugaðu það** áður en þú hleypir einhverjum inn: úttektarkeðjan
   (`docker compose -f docker/compose.yaml run --rm worker bun tooling/audit-verify/run.ts`),
   og að týndu gögnin séu komin aftur.
7. **Farðu aftur í eðlilegt**: `docker compose -f docker/compose.yaml up -d`. Þetta
   endurræsir Postgres með skjalasöfnun kveikta, og ný WAL-tímalína hefst. Taktu
   nýtt grunnöryggisafrit þegar í stað.

Verkefnisnafnið `quire` forskeytir hvert bindi; `docker volume ls` sýnir
nákvæm nöfn.

## Tímasett sannvottunaræfing <!--quire:the-scheduled-verification-drill-->

`backup-offsite` keyrir einnig æfingu á `QUIRE_BACKUP_DRILL_INTERVAL_HOURS`
fresti (sjálfgefið 168, vikulega), og aftur við næstu umferð eftir að ein bilar. Hún sækir
nýjasta grunnöryggisafritið utan hýsils og hvern WAL-bút eftir það, afdulritar hvern
(sem sannar að lykillinn opni þau enn og engu hafi verið breytt), ber hverja
skrá saman við skrá hennar, athugar að skjalasafnið sé Postgres-gagnamappa, og
athugar að WAL frá öryggisafritinu og áfram hafi ekkert bil. Skýrslan er skrifuð í
geymsluna sem `reports/drill-<time>.json` og í annál þjónustunnar; misheppnuð
æfing nefnir skrána eða fyrsta vantarandi bútinn.

## Endurheimtaræfingin <!--quire:the-restore-drill-->

Öryggisafrit sem aldrei hefur verið endurheimt er ekki öryggisafrit. Æfingin endurheimtir
nýjasta heila grunnöryggisafritið tekið fyrir markið, auk WAL-skjalasafnsins,
í rusl-Postgres sem deilir engu með þeim lifandi, og sannar
niðurstöðuna:

```sh
docker/scripts/restore-drill.sh                                  # to ninety minutes ago
docker/scripts/restore-drill.sh --target "2026-09-24 09:30:00+00"
```

Markið er UTC í nákvæmlega því formi. Það þarf grunnöryggisafrit eldra en það
og skjalasafnað WAL handan þess: á nýrri uppsetningu skaltu taka grunnöryggisafrit og bíða eftir
næsta skjalasafnaða bútnum (að mestu mínútu með skrifum) áður en þú velur
mark eftir öryggisafritið. Æfingin þarf Docker og bash á hýsilnum, ekkert
annað.

Hvert skref fellur æfinguna:

1. **Endurheimtanleiki**: ruslklasinn spilar til marksins og opnar.
2. **Heild**: talning raða hverrar töflu gagnvart lifandi gagnagrunni
   (`tooling/restore-drill`). Lifandi gagnagrunnurinn hefur færst áfram síðan markið,
   svo tafla má víkja um stærra af 500 röðum og tíunda hluta stærðar sinnar, í
   hvora átt (skrif láta hana dragast aftur úr, eyðingar láta endurheimtina halda meiru);
   skipting stofnuð eftir markið er ekki týnd tafla. Víkkaðu
   svigrúmið á annasamari uppsetningu með `QUIRE_DRILL_MAX_BEHIND` og
   `QUIRE_DRILL_MAX_DRIFT_RATIO`. Vantarandi eða tæmd tafla fellur.
3. **Heilleiki**: úttektar-hashkeðjan sannvottast á endurheimta afritinu.
4. **Notagildi**: forritshlutverkið les í gegnum öryggi á raðarstigi.
5. **Tími**: frá upphafi til græns, gagnvart `QUIRE_DRILL_RTO_SECONDS`
   (sjálfgefið 3600).

Hún skrifar aldrei í lifandi gagnagrunninn eða bindi hans: öryggisafritið og WAL-
bindin eru tengd eingöngu til lestrar og ruslklasinn er fjarlægður í lokin,
hvort sem stendur eða fellur.

Stilltu `QUIRE_DRILL_REPORT` á slóð til að JSON-skýrsla sé skrifuð, hvort sem stendur eða
fellur, og keyrðu hana á áætlun frá Docker-hýsilnum:

```cron
30 3 1 * * cd /srv/quire && QUIRE_DRILL_REPORT=/var/log/quire-drill.json docker/scripts/restore-drill.sh >> /var/log/quire-drill.log 2>&1
```

Keyrðu hana mánaðarlega og fyrir hverja uppfærslu. Misheppnuð æfing stöðvar uppfærsluna.
Einu sinni á ársfjórðungi skaltu láta einhvern sem skrifaði þessa handbók ekki framkvæma raunverulega
endurheimt til tíma á varahýsil, með aðeins þessu skjali.

## Skrár <!--quire:files-->

Staðbundnar skrár lifa í `files` bindinu. Taktu öryggisafrit af því með gagnagrunninum, á
sama tíma, og endurheimtu bæði saman:

```sh
docker run --rm -v quire_files:/files:ro -v "$PWD":/out alpine tar -czf /out/files-$(date -u +%Y%m%d).tar.gz -C /files .
```

Með hlutageymslu skaltu kveikja á útgáfustýringu fötu og halda 35 daga af
eldri útgáfum; endurheimt skráa til tíma er þá fötu eigin.

Source: https://docs.quirelms.com/is/ops/backup-restore/index.mdx
