Өдөр бүр 03:15 backups.petronet.mn
Алдвал хамгийн ихдээ нэг өдөр
Өгөгдлийн сан уствал алдагдах зүйл нь сүүлийн 03:15-аас хойшх ажил л. ШТС ба агуулахын бүртгэл, савны үлдэгдэл, гинжин мөрдлөг, тайлан, ваучер, аудитын мөр — үлдсэн бүгд өдөр бүрийн dump дээр, өөр байршилд шифрлэгдсэн хуулбартай.
Кодыг git-ээс авна. Өгөгдлийг хаанаас ч авахгүй.
Сервер дахин босно, образ дахин угсарна. Харин өнгөрсөн долоо хоногт аль ШТС хэдэн литр хүлээж авсныг өөр хаана ч бичээгүй.
Нэг platform_db, бүтнээр
PetroNet-ийн 22 petro_* хүснэгт — ШТС, агуулах, сав,
хөдөлгөөн, гаалийн илгээмж, тайлангийн үе ба мөр, ваучер, хяналтын
байгууллага — болон цөмийн байгууллага, хэрэглэгч, эрх, баримт,
гарын үсэг, аудит.
Нэг pg_dump, хэсэглэхгүй: хагас сан сэргээвэл гадаад түлхүүрүүд тасарна.
RLS нь role-гүйгээр ажиллахгүй
pg_dump нь нэг сангийн объектыг л авдаг. Тенантын
gerege_nexus_tenant, API-ийн gerege_nexus_api
кластерын түвшинд амьдардаг — тэдгээргүй сэргээвэл GRANT ба POLICY унаж,
хэрэглэгч хүснэгтээ харахгүй.
Тиймээс role-ууд тусдаа файлд, нууц үггүй.
Ажиллалт бүр өөрийгөө бүртгэнэ
Амжилттай ч, амжилтгүй ч platform_backups-д мөр
бичнэ — консол тэрийг уншина. Prometheus руу таван хэмжүүр:
хэзээ ажилласан, хэзээ амжилттай, хэмжээ, үр дүн, өөр байршилд
хүрсэн эсэх.
10 KB-аас жижиг dump-ыг өөрөө татгалзана — алдаагүй дуусаад юу ч бичээгүй pg_dump бол амжилттай харагдах бүтэлгүйтэл.
Шөнө бүр юу болдог вэ
Хост дээр нэг cron мөр, нэг скрипт: deploy/scripts/backup.sh. Алхам бүтэлгүйтвэл дараагийнх нь эхлэхгүй.
Сангийн dump
pg_dump --clean --if-exists→gzip -9. Файл ньumask 077-оор үүснэ: dump-д иргэдийн мэдээлэл, нууц үгийн hash бий.Хэмжээг шалгах
10 KB-аас бага бол ажиллалт амжилтгүй гэж бүртгэгдэж, үргэлжлэхгүй.
Role-уудын dump
pg_dumpall --roles-only --no-role-passwords— сангийн файлтай нэг цагийн тэмдэгтэй, нэг багц.Хуучныг цэвэрлэх
Хост дээр 14 хоногоос хуучин багц устна. Өөр байршлын хуучныг тэр байршлын эзэн л цэвэрлэнэ.
Өөр байршил руу
Тохируулсан бол S3 руу (
age-ээр шифрлээд) ба restic rest-server руу. Аль нэг нь унавал бүх ажиллалт амжилтгүй.Бүртгэл ба хэмжүүр
platform_backups-д мөр,petronet_backup.prom-д хэмжүүр. Бүтэлгүйтэл өмнөх амжилтын мөчийг хадгална — эс бөгөөс «нэг удаа унасан», «хэзээ ч ажиллаагүй» хоёр ялгагдахгүй.
petronet-20261013-031500.sql.gz.age
petronet-roles-20261013-031500.sql.gz.age
- .sql
Бүтэн
pg_dump; сэргээхдээ өмнөх объектыг өөрөө цэвэрлэнэ. - .gz
Шахалт эхэлж — шифрлэгдсэн өгөгдөл шахагддаггүй.
- .age
Зөвхөн S3 руу явах хуулбар. Хостыг орхихоосоо өмнө шифрлэгдэнэ.
Эвдэрсэн хост түүхээ устгаж чадахгүй
Хоёр бие даасан байршил. Хоёулаа хост өөрөө эвдэрсэн өдрийг тооцож хийгдсэн.
Хост өөрийн илгээснийг уншиж чадахгүй
Хост дээр зөвхөн age-ийн нийтийн түлхүүр бий.
Хувийн түлхүүр операторт. Сан нь хувилбартай, байршуулах түлхүүр нь
зөвхөн нэмэх эрхтэй — устгах эрхгүй.
Илгээснийг итгэхгүй, шалгана
Repo нь append-only, өөрийгөө шифрлэдэг. Илгээсний дараа скрипт сүүлийн
snapshot-д хоёр файл хоёулаа байгааг restic ls-ээр
шалгана. Retention-ийг repo-гийн эзэн хийнэ, хост биш.
nexus_backup_offsite_ok
Өөр байршил тохируулаагүй систем дээр энэ нь 0 хэвээр. Тэр нь алдаа биш: «хуулбар өөр газар байхгүй» гэдэг нь нуух биш, харагдах ёстой баримт.
Role-ууд → сан → шалгалт
Сэргээж үзээгүй нөөцлөлт бол итгэл найдвар. Дараалал үргэлж ижил, ажиллаж байгаа кластер руу биш — хаягдах кластер руу.
# 1 — тайлах (S3-ийн хуулбар; restic-ээс бол restore хийгээд .age-гүй файл) age -d -i key.txt petronet-roles-<огноо>.sql.gz.age | gunzip > roles.sql age -d -i key.txt petronet-<огноо>.sql.gz.age | gunzip > restore.sql # 2 — эхлээд role-ууд («role "postgres" already exists» — хэвийн) psql -d postgres -f roles.sql # 3 — дараа нь сан createdb platform_db psql -v ON_ERROR_STOP=1 -d platform_db -f restore.sql # 4 — RLS амьд уу: бодлого ирсэн, тенантын role байгаа psql -d platform_db -c "select count(*) from pg_policies" psql -d platform_db -c "select count(*) from petro_stations"
Role-ууд нууц үггүй сэргээгдэнэ. Апп-ийн холболтын role
(gerege_nexus_api г.м.)-ийн нууц үгийг .env-ээс
ALTER ROLE … PASSWORD …-оор дахин тавина. pg_policies
0 бол role-уудын файл ачаалагдаагүй байна. Бүтэн заавар, restic-ийн
хувилбар — docs.petronet.mn/operations.
Юунаас хамгаалахгүй вэ
Хувийн түлхүүрээ алдвал S3-ийн бүх хуулбар ашиггүй. Түүнийг нөөц байгаа машин дээр биш, нууц үгийн менежерт эсвэл офлайн хадгална. Хост дээр үлдээвэл шифрлэлт утгагүй.
Өөр байршил тохируулаагүй бол хуулбар нь сантай нэг машин дээр: хүснэгт устгасан, буруу миграц, volume дахин үүсгэснээс хамгаална — хостоо бүхэлд нь алдахаас хамгаалахгүй.
Хэмжүүрүүд Prometheus-д бичигддэг ч сэрэмжлүүлэг (Alertmanager) одоогоор суугаагүй: «нөөцлөлт өчигдөр унасан» гэдгийг хүн самбар нээж харна. Энэ хуудас өөрөө зөвхөн тайлбар — энэ хаягаар файл татаж авах боломжгүй.