---
title: "Cùl-taic, ath-nuadhachadh gu àm sònraichte agus deuchainn ath-nuadhachaidh"
description: "Dèan cùl-taic de Quire, ath-nuadhaich e gu àm sònraichte agus dearbh e le deuchainn ath-nuadhachaidh."
image: "https://docs.quirelms.com/og.png"
---

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

# Cùl-taic, ath-nuadhachadh gu àm sònraichte agus deuchainn ath-nuadhachaidh

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

Tha an dealbhadh ann an earrann 8 de `docs/architecture/23-ops.md`. Seo stiùireadh obrachaidh airson bathar Docker Compose. Tha e sgrìobhte airson neach nach do sgrìobh e a leantainn; mas e ceum sam bith doilleir a th’ ann, ’s e uireasbhaidh san sgrìobhainn seo a th’ ann.

## Na tha air a dhìon agus ciamar <!--quire:what-is-protected-and-how-->

| Maoin | Ciamar | Càite |
| --- | --- | --- |
| Stòr-dàta | WAL air a thasgadh gu leantainneach, aig a’ char as fhaide gach 60 diog, on chiad tòiseachadh | Leabhar `pgwal` |
| Stòr-dàta | Cùl-taicean bunaiteach le `pg_basebackup`, làitheil mar bhun-roghainn (`backup-scheduler`) | Leabhar `pgbackup` |
| Stòr-dàta | Lethbhreacan crioptaichte de na cùl-taicean bunaiteach is WAL gach còig mionaidean (`backup-offsite`) | Stòr air leth a dh’ainmicheas tu |
| Faidhlichean | An leabhar `files`. Dèan lethbhreac dheth le inneal cùl-taice an aoigh agad no cleachd stòradh nithean le tionndaidhean | Leabhar `files` |
| Dìomhaireachdan | `docker/.env`, os cionn gach nì `QUIRE_MASTER_KEY` (agus `QUIRE_MASTER_KEY_RETIRED` sam bith a tha fhathast ga chleachdadh), `QUIRE_BACKUP_ENCRYPTION_KEY` agus `docker/secrets/audit-signing-key.pem` | Cùm lethbhreac far an aoigh seo |
| Clàran-amais lorg, tasgadan, tionndaidhean | Cha tèid cùl-taic a dhèanamh dhiubh; thèid an ath-thogail | |

Targaidean: puing ath-bheothachaidh taobh a-staigh 60 diog bhon fhàilligeadh agus ath-nuadhachadh taobh a-staigh 60 mionaid airson stòr-dàta 500 GB.

Tha dà mhearachd cumanta ann. Bheir stòr-dàta air ath-nuadhachadh **gun na faidhlichean aige** duilleagan briste. Chan urrainn do stòr-dàta air ath-nuadhachadh **gun `QUIRE_MASTER_KEY`** teisteanasan SSO, webhook agus amalachaidh a tha ann a dhì-chrioptachadh; gus an tig cuairteachadh iuchrach-mhaighstir gu crìch gun dad gun fhuasgladh ([key-rotation.md](/gd/ops/key-rotation/)), tha na seann iuchraichean a tha air an leigeil dhith nam measg cuideachd. Buinidh an dà chuid don chùl-taic.

## Dèan cùl-taicean <!--quire:taking-backups-->

Cùl-taic bunasach a’ bhuidhinn gu lèir:

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

Cumaidh e na cùl-taicean bunaiteach as ùire, suas ri `QUIRE_BACKUP_KEEP` dhiubh (5 mar bhun-roghainn), agus glanaidh e WAL nach eil feumach tuilleadh air an tè as sine gus nach fhàs an tasglann gun chrìoch. Clàraich e gach latha le cron no timer systemd air an aoigh:

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

No leig leis a’ chàrn a chlàradh: ruithidh am pròifil `backup` `backup-scheduler`, a nì cùl-taic bunasach gach `QUIRE_BACKUP_INTERVAL_HOURS` uair a thìde (24 mar bhun-roghainn), agus `backup-offsite` a tha air a mhìneachadh an ath rud.

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

## Lethbhreacan crioptaichte taobh a-muigh an aoigh <!--quire:encrypted-off-host-copies-->

Tha an dà leabhar air an aon aoigh ris an stòr-dàta, agus chan e cùl-taic a th’ ann an cùl-taic air inneal a dh’fhàillig. Cuiridh `backup-offsite` gach cùl-taic bunasach agus gach earrann WAL a chaidh a thasgadh gu stòr eile tro phort an stòraidh, crioptaichte, agus cumaidh e an sin iad fo chumhachan gleidhidh:

