Preskoči na vsebino

restore_database.sh — Splošna obnova baz Odoo za PMIVerse

Meje modulov, lastništvo, varnost in omejene teste opisuje pogodba arhitekture in vzdrževanja.

Lokacija

/srv/pmiverse/_pmiconfig/scripts/restore/restore_database.sh.

Namen

Obnovi kopijo baze Odoo v lokalno razvojno zbirko PMIVerse. Izbirno nevtralizira bazo: izklopi načrtovana dejanja, odhodno/vhodno pošto, nameščene plačilne in dostavne integracije, počisti IAP, odklopi podprto bančno sinhronizacijo in nastavi website.robots na noindex, nofollow. Poti razreši iz centralne konfiguracije in konvencij PMIVerse; minimalna konfiguracija posamezne baze je centralna.

Predpogoji

  • Postavitev /srv/pmiverse z zbirkami _pmisuite<version>.
  • psql, createdb, dropdb, pg_restore, unzip, zipinfo.
  • Vloga PostgreSQL s pravico ustvarjanja baz, preimenovanja cilja in prekinjanja njegovih povezav; obstoječi cilj mora biti njen, razen pri superuporabniku.
  • Virtualno okolje Odoo ciljne zbirke, npr. /srv/pmiverse/_pmisuite18/venv/bin/python.
  • Centralni /srv/pmiverse/_pmiregistry/config/pmiverse.conf.

Lupina Odoo se zažene z --load=web, da ne zahteva izbirnih strežniških modulov, npr. odoo.addons.openupgrade_framework. Konfiguracije zbirke ne spremeni in drugo vedenje ostane enako.

Centralna konfiguracija

Globalni koreni

V pmiverse.conf, s privzetimi vrednostmi ob odsotnosti:

  • PMIVERSE_ROOT="/srv/pmiverse"
  • PMICONFIG_DIR="$PMIVERSE_ROOT/_pmiconfig"
  • PMISUITE_PREFIX="_pmisuite"

Register baz (priporočeno)

Aktivni /srv/pmiverse/_pmiregistry/config/pmiverse.conf upravlja inventar namestitve. Primeri uporabljajo sintetična imena; nadomestite jih z aktivnimi vzdevki. PMIVERSE_DB_REGISTRY je heredoc, podoben CSV, s šestimi stolpci:

# name,db_name,version,source_dir_name,target_dir_name,backups_dirname
demo,demo.example,18,backup-a/demo.example,demo,
  • name: kratki vzdevek za klic, npr. demo.
  • db_name: ime PostgreSQL in mape filestore.
  • version: različica zbirke tega vnosa. Druge različice izberete s podprtimi izrecnimi možnostmi ali starejšimi ciljnimi nadomestitvami; niso aktivni vzdevki, dokler niso v registru.
  • source_dir_name: relativna podmapa ZIP pod data/<backups_dirname>/, tudi gostiteljska mapa na lokalnem strežniku rsync/obnove.
  • target_dir_name: delovna mapa pod data/dumps/.
  • backups_dirname: izbirna nadrejena mapa kopij, običajno backups ali backups-main. Prazna pomeni backups, razen ob možnosti CLI.

Starejše ciljne nadomestitve, npr. DEMO_SOURCE_DIR in DEMO_ODOO_VENV, se še upoštevajo, vendar je priporočljiv register.

Lokalna zrcala celotne zgodovine so data/backups/backup-a/<database>/ in data/backups/backup-b/<database>/; oddaljeni proizvajalci ohranijo data/backups/. Na proizvajalcu izrecno izberite izvorno mapo z --source, ker register opisuje lokalne kopije.

Podprti formati in postavitve kopij

Pričakovan je ZIP z enim izvozom dump.sql (prednostno), drugim posameznim *.sql ali arhivom pg_dump po meri *.dump/*.backup, obnovljenim prek pg_restore. Filestore se odkrije rekurzivno v oblikah:

  • */filestore/<db_name>
  • */<db_name>/filestore
  • */<db_name> (kanonična korenska mapa)
  • poljuben */filestore, pri obnovi preimenovan v <db_name>.

backup_odoo18_dbs.sh ustvari en časovno označen *.dump v korenu in <db_name>/... za shrambo, z relativnimi potmi.

Potreben je natanko en podprt izvoz. Absolutna imena, deli .. ali ., obrnjene poševnice, krmilni znaki in povezave ZIP se zavrnejo pred razširjanjem. Razširjene poti se ponovno preverijo za povezave. Arhiv samo z bazo je podprt: objavi bazo in ohrani aktivni filestore, namesto da bi ga izbrisal.

Vrstni red razreševanja

Od najvišje prednosti:

  1. Možnosti CLI, tudi --backups-dirname.
  2. Nastavljene starejše ciljne spremenljivke pmiverse.conf.
  3. Vnos registra baze.
  4. Izpeljava iz PMIVERSE_ROOT/_pmisuite<version>/....
  5. Vgrajene privzete vrednosti.

