Fara beint í efni

Öryggisafrit, endurheimt til tíma og endurheimtaræfingin

Taktu öryggisafrit af Quire, endurheimtu það til tíma og sannaðu það með endurheimtaræfingunni.

Skoða sem Markdown

Hönnunin er í docs/architecture/23-ops.md kafla 8. Þetta er handbókin fyrir Docker Compose-vöruna. Hún er skrifuð til að vera fylgt af einhverjum sem skrifaði hana ekki; ef skref er óljóst er það galli í þessu skjali.

Hvað er varið, og hvernig

Eign Hvernig Hvar
Gagnagrunnurinn WAL skjalasafnað samfellt, á 60 sekúndna fresti að mestu, frá fyrstu ræsingu pgwal bindi
Gagnagrunnurinn Grunnöryggisafrit með pg_basebackup, daglega sjálfgefið (backup-scheduler) pgbackup bindi
Gagnagrunnurinn Dulrituð afrit grunnöryggisafritanna og WAL, á fimm mínútna fresti (backup-offsite) Aðskilin geymsla sem þú nefnir
Skrár files bindið. Afritaðu það með öryggisafritstæki hýsilsins, eða notaðu útgáfustýrða hlutageymslu files bindi
Leyndarmál docker/.env, umfram allt QUIRE_MASTER_KEY (og hvert QUIRE_MASTER_KEY_RETIRED enn í notkun), QUIRE_BACKUP_ENCRYPTION_KEY og docker/secrets/audit-signing-key.pem Haltu afriti utan þessa hýsils
Leitarvísitölur, skyndiminni, myndefni Ekki tekið öryggisafrit; endurbyggt

Markmið: endurheimtarpunktur innan 60 sekúndna frá bilun, og endurheimt innan 60 mínútna fyrir 500 GB gagnagrunn.

Tvö mistök eru algeng. Gagnagrunnur endurheimtur án skráa sinna myndar brotnar síður. Gagnagrunnur endurheimtur án QUIRE_MASTER_KEY getur ekki afdulritað SSO-, vefkróks- og samþættingaraðauðkennin sem hann heldur; þar til snúningur aðallykils lýkur með engu óleystu (key-rotation.md), felur það í sér starfsloknu lyklana. Bæði eru hluti öryggisafritsins.

Að taka öryggisafrit

Grunnöryggisafrit af öllu klasanum:

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

Það heldur nýjustu QUIRE_BACKUP_KEEP grunnöryggisafritunum (sjálfgefið 5) og hreinsar WAL sem elsta þeirra þarf ekki lengur, svo skjalasafnið geti ekki vaxið án marka. Tímasettu það daglega með cron eða systemd-tímamæli á hýsilnum:

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

Eða láttu stakkann tímasetja það: backup-sniðið keyrir backup-scheduler, sem tekur grunnöryggisafrit á QUIRE_BACKUP_INTERVAL_HOURS fresti (sjálfgefið 24), og backup-offsite, lýst hér á eftir.

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

Dulrituð afrit utan hýsils

Bæði bindin lifa á sama hýsil og gagnagrunnurinn, og öryggisafrit á vélinni sem bilaði er ekki öryggisafrit. backup-offsite afritar hvert grunnöryggisafrit og hvern skjalasafnaðan WAL-bút í aðskilda geymslu í gegnum geymslugáttina, dulrituð, og heldur þeim þar undir varðveislu:

  • Dulritun. AES-256-GCM með QUIRE_BACKUP_ENCRYPTION_KEY (eða skránni sem QUIRE_BACKUP_ENCRYPTION_KEY_FILE nefnir): 32 bæti, frá openssl rand -hex 32. Hver skrá hefur sinn eigin nonce og sannvottunarmerki, svo afrit er ólæsilegt án lykilsins og sérhver breyting á því greinist. Haltu lyklinum með QUIRE_MASTER_KEY, fjarri þessum hýsil og fjarri öryggisafritsgeymslunni. Án lykilsins er engin endurheimt.
  • Hvar. QUIRE_BACKUP_STORAGE_DRIVER er s3, azure eða local (tengdur fjarlægur diskur á QUIRE_BACKUP_STORAGE_ROOT). Stillingarnar eru skráageymslustillingarnar með QUIRE_BACKUP_ forskeyti: QUIRE_BACKUP_S3_ENDPOINT, QUIRE_BACKUP_S3_BUCKET, QUIRE_BACKUP_S3_ACCESS_KEY_ID og svo framvegis. Notaðu aðra fötu og, helst, annan aðgang en fyrir skrárnar, með auðkennum sem geta skrifað en ekki eytt ef veitan leyfir það.
  • Varðveisla. Nýjustu QUIRE_BACKUP_OFFSITE_KEEP grunnöryggisafritin (sjálfgefið QUIRE_BACKUP_KEEP, annars 7) og WAL sem elsta þeirra þarf; eldri sett og bútar eru eytt úr geymslunni.
  • Hvenær. Á QUIRE_BACKUP_SHIP_INTERVAL_SECONDS fresti (sjálfgefið 300). Sending er samtaka: því sem þegar er geymt er sleppt, og grunnöryggisafrit telst geymt aðeins þegar skrá þess er skrifuð, síðust.

Sama skipun keyrir með hendi:

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

Til að endurheimta á nýjum hýsil skaltu fyrst ná í sett, fylgdu síðan skrefunum hér að neðan með sóttu möppunni í stað pgbackup bindisins og sóttu wal-archive í stað pgwal:

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

Endurheimt til tíma

