Yozib qo‘yib, hech qachon yoqmagan monitoringim
Tungi backup, watchdog va uptime pingi repoda uch hafta yotdi, lekin bir marta ham ishlamadi. Nihoyat sozlaganimda nimani topdim - va birinchi bo‘lib sinab ko‘rishim kerak bo‘lgan tiklash.
Sentabrda bu saytning operatsion qismini yozdim: bazaning tungi backup’i, ops bot jim qolsa ogohlantiradigan watchdog va disk hamda xotira haqida ertalabki hisobot. Ko‘rib chiqildi, testdan o‘tdi, merge qilindi.
Oktabrda serverga kirib shuni ishga tushirdim:
$ crontab -l
no crontab for ibrohimUlarning hech biri bir marta ham ishlamagan edi. Uch hafta davomida saytning umuman backup’i bo‘lmagan va buni hech narsa aytmagan.
Nega hech narsa aytmadi
Bot yo‘qolgan backup’larni kuzatadi. 26 soatdan ortiq backup bo‘lmasa, kritik ogohlantirish yuboradi. Lekin men ataylab bitta istisno qilgandim: agar backup hech qachon bo‘lmagan bo‘lsa, u jim turadi. Bu incident emas, sozlash bosqichi; hali sozlayotgan paytingizda har kuni chalinadigan ogohlantirish sizni unga e’tibor bermaslikka o‘rgatadi.
O‘zicha bu oqilona qoida. Lekin hech qachon bajarilmagan sozlash qadami bilan birga u aynan shu holat uchun qurilgan yagona ogohlantirishni o‘sha holatning o‘zi bilan o‘chirib qo‘ydi.
Hozir yozadigan qoidam: jim sozlash bosqichining tugash muddati bo‘lishi kerak. “Hali sozlanmagan” bir kun uchun normal. Bir haftadan keyin muammoning o‘zi shu.
Bitta diskdagi backup
Birinchi ishga tushirish muvaffaqiyatli bo‘ldi va botning xabari aynan nima ekanini aytdi:
💾 Backup
512K · 1s
Faqat shu serverda - tashqi nusxa sozlanmagan.O‘zi nusxa olgan baza yonida turgan dump yomon migratsiyadan yoki ehtiyotsiz DELETEdan himoya qiladi. Serverni yo‘qotishdan esa himoya qilmaydi - backup’lar aynan shu holat uchun mavjud.
Shuning uchun endi har dump yozilishi bilanoq rclone orqali Cloudflare R2’ga nusxalanadi, ertalabki xabar esa nusxa qayerga ketganini aytadi.
Bucket’da qulf qoidasi bor: o‘ttiz kun davomida obyektni hech kim - serverning o‘z kaliti ham - o‘chira yoki ustidan yoza olmaydi. Qoida faol ekanini test faylini tozalayotganimda bildim:
ERROR : r2test.txt: Couldn't delete: ObjectLockedByBucketPolicyBu xato - aynan kerakli xususiyat. Server qachondir buzilsa, uni egallagan odam backup’larimni o‘qiy oladi, lekin o‘chira olmaydi.
Birinchi tiklash
Hech qachon tiklanmagan backup - shunchaki fayl. Shuning uchun keyingi qadam bittasini tiklash edi - noutbukda emas, serverning o‘zida, tashqi nusxadan, vaqtinchalik bazaga:
F=$(rclone lsf r2:fayzullayev-backups/portfolio | sort | tail -1)
rclone copy "r2:fayzullayev-backups/portfolio/$F" /tmp/
psql -c "CREATE DATABASE portfolio_restore_test;"
gunzip -c "/tmp/$F" | psql -d portfolio_restore_test -v ON_ERROR_STOP=1
psql -d portfolio_restore_test -c \
"SELECT (SELECT count(*) FROM posts), (SELECT count(*) FROM projects);"O‘nta post, oltita loyiha, bitta foydalanuvchi - adminkada ko‘rinadigan sonlarning aynan o‘zi. Bu so‘rov endi oylik tekshiruv, bot esa har oyning birinchi kuni eslatadi.
Haqiqiy tiklash tartibini yozish paytida bitta tuzoq chiqdi. Serverdagi .envda TAG=latest turibdi, CI esa image’larni commit xeshi bilan teglab deploy qiladi - demak serverdagi latest image hozir ishlayotganidan eskiroq bo‘lishi mumkin. Tiklashdan keyin docker compose up -d qilinsa, konteynerlar jimgina o‘sha eski image’dan qayta yaratiladi: ma’lumot tiklanayotganda kod orqaga qaytadi. Shuning uchun tartibda docker compose start ishlatiladi - u mavjud konteynerlarni o‘zgartirmay qayta yoqadi.
Hech qachon yuborilmagan ping
Bitta bo‘shliq qolgandi: yuqoridagilarning hammasi bitta mashinada ishlaydi. Server o‘lsa, watchdog ham u bilan birga o‘ladi.
Botda buning kodi boshidan bor edi. HEARTBEAT_PING_URL berilsa, u har ikki daqiqada tashqi xizmatga ping yuboradi, pinglar to‘xtasa o‘sha xizmat bong uradi. Yozuvlarimda bu “.envga bitta qator” deb turardi.
Bunday emas ekan. Compose fayl bu o‘zgaruvchini bot konteyneriga umuman uzatmagan. .envga qator qo‘shish hech narsani o‘zgartirmasdi va buni hech kim aytmasdi. docker-compose.prod.ymlga yana bitta qator buni tuzatdi; URL endi healthchecks.io’ga qaraydi - uning ogohlantirishlari o‘zining Telegram boti va email orqali keladi, chunki serverim haqidagi ogohlantirish serverimga bog‘liq bo‘lmasligi kerak.
Endi “tayyor” nimani anglatadi
Bu deploy haqidagi postdagi saboqning o‘zi, faqat boshqa tomondan. Yashil pipeline kod to‘g‘ri ekanini aytadi. Kod ishlayaptimi-yo‘qmi - bu haqda hech narsa demaydi.
Operatsion ishda endi har bir qismni prodda bir marta ishlaganini ko‘rganimdan keyingina tugagan deb hisoblayman: botdan backup xabari, R2’da fayl, sonlari mos keladigan tiklash, uptime xizmatida yashilga aylangan tekshiruv. Ungacha hammasi - reja.