---
title: "Ajiyar bayanai, maido da wani lokaci da atisayen maido"
description: "Yi ajiyar Quire, mayar da shi zuwa wani lokaci, sannan tabbatar da hakan ta atisayen maido."
image: "https://docs.quirelms.com/og.png"
---

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

# Ajiyar bayanai, maido da wani lokaci da atisayen maido

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

Tsarin yana cikin sashen 8 na `docs/architecture/23-ops.md`. Wannan jagorar aiki
ce ta samfurin Docker Compose. An rubuta ta domin wanda bai rubuta ta ba ya bi ta;
idan wani mataki bai bayyana ba, wannan kuskure ne a takardar.

## Abin da ake karewa, da yadda <!--quire:what-is-protected-and-how-->

| Abu | Yadda ake karewa | Inda ake adanawa |
| --- | --- | --- |
| Ma'ajiya | Ana adana WAL kullum, aƙalla duk bayan daƙiƙa 60, tun farkon kunnawa | Volume na `pgwal` |
| Ma'ajiya | Ajiyoyin tushe da `pg_basebackup`, a matsayin tsoho kullum (`backup-scheduler`) | Volume na `pgbackup` |
| Ma'ajiya | Kwafin ajiyar tushe da WAL a ɓoye, duk bayan minti biyar (`backup-offsite`) | Wani ma'ajiya da ka zaɓa |
| Fayiloli | Volume na `files`. Kwafa shi da kayan ajiyar uwar garkenka, ko amfani da ma'ajiyar abubuwa mai sigogi | Volume na `files` |
| Sirrika | `docker/.env`, musamman `QUIRE_MASTER_KEY` (da kowane `QUIRE_MASTER_KEY_RETIRED` da ake amfani da shi), `QUIRE_BACKUP_ENCRYPTION_KEY`, da `docker/secrets/audit-signing-key.pem` | Riƙe kwafi a wajen wannan uwar garke |
| Ma'aunan bincike, caches, siffofin da aka sarrafa | Ba a yi musu ajiyar bayanai ba; ana sake gina su | |

Manufofi: samun damar maido da bayanan da suka wuce gazawa da bai wuce daƙiƙa
60 ba, da maido a cikin minti 60 ga ma'ajiya mai girman 500 GB.

Kurakurai biyu sun fi faruwa. Ma'ajiya da aka dawo da ita **ba tare da fayilolinta
ba** tana nuna shafuka karyayyu. Ma'ajiya da aka dawo da ita **ba tare da
`QUIRE_MASTER_KEY` ba** ba za ta iya warware bayanan shiga na SSO, webhook da haɗin
kai da take riƙe da su ba; har sai an kammala juya maɓallin babba ba tare da abin
da ba a warware ba ([key-rotation.md](/ha/ops/key-rotation/)), wannan ya haɗa da tsoffin
maɓallan ritaya. Duka biyun ɓangare ne na ajiyar bayanai.

## Ɗaukar ajiyar bayanai <!--quire:taking-backups-->

Ajiyar tushe ta dukan gungu:

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

Yana riƙe sabbin ajiyoyin tushe `QUIRE_BACKUP_KEEP` (tsoho 5) kuma yana cire
WAL ɗin da mafi tsohuwar ajiyar ba ta ƙara buƙata, domin taskar ba ta girma ba
har abada. Saita shi kullum da cron ko agogon systemd a uwar garke:

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

Ko ka bar gungun ya tsara su: bayanin `backup` yana gudanar da `backup-scheduler`,
wanda ke ɗaukar ajiyar tushe duk bayan `QUIRE_BACKUP_INTERVAL_HOURS` (tsoho 24),
da `backup-offsite`, wanda aka bayyana gaba.

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

## Kwafi ɓoyayye a wajen uwar garke <!--quire:encrypted-off-host-copies-->

Dukkan volume biyun suna kan uwar garke ɗaya da ma'ajiya, kuma ajiyar da ke kan
na'urar da ta lalace ba ajiyar bayanai ba ce. `backup-offsite` yana kwafe kowace
ajiyar tushe da kowane ɓangaren WAL da aka adana zuwa wani wurin daban ta tashar
ajiya, a ɓoye, ya kuma riƙe su bisa tsawon adanawa:

- **Boye bayanai.** AES-256-GCM tare da `QUIRE_BACKUP_ENCRYPTION_KEY` (ko fayil
  da `QUIRE_BACKUP_ENCRYPTION_KEY_FILE` ya nuna): bytes 32, daga
  `openssl rand -hex 32`. Kowane fayil yana da nonce da alamar tantancewa tasa,
  saboda haka ba za a iya karanta kwafi ba tare da maɓalli ba, kuma ana gano
  duk wani canjinsa. Riƙe maɓalli tare da `QUIRE_MASTER_KEY`, a nesa da wannan
  uwar garke da wurin ajiyar kwafi. Idan babu maɓalli, babu maido da bayanai.
- **Inda.** `QUIRE_BACKUP_STORAGE_DRIVER` yana zama `s3`, `azure` ko `local`
  (faifan nesa da aka haɗa a `QUIRE_BACKUP_STORAGE_ROOT`). Saitunan su ne irin
  na ajiyar fayil da aka ƙara musu `QUIRE_BACKUP_`: `QUIRE_BACKUP_S3_ENDPOINT`,
  `QUIRE_BACKUP_S3_BUCKET`, `QUIRE_BACKUP_S3_ACCESS_KEY_ID` da sauransu. Yi amfani
  da wani bokiti dabam, kuma zai fi kyau wani asusu dabam da na fayiloli, tare
  da takardun shiga da za su iya rubutawa amma ba sharewa ba idan mai samarwa ya
  yarda da hakan.
- **Tsawon adanawa.** Sabbin ajiyoyin tushe `QUIRE_BACKUP_OFFSITE_KEEP` (tsoho
  `QUIRE_BACKUP_KEEP`, in ba haka ba 7) da WAL da mafi tsohuwarsu ke buƙata;
  ana share tsofaffin saituka da sassa daga wurin ajiyar.
- **Lokaci.** Duk bayan `QUIRE_BACKUP_SHIP_INTERVAL_SECONDS` (tsoho 300). Aika
  ba ya yin abu sau biyu: ana tsallake abin da yake wurin tuni, kuma ana ɗaukar
  ajiyar tushe ta isa ne idan an rubuta takardar bayananta a ƙarshe.

Ana iya gudanar da waɗannan umarni da hannu:

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

Domin maido da bayanai a sabon uwar garke, da farko dawo da saitin kwafi, sannan
bi matakan da ke ƙasa ta amfani da babban fayil ɗin da aka dawo da shi a maimakon
volume na `pgbackup`, da `wal-archive` da aka samo a maimakon `pgwal`:

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

## Maido zuwa wani lokaci <!--quire:restoring-to-a-point-in-time-->

Yi haka bayan asarar bayanai: shigo da bayanai mara kyau, share kwas, ko ƙaura
ta takaita da kake buƙatar soke wa. Yana maye gurbin ma'ajiya mai aiki, don haka
ka fara gwada shi da atisayen da ke ƙasa.

1. **Zaɓi lokacin manufa**, a UTC, kafin lalacewar:
   `2026-09-24 09:30:00+00`. Yawanci rajistar tantancewa (`/admin/audit`) tana
   nuna lokacin.
2. **Dakatar da duk abin da ke rubutawa**:
   `docker compose -f docker/compose.yaml stop web content worker scheduler collab`
3. **Riƙe gungun da ya lalace** har sai an tabbatar da maido:
   ```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. **Buɗe sabuwar ajiyar tushe da ta gabaci lokacin manufa** cikin volume ɗin
   bayanai, sannan ka nemi maido da aka niyya:
   ```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. **Mayar da bayanai**: kunna Postgres sau ɗaya da saitunan maidowa, daga
   Compose override domin kada a taɓa babban fayil na yau da kullum:
   ```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]
   ```
   Override yana maye gurbin dukan umarni, don haka yana maimaita saituna biyu
   da maidowa ke buƙata: `max_connections` kada ya yi ƙasa da na uwar garken
   farko (idan ba haka ba maidowa yana ƙarewa da “insufficient parameter
   settings”), da `pg_hba.conf` da aka haɗa.
   ```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. **Duba shi** kafin a bari kowa ya shiga: sarkar tantancewa
   (`docker compose -f docker/compose.yaml run --rm worker bun tooling/audit-verify/run.ts`),
   da kuma tabbacin cewa bayanan da suka ɓace sun dawo.
7. **Koma yadda aka saba**: `docker compose -f docker/compose.yaml up -d`.
   Wannan yana sake fara Postgres tare da adana WAL, sabon jerin WAL kuma zai fara.
   Ɗauki sabuwar ajiyar tushe nan take.

Sunan aikin `quire` yana zuwa a farkon sunan kowane volume; `docker volume ls`
yana nuna ainihin sunayen.

## Atisayen tantancewa da aka tsara <!--quire:the-scheduled-verification-drill-->

`backup-offsite` yana gudanar da atisaye duk bayan
`QUIRE_BACKUP_DRILL_INTERVAL_HOURS` (tsoho 168, mako-mako), kuma yana sake yi a
zagaye na gaba bayan gazawa. Yana samo sabuwar ajiyar tushe daga wajen uwar garke
da kowane ɓangaren WAL bayanta, yana warware kullewar kowane (wanda ke tabbatar
maɓalli yana buɗe su kuma babu abin da aka sauya), yana kwatanta fayil da bayanin
sa, yana tabbatar taskar kundin bayanai ce ta Postgres, sannan yana duba WAL daga
ajiyar gaba babu gibi. Ana rubuta rahoto a wurin ajiyar a matsayin
`reports/drill-<time>.json` da kuma log na hidima; atisayen da ya gaza yana bayyana
fayil ko sashin farko da ya ɓace.

## Atisayen maido <!--quire:the-restore-drill-->

Ajiyar bayanai da ba a taɓa maidowa ba ba ajiyar bayanai ba ce. Atisayen yana
maido da cikakkiyar ajiyar tushe ta ƙarshe kafin manufa tare da taskar WAL, zuwa
Postgres na wucin gadi da ba ya raba komai da mai aiki, sannan ya tabbatar da
sakamako:

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

Lokacin manufa dole ne ya zama UTC a daidai wannan tsarin. Ana buƙatar ajiyar tushe
da ta girmi sa da WAL da aka adana bayansa: a sabuwar shigarwa, ɗauki ajiyar tushe
ka jira sashin da za a adana na gaba (aƙalla minti ɗaya idan ana rubutu) kafin
zaɓar manufa bayan ajiyar. Atisaye yana buƙatar Docker da bash a uwar garke kawai.

Kowane mataki yana sa atisayen ya gaza:

1. **Iya maidowa**: gungun wucin gadi yana kunna WAL har zuwa lokacin manufa,
   sannan ya buɗe.
2. **Cikawa**: ƙididdigar layukan kowane tebur idan aka kwatanta da ma'ajiya mai
   aiki (`tooling/restore-drill`). Ma'ajiya mai aiki ta ci gaba tun lokacin manufa,
   saboda haka tebur na iya bambanta da mafi girman adadin layuka 500 ko kashi
   ɗaya bisa goma na girmansa, ta kowace alkibla (rubutu yana sa maido ya ragu,
   sharewa kuma ya sa ya fi yawa); partition da aka ƙirƙira bayan lokacin ba tebur
   da ya ɓace ba ne. Faɗaɗa izinin a shigarwa mai yawan aiki ta `QUIRE_DRILL_MAX_BEHIND`
   da `QUIRE_DRILL_MAX_DRIFT_RATIO`. Tebur da ya ɓace ko ya zama fanko yana sa ya gaza.
3. **Mutunci**: an tabbatar da sarkar hash ta tantancewa a kwafin da aka dawo.
4. **Amfani**: matsayin manhaja yana karantawa ta tsaron matakin layi.
5. **Lokaci**: daga farawa zuwa nasara, bisa `QUIRE_DRILL_RTO_SECONDS` (tsoho 3600).

Ba ya rubutawa a ma'ajiya ko volume mai aiki: an haɗa volume na ajiyar bayanai
da WAL a yanayin karatu kawai, kuma ana cire gungun wucin gadi a ƙarshe, ko ya
wuce ko ya gaza.

Saita `QUIRE_DRILL_REPORT` zuwa hanya domin rubuta rahoton JSON, ko ya wuce ko ya
gaza, sannan gudanar da shi bisa jadawali daga Docker host:

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

Gudanar da shi kowane wata da kafin kowane sabuntawa. Atisayen da ya gaza yana
hana sabuntawa. Sau ɗaya a kwata, sa wani wanda bai rubuta wannan jagorar ba ya
yi maido na gaske zuwa wani lokaci a uwar garke na gefe, ta amfani da wannan
takarda kawai.

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

Fayilolin gida suna cikin volume na `files`. Yi musu ajiyar bayanai tare da
ma'ajiya, a lokaci guda, sannan a maidowa da su gaba ɗaya:

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

A ma'ajiyar abubuwa, kunna sigogin bokiti kuma riƙe tsofaffin sigogi na kwana 35;
maidowa zuwa wani lokaci ga fayiloli aikin bokiti ne da kansa.

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