Резервни копия и възстановяване
Какво да архивирате
| Какво | Защо |
|---|---|
| Базата данни | Всичко, освен файловете. |
Базата данни на Entrosity Hub (platform) | Потребители, идентификационни данни, организации и роли. |
Кофата (rmm-packages) | Инсталатори на пакети, изход от скриптове, MSI файлове на агента и конектора. |
deploy/.env | Без RMM_MASTER_KEY (и PLATFORM_MASTER_KEY за Hub) криптираните тайни в резервното копие се губят. |
Нощно резервно копие
deploy/scripts/backup.sh:
pg_dump -Fc, проверен чрез обратно прочитане сpg_restore --list, вdeploy/backups/db/(заедно с файл.meta, който съдържа версията на схемата). Дъмповете се записват с права 0600. Когато съществува базата данни на Hubplatform, и тя се дъмпва катоplatform-<same time>.dump.- Инкрементално
mc mirrorна кофата къмdeploy/backups/objects/. - Изтрива дъмповете, по-стари от
RMM_BACKUP_KEEP_DAYS(по подразбиране 14). - По избор копира всичко в S3 кофа извън площадката
(
RMM_BACKUP_S3_ENDPOINT,_BUCKET,_ACCESS_KEY,_SECRET_KEY) и прилага същия срок на съхранение и там.
15 2 * * * root /opt/entrosity/deploy/scripts/backup.sh >> /var/log/rmm-backup.log 2>&1
На продукционния хост на Entrosity този ред все още не е добавен; всяко разгръщане прави резервно копие преди обновяването (Непрекъснато разгръщане).
Резервно копие на същия диск не оцелява при загуба на хоста.
Възстановяване към момент във времето
Задайте PG_ARCHIVE_MODE=on и PG_ARCHIVE_COMMAND в .env, за да се
архивират WAL сегментите в backups/wal/. Възстановете ги със стандартния
PITR механизъм на PostgreSQL, като започнете от базово резервно копие,
направено с pg_basebackup.
Възстановяване
deploy/scripts/restore.sh deploy/backups/db/rmm-20260924T021500Z.dump
Скриптът:
- спира портала и бекендите;
- създава наново базата данни (и ролята
rmm_app, ако липсва), както и базата данни на Hub от дъмпаplatform-от същото изпълнение, ако има такъв (и ролятаplatform_app); - възстановява дъмпа (паралелно, когато той се намира в директорията за резервни копия);
- връща обектите обратно чрез огледално копиране;
- изпълнява
migrate up, което придвижва по-стар дъмп до текущата версия и задава паролата наrmm_app, както иplatform-migrateна Hub; - стартира всичко.
Агентите се свързват отново сами.
На нов хост: инсталирайте Docker, копирайте deploy/.env (със същите
ключове!) и директорията с резервните копия, след което изпълнете
restore.sh. Преди възстановяването той стартира само postgres и minio.
Преместване на продукцията на друг хост (направено на 2026-09-27, вижте
CUTOVER.md в entrosity-infra): първо подгответе новия хост (deploy/,
.env с новия SPHERE_MEDIA_PUBLIC_IP, release-public-key.txt, образите,
томовете caddy-data и caddy-config, за да се пренесат сертификатите,
rmm.service, реда за резервни копия в cron и ключа за разгръщане). След това
спрете web, бекендите и sphere-media на стария хост, изпълнете
backup.sh, копирайте новите дъмпове и backups/objects/, изпълнете
restore.sh на новия хост, сравнете броя на редовете и насочете DNS записите
към него. Накрая изключете rmm.service на стария хост и сменете
DEPLOY_HOST и DEPLOY_KNOWN_HOSTS (Непрекъснато разгръщане).
Учение по възстановяване
Учението (2026-09-24) използва продукционния compose на лабораторен хост с 20 симулирани агента, свързани през TLS. Томовете на PostgreSQL и MinIO бяха изтрити, след което всичко беше възстановено от нощния дъмп.
| Стъпка | Време |
|---|---|
| Резервно копие (дъмп + проверка + огледално копие на обектите) | 2 s |
| Спиране на услугите, стартиране на празни postgres/minio | 6 s |
Повторно създаване на базата данни + pg_restore | 2 s |
| Обратно огледално копиране на обектите | 1 s |
migrate up + стартиране на бекендите и портала (в изправно състояние) | 10 s |
| Общо възстановяване | 19 s |
Броят на редовете съвпадна, администраторът можа да влезе, обектът на пакета беше наличен, а всичките 20 агента отново бяха онлайн в рамките на 30 s без никакви действия по тях.
Базата данни в учението беше малка: планирайте приблизително 1 минута на
GB дъмп за pg_restore -j 4 на SSD. Повтаряйте учението след големи
надграждания, на временен хост или с RMM_COMPOSE_PROJECT=rmm-drill.