- **Crioptachadh.** AES-256-GCM le `QUIRE_BACKUP_ENCRYPTION_KEY` (no faidhle air ainmeachadh le `QUIRE_BACKUP_ENCRYPTION_KEY_FILE`): 32 baidht, bho `openssl rand -hex 32`. Tha nonce agus taga dearbhaidh fhèin aig gach faidhle; mar sin chan urrainnear lethbhreac a leughadh gun iuchair, agus thèid atharrachadh sam bith a lorg. Cùm an iuchair còmhla ri `QUIRE_MASTER_KEY`, fada on aoigh seo agus bhon stòr cùl-taice. Chan urrainnear ath-nuadhachadh às aonais na h-iuchrach.
- **Àite.** Tha `QUIRE_BACKUP_STORAGE_DRIVER` `s3`, `azure` no `local` (diosg iomallach air a chur suas aig `QUIRE_BACKUP_STORAGE_ROOT`). Is iad roghainnean stòraidh nam faidhlichean le ro-leasachan `QUIRE_BACKUP_` na roghainnean aige: `QUIRE_BACKUP_S3_ENDPOINT`, `QUIRE_BACKUP_S3_BUCKET`, `QUIRE_BACKUP_S3_ACCESS_KEY_ID` agus mar sin air adhart. Cleachd bucaid eadar-dhealaichte agus, mas urrainn dhut, cunntas eadar-dhealaichte bho na faidhlichean; bu chòir do theisteanasan sgrìobhadh a cheadachadh ach sguabadh às a bhacadh ma cheadaicheas an solaraiche e.
- **Gleidheadh.** Cumaidh e na cùl-taicean bunaiteach as ùire suas ri `QUIRE_BACKUP_OFFSITE_KEEP` (mar bhun-roghainn `QUIRE_BACKUP_KEEP`, no 7), agus an WAL a tha a dhìth air an fhear as sine; thèid seataichean is earrannan nas sine a sguabadh às an stòr.
- **Cuin.** Gach `QUIRE_BACKUP_SHIP_INTERVAL_SECONDS` diog (300 mar bhun-roghainn). Tha cur air adhart idempotent: thèid na tha san stòr mar-thà a sheachnadh, agus cha bhi cùl-taic bunasach air a mheas ann gus an tèid a mhanaifest a sgrìobhadh mu dheireadh.

Faodar an aon àithne a ruith le làimh:

```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
```

Gus ath-nuadhachadh air aoigh ùr, thoir seata air ais an toiseach, agus lean na ceuman gu h-ìosal leis an eòlaire a chaidh fhaighinn an àite leabhar `pgbackup`, agus `wal-archive` a chaidh fhaighinn an àite `pgwal`:

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

## Ath-nuadhachadh gu àm sònraichte <!--quire:restoring-to-a-point-in-time-->

Cleachd seo an dèidh call dàta: droch ion-phortadh, cùrsa a chaidh a sguabadh às no imrich cùmhnaint a dh’fheumas tu a chur dheth. Cuiridh e an àite an stòr-dàta beò, mar sin cleachd an deuchainn gu h-ìosal ro làimh.

