Mandehana any amin'ny votoaty fototra

Backup, famerenana amin'ny fotoana voafaritra ary ny fandinihan'ny famerenana

Manao backup ny Quire, mamerina azy amin'ny fotoana voafaritra, ary manambara izany amin'ny fandinihan'ny famerenana.

Ny drafitra dia ao amin’ny docs/architecture/23-ops.md singa 8. Ity ny toro-dalana ho an’ny rindrina Docker Compose. Natao ho arahina olona tsy nanao izy; raha misy dingana tsy mazava, izany dia fahadisoan’ity dokumenty ity.

Inona no miaro, ary ahoana

Zava-tahiry Ahoana Ahoana toerana
Ny data-by Arsivin’ny WAL mandritra ny fotoana, farany 60 sekondra, avy amin’ny fiaingana voalohany Tompon’ny pgwal
Ny data-by Backup fototra amin’ny pg_basebackup, isan’andro amin’ny toe-javatra fototra (backup-scheduler) Tompon’ny pgbackup
Ny data-by Sary mampiasa ny backup fototra sy ny WAL, isaky ny dimy minitra (backup-offsite) Tahiry manokana nosoratanao
Rakitra Ny volume files. Akatri azy amin’ny fitaovana backup an’ny mpandray anjarao, na ampiasao tahirin-entana misy version Tompon’ny files
Teny miafina docker/.env, lehibe indrindra QUIRE_MASTER_KEY (sy QUIRE_MASTER_KEY_RETIRED mbola ampiasaina), QUIRE_BACKUP_ENCRYPTION_KEY, ary docker/secrets/audit-signing-key.pem Tazomina kalitao etsy amin’io mpandray anjara io
Index fitadiavana, cache, endrika Tsy backup; averina amoronina

Tetibola: toeram-pamerenana ao anatin’ny 60 sekondra aorian’ny fahadisoana, ary famerenana ao anatin’ny 60 minitra ho an’ny data-by 500 GB.

Misy fahadisoan-kasokajy roa. Ny data-by mamerina tsy misy ny rakitriny dia manao pejy simba. Ny data-by mamerina tsy misy QUIRE_MASTER_KEY dia tsy afaka manala mombamomba alefa SSO, webhook sy fampifandraisana misy azy; mandraaka vita ny fanavaozana kiteny lehibe tsy misy tsy voavaha (key-rotation.md), dia ao anatiny koa ny kiteny voavelana. Roa ireo ao anatin’ny backup.

Fanatahana backup

Backup fototra an’ny cluster manontolo:

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

Mitazona ny backup fototra vaovao indrindra QUIRE_BACKUP_KEEP (5 amin’ny toe-javatra fototra) ary manala ny WAL tsy ilain’ny taloha intsony, ka tsy afaka mitombo ampy ny arsiny. Atao isan’andro amin’ny cron na timer systemd ao amin’ny mpandray anjara:

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

Na avelao ny stack no mametraka azy: ny backup profile dia miasa amin’ny backup-scheduler, izay manao backup fototra isaky ny QUIRE_BACKUP_INTERVAL_HOURS (24 amin’ny fototra), ary ny backup-offsite, lazaina ambany.

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

Sary mampiasa avy any ivelany amin’ny mpandray anjara

