Asosiy kontentga o‘tish

Maqolalar 7 daqiqa 198 ko‘rish

Server o'chib yonsa nima tirik qoladi? Reboot'ga chidamlilik auditi

Reboot vaqtini siz tanlamaysiz — kernel yangilanishi, provayder ishlari yoki oddiy elektr muammosi uni sizsiz qiladi. Serverni tekshirib chiqamiz: nimalar o'zi qaytadi, nimalar jim o'lib qoladi, va buni qanday oldindan bilish mumkin.

linux devops

Mundarija

Bu mavzuga meni hayotning o'zi olib kelgan. Yaqinda serverlarimdan biriga reboot berildi — reja asosida, o'z qo'lim bilan. Saytlar qaytdi, systemd ostidagi botlar qaytdi. Bittasi esa jim qoldi: yillar oldin nohup bilan ishga tushirilgan bot faqat kimdir qo'lda yoqib qo'yishini kutib yotardi. Bu voqeani Aladdin seriyasida aytib bergan edim. O'shanda men uchun asosiy savol boshqacha bo'lib qoldi: serverda yana nimalar faqat qo'lda ishga tushirilgan-u, buni hech kim bilmaydi?

Gap shundaki, reboot vaqtini har doim ham siz tanlamaysiz. Kernel'dagi jiddiy zaiflik yangilanish talab qiladi, provayder uskuna almashtiradi, elektr yoki xotira muammosi serverni o'zi o'chirib yuboradi. Shunday paytda "nima o'zi qaytadi, nima qaytmaydi" degan savolga javob tayyor bo'lishi kerak — va bu javobni olishning yagona ishonchli yo'li audit.

Audit: to'rt savol#

1. Xizmatlar ro'yxati to'liqmi?#

Hozir ishlab turgan xizmatlar bilan reboot'dan keyin qaytadiganlari — ikki xil ro'yxat. Ularni solishtiramiz:

Terminal
# hozir ishlab turganlar:
systemctl list-units --type=service --state=running --no-pager

# reboot'dan keyin qaytadiganlar:
systemctl list-unit-files --type=service --state=enabled --no-pager

Birinchi ro'yxatda bor-u ikkinchisida yo'q xizmat — xavf ostidagi nomzod. Har muhim xizmatni bittalab ham so'rash mumkin:

Terminal
systemctl is-enabled mysite-web nginx postgresql db-backup.timer
# hammasi "enabled" qaytarishi kerak

Mening o'sha voqeamdagi bot esa bu ro'yxatlarning ikkalasida ham yo'q edi — u umuman systemd'dan tashqarida yashardi. Shuning uchun auditga bitta qadam qo'shiladi: systemd bilmaydigan jarayonlarni qidirish. Buning uchun ps ga har jarayon qaysi systemd birligida yashayotganini ko'rsatadigan unit ustunini qo'shamiz:

Terminal
ps -eo pid,etime,unit,args --sort=-etime | grep -E "session-|user@"

Natija taxminan shunday bo'ladi:

Natija
    592  412-03:11:45 session-15.scope    python3 /home/deploy/bot/bot.py
    608  230-19:02:10 session-16.scope    SCREEN -dmS bot2 python3 bot2.py
    453       00:05 user@1000.service   /usr/lib/systemd/systemd --user
    725       00:00 session-18.scope    sshd: deploy [priv]
    738       00:00 session-18.scope    ps -eo pid,etime,unit,args --sort=-etime

Nginx, gunicorn yoki postgres kabi systemd boshqaradigan jarayonlarda bu ustunda .service turadi, shuning uchun filtr ularni chiqarmaydi. session-N.scope esa jarayonni kimdir SSH sessiyasidan qo'lda ishga tushirib qoldirganini bildiradi (nohup, screen). ELAPSED ustunidagi 412-03:11:45 — 412 kun degani. user@1000.service qatorlarida systemd --user va (sd-pam) odatiy, lekin ulardan boshqa jarayon ham shubhali: masalan, tmux ichida ishga tushirilgan bot aynan shu yerga tushadi. Pastdagi yangi qatorlar — sizning hozirgi sessiyangiz (sshd, bash, ps), ularga e'tibor bermang.

Ro'yxatda qo'lda yurgan bot yoki skript chiqsa — uni xizmatga aylantirish vaqti kelgan.

2. fstab yodida bormi?#

Diskka ulangan hamma narsa — swap, qo'shimcha disk, tashqi papka — mount buyrug'i bilan qo'lda ulangan bo'lsa, reboot'da yo'qoladi. Doimiy bo'lishi uchun /etc/fstabda yozuvi turishi kerak:

Terminal
swapon --show          # swap hozir bor
grep swap /etc/fstab   # ...lekin bu qatorsiz reboot'dan keyin bo'lmaydi

1-qismda swap yaratganda fstab'ga yozgan edik — mana o'sha qatorning haqiqiy sababi.

3. Firewall va sertifikatlar-chi?#

Yaxshi yangilik: ufw qoidalari o'zi doimiy, alohida saqlash shart emas. Certbot'ning yangilanish timer'i ham enabled bo'lsa qaytadi. Lekin tekshirib qo'yish bir qatordan:

Terminal
sudo ufw status | head -5
systemctl is-enabled snap.certbot.renew.timer db-backup.timer

4-qismda certbot'ni snap orqali o'rnatganmiz, shuning uchun timer nomi snap.certbot.renew.timer. apt'dan o'rnatgan bo'lsangiz, uning o'rniga certbot.timer yozing. Nom xato bo'lsa, enabled o'rniga not-found chiqadi.

4. Xizmatlar to'g'ri TARTIBDA qaytadimi?#