Notaðu þetta eftir gagnatap: slæman innflutning, eytt námskeið, samdráttar- flutning sem þú þarft að afturkalla. Það kemur í stað lifandi gagnagrunnsins, svo æfðu það með æfingunni hér að neðan fyrst.

  1. Veldu mark tímann, í UTC, rétt fyrir tjónið: 2026-09-24 09:30:00+00. Úttektarannállinn (/admin/audit) sýnir venjulega augnablikið.
  2. Stöðvaðu allt sem skrifar: docker compose -f docker/compose.yaml stop web content worker scheduler collab
  3. Haltu skemmda klasanum þar til endurheimtin er sannvotuð:
    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. Pakkaðu upp nýjasta grunnöryggisafriti eldra en markið í gagna- bindið, og biddu um markvissa endurheimt:
    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. Endurheimtu: ræstu Postgres einu sinni með endurheimtarstillingunum, frá Compose-yfirlýsingu svo venjulega skráin sé ósnert:
    # 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]
    Yfirlýsingin kemur í stað allrar skipunarinnar, svo hún endurtekur stillingarnar tvær sem endurheimtin byggir á: max_connections ekki lægra en aðalþjónsins (annars hættir endurheimtin með „insufficient parameter settings“) og tengda pg_hba.conf.
    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. Athugaðu það áður en þú hleypir einhverjum inn: úttektarkeðjan (docker compose -f docker/compose.yaml run --rm worker bun tooling/audit-verify/run.ts), og að týndu gögnin séu komin aftur.
  7. Farðu aftur í eðlilegt: docker compose -f docker/compose.yaml up -d. Þetta endurræsir Postgres með skjalasöfnun kveikta, og ný WAL-tímalína hefst. Taktu nýtt grunnöryggisafrit þegar í stað.

Verkefnisnafnið quire forskeytir hvert bindi; docker volume ls sýnir nákvæm nöfn.

Tímasett sannvottunaræfing

backup-offsite keyrir einnig æfingu á QUIRE_BACKUP_DRILL_INTERVAL_HOURS fresti (sjálfgefið 168, vikulega), og aftur við næstu umferð eftir að ein bilar. Hún sækir nýjasta grunnöryggisafritið utan hýsils og hvern WAL-bút eftir það, afdulritar hvern (sem sannar að lykillinn opni þau enn og engu hafi verið breytt), ber hverja skrá saman við skrá hennar, athugar að skjalasafnið sé Postgres-gagnamappa, og athugar að WAL frá öryggisafritinu og áfram hafi ekkert bil. Skýrslan er skrifuð í geymsluna sem reports/drill-<time>.json og í annál þjónustunnar; misheppnuð æfing nefnir skrána eða fyrsta vantarandi bútinn.

Endurheimtaræfingin

Öryggisafrit sem aldrei hefur verið endurheimt er ekki öryggisafrit. Æfingin endurheimtir nýjasta heila grunnöryggisafritið tekið fyrir markið, auk WAL-skjalasafnsins, í rusl-Postgres sem deilir engu með þeim lifandi, og sannar niðurstöðuna:

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

Markið er UTC í nákvæmlega því formi. Það þarf grunnöryggisafrit eldra en það og skjalasafnað WAL handan þess: á nýrri uppsetningu skaltu taka grunnöryggisafrit og bíða eftir næsta skjalasafnaða bútnum (að mestu mínútu með skrifum) áður en þú velur mark eftir öryggisafritið. Æfingin þarf Docker og bash á hýsilnum, ekkert annað.

Hvert skref fellur æfinguna:

  1. Endurheimtanleiki: ruslklasinn spilar til marksins og opnar.
  2. Heild: talning raða hverrar töflu gagnvart lifandi gagnagrunni (tooling/restore-drill). Lifandi gagnagrunnurinn hefur færst áfram síðan markið, svo tafla má víkja um stærra af 500 röðum og tíunda hluta stærðar sinnar, í hvora átt (skrif láta hana dragast aftur úr, eyðingar láta endurheimtina halda meiru); skipting stofnuð eftir markið er ekki týnd tafla. Víkkaðu svigrúmið á annasamari uppsetningu með QUIRE_DRILL_MAX_BEHIND og QUIRE_DRILL_MAX_DRIFT_RATIO. Vantarandi eða tæmd tafla fellur.
  3. Heilleiki: úttektar-hashkeðjan sannvottast á endurheimta afritinu.
  4. Notagildi: forritshlutverkið les í gegnum öryggi á raðarstigi.
  5. Tími: frá upphafi til græns, gagnvart QUIRE_DRILL_RTO_SECONDS (sjálfgefið 3600).

Hún skrifar aldrei í lifandi gagnagrunninn eða bindi hans: öryggisafritið og WAL- bindin eru tengd eingöngu til lestrar og ruslklasinn er fjarlægður í lokin, hvort sem stendur eða fellur.

Stilltu QUIRE_DRILL_REPORT á slóð til að JSON-skýrsla sé skrifuð, hvort sem stendur eða fellur, og keyrðu hana á áætlun frá Docker-hýsilnum:

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

Keyrðu hana mánaðarlega og fyrir hverja uppfærslu. Misheppnuð æfing stöðvar uppfærsluna. Einu sinni á ársfjórðungi skaltu láta einhvern sem skrifaði þessa handbók ekki framkvæma raunverulega endurheimt til tíma á varahýsil, með aðeins þessu skjali.

Skrár

Staðbundnar skrár lifa í files bindinu. Taktu öryggisafrit af því með gagnagrunninum, á sama tíma, og endurheimtu bæði saman:

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 .

Með hlutageymslu skaltu kveikja á útgáfustýringu fötu og halda 35 daga af eldri útgáfum; endurheimt skráa til tíma er þá fötu eigin.

Yfirlit

Sláðu inn til að leita…

↑↓ fletta↵ veljaEsc loka