Misy ao amin’ny mpandray anjara mitovy amin’ny data-by ny volume roa, ary tsy backup ny ao amin’ny solosaina nisy ny fahadisoana. Ny backup-offsite dia manakatra ny backup fototra tsirairay sy ny segmentin’ny WAL arsivina tsirairay mankany amin’ny tahiry manokana amin’ny alàlan’ny akanjon’ny tahirina, mampiasa, ary mitazona azy ireo eo amin’ny fotoana tahirizana:

  • Fampiasana. AES-256-GCM amin’ny QUIRE_BACKUP_ENCRYPTION_KEY (na ny rakitra nosoratan’ny QUIRE_BACKUP_ENCRYPTION_KEY_FILE): 32 octet, avy amin’ny openssl rand -hex 32. Misy nonce manokana sy etiketa fanamarinana isaky ny rakitra, ka tsy azo vakiana sary raha tsy misy ny kiteny ary hita ny fanovana azy rehetra. Tazomina amin’ny QUIRE_MASTER_KEY ny kiteny, lavitra an’io mpandray anjara io sy lavitra an’ny tahiry backup. Tsy misy famerenana raha tsy misy ny kiteny.
  • Ahoana. Ny QUIRE_BACKUP_STORAGE_DRIVER dia s3, azure na local (karatra lavitra voarakitra ao amin’ny QUIRE_BACKUP_STORAGE_ROOT). Ny filàlana dia ny filàlana tahirin-rakitra misy rambe QUIRE_BACKUP_: QUIRE_BACKUP_S3_ENDPOINT, QUIRE_BACKUP_S3_BUCKET, QUIRE_BACKUP_S3_ACCESS_KEY_ID, sns. Ampiasao bucket hafa ary, raha azo atao, kaonty hafa amin’ny rakitra, amin’ny mombamomba alefa afaka manoratra fa tsy manala raha mamerina izany ny mpanome.
  • Fotoana tahirizana. Ny QUIRE_BACKUP_OFFSITE_KEEP vaovao indrindra (aorian’ny QUIRE_BACKUP_KEEP, na 7 raha tsy misy) ary ny WAL ilain’ny taloha indrindra aminy; esorina ao amin’ny tahiry ny vondrona sy segmentin’ny taloha.
  • Ahoana. Isaky ny QUIRE_BACKUP_SHIP_INTERVAL_SECONDS (300 amin’ny fototra). Idempotenty ny fandefasana: tsy atehirizina ny efa tahirizina, ary tsy hita ho tahirizina ny backup fototra raha tsy voasoratra farany ny manifestiny.

Fehezanteny mitovy no alefa tanteraka:

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

Hanamora amin’ny mpandray anjara vaovao, alaina voalohany ny vondrona, avy eo arahao ny dingana ambany amin’ny rakitra alefan’ny toeran’ny volume pgbackup ary ny wal-archive alefan’ny toeran’ny pgwal:

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

Famerenana amin’ny fotoana voafaritra

Ampiasao izany aorian’ny fahantran-karena: fampidirana diso, fampianarana nofoana, fiovana fanaprahana tokony ho afoana. Manolo ny data-by miasa izany, ka jereo aloha amin’ny fandinihana ambany.

  1. Safidio fotoana fototra, amin’ny UTC, tsy very alohan’ny fahadisoana: 2026-09-24 09:30:00+00. Matetika mampiseho ny fotoana ny lakon’ny fitsarana (/admin/audit).
  2. Ajeno ny rehetra manoratra: docker compose -f docker/compose.yaml stop web content worker scheduler collab
  3. Tazomina ny cluster simba mandraaka fanamarinana ny famerenana:
    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. Sokafy ny backup fototra vaovao talohan’ny fotoana fototra ao amin’ny volume data, ary angataho famerenana voafaritra:
    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. Mamerena: manomboka ny Postgres iray amin’ny filàlana famerenana, avy amin’ny override Compose ka tsy voanova ny rakitra fototra:
    # 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]
    Manolo ny fehezanteny manontolo ny override, ka mamerina ny filàlana roa iainan’ny famerenana: max_connections tsy ambany kokoa no an’ny voalohany (raha tsy izany, dia misakana ny famerenana amin’ny “insufficient parameter settings”) ary ny pg_hba.conf voarakitra.
    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. Jereo aloha alohan’ny handefasana olona: ny rindrin’ny fitsarana (docker compose -f docker/compose.yaml run --rm worker bun tooling/audit-verify/run.ts), ary ny data very dia miverina.
  7. Miverina amin’ny fomban’ny fahazotana: docker compose -f docker/compose.yaml up -d. Izany dia manomboka indray ny Postgres misy ny arsivana, ary manomboka daty vaovao ny filan’ny WAL. Manao backup fototra vaovao haingana.

Ny anaran’ny tetikasa quire eo ambonin’ny volume tsirairay; ny docker volume ls dia mampiseho ny anarana marina.

Ny fandinihana famaritana mirakina

