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 shipdocker 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.
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ð.
Stöðvaðu allt sem skrifar:
docker compose -f docker/compose.yaml stop web content worker scheduler collab
Haltu skemmda klasanum þar til endurheimtin er sannvotuð:
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/
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'
Endurheimtu: ræstu Postgres einu sinni með endurheimtarstillingunum, frá
Compose-yfirlýsingu svo venjulega skráin sé ósnert:
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 postgresdocker compose -f docker/compose.yaml logs -f postgres # wait for "database system is ready"
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.
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 agodocker/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:
Endurheimtanleiki: ruslklasinn spilar til marksins og opnar.
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.
Heilleiki: úttektar-hashkeðjan sannvottast á endurheimta afritinu.
Notagildi: forritshlutverkið les í gegnum öryggi á raðarstigi.
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:
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.