1. **Tagh an t-àm targaid**, ann an UTC, dìreach mus do thachair am milleadh: `2026-09-24 09:30:00+00`. Mar as trice seallaidh log an sgrùdaidh (`/admin/audit`) an t-àm.
2. **Cuir stad air a h-uile càil a sgrìobhas**: `docker compose -f docker/compose.yaml stop web content worker scheduler collab`.
3. **Cùm a’ bhuidheann mhillte** gus an dearbhar an t-ath-nuadhachadh:
   ```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. **Dì-phacaich an cùl-taic bunasach as ùire ron targaid** dhan leabhar dàta agus iarr ath-bheothachadh cuimsichte:
   ```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. **Dèan ath-bheothachadh**: tòisich PostgreSQL aon turas leis na roghainnean ath-bheothachaidh, ann an tar-àithne Compose gus am bi am faidhle àbhaisteach gun atharrachadh:
   ```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]
   ```
   Cuiridh an tar-àithne an àite na h-àithne air fad, agus mar sin tha i a’ toirt a-steach an dà roghainn air a bheil ath-bheothachadh an urra: `max_connections` co-dhiù cho àrd ris a’ phrìomh stòr-dàta (air neo thig ath-bheothachadh gu crìch le “insufficient parameter settings”) agus an `pg_hba.conf` a chaidh a chur suas.
   ```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. **Thoir sùil air** mus leig thu le duine clàradh a-steach: sreath an sgrùdaidh le `docker compose -f docker/compose.yaml run --rm worker bun tooling/audit-verify/run.ts`, agus dèan cinnteach gu bheil an dàta a chaidh a chall air ais.
7. **Till gu àbhaisteas**: `docker compose -f docker/compose.yaml up -d`. Tòisichidh seo PostgreSQL le tasgadh air agus tòisichidh loidhne-ama WAL ùr. Dèan cùl-taic bunasach ùr sa bhad.

Tha ainm a’ phròiseict `quire` air thoiseach air gach leabhar; seallaidh `docker volume ls` na dearbh ainmean.

## Deuchainn dearbhaidh chlàraichte <!--quire:the-scheduled-verification-drill-->

Bidh `backup-offsite` a’ ruith deuchainn gach `QUIRE_BACKUP_DRILL_INTERVAL_HOURS` (168, gach seachdain mar bhun-roghainn), agus a-rithist aig an ath chuairt an dèidh fàilligeadh. Gheibh e an cùl-taic bunasach as ùire far an aoigh agus gach earrann WAL às a dhèidh, dì-chrioptaichidh e iad (a dhearbhas gun fosgail an iuchair iad fhathast agus nach deach dad atharrachadh), nì e coimeas eadar gach faidhle agus am manifest, sgrùdaidh e gur e pasgan dàta Postgres a th’ anns an tasglann agus dearbhaidh e nach eil beàrn anns an WAL on chùl-taic air adhart. Thèid an aithisg a sgrìobhadh don stòr mar `reports/drill-<time>.json` agus gu log na seirbheise; ainmichidh deuchainn a dh’fhàilligeas am faidhle no a’ chiad earrann a tha a dhìth.

## Deuchainn ath-nuadhachaidh <!--quire:the-restore-drill-->

Chan e cùl-taic a th’ ann an cùl-taic nach deach ath-nuadhachadh a-riamh. Ath-nuadhaichidh an deuchainn an cùl-taic bunasach iomlan as ùire a chaidh a thogail ron targaid, còmhla ri tasglann WAL, ann am pròiseas Postgres sealach nach eil a’ roinn dad ris an fhear bheò, agus dearbhaidh i an toradh:

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

Feumaidh an targaid a bhith ann an UTC anns an dearbh chruth sin. Tha feum air cùl-taic bunasach nas sine agus WAL tasgaichte às a dhèidh: air stàladh ùr, dèan cùl-taic bunasach agus feith ris an ath earrann thasgaidh (mionaid aig a’ char as motha nuair a tha sgrìobhaidhean ann) mus tagh thu targaid an dèidh a’ chùl-taic. Feumaidh an deuchainn Docker agus bash air an aoigh, agus chan eil dad eile.

Fàilligidh an deuchainn aig gach ceum:

1. **Ath-bheothachadh**: ath-chluichidh am buidheann sealach chun targaid agus fosglaidh e.
2. **Coileantachd**: àireamh shreathan gach clàr an aghaidh an stòr-dàta bheò (`tooling/restore-drill`). Tha an stòr-dàta beò air gluasad air adhart on targaid; mar sin faodaidh àireamh clàir a bhith eadar-dhealaichte anns an dà rathad leis an luach as motha eadar 500 sreath agus an deicheamh cuid dhen mheud aige (cuiridh sgrìobhaidhean dàil air; cumaidh sguabadh às barrachd san ath-nuadhachadh). Chan e clàr caillte a th’ ann am pàirt a chaidh a chruthachadh an dèidh an targaid. Leudaich an cuibhreann air stàladh nas trainge le `QUIRE_DRILL_MAX_BEHIND` agus `QUIRE_DRILL_MAX_DRIFT_RATIO`. Fàilligidh clàr a tha a dhìth no falamh.
3. **Ionracas**: thèid sreath-hais an sgrùdaidh a dhearbhadh air an lethbhreac ath-nuadhaichte.
4. **Comas-cleachdaidh**: leughaidh dreuchd na h-aplacaid tro thèarainteachd ìre-shreathan.
5. **Ùine**: eadar tòiseachadh agus deisealachd, an aghaidh `QUIRE_DRILL_RTO_SECONDS` (3600 mar bhun-roghainn).

Cha sgrìobh e a-riamh dhan stòr-dàta bheò no dha na leabhraichean aige: tha leabhraichean cùl-taice is WAL air an cur suas le leughadh a-mhàin agus thèid am buidheann sealach a thoirt air falbh aig an deireadh, ge b’ e soirbheachadh no fàilligeadh.

Suidhich `QUIRE_DRILL_REPORT` gu slighe gus aithisg JSON a sgrìobhadh, soirbheachail no nach eil, agus ruith e a rèir clàr-ama bhon aoigh Docker:

```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
```

Ruith e gach mìos agus mus dèanar gach ùrachadh. Cuiridh deuchainn a dh’fhàillig stad air ùrachadh. Aon turas gach cairteal, iarr air cuideigin nach do sgrìobh an stiùireadh seo ath-nuadhachadh fìor gu àm sònraichte a dhèanamh air aoigh taice, a’ cleachdadh dìreach na sgrìobhainn seo.

## Faidhlichean <!--quire:files-->

Tha faidhlichean ionadail anns an leabhar `files`. Dèan cùl-taic dhiubh còmhla ris an stòr-dàta aig an aon àm, agus ath-nuadhaich an dà chuid còmhla:

```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 .
```

Le stòradh nithean, cuir tionndadh bucaid air agus cùm 35 latha de thionndaidhean nach eil làithreach; ’s e am bucaid fhèin a bheir ath-bheothachadh faidhlichean gu àm sònraichte an uair sin.

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