Za zbirko <N>:

  • SUITE_DIR = /srv/pmiverse/_pmisuite<N>
  • FILESTORE_LOCATION = $SUITE_DIR/data/filestore
  • ODOO_VENV = $SUITE_DIR/venv/bin/python
  • ODOO_BIN = $SUITE_DIR/repos/OCB/odoo-bin
  • ODOO_CONFIG = $SUITE_DIR/config/pmisuite<N>.conf
  • SOURCE_DIR = $SUITE_DIR/data/<backups_dirname>/<source_dir_name or db_name>
  • DESTINATION_DIR = $SUITE_DIR/data/dumps/<target_dir_name or alias or db short>
  • backups_dirname je privzeto backups, če ga CLI ali register ne določita.

--dry-run izpiše vse razrešene vrednosti z njihovim virom in konča brez izvedbe.

Uporaba

Hitra obnova po vzdevku

/srv/pmiverse/_pmiconfig/scripts/restore/restore_database.sh demo

Z nevtralizacijo

/srv/pmiverse/_pmiconfig/scripts/restore/restore_database.sh demo --neutralize

Samo nevtralizacija brez obnove

/srv/pmiverse/_pmiconfig/scripts/restore/restore_database.sh demo --only-neutralize

Suhi zagon

/srv/pmiverse/_pmiconfig/scripts/restore/restore_database.sh demo --dry-run

Izrecne možnosti nad registrom in izpeljavami

/srv/pmiverse/_pmiconfig/scripts/restore/restore_database.sh \
  --suite 18 \
  --db demo.example \
  --source /srv/pmiverse/_pmisuite18/data/backups/backup-b/demo.example \
  --dest   /srv/pmiverse/_pmisuite18/data/dumps/demo \
  --filestore /srv/pmiverse/_pmisuite18/data/filestore \
  --odoo-venv /srv/pmiverse/_pmisuite18/venv/bin/python \
  --odoo-bin  /srv/pmiverse/_pmisuite18/repos/OCB/odoo-bin \
  --odoo-conf /srv/pmiverse/_pmisuite18/config/pmisuite18.conf \
  --neutralize

Nadomestitev nadrejene mape kopij

/srv/pmiverse/_pmiconfig/scripts/restore/restore_database.sh demo --backups-dirname backups

Namesto položajnega vzdevka lahko uporabite --target <name>.

Referenca možnosti

  • NAME ali --target NAME: vzdevek registra, npr. demo.
  • --suite N: različica zbirke za izpeljave.
  • --db NAME: ime baze.
  • --source DIR: mapa ZIP, izbere najnovejšega.
  • --source-file FILE: točno en berljiv navaden ZIP; izključuje --source. Ne sledi simbolnim povezavam, niti visečim ali v delih poti.
  • --dest DIR: delovna mapa za kopiranje in razširjanje ZIP.
  • --filestore DIR: koren filestore, cilj mape <db_name>.
  • --odoo-venv PATH: interpreter virtualnega okolja Odoo.
  • --odoo-bin PATH: pot do odoo-bin.
  • --odoo-conf PATH: pot do pmisuite<N>.conf.
  • --backups-dirname VAL: nadrejena mapa kopij backups ali backups-main.
  • --neutralize: nevtralizacija SQL in ORM po obnovi.
  • --only-neutralize: samo nevtralizacija obstoječe baze.
  • --dry-run: izpis konfiguracije in izhod.
  • -h|--help: pomoč in izhod.

Pripravljena objava in povratek

  1. Razreši konfiguracijo in preveri točen vir ali najnovejši ZIP.
  2. V fiksnem vrstnem redu pridobi trajni neblokirajoči ključavnici PostgreSQL in filestore. Prva je /srv/pmiverse/.pmis-restore-locks/.pmis-restore-postgresql-<sha256>.lock, njena vrednost pokriva natanko postgresql-local-default:<effective-database-name>. Druga je <physical-filestore-root>/.pmis-restore-filestore-<sha256>.lock, z identiteto filestore:<canonical-live-filestore-path>. Identiteti ne vsebujeta zbirke, vzdevka, arhiva, delovne mape ali drugega vira. Surova imena in poti niso deli imena datoteke. Neuspešna pridobitev ali preverjanje poti/naprave/inode zapre vse pridobljene deskriptorje pred pregledom spremenljivih ciljev.
  3. Zavrne nevarne vnose, razširi v enolično čisto mapo, najde en izvoz, preveri posebne izvoze z pg_restore --list oziroma berljivost/nepraznost SQL ter odkrije filestore.
  4. Pod ključavnico zabeleži prvotni obstoj končne baze in aktivne shrambe. Vhodno shrambo kopira v enolično skrito pripravljalno mapo neposredno pod končnim korenom. Aktivna ostane nedotaknjena.
  5. Obnovi izvoz v začasno bazo z zaščito pred kolizijami. Napaka izbriše samo začasno bazo in ohrani aktivni par.
  6. Iz vzdrževalne postgres prekine ciljne povezave, obstoječo bazo preimenuje v enolično povratno ime in začasno v prvotno ciljno ime.
  7. Aktivni filestore preimenuje v povratno pot, pripravljeni pa na njegovo mesto. Preimenovanja na istem datotečnem sistemu so posamezno atomarna, par PostgreSQL/datoteke pa ni ena transakcija.
  8. Izvede naknadno delo in zahtevano nevtralizacijo na končnem cilju. Stari par ostane obnovljiv do uspeha obeh.
  9. Šele nato odstrani povratne artefakte in sprosti ključavnici. Datoteke ključavnic ostanejo; zaprtje deskriptorjev jih sprosti ob uspehu, napaki, povratku ali signalu.

