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/pmiversez 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 poddata/<backups_dirname>/, tudi gostiteljska mapa na lokalnem strežniku rsync/obnove.target_dir_name: delovna mapa poddata/dumps/.backups_dirname: izbirna nadrejena mapa kopij, običajnobackupsalibackups-main. Prazna pomenibackups, 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:
- Možnosti CLI, tudi
--backups-dirname. - Nastavljene starejše ciljne spremenljivke
pmiverse.conf. - Vnos registra baze.
- Izpeljava iz
PMIVERSE_ROOT/_pmisuite<version>/.... - Vgrajene privzete vrednosti.
Za zbirko <N>:
SUITE_DIR = /srv/pmiverse/_pmisuite<N>FILESTORE_LOCATION = $SUITE_DIR/data/filestoreODOO_VENV = $SUITE_DIR/venv/bin/pythonODOO_BIN = $SUITE_DIR/repos/OCB/odoo-binODOO_CONFIG = $SUITE_DIR/config/pmisuite<N>.confSOURCE_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_dirnameje privzetobackups, č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
NAMEali--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 doodoo-bin.--odoo-conf PATH: pot dopmisuite<N>.conf.--backups-dirname VAL: nadrejena mapa kopijbackupsalibackups-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
- Razreši konfiguracijo in preveri točen vir ali najnovejši ZIP.
- 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 natankopostgresql-local-default:<effective-database-name>. Druga je<physical-filestore-root>/.pmis-restore-filestore-<sha256>.lock, z identitetofilestore:<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. - Zavrne nevarne vnose, razširi v enolično čisto mapo, najde en izvoz, preveri posebne izvoze z
pg_restore --listoziroma berljivost/nepraznost SQL ter odkrije filestore. - 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.
- Obnovi izvoz v začasno bazo z zaščito pred kolizijami. Napaka izbriše samo začasno bazo in ohrani aktivni par.
- Iz vzdrževalne
postgresprekine ciljne povezave, obstoječo bazo preimenuje v enolično povratno ime in začasno v prvotno ciljno ime. - 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.
- Izvede naknadno delo in zahtevano nevtralizacijo na končnem cilju. Stari par ostane obnovljiv do uspeha obeh.
- Š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_DIRz--dry-runin obstoj kopij. - Manjkajoči filestore uporablja politiko samo baze in ohrani aktivno shrambo.
- Pri »Error: No database dump file found…« preverite
dump.sql, en*.sqlali*.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.