---
title: "Камдык көчүрмө, учурга чейинки калыбына келтирүү жана калыбына келтирүү машыгуусу"
description: "Quire'ди камдыкка көчүрүңүз, белгилүү учурга чейин калыбына келтириңиз жана калыбына келтирүү машыгуусу менен далилдеңиз."
image: "https://docs.quirelms.com/og.png"
---

> Documentation Index
> Fetch the complete documentation index at: https://docs.quirelms.com/ky/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-->

| Asset | How | Where |
| --- | --- | --- |
| Маалымат базасы | 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 ГБ маалымат базасы үчүн 60 мүнөттүн ичинде
калыбына келтирүү.

Эки ката кеңири таралган. **Файлдарысыз** калыбына келтирилген маалымат
базасы бузук беттерди көрсөтөт. **`QUIRE_MASTER_KEY`'сиз** калыбына
келтирилген маалымат базасы камтый турган SSO, вебхук жана интеграция
купуялык маалыматтарын шифрлөөдөн чыгара албайт; негизги килит
алмаштыруусу чечилбеген эч нерсе калбай бүткөнгө чейин
([key-rotation.md](/ky/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 бөлүгүн
сактоо порту аркылуу айырма кампага, шифрлөө менен көчүрөт жана аларды
ал жерде сактоо мөөнөтү менен кармайт:

- **Шифрлөө.** `QUIRE_BACKUP_ENCRYPTION_KEY` (же
  `QUIRE_BACKUP_ENCRYPTION_KEY_FILE` атаган файл) менен AES-256-GCM: 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` ж.б. Файлдардан айрыма bucket жана,
  мүмкүн болсо, айрыма эсеп колдонуңуз, провайдер уруксат кылса өчүрө
  албай, жаза алган купуялыктар менен.
- **Сактоо мөөнөтү.** Эң жаңы `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-->

Буну маалымат жоготкодон кийин колдонуңуз: бузулган импорт, өчүрүлгөн
курс, кайтарыш керек болгон кыскартуу миграциясы. Ал азыркы маалымат
базасын алмаштырат, ошондуктан аны алгач төмөндөгү машыгуу менен
машыктырыңыз.

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

Объекттик сактоо менен bucket версиялаштыруусун күйгүзүп, 35 күндүк
актуалдуу эмес версияларды кармаңыз; андан кийин файлдар үчүн учурга
чейинки калыбына келтирүү — bucket'тын өзү.

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