Delno prekrivanje vedno tekmuje: ista baza z drugo shrambo ali druga baza z isto kanonično aktivno shrambo ne moreta teči hkrati. Druga zbirka, vzdevek ali izrecna oblika ne spremenijo razrešene identitete. Hkrati so dovoljene različne baze z različnimi kanoničnimi shrambami. --only-neutralize ne spreminja filestore, zato pridobi samo ključavnico PostgreSQL, še vedno pa tekmuje z vsako obnovo te baze.

Privzeti skupni koren ključavnic se ustvari samo, če ga običajni uporabnik lahko varno ustvari brez privilegijev. Nedostopen, nevaren ali nezapisljiv koren zavrne izvedbo. PMIS_RESTORE_LOCK_ROOT je namenjen nadzorovanim primerom in namestitvam, vendar morajo vsi procesi za isto bazo uporabljati isti koren. Identiteta konservativno zaporedno obravnava ista imena v lokalnem/privzetem imenskem prostoru PostgreSQL in ne razlikuje gruč z dejansko povezavo. Ne usklajuje drugih gostiteljev ali namenoma različnih korenov. Objava ostaja usklajen povratek, ne atomarnost.

Ob napaki objave, naknadnega dela ali zahtevane nevtralizacije skripta poskusi vrniti nove vire na začasna/pripravljalna imena in obnoviti stari par. Vrne neničelno kodo ter natančna imena artefaktov in varna navodila preimenovanja. Če je prekinitev na meji preimenovanja dvoumna, varno zavrne in ohrani obe kopiji za ročno okrevanje.

Usklajevanje uporablja opaženo prisotnost točne ciljne, začasne in povratne baze ter aktivne, pripravljene in povratne poti filestore. Obravnava tudi prvotno manjkajoče vire in obnovo samo baze, brez zanašanja na zastarelo zastavico. Najprej ugotovi povratek baze, nato datotek. Tudi čiščenje pred objavo izbriše točno ustvarjeno začasno bazo samo, če ciljno/povratno stanje nedvoumno dokaže lastništvo. Napake čiščenja ne nadomestijo izvirne izhodne kode.

Vedno izvedeni zaščiti odhodne in vhodne pošte sta obvezni. Zahtevana nevtralizacija obvezno izklopi cron ter zapiše nameščene ponudnike plačil, dostavljavce, račune IAP, podprta zapisljiva polja odklopa bank in website.robots. ORM poskusi vse ustrezne operacije, poroča vse zahtevane napake in sproži skupno izjemo. Manjkajoče izbirne integracije in nameščeni bančni modeli brez podprtega zapisljivega polja so informativni. Vsaka zahtevana napaka ORM povzroči neničelni izhod lupine Odoo in prepreči zunanje brisanje povratnih artefaktov.

Odpravljanje težav

  • Pri »Error: No files found in the source directory« preverite SOURCE_DIR z --dry-run in obstoj kopij.
  • Manjkajoči filestore uporablja politiko samo baze in ohrani aktivno shrambo.
  • Pri »Error: No database dump file found…« preverite dump.sql, en *.sql ali *.dump/*.backup.
  • Napake nevtralizacije so usodne. Skripta poskusi povrniti par in ob neuspehu ohrani artefakte; nikoli ne sporoči uspeha po neuspešni nevtralizaciji.
  • Ob dvoumnem stanju ali napaki povratka se enolični povratni artefakti ne brišejo. Izpisanim ukazom sledite šele po neodvisni potrditvi vseh treh imen baz in vseh treh poti filestore.

Primeri

Obnova in nevtralizacija demo:

/srv/pmiverse/_pmiconfig/scripts/restore/restore_database.sh demo --neutralize

Razrešitev lokalnega zrcala backups/backup-a/demo.example iz registra:

/srv/pmiverse/_pmiconfig/scripts/restore/restore_database.sh demo --dry-run

Izrecne poti brez registra:

/srv/pmiverse/_pmiconfig/scripts/restore/restore_database.sh \
  --suite 18 --db demo.example \
  --source /srv/pmiverse/_pmisuite18/data/backups/backup-b/demo.example \
  --dest   /srv/pmiverse/_pmisuite18/data/dumps/demo \
  --neutralize

Opombe

Skripta je zasnovana za set -euo pipefail in ob delno manjkajočem pmiverse.conf uporabi konvencije map PMIVerse. Ciljni ukazi v _pmiregistry/scripts/restore/ delijo razreševanje vira registra, vendar ohranijo ločene izvedbe obnove; ta ukaz je splošna alternativa.