Ny backup-offsite dia alefa koa fandinihana isaky ny QUIRE_BACKUP_DRILL_INTERVAL_HOURS (168 amin’ny fototra, isan-kerinandro), ary indray amin’ny fandehana manaraka raha diso iray. Maka ny backup fototra vaovao avy any etsy sy ny segmentin’ny WAL rehetra manaraky azy, manala fampiasana ny tsirairay (izay manambara fa mbola misokafa azy ny kiteny ary tsy niova na inona na inona), mampitaho ny rakitra tsirairay amin’ny manifestiny, mijery raha directory data Postgres ny arsiny, ary mijery raha misy fijanonana ny WAL avy amin’ny backup mankany. Aseho ao amin’ny tahiry ny tatitra ho reports/drill-<time>.json ary ao amin’ny log an’ny serivisy; ny fandinihana diso dia manambara ny rakitra na ny segmentin’ny voalohany very.

Ny fandinihan’ny famerenana

Tsy backup ny backup tsy mody namerena mihitsy. Mamerina ny backup fototra feno vaovao indrindra natao alohan’ny fotoana fototra, miaraka amin’ny arsin’ny WAL, ao amin’ny Postgres fandinihana tsy mizara na inona na inona amin’ny miasa, ary manamara ny vokany:

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

UTC amin’ny endrika izy io mihitsy ny fotoana fototra. Mila backup fototra taloha kokoa azy ary WAL arsivina manaraky azy: amin’ny fampidirana vaovao, manao backup fototra ary miandry ny segmentin’ny arsivina manaraka (farany minitra iray raha misy fanoratana) alohan’ny famintinana fotoana fototra manaraky ny backup. Mila Docker sy bash ao amin’ny mpandray anjara ny fandinihana, tsy misy hafa.

Isaky ny dingana no afaka manakana ny fandinihana:

  1. Fahafahana mamerena: mamerena amin’ny fotoana fototra ary misokatra ny cluster fandinihana.
  2. Fahatanterahana: isakin-taratry ny takelaka tsirairay amin’ny data-by miasa (tooling/restore-drill). Niova ny data-by miasa avy eo amin’ny fotoana fototra, ka mety misy sampana 500 toerana na fahatelon’ny habeny, eo amin’ny felana roa (ny fanoratana dia manakana azy, ny fanalana dia mahatonga ny famerenana hisy be kokoa); ny seza namorona aorian’ny fotoana fototra dia tsy takelaka very. Ampitombo ny fahalemena amin’ny fampandrafiana be kokaka amin’ny QUIRE_DRILL_MAX_BEHIND sy QUIRE_DRILL_MAX_DRIFT_RATIO. Manakana ny takelaka very na foana.
  3. Fahamarinana: marinina ny rindrin’ny hash an’ny fitsarana amin’ny sary mamerina.
  4. Fahafahana ampiasaina: mamaky amin’ny alàlan’ny fiarovana isakin-tseza ny andraikin’ny fampiharana.
  5. Fotoana: avy amin’ny fanombohana ka hatramin’ny tsara, amin’ny QUIRE_DRILL_RTO_SECONDS (3600 amin’ny fototra).

Tsy manoratra mihitsy ao amin’ny data-by miasa na ny volume any: mamaritra famakarana ihany ny volume backup sy WAL ary esorina ny cluster fandinihana a farany, na vita na tsy vita.

Metrahana QUIRE_DRILL_REPORT amin’ny laza hanoratana tatitra JSON, na vita na tsy vita, ary alefa azy mirakina avy amin’ny mpandray anjara Docker:

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

Alefa isan-velona ary alohan’ny fanavaozana tsirairay. Manakana ny fanavaozana ny fandinihana diso. Isaky ny efatra volana, angataho olona tsy nanao ity toro-dalana ity hanaovana famerenana tena fotoana voafaritra amin’ny mpandray anjara feno, ampiasaina ity dokumenty ity ihany.

Rakitra

Misy ao amin’ny volume files ny rakitra anaty. Backup azy miaraka amin’ny data-by, amin’ny fotoana mitovy, ary mamerena roa amin’ny telo:

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 .

Amin’ny tahirin-entana, apetraho ny version an’ny bucket ary tazomina 35 andro ny version tsy ankehitriny; ny famerenana amin’ny fotoana voafaritra ho an’ny rakitra dia ny an’ny bucket avy eo.

Fifandehanana

Soraty hanadihana…

↑↓ mandeha↵ safidioEsc akano