Дизайн docs/architecture/23-ops.md 8-бөлүмүндө. Бул Docker Compose
продукты үчүн иш китепчеси. Аны жазбаган адам аткарышы үчүн жазылган;
кадам түшүнүксүз болсо, бул документтин кемчилиги.
Эмне корголот жана кантип
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), ага кетирилген килттер да кирет.
Экөө тең камдык көчүрмөнүн бир бөлүгү.
Камдык көчүрмө алуу
Бүткүл кластердин негизги камдык көчүрмөсү:
docker compose -f docker/compose.yaml --profile backup run --rm backup
Ал эң жаңы QUIRE_BACKUP_KEEP негизги камдык көчүрмөсүн (демилгелик 5)
сактап, эң эскисине кереги жок WAL’ды тазалайт, ошондуктан архив
чексиз өсө албайт. Аны хосттогу cron же systemd таймери менен күнүнө
жайыңыз:
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.
docker compose -f docker/compose.yaml --profile backup up -d
Шифрленген хосттон тышкары көчүрмөлөр
Эки том тең маалымат базасы менен бир хостто турат, жана ийгиликсиз
болгон машинадагы камдык көчүрмө — камдык көчүрмө эмес. 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).
Жеткирүү бирдейликке ээ: мурунтан сакталганы өткөрүлөт, жана негизги
камдык көчүрмө манифести акыркысы болуп жазылганча гана сакталган
деп эсептенет.
Ошол эле буйрук кол менен иштетилет:
docker compose -f docker/compose.yaml run --rm backup-offsite bun apps/worker/src/backups/main.ts shipdocker compose -f docker/compose.yaml run --rm backup-offsite bun apps/worker/src/backups/main.ts verify
Жаңы хостто калыбына келтирүү үчүн, алгач топтомду алып келиңиз, андан
кийин төмөндөгү кадамдарды аткарыңыз, pgbackup томнүн ордуна жүктөлгөн
папканы жана wal-archive’ты pgwal ордуна колдонуп:
bun apps/worker/src/backups/main.ts fetch base-20260924T021500Z /srv/restore
Белгилүү учурга калыбына келтирүү
Буну маалымат жоготкодон кийин колдонуңуз: бузулган импорт, өчүрүлгөн
курс, кайтарыш керек болгон кыскартуу миграциясы. Ал азыркы маалымат
базасын алмаштырат, ошондуктан аны алгач төмөндөгү машыгуу менен
машыктырыңыз.
Максат убакытты тандаңыз, UTC’де, зыяндан бир аз мурда:
2026-09-24 09:30:00+00. Аудит журналы (/admin/audit) адатта ошол
учурду көрсөтөт.
Бардык жазууну токтотуңуз:
docker compose -f docker/compose.yaml stop web content worker scheduler collab
Бузулган кластерди калыбына келтирүү текшерилгиче кармаңыз:
docker compose -f docker/compose.yaml stop postgresdocker run --rm -v quire_postgres18-data:/from -v quire_postgres-damaged:/to alpine cp -a /from/. /to/
Максаттан мурунку эң жаңы негизги камдык көчүрмөнү маалымат
томунун ичине чыгарып, багыттуу калыбына келтирүүнү сураңыз:
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'
Калыбына келтирүү: Postgres’ти калыбына келтирүү жөндөөлөрү менен
бир жолу иштетиңиз, адаттагы файлга тийбегидей кылып Compose
override аркылуу:
Override бардык буйрукту алмаштырат, ошондуктан ал калыбына
келтирүүгө керек болгон эки жөндөөнү кайталайт: max_connections
негизги базадан төмөн болбосу (болбосо калыбына келтирүү
“insufficient parameter settings” себебинен токтойт) жана
туташтырылган pg_hba.conf.
docker compose -f docker/compose.yaml -f docker/compose.recover.yaml up -d postgresdocker compose -f docker/compose.yaml logs -f postgres # wait for "database system is ready"
Аны текшериңиз, эч кимди киргизүүдөн мурун: аудит чынжырын
(docker compose -f docker/compose.yaml run --rm worker bun tooling/audit-verify/run.ts),
жана жоголгон маалымат кайта келгенин.
Адаттагы абалга кайтыңыз: docker compose -f docker/compose.yaml up -d.
Бул Postgres’ти архивлөө менен кайра иштетет жана жаңы WAL
убакыт чынжыры башталат. Дароо жаңы негизги камдык көчүрмө алыңыз.
Проект аты quire ар бир томдун алдына кошулат; так аттарды
docker volume ls көрсөтөт.
Пландаштырылган текшерүү машыгуусу
backup-offsite ошондой эле ар QUIRE_BACKUP_DRILL_INTERVAL_HOURS
сайын (демилгелик 168, жумасына) машыгуу иштетет, жана бири
ийгиликсиз болсо кийинки өтүшүндө кайра. Ал эң жаңы хосттон тышкары
негизги камдык көчүрмөнү жана андан кийинки ар бир WAL бөлүгүн жүктөп
алат, ар бирин шифрлөөдөн чыгарат (бул килит дагы эле ачарын жана эч
нерсе өзгөртүлбөгөнүн далилдейт), ар бир файлды анын манифести менен
салыштырат, архив Postgres маалымат папкасы экенин текшерет жана
камдык көчүрмөдөн бери WAL’да үзүлүш жок экенин текшерет. Отчёт кампага
reports/drill-<time>.json катары жана кызматтын журналына жазылат;
ийгиликсиз машыгуу файлды же биринчи жетпей турган бөлүктү атайт.
Калыбына келтирүү машыгуусу
Эч качан калыбына келтирилбеген камдык көчүрмө — камдык көчүрмө эмес.
Машыгуу максатка чейин алынган эң жаңы толук негизги камдык көчүрмөнү,
WAL архивин кошо, тирүү менен эч нерсе бөлүшпөй турган убактылуу
Postgres’ке калыбына келтирет жана натыйжаны далилдейт:
docker/scripts/restore-drill.sh # to ninety minutes agodocker/scripts/restore-drill.sh --target "2026-09-24 09:30:00+00"
Максат так ушул түрдө UTC болот. Ага андан мурунку негизги камдык
көчүрмө жана андан ары архивленген WAL керек: жаңы орнотууда негизги
камдык көчүрмө алып, максатты камдык көчүрмөдөн кийин тандаганга чейин
кийинки архивленген бөлүктү күтүңүз (жазуу болгондо көп болгондо бир
мүнөт). Машыгууга хостто Docker жана bash керек, башка эч нерсе керек эмес.
Ар бир кадам машыгууну ийгиликсиз кылат:
Калыбына келтирилүүчүлүк: убактылуу кластер максатка чейин
кайра ойнотуп, ачылат.
Толуктуу: ар бир таблицанын сабынын саны тирүү маалымат
базасына каршы (tooling/restore-drill). Тирүү маалымат базасы
максаттан бери өнүп кеткен, ошондуктан таблица 500 саптын жана
өлчөмүнүн ондон биринин чоңураагы боюнча айырмашышы мүмкүн, эки
багытта да (жазуулар аны кечиктирет, өчүрүүлөр калыбына келтирүү
көбүрөөк камтыйт); максаттан кийин түзүлгөн бөлүм жоголгон таблица
эмес. Ортодо көбүрөк орнотууда QUIRE_DRILL_MAX_BEHIND жана
QUIRE_DRILL_MAX_DRIFT_RATIO менен чени кеңиңүрөк кылыңыз. Жетпей
турган же бош таблица ийгиликсиз кылат.
Бүтүндүк: аудит хэш чынжыры калыбына келтирилген көчүрмөдө
текшерилет.
Жеткиликтүүлүк: колдонмо ролу сап деңгээлинде коргоо аркылуу
окуйт.
Убакыт: баштаптан жашылга чейин, QUIRE_DRILL_RTO_SECONDS’ка
каршы (демилгелик 3600).
Ал тирүү маалымат базасына же анын томдоруна эч качан жазбайт: камдык
көчүрмө жана WAL томдору окуу гана режиминде туташтырылган жана
убактылуу кластер аяктоодо, өтсө да өтпөсө да өчүрүлөт.
JSON отчёт жазылышы үчүн, өтсө да өтпөсө да, QUIRE_DRILL_REPORT’ти
жолго коюңуз жана аны Docker хостунан жайы менен иштетиңиз:
Аны ай сайын жана ар бир жаңылоодон мурун иштетиңиз. Ийгиликсиз
машыгуу жаңылоону тосуп калат. Ар чейректе, бул иш китепчесин жазбаган
адамга, ушул документти гана колдонуп, атайын хостто чыныгы учурга
чейинки калыбына келтирүүнү жасатыңыз.
Файлдар
Жергиликтүү файлдар files томндө. Аны маалымат базасы менен бирге,
ал эми учурда, камдыкка көчүрүңүз жана экөөнүн да чогуу калыбына
келтириңиз:
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’тын өзү.