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
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), wannan ya haɗa da tsoffin
maɓallan ritaya. Duka biyun ɓangare ne na ajiyar bayanai.
Ɗaukar ajiyar bayanai
Ajiyar tushe ta dukan gungu:
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:
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.
docker compose -f docker/compose.yaml --profile backup up -d
Kwafi ɓoyayye a wajen uwar garke
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:
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
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:
bun apps/worker/src/backups/main.ts fetch base-20260924T021500Z /srv/restore
Maido zuwa wani lokaci
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.
Zaɓi lokacin manufa, a UTC, kafin lalacewar:
2026-09-24 09:30:00+00. Yawanci rajistar tantancewa (/admin/audit) tana
nuna lokacin.
Dakatar da duk abin da ke rubutawa:
docker compose -f docker/compose.yaml stop web content worker scheduler collab
Riƙe gungun da ya lalace har sai an tabbatar da maido:
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/
Buɗe sabuwar ajiyar tushe da ta gabaci lokacin manufa cikin volume ɗin
bayanai, sannan ka nemi maido da aka niyya:
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'
Mayar da bayanai: kunna Postgres sau ɗaya da saitunan maidowa, daga
Compose override domin kada a taɓa babban fayil na yau da kullum:
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.
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"
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.
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
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
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:
docker/scripts/restore-drill.sh # to ninety minutes agodocker/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:
Iya maidowa: gungun wucin gadi yana kunna WAL har zuwa lokacin manufa,
sannan ya buɗe.
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.
Mutunci: an tabbatar da sarkar hash ta tantancewa a kwafin da aka dawo.
Amfani: matsayin manhaja yana karantawa ta tsaron matakin layi.
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:
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
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:
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.