Rêşebeciya docs/architecture/23-ops.md beş 8 e. Ev runbooka berhevoka Docker Compose ye. Ji bo ku bi qasî were bikaranîn ji aliyê kesekî ve hatiye nivîsandin ku ne wê nivîsiye; ger gavek neçawaş e, ew eybê vê belgeyê ye.
Çi tê parastin, û çawa
Sarvek
Çawa
Li kêyê
Danegirş
WAL bi tevahiye tê arşîvkirin, bi kêmtirî her 60 deqîqeyek, ji yekem boot ve
volume pgwal
Danegirş
Veparîstinên bingehî bi pg_basebackup, bi veberî rojanek ( backup-scheduler)
volume pgbackup
Danegirş
Kopîyên şifrakirî yên veparîstinên bingehî û WAL, her pênc deqîqeyek (backup-offsite)
Danekeke cuda ku tu navdide
Dosye
volume files. Wê bi amûra veparîstina servera te kopî bike, an hilanîneyeke tiştên nûşeyê bikar bîne
volume files
Nepûr
docker/.env, bi baştir QUIRE_MASTER_KEY (û her QUIRE_MASTER_KEY_RETIRED ku hê tê bikaranîn), QUIRE_BACKUP_ENCRYPTION_KEY, û docker/secrets/audit-signing-key.pem
Kopîyeke ji vê serverê derxe biparîzê
Indeksên lêgerdinê, cach, rendît
Ne tên veparîstin; tên nûveçêkirin
Armanc: nîşaneyekî sererastkirin di 60 deqîqe de ji serneketê, û sererastkirinek di 60 deqîqe de ji bo danegirşekî 500 GB.
Du xeletî hênarin. Danegirşek ku bê dosyeyan tê sererastkirin rûpelekî şîştî nîşan dide. Danegirşek ku bê QUIRE_MASTER_KEY tê sererastkirin nikare têketnaverên SSO, webhook û yekkêşin ku dihêle şifra; heta ku gurîştineke kilîta sereke bê tiştî neçareser temam bibe (key-rotation.md), ew di qeyda kilîtên bêjestî de tê. Herdu beşeka veparîstinê ne.
Veparîstinên girtîn
Veparîstineke bingehî ya tevahî klûterê:
docker compose -f docker/compose.yaml --profile backup run --rm backup
Ew QUIRE_BACKUP_KEEP veparîstinên bingehî ya herî nû parastî dike (veberî 5) û WALya ku veparîstina herî kevn naxwaze tê paqijin, ji ber vê arşîv nikare bi beqeya bêdawî mezin bibe. Wê bi cron an timekekî systemd li ser serverê rojanek bide navêrerî:
15 2 * * * cd /srv/quire && docker compose -f docker/compose.yaml --profile backup run --rm backup >> /var/log/quire-backup.log 2>&1
An bila stack wê rabeşîne: profîla backupbackup-scheduler bixebitîne, ku her QUIRE_BACKUP_INTERVAL_HOURS (veberî 24) veparîstineke bingehî digire, û backup-offsite, ku di peş ve şîrokirî ye.
docker compose -f docker/compose.yaml --profile backup up -d
Kopîyên şifrakirî ji serverê derve
Herdu volume li ser heman serverê ya danegirşê ne, û veparîstinek li ser makîneya ku serket veparîstin nîn e. backup-offsite her veparîstineke bingehî û her parçaya WAL ya arşîvkirî bi rêkî porta hilanînê biçe danekeke cuda, bi şifrakirin, û wê li wir bi retênsiyonê parastî dike:
Şifrakirin. AES-256-GCM bi QUIRE_BACKUP_ENCRYPTION_KEY (an dosye ku QUIRE_BACKUP_ENCRYPTION_KEY_FILE navdide): 32 hejmara, ji openssl rand -hex 32. Her dosye nonce û etîketa rastînkirinê ya xwe heye, ji ber vê kopîyeke bê kilît nehat dîtin û her guhertin tê şayenkirin. Kilît bi QUIRE_MASTER_KEY re biparîzê, derxûn ji vê serverê û derxûn ji daneke veparîstinê. Bê kilît sererastkirin tune.
Li kêyê.QUIRE_BACKUP_STORAGE_DRIVERs3, azure an local ye (dîskekî dûr ku di QUIRE_BACKUP_STORAGE_ROOT de girêdayî ye). Mîhaz mîhazên hilanîna dosye ne bi pêşgota QUIRE_BACKUP_: QUIRE_BACKUP_S3_ENDPOINT, QUIRE_BACKUP_S3_BUCKET, QUIRE_BACKUP_S3_ACCESS_KEY_ID, û wisa. Bucketekî cuda an, ji bo çêt, qeydeke cuda ji dosyan bikar bîne, bi têketnaverên ku dikarin nivîsin lê ne rakin ger dabînker destûr dike.
Retênsiyon.QUIRE_BACKUP_OFFSITE_KEEP veparîstinên bingehî ya herî nû (veberî QUIRE_BACKUP_KEEP, paş 7) û WALya ku herî kevn wan pêwîst e; kome û parçeyên kevn ji daneke tê rakirin.
Dîmeke. Her QUIRE_BACKUP_SHIP_INTERVAL_SECONDS (veberî 300). Şandn bi bixwe ye: ew ku hê hatiye hilanîn tê derxistin, û veparîstineke bingehî tenê gava manifesta wê hatiye nivîsandin, di dawî de, tê hezkirin ji bo hatiye hilanîn.
Heman ferman bi dest bixebite:
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
Ji bo sererastkirinê li serverekî nû, berê komekî vegerîne, paş gavên jêrîn bişopîne bi pôçika hatiye barkirin di cihê volume pgbackup û wal-archive ya hatiye barkirin di cihê pgwal re:
bun apps/worker/src/backups/main.ts fetch base-20260924T021500Z /srv/restore
Sererastkirin bi demekî diyarî
Wê ji bo datayên ku kulîlîn bikar bîne: barkevekî nebes, kursek rakekirî, guherdineke contract ku te pêwîst e biguherîne. Wê danegirşa zindî veşarî dike, ji ber vê berê bi ceribandina jêrîn rerast bike.
Dîmeya armancê hilbijêre, bi UTC, pêş ji zararê: 2026-09-24 09:30:00+00. Loga denetinê (/admin/audit) bi giştî wê demê nîşan dide.
Her tiştî ku nivîsiye rawestîne: docker compose -f docker/compose.yaml stop web content worker scheduler collab
Klûtera zararkirî biparîzê heta sererastkirinê çawas bibe:
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/
Veparîstineke bingehî ya herî nû ku ji armancê kevntr e vekişîne bo volumeya danayan, û sererastkirineke nîşankirî bixwaze:
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'
Sererast bike: Postgres carekê bi mîhazên sererastkirinê bide dest pê, ji overrideyekî Compose ta dosyeke normal neyê derxe:
Override fermana tevahî veşarî dike, ji ber vê du mîhazên ku sererastkirin piştgirî dike dixerîne: max_connections ne kêmtir ji ya sereke (nebû sererastkirin bi “insufficient parameter settings” tê rakirin) û pg_hba.conf ya hatiye girêdan.
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"
Çawas bike berî ku kesek veke: zencîra denetinê (docker compose -f docker/compose.yaml run --rm worker bun tooling/audit-verify/run.ts), û ew ku datayên kulîlîn vegerin.
Vegere bi hêsanî: docker compose -f docker/compose.yaml up -d. Ev Postgres bi arşîvkirinê ve dest pê dike, û nûşeyeka WALya nû dest pê dike. Bi tenê veparîstineke bingehî ya nû bibîne.
Navê proyeletê quire pêşgota her volume ye; docker volume ls navên rast nîşan dide.
Ceribandiya çawaskirinê ya rabeşkirî
backup-offsite jî ceribandeke her QUIRE_BACKUP_DRILL_INTERVAL_HOURS (veberî 168, hefteyî) bixebitîne, û dîsa di gava piştî yek serket de. Wê veparîstineke bingehî ya herî nû ji serverê derve û her parçaya WAL ji piştî wê vekişîne, her yek şifra dake (ku piştrîn dike ku kilît hê wê veke û tiştek nehatiye biguherîn), her dosye bi manifesta wê veñavîne, çawas dike ku arşîv danegirşekî Postgres e, û çawas dike ku WAL ji veparîstinê ve bêdergebeşî ye. Rapor di daneke de bi navê reports/drill-<time>.json û di loga xizmetê de tê nivîsandin; ceribandeke serket dosye an parçaya yekem ku kêm e navdide.
Ceribandiya sererastkirinê
Veparîstinek ku hê sererast nake veparîstin nîn e. Ceribandin veparîstineke bingehî ya herî nû ya temam ku berî armancê hatiye girîn, bi WAL arşîv re, di Postgreskeke şîno de sererast dike ku bi yê zindî tiştekî tune, û encamê piştrîn dike:
docker/scripts/restore-drill.sh # to ninety minutes agodocker/scripts/restore-drill.sh --target "2026-09-24 09:30:00+00"
Armanc UTC ye bi heman şîle. Wê veparîstineke bingehî ku ji wê kevntr e û WALya arşîvkirî ku ji wê derdeker pêwîst e: li sazkirinekî nû, veparîstineke bingehî bigire û li bendê parçaya piştîn a arşîvkirî (bi kêmtirî deqîqeyek bi nivîsandin) bisekinîne berî ku ji bo dîmeyekî piştî veparîstinê hilbijêre. Ceribandin Docker û bash ji bo serverê pêwîst dike, tiştî din nî.
Her gav ceribandinê serket dike:
Sererastkarî: klûtera şîno biçe armancê û veke.
Temamiyê: hejmara rizên her tabloyê li danegirşa zindî (tooling/restore-drill). Danegirşa zindî ji armancê ve çûye, ji ber vê tablek dikare bi mezinahî yekê 500 riz an dehî tejîr xuya bide, bi herdu alîyan (nivîsandin wan dişopînin, rakirin dide wêjîn ku sererastkirin bêtir dihêle); partîsyonek ku piştî armancê hatiye çêkirin tabelekê kulîlî nîn e. Toleransa li sazkirinekî masûl bi QUIRE_DRILL_MAX_BEHIND û QUIRE_DRILL_MAX_DRIFT_RATIO biguherîne. Tabelekek ku kêm e an vala bûye serket dike.
Rastiyê: zencîra heşa denetinê di kopîya hatiye sererastkirinê de tê çawaskirin.
Bikaranîn: rolê nivîsbariyê bi parastina rizê dixwîne.
Dem: ji destpêkê heta rengê, li gorî QUIRE_DRILL_RTO_SECONDS (veberî 3600).
Her tim di danegirşa zindî an di volumeyan wê de nivîsî nake: volume veparîstin û WAL bi xwendiya tenê girêdayî ne û klûtera şîno di qediya de tê rakirin, bi serketin an biserketin.
QUIRE_DRILL_REPORT biçe dosyeke ku raporek JSON were nivîsandin, bi serketin an biserketin, û wê ji servera Docker bi rabeşînê bixebitîne:
Wê mehekê bixebitîne û berî her nûvekirinê. Ceribandeke serket nûvekirinê digire. Careke her çar meh, bila kesek ku ne wê runbooka nivîsiye sererastkirineke rastîn bi nokte li serverekî vala bide xebitandin, bi tenê bi vê belgeyê re.
Dosye
Dosyên nexweş di volume files de ne. Wê bi danegirşê re, di heman demê, veparîste û herduyan bi hev re sererast bike:
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 .
Bi hilanîneyeke tiştên, vêdabeşkirina bucket veke û 35 rojên nûşeyên neçalak biparîzê; sererastkirina bi nokte ji bo dosyan lewra xwe ya bucket e.