Hammasi enabled bo'lishi hali yetarli emas — bog'liqliklar ham to'g'ri bo'lishi kerak. Ilova bazadan oldin ko'tarilsa, birinchi urinishda yiqilib, restart bilan tiklanadi; bu ishlaydi, lekin loglarni har reboot'da bitta soxta xato bilan ifloslaydi. 2-qismdagi After= va Requires= qatorlari aynan shu tartibni kafolatlaydi — auditda ularni ham bir ko'zdan kechiring.

Mashq: rejali reboot#

Audit qog'ozda to'g'ri chiqishi mumkin, lekin haqiqiy javobni faqat amaliyot beradi. Shuning uchun tizimni sozlab bo'lgach — va keyin ham yiliga bir-ikki marta — rejali reboot qiling. Farqi shundaki, siz unga tayyor holda, kunduz kuni, checklist bilan kirasiz:

Terminal
sudo reboot
# ... bir daqiqa kutamiz, keyin:
ssh deploy@SERVER_IP

systemctl --failed                 # bo'sh bo'lishi kerak
systemctl is-system-running        # "running" — hammasi joyida; "degraded" — nimadir yiqilgan
curl -Is https://mysite.uz | head -1   # sayt domen orqali javob beradi
free -h                            # swap qaytdi

is-system-running degraded desa, yiqilgan unit'lar aynan systemctl --failed ro'yxatida turadi — sababini sudo journalctl -u <unit nomi> -b bilan o'qing. Server yonishda davom etayotgan bo'lsa, u starting deydi — bir necha soniyadan keyin qayta so'rang. Saytni o'z kompyuteringiz brauzerida ham bir ochib ko'ring.

systemctl --failed bo'sh chiqsa va sayt ochilsa — server o'chib-yonishga tayyor. Endi kutilmagan reboot ham kutilgan stsenariy bo'ladi.

Bonus: server qayta yonganini o'zi aytsin#

Kutilmagan reboot baribir bo'ladi, va u haqda serverning o'zi xabar bergani yaxshi. Buning uchun bitta mitti xizmat yetadi — u har yonishda Telegram'ga xabar yuboradi. Telegram bot tokeni va xabar boradigan chat ID kerak bo'ladi. Ularni xizmat /opt/mysite/.env dan oladi, shuning uchun u yerda BOT_TOKEN=... va ADMIN_CHAT_ID=... qatorlari bo'lsin. Chat ID'ni bilish uchun botga Telegram'da /start yozing va brauzerda https://api.telegram.org/bot<TOKEN>/getUpdates ni oching: javobdagi "chat":{"id":...} raqami — sizning chat ID'ingiz. /start ni o'tkazib yubormang: siz yozmaguningizcha bot sizga xabar yubora olmaydi. Shu token bilan bot serverda allaqachon ishlab tursa, u xabarlarni o'zi olib ketadi va getUpdates bo'sh "result":[] yoki xato qaytaradi — botni bir daqiqaga to'xtatib, /start ni qayta yozing.

INI
# /etc/systemd/system/boot-notify.service
[Unit]
Description=Reboot haqida adminga xabar
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
EnvironmentFile=/opt/mysite/.env
# -sS: ortiqcha chiqish yo'q, lekin xato bo'lsa jurnalga yozilsin;
# --fail-with-body: Telegram xato qaytarsa (token yoki chat ID noto'g'ri),
# xizmat "muvaffaqiyatli" bo'lib ko'rinmasin
ExecStart=/usr/bin/curl -sS --fail-with-body -X POST \
    "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
    -d chat_id=${ADMIN_CHAT_ID} \
    -d text="Server qayta ishga tushdi"

[Install]
WantedBy=multi-user.target
Terminal
sudo systemctl daemon-reload && sudo systemctl enable boot-notify

# reboot'ni kutmasdan hoziroq sinaymiz — telefoningizga xabar kelishi kerak:
sudo systemctl start boot-notify

Xabar kelmasa, sudo journalctl -u boot-notify -n 10 ni oching. Telegram javobi o'sha yerda turadi: "Unauthorized" — token noto'g'ri, "Bad Request: chat not found" — chat ID noto'g'ri yoki botga /start yozilmagan. --fail-with-body bo'lmaganida bu holatlarda ham xizmat "muvaffaqiyatli" tugagan bo'lib ko'rinardi va siz xabar nega kelmayotganini reboot'dan keyingina payqardingiz.

Endi server qachon o'chib yonmasin, telefoningizga xabar keladi — va siz buni mijozdan emas, serverning o'zidan birinchi bo'lib eshitasiz.

Xabar keldi — endi sababini bilamiz

Serverga kirib last reboot | head -3 ni ishga tushiring: qachon va necha marta yonganini ko'rsatadi. Nega yonganini esa oldingi yonishning oxirgi loglari aytadi — journalctl -b -1 -e (buni seriyaning 8-qismida batafsil ko'ramiz). Tez-tez sababsiz reboot bo'layotgani ma'lum bo'lsa — bu boshqa, jiddiyroq suhbatning boshlanishi (provayder bilan yoki xotira bilan).

Yakun#

Reboot'ga chidamlilik alohida texnologiya emas, oldingi qismlarda qurilgan intizomning sinovi: xizmatlar systemd'da va enabled, disklar fstab'da, bog'liqliklar unit'larda, zaxira timer'da. Audit shularning hammasini bir aylanib chiqadi, rejali reboot esa qog'ozdagi javobni amalda tasdiqlaydi. Va server o'zi haqida o'zi xabar beradigan bo'lsa, kutilmagan hodisa ham boshqariladigan hodisaga aylanadi.

Keyingi qismda deploy'ning o'zini avtomatlashtiramiz: GitHub Actions bilan CI/CD — push qildingiz, testlar o'tdi, server o'zi yangilandi.

7 daqiqa 198 marta o‘qildi