Архивиране и възстановяване
LOSPOR Hospital 1.2 създава удостоверен обект за възстановяване на PostgreSQL
на всеки четири часа. Завършеният обект е частна папка с име
backups/lospor-YYYYMMDDTHHMMSSZ-RANDOM.backup, която съдържа архива на базата
и манифест, публикуван последен. Манифестът свързва хеша на архива с болницата,
системата, версията на Hospital, версиите на обменния договор и речника,
основната версия на PostgreSQL, миграциите, схемата и отпечатъците на
клиничните ключове, точната стойност на OMOP_PSEUDONYM_SALT и ключа за
запечатване на външния ИИ. Той не съдържа тайни или данни за пациенти и се
удостоверява с отделен HMAC ключ.
Пазят се всички проверени обекти за 48 часа, а след това по един проверен обект
за всеки UTC ден в продължение на 14 дни. Копията преди обновяване, преди
възстановяване и изрично неизменяемите копия не се изтриват от обичайното
почистване. Почистване има само след ново проверено или безопасно повторно
използвано копие; неуспешен архив никога не изтрива по-стара точка за
възстановяване. Свободното място се проверява преди pg_dump, а манифестът се
публикува едва след успешна проверка на каталога, контролната сума, схемата и
миграциите.
Целевата загуба на данни при бедствие е до четири часа. Архивиране на WAL и възстановяване до произволна транзакция (PITR) не са част от appliance.
Език на операторските съобщения
backup-now.sh, ensure-backup-configuration.sh и restore-backup.sh показват
указанията и грешките на езика на системата, избран чрез
LOSPOR_DEFAULT_LOCALE (по подразбиране български). Външен техник може да избере
английски само за една команда, без да променя настройката на системата, например:
sudo env LOSPOR_DEFAULT_LOCALE=en sh /opt/lospor-hospital/current/scripts/backup-now.sh
Превежда се само обяснителният текст. Устойчивите резултати и означения за
възстановяване като BACKUP_BUSY, BACKUP_MAINTENANCE_BUSY,
RESTORE_PREFLIGHT_OK, NEEDS_OPERATOR, точните потвърждения
TEMPORARY RESTORE / EMERGENCY RESTORE, имената на променливите, етапите на
журнала, пътищата и командите остават еднакви на двата езика.
Копие извън сървъра и защитено съхранение на ключовете
Локалното копие не е достатъчно при бедствие. Файлът
secrets/backup/offhost-copy е неутрален към доставчика изпълним механизъм,
който получава пътя до всеки проверен обект. Първоначалният файл завършва с код
75 („отложено“) и никога не твърди невярно, че има външно копие. Болничният ИТ
екип може да го замени със свой механизъм за шифровано прехвърляне. Код 0
означава, че точно този обект е трайно потвърден; 75 го отлага; всеки друг код
означава грешка. LOSPOR записва само безопасни данни: име на обекта, време на
потвърждението и хеш на манифеста в .last-offhost-verified.v1.
Шифровани копия извън сървъра
Системата може сама да прави тези копия в мрежова папка, монтирана на сървъра
(SMB или NFS), или на SFTP сървър. Таймер проверява на всеки 15 минути. Всеки
нов проверен архив се шифрова на сървъра (AES-256, с HMAC-SHA256 върху името на
обекта, хеша на манифеста и шифрования текст) и се копира на мястото. След това
се прочита обратно и се сравнява, и едва тогава се записва в
.last-offhost-verified.v1. Настройва се от Поддръжка в Status или от
конзолата.
За споделена папка болничният ИТ екип първо я монтира в /mnt, /media или
/srv. Адаптерът отказва път, който е само обикновена локална папка. Пример за
SMB в /etc/fstab, с паролата във файл с данни за достъп, достъпен само за root
(редове username=, password=, domain=, права 0600, инсталиран пакет
cifs-utils):
//fileserver.hospital.local/lospor-backups /mnt/lospor-backups cifs credentials=/etc/lospor-backups.cred,uid=0,gid=0,file_mode=0600,dir_mode=0700,nofail,_netdev 0 0
За SFTP настройката създава SSH ключ на системата и закрепва ключовете на сървъра. Инсталирайте показания публичен ключ за SFTP потребителя и проверете показаните отпечатъци на ключовете с администратора на сървъра. Вход с парола не се поддържа.
sudo losporctl backup offhost configure mount /mnt/lospor-backups
sudo losporctl backup offhost configure sftp backup.hospital.local 22 lospor lospor-backups
sudo losporctl backup offhost test
sudo losporctl backup offhost run
sudo losporctl backup offhost drill
sudo losporctl backup offhost state
test записва пробен файл, прочита го обратно и го изтрива. drill изтегля
най-новото потвърдено копие, проверява удостоверяването му, дешифрова го и го
възстановява във временна база данни, след което го премахва. Това е
тримесечното възстановяване от действителния външен носител, описано по-долу.
Ключът за шифроване е secrets/backup/offhost-encryption.key. Той се създава
веднъж и никога не се сменя, защото е нужен за всяко копие. След първата
настройка съхранете отново secrets/ в сейфа: дотогава Status отчита
потвърждението за съхранение като неактуално. Задържането на копията на мястото
се определя от болничния ИТ екип.
Болницата трябва да съхранява защитено site.env, .env (включително точния
OMOP_PSEUDONYM_SALT на инсталацията), цялата папка secrets/
(включително secrets/backup/manifest-hmac-key и
secrets/api/external-ai-seal-key) и проверените архиви в отделна
шифрована система извън виртуалната машина и нейното хранилище. Следете
отделно възрастта на локалното и външно потвърденото копие и поне веднъж на
тримесечие правете документирано възстановяване от действителния външен носител.
Съхранение на тайните от Status
Поддръжка → Съхранение на тайните → Създайте копие за съхранение. Status иска администраторската парола и код от приложението за удостоверяване, след което показва парола за файла веднъж: запишете я, преди да напуснете страницата. Сървърът записва същия шифрован файл, който записва командата за конзолата по-долу, дешифрира го и изисква той да съвпада с използваните файлове, и го предлага 30 минути на администратора, който го е поискал. Изтеглете го на USB памет на своя компютър. Изтеглянето се съобщава на сървъра, който записва потвърждението, проверявано от „Готовност“, и премахва копието от сървъра.
Тъй като файлът заедно с паролата му отваря всяка тайна на инсталацията, Status предлага това само докато собственият му мрежов списък е ограничен до мрежите за ИТ управление, позволява най-много три копия за 24 часа (броени от сървъра), записва всяка заявка и всяко изтегляне и показва изтеглянето в прегледа една седмица. Аварийна сесия от конзолата не може да го използва.
Съхранение на тайните в конзолата
Поставете USB памет или монтирайте споделена папка извън този сървър и изпълнете:
sudo losporctl secrets escrow /media/usb
Командата записва site.env, .env, advanced.env (ако има) и цялата
secrets/ като един шифрован файл (lospor-hospital-secrets-<време>.tar.gz.enc,
AES-256 с ключ, изведен чрез PBKDF2) с .sha256 до него, дешифрира копието и
изисква то да съвпада с използваните файлове и едва тогава записва
потвърждението, което проверява „Готовност“. Отказва директория на собствения
диск на сървъра. Паролата се генерира и показва веднъж: пазете я в хранилището
за пароли на ИТ, отделно от USB паметта. Болница, която управлява собствена
парола, може да я подаде с --passphrase-file ФАЙЛ. Изпълнете отново след всяка
промяна на тайните: смяна на данни за достъп или ключа за външните копия,
създаден при първата им настройка.
За възстановяване на нов сървър, като root в /opt/lospor-hospital:
openssl enc -d -aes-256-cbc -pbkdf2 -iter 600000 -md sha256 -in lospor-hospital-secrets-<време>.tar.gz.enc | tar -xz
Тайни, съхранени по друг начин, се отбелязват с
sudo sh /opt/lospor-hospital/current/scripts/acknowledge-secrets-escrow.sh.
Нито потвърждението, нито Status съдържат ключ: само еднопосочни отпечатъци,
така че по-късна смяна на ключовете показва съхранението като остаряло.
Създаване на точка за възстановяване
sudo sh /opt/lospor-hospital/current/scripts/backup-now.sh
За защитените работни процеси:
sudo sh /opt/lospor-hospital/current/scripts/backup-now.sh --kind pre-update
sudo sh /opt/lospor-hospital/current/scripts/backup-now.sh --kind pre-restore
sudo sh /opt/lospor-hospital/current/scripts/backup-now.sh --kind immutable
Едновременните планови, ръчни и преди-обновяване заявки споделят ключалката за
архивиране и могат да използват една и съща току-що проверена точка.
BACKUP_BUSY е стабилният резултат при заетост и не заменя Status сигнала на
активния архив. Архивирането използва и същата постоянна системна ключалка като
миграциите и подмяната на услуги. Ако тя е заета от поддръжка, архивирането се
отлага преди достъп до PostgreSQL с код 75 и BACKUP_MAINTENANCE_BUSY; архив и
обновяване никога не се изпълняват едновременно.
Безопасно възстановяване
По подразбиране възстановяването е в изолирана временна база, без промяна на работещата клинична база и услуги:
sudo sh /opt/lospor-hospital/current/scripts/restore-backup.sh --temporary \
backups/lospor-YYYYMMDDTHHMMSSZ-RANDOM.backup
Пробното възстановяване доказва, че архивът може да бъде възстановен, без да
пази копието. То изпълнява същите проверки, възстановяване, миграции и
валидиране като временното възстановяване, след което премахва временната база
данни. Не се въвежда потвърждение, защото нищо, което клиницистите използват, не
се променя. losporctl backup drill проверява най-новия архив, а
Поддръжка в Status изпълнява същата проверка и пази резултатите ѝ:
sudo sh /opt/lospor-hospital/current/scripts/restore-backup.sh --drill \
backups/lospor-YYYYMMDDTHHMMSSZ-RANDOM.backup
sudo losporctl backup drill
Преди да създаде нещо, процедурата удостоверява затворената схема на
манифеста, проверява каталога и мястото и сравнява болница, система, версии,
PostgreSQL, миграции, схема и всички ключови отпечатъци. Отпечатъкът за външния
ИИ е SHA-256 върху декодираните 32 байта на ключа за запечатване, а не върху
base64 текста. Липсващ или различен ключ връща
RESTORE_EXTERNAL_AI_SEAL_KEY_MISMATCH преди каквато и да е промяна на базата,
защото иначе възстановените данни за достъп до доставчика не могат да бъдат
отворени. Отпечатъкът на солта за OMOP псевдоними е SHA-256 върху точната
канонична стойност от 64 малки шестнадесетични знака в .env, без нов ред.
Различна стойност в защитеното копие връща
RESTORE_OMOP_PSEUDONYM_SALT_MISMATCH преди каквато и да е промяна на базата,
защото иначе възстановената OMOP проекция би извела различни числови изходни
идентификатори. Чужд, повреден, неподдържан или по-нов архив се отказва преди
прекъсване. Временната база се
мигрира и валидира; при грешка се премахва само тя.
Подмяна на работещата база е аварийна операция:
sudo sh /opt/lospor-hospital/current/scripts/restore-backup.sh --in-place \
backups/lospor-YYYYMMDDTHHMMSSZ-RANDOM.backup
Тя изисква точното показано потвърждение с болница и време, ново удостоверено
предаварийно копие и второ потвърждение на разрушителната граница. Предишната
база се пази под безопасно име, докато подмяната бъде доказана. Caddy може да
отвори достъпа едва след като doctor.sh --restore-preopen провери PostgreSQL,
схемата и миграциите, API, Web, PWA, Browser, Status, оператора и терминологията
и изведе RESTORE_PREOPEN_OK.
SQLite базата на Status е оперативно състояние и не е част от клиничния архив.
Запазете нейния том. Ако той е загубен, но клиничната база още съдържа
оператора, използвайте ./scripts/appliance-operator.sh repair-status.
Автоматичните тестове не заменят тримесечното възстановяване от реалното
външно копие на болницата.