---
title: "Сақтық көшірме, уақыт бойынша қалпына келтіру және қалпына келтіру жаттығуы"
description: "Quire-ді сақтық көшірмеңіз, уақыт бойынша қалпына келтіріңіз және оны қалпына келтіру жаттығуымен дәлелдеңіз."
image: "https://docs.quirelms.com/og.png"
---

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

# Сақтық көшірме, уақыт бойынша қалпына келтіру және қалпына келтіру жаттығуы

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

Жоба `docs/architecture/23-ops.md` құжатының 8-тармағында. Бұл Docker
Compose өнімінің жұмыс нұсқаулығы. Ол оны жазбаған адам орындайтын
дейін жазылған; қадам түсініксіз болса, бұл құжаттың өз ақауы.

## Нені қорғайды және қалай <!--quire:what-is-protected-and-how-->

| Мүлік | Қалай | Қайда |
| --- | --- | --- |
| Дерекқор | WAL үздіксіз архивтеледі, алғашқы қосылғаннан бастап 60 секундтан аспай | `pgwal` томы |
| Дерекқор | `pg_basebackup` арқылы негізгі сақтық көшірмелері, әдепкіде күн сайын (`backup-scheduler`) | `pgbackup` томы |
| Дерекқор | Негізгі сақтық көшірмелері мен WAL-дің шифрленген көшірмелері, бес минут сайын (`backup-offsite`) | Сіз атап беретін бөлек қойма |
| Файлдар | `files` томы. Оны хостыңыздың сақтық көшірме құралымен көшіріңіз немесе нұсқалы объектілік қойманы пайдаланыңыз | `files` томы |
| Құпиялар | `docker/.env`, ең алдымен `QUIRE_MASTER_KEY` (және әлі қолданыстағы кез келген `QUIRE_MASTER_KEY_RETIRED`), `QUIRE_BACKUP_ENCRYPTION_KEY`, және `docker/secrets/audit-signing-key.pem` | Көшірмесін осы хосттан тыс жерде сақтаңыз |
| Іздеу индестері, кэштер, өңделген нұсқалар | Сақтық көшірме алынбайды; қайта құрылады | |

Мақсаттар: сәтсіздіктен кейін 60 секунд ішіндегі қалпына келтіру
нүктесі және 500 GB дерекқор үшін 60 минут ішіндегі қалпына
келтіру.

Екі қате жиі кездеседі. **Файлдарынсыз** қалпына келтірілген
дерекқор бұзылған беттерді көрсетеді. **`QUIRE_MASTER_KEY`сыз**
қалпына келтірілген дерекқор ұстап тұрған SSO, webhook және
интеграция кілттерін аша алмайды; мастер-кілт ауыстыру шешілмеген
нәрсесіз аяқталғанға дейін ([key-rotation.md](/kk/ops/key-rotation/)), бұл
зейнетке шыққан кілттерді де қамтиды. Екеуі де сақтық көшірменің
бөлігі.

## Сақтық көшірме алу <!--quire:taking-backups-->

Бүкіл кластердің негізгі сақтық көшірмесі:

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

Ол ең жаңа `QUIRE_BACKUP_KEEP` негізгі сақтық көшірмесін (әдепкі 5)
ұстап қалады және ең көне біреуге енді қажет емес WAL-ді қысқартады,
сондықтан архив шексіз өсе алмайды. Оны хостта cron немесе systemd
таймерімен күн сайын жоспарлаңыз:

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

Немесе жинақтың өзіне жоспарлаңыз: `backup` профилі `backup-scheduler`
жүргізеді, ол әр `QUIRE_BACKUP_INTERVAL_HOURS` сайын (әдепкі 24)
негізгі сақтық көшірме алады, және төменде сипатталатын
`backup-offsite`.

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

## Шифрленген хосттан тыс көшірмелер <!--quire:encrypted-off-host-copies-->

Екі том да дерекқормен бір хостта тұрады, ал сәтсіз болған
машинадағы сақтық көшірме — сақтық көшірме емес. `backup-offsite`
әр негізгі сақтық көшірмені және әр архивтелген WAL бөлігін қойма
порты арқылы шифрленген түрде бөлек қоймаға көшіреді және оларды
сонда сақтайды:

- **Шифрлеу.** AES-256-GCM `QUIRE_BACKUP_ENCRYPTION_KEY` кілтімен
  (`QUIRE_BACKUP_ENCRYPTION_KEY_FILE` атайтын файлдың орнына): 32
  байт, `openssl rand -hex 32` арқылы. әр файлдың өз nonce-ы мен
  аутентификация белгісі бар, сондықтан көшірме кілтсіз оқылмайды және
  оның әр өзгерісі анықталады. Кілтті `QUIRE_MASTER_KEY`-пен бірге,
  осы хосттан және сақтық көшірме қоймасынан алыс жерде сақтаңыз.
  Кілт болмаса, қалпына келтіру жоқ.
- **Қайда.** `QUIRE_BACKUP_STORAGE_DRIVER` — `s3`, `azure` немесе
  `local` (`QUIRE_BACKUP_STORAGE_ROOT` мекенжайында бекітілген
  қашықтық диск). Параметрлер файл қоймасынікі, бірақ `QUIRE_BACKUP_`
  префиксімен: `QUIRE_BACKUP_S3_ENDPOINT`, `QUIRE_BACKUP_S3_BUCKET`,
  `QUIRE_BACKUP_S3_ACCESS_KEY_ID` және т.б. Файлдардан бөлек шелек
  және мүмкін болса бөлек аккаунт пайдаланыңыз, провайдер рұқсат
  етсе, жаза алатын, бірақ жоя алмайтын кілттермен.
- **Сақтау мерзімі.** Ең жаңа `QUIRE_BACKUP_OFFSITE_KEEP` негізгі
  сақтық көшірмесі (әдепкі `QUIRE_BACKUP_KEEP`, болмаса 7) және
  олардың ең көнесіне қажет WAL; ескірек жиынтар мен бөліктер
  қоймадан жойылады.
- **Қашан.** әр `QUIRE_BACKUP_SHIP_INTERVAL_SECONDS` сайын (әдепкі
  300). Жеткізу идемпотентті: қазірдің өзінде сақталған нәрсе аттап
  өтіледі, және негізгі сақтық көшірме манифесті соңында жазылғанға
  дейін сақталған саналмайды.

Сол команда қолмен жүреді:

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

Жаңа хостта қалпына келтіру үшін алдымен жиынды қайта әкеліңіз,
содан кейін төмендегі қадамдарды алынған каталогты `pgbackup` томы
орнына, ал алынған `wal-archive`-ты `pgwal` орнына қойып орындаңыз:

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

## Уақыт бойынша қалпына келтіру <!--quire:restoring-to-a-point-in-time-->

Мұны деректер жоғалғаннан кейін пайдаланыңыз: нашар импорт, жойылған
курс, болдырмау керек contract миграциясы. Ол тірі дерекқорды
ауыстырады, сондықтан алдымен төмендегі жаттығумен тексеріп көріңіз.

1. **Мақсат уақытын таңдаңыз**, UTC-де, зақымдан бір сәт бұрын:
   `2026-09-24 09:30:00+00`. Аудит журналы (`/admin/audit`) әдетте
   сол сәтті көрсетеді.
2. **Жазатын бәрін тоқтатыңыз**:
   `docker compose -f docker/compose.yaml stop web content worker scheduler collab`
3. **Зақымдалған кластерді** қалпына келтіру расталғанға дейін
   сақтаңыз:
   ```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. **Мақсаттан ескі ең жаңа негізгі сақтық көшірмені** деректер томына
   тарқатып, бағытталған қалпына келтіруді сұраңыз:
   ```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. **Қалпына келтіріңіз**: Postgres-ті қалпына келтіру параметрлерімен
   бір рет іске қосыңыз, қалыпты файлға тимейтіндей Compose override
   арқылы:
   ```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 бүкіл команданы ауыстырады, сондықтан қалпына
   келтіруге тәуелді екі параметрді қайталайды: `max_connections`
   негізгіден төмен емес (әйтпесе қалпына келтіру "insufficient
   parameter settings" қатесімен тоқтайды) және бекітілген
   `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. **Тексеріңіз**, ешкімді кіргізбей тұрып: аудит тізбегі
   (`docker compose -f docker/compose.yaml run --rm worker bun tooling/audit-verify/run.ts`),
   және жоғалған деректер қайта келгенін.
7. **Қалыпты күйге оралыңыз**: `docker compose -f docker/compose.yaml up -d`.
   Бұл Postgres-ті архивтеу қосулы түрде қайта іске қосады және жаңа
   WAL уақыт сызығы басталады. Дереу жаңа негізгі сақтық көшірме
   алыңыз.

Жоба атауы `quire` әр томның алдына қосылады; `docker volume ls` дәл
атауларды көрсетеді.

## Жоспарланған растау жаттығуы <!--quire:the-scheduled-verification-drill-->

`backup-offsite` әр `QUIRE_BACKUP_DRILL_INTERVAL_HOURS` сайын да
жаттығу жүргізеді (әдепкі 168, апта сайын), және біреуі сәтсіз
болғаннан кейінгі келесі өтімде қайта. Ол ең жаңа хосттан тыс
негізгі сақтық көшірмені және одан кейінгі әр WAL бөлігін алады,
әрқайсысын ашады (бұл кілттің әлі де ашатынын және ештеңе өзгермегенін
дәлелдейді), әр файлды оның манифестімен салыстырады, архивтің
Postgres деректер каталогы екенін тексереді және көшірмеден кейінгі
WAL-де үзіліс жоқ екенін тексереді. Есеп `reports/drill-<time>.json`
түрінде қоймаға және қызмет журналына жазылады; сәтсіз жаттығу
файлды немесе алғашқы жетіспейтін бөлікті атайды.

## Қалпына келтіру жаттығуы <!--quire:the-restore-drill-->

Ешқашан қалпына келтірілмеген сақтық көшірме — сақтық көшірме емес.
Жаттығу мақсаттан бұрын алынған ең жаңа толық негізгі сақтық
көшірмесін және WAL архивін тірі дерекқорменештеңе бөліспейтін
уақытша Postgres-ке қалпына келтіреді және нәтижені дәлелдейді:

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

Мақсат дәл осы пішіндегі UTC. Оған одан ескі негізгі сақтық көшірме
және одан кейінгі архивтелген WAL қажет: жаңа орнатылымда көшірмеден
кейінгі мақсатты таңдаудан бұрын негізгі сақтық көшірме алып, келесі
архивтелген бөлікті күтіңіз (жазу кезінде минуттан артық емес).
Жаттығуға хостта Docker мен bash қажет, басқа ештеңе емес.

әр қадам жаттығуды сәтсіз етеді:

1. **Қалпына келтірілетіндік**: уақытша кластер мақсатқа дейін
   қайта ойнатып, ашады.
2. **Толықтық**: әр кестенің жол саны тірі дерекқормен салыстырылады
   (`tooling/restore-drill`). Тірі дерекқор мақсаттан бері алға
   жылжыған, сондықтан кесте 500 жол мен өлшемінің ондығының үлкені
   мөлшерінде, екі бағытта да айырылуы мүмкін (жазу артта қалдырады,
   жою қалпына келтірілгенде көбірек ұстауға мүмкіндік береді);
   мақсаттан кейін жасалған бөлім жоғалған кесте емес. Белсендірек
   орнатылымда рұқсатты `QUIRE_DRILL_MAX_BEHIND` және
   `QUIRE_DRILL_MAX_DRIFT_RATIO` арқылы кеңейтіңіз. Жоқ немесе
   бос кесте сәтсіз болады.
3. **Бүтіндік**: аудит хэш тізбегі қалпына келтірілген көшірмеде
   расталады.
4. **Пайдаланылатындық**: қолданба рөлі жол деңгейіндегі қауіпсіздік
   арқылы оқиды.
5. **Уақыт**: жасыл күйге дейін, `QUIRE_DRILL_RTO_SECONDS` (әдепкі
   3600) бойынша.

Ол тірі дерекқорға немесе оның томдарына ешқашан жазбайды: сақтық
көшірме мен WAL томдары тек оқу режимінде бекітілген және уақытша
кластер соңында, өткеніне қарамастан жойылады.

Жазуға, өткеніне қарамастан, JSON есеп жазылатын жол ретінде
`QUIRE_DRILL_REPORT` параметрін орнатыңыз және оны 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
```

Оны ай сайын және әр жаңартудан бұрын жүргізіңіз. Сәтсіз жаттығу
жаңартуды бөгейді. Төрт апта сайын біреуден, бұл нұсқаулықты жазбаған
адамнан, тек осы құжатты пайдаланып, бос хостта нақты уақыт бойынша
қалпына келтіруді орындаңыз.

## Файлдар <!--quire:files-->

Жергілікті файлдар `files` томында тұрады. Оны дерекқормен бірге,
сол сәтте сақтық көшірмеңіз және екеуін бірге қалпына келтіріңіз:

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

Объектілік қоймамен шелектің нұсқаларын қосып, 35 күндік емес
ағымдағы нұсқаларды сақтаңыз; файлдар үшін уақыт бойынша қалпына
келтіру содан кейін шелектің өзінде болады.

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