WisarWisar
Dasturlash kitobi/10-QISM — DevOps45 daqiqa

10.7-bob: Deployment strategiyalari — PM2, domen, SSL

10-QISM — DevOps va Deploy · 7-mavzu


1. Kirish va motivatsiya

10.1-bobda biz bo'sh serverni xavfsiz sozladik (10.1: 2.10), 10.2-bobda Nginx'ni reverse proxy qildik (10.2: 2.4), 10.3-10.4'da ilovani Docker'ga o'radik, 10.5'da CI/CD bilan avtomatik chiqarishni o'rgandik va 10.6'da bulutni ko'rdik. Har biri — alohida bo'lak. Endi vaqti keldi: shu bo'laklarni birlashtirib, ilovani real, doimiy ishlaydigan production holatga keltirish. Bu — bobning markaziy g'oyasi.

Production deploy uchta narsani talab qiladi. Birinchi — ilova doimiy ishlashi kerak: terminal yopilsa o'lmasin, yiqilsa o'zi qayta yonsin, server qayta yuklansa avtomatik ko'tarilsin, ko'p yadroni to'liq ishlatsin. Buni PM2 (Process Manager 2 — Node.js uchun jarayon menejeri) hal qiladi. Ikkinchi — foydalanuvchi http://203.0.113.5:3000 yozmaydi, u https://saytim.uz ga kiradi: bizga domen va uni server IP'siga ulaydigan DNS kerak. Uchinchi — bog'lanish shifrlangan va ishonchli bo'lishi shart (parol/karta ochiq ketmasin, brauzer qulf belgisini ko'rsatsin): bu — HTTPS/SSL/TLS, Let's Encrypt sertifikati va uni avtomatik o'rnatuvchi Certbot. Bularning ustiga — zero-downtime (uzilishsiz) deploy va deploy strategiyalari (recreate, rolling, blue-green, canary).

Bu bob: process manager nima (nega node main.js yetarli emas — PM2 vs systemd), PM2 (start, daemon, auto-restart, log, monitoring, ecosystem.config.js, cluster mode, startup+save), domen va DNS (registrar, A/CNAME record, IP'ga ulash, propagation), HTTPS/SSL/TLS (nega kerak — shifrlash va ishonch; sertifikat, CA, Let's Encrypt bepul), Certbot (avtomatik sertifikat, Nginx plugin, auto-renew), Nginx + SSL (443, 80443 redirect — 10.2 bilan bog'liq), deploy strategiyalari (recreate/rolling/blue-green/canary — qachon qaysi), zero-downtime deploy (PM2 reload, graceful shutdown), backup/rollback, log rotation (pm2-logrotate), health check endpoint, HSTS/wildcard/SSL sifat va PaaS muqobili (Railway/Render/Fly.io — qachon VPS o'rniga).

O'xshatish: Production deploy — do'kon ochish kabi. (1) Do'koningda chiroq doim yonib turishi kerak — mijoz kelganda qorong'i bo'lsa, ketadi; lampochka kuysa, avtomatik zaxira yonsin; elektr o'chib yonsa, hammasi o'zi qaytsin. Bu — PM2 (ilova 24/7 ishlaydi, yiqilsa qaytadi, server qayta yuklansa o'zi yonadi). (2) Do'koningning manzili va taxallusi bo'lishi kerak — "uchinchi mahalla, beshinchi uy" emas, balki "Mega Planet, 2-qavat" — odamlar topib kelsin. Bu — domen (saytim.uz) va DNS (manzil aniq joy/IP). (3) Eshigingda ishonchli qulf va sertifikat bo'lishi kerak — mijoz "bu haqiqiy do'konmi, pulim xavfsizmi?" deb ishonsin; eshikda rasmiy litsenziya osig'liq tursin. Bu — SSL sertifikati (HTTPS qulfi, brauzerdagi qulf belgisi). Tovaringni almashtirsangiz (yangi versiya deploy) — do'konni yopmasdan, javonlarni bittalab yangilaysiz (zero-downtime). DevOps — shu do'konni masofadan, hech kim sezmasdan boshqarish san'ati.

Nega muhim?

  • "Deploy qila olaman" farqi — junior node main.js qiladi (terminal yopilsa o'ladi); senior PM2 + domen + SSL bilan to'liq chiqaradi.
  • Ishonch va xavfsizlik — HTTPS'siz sayt brauzerda "Not secure" deydi; karta/parol ochiq ketadi (xavf).
  • Uzilishsizlik — yangi versiya chiqarishda sayt yiqilmasin (zero-downtime — biznes uchun pul).
  • Intervyu/ish — "domen ulab, SSL o'rnatib, deploy qilganmisan?" — eng amaliy savol (real ko'nikma).

2. Nazariya — chuqur tushuntirish

2.1. Process manager nima va nega kerak

text
  MUAMMO: "node main.js" — production uchun YETARLI EMAS:

  $ node main.js           ilova ishlaydi... LEKIN:
   Terminal yopilsa      ilova O'LADI (SSH uzilsa — sayt yiqiladi)
   Ilova xato qilib yiqilsa  QAYTMAYDI (qo'lda yoqish kerak — soatlab o'lik)
   Server qayta yuklansa   ilova o'zi YONMAYDI
   Bitta jarayon           faqat 1 CPU yadro (qolgani bo'sh turadi)
   Log qayerda?            konsolga chiqadi, saqlanmaydi

  YECHIM: PROCESS MANAGER (jarayon menejeri):
   DAEMON — fon rejimida ishlaydi (terminaldan mustaqil)
   AUTO-RESTART — yiqilsa darrov qaytaradi
   BOOT — server qayta yuklansa avtomatik yonadi
   CLUSTER — bir necha nusxa (hamma yadroni ishlatadi)
   LOG — loglarni faylga yozadi, ko'rsatadi
   MONITORING — CPU/RAM/restart sonini kuzatadi

   Node.js uchun standart — PM2 (yoki systemd — 10.1: 2.6)

Process manager (jarayon menejeri) — ilovani boshqaradigan va doimiy ishlab turishini ta'minlaydigan vosita. node main.js ni to'g'ridan ishlatish production uchun yetarli emas: terminal (SSH sessiya) yopilsa ilova o'ladi; ilova xato bilan yiqilsa qaytmaydi (qo'lda yoqmaguningcha sayt o'lik turadi); server qayta yuklansa o'zi yonmaydi; bitta jarayon faqat bitta CPU yadroni ishlatadi (Node.js bitta ipli — single-threaded, 5.1); loglar saqlanmaydi. Process manager bularning hammasini hal qiladi: ilovani daemon (fon jarayoni — terminaldan mustaqil) qilib ishlatadi, yiqilsa avtomatik qayta yoqadi, server boot bo'lganda yondiradi, cluster bilan bir necha nusxa ko'taradi (hamma yadroni ishlatadi), loglarni faylga yozadi va resurslarni monitoring qiladi. Node.js dunyosida eng keng tarqalgan process manager — PM2.

2.2. PM2 nima va daemon arxitekturasi

text
  PM2 (Process Manager 2) — Node.js uchun production process manager:
   npm orqali o'rnatiladi: npm install -g pm2

  ARXITEKTURA — ikki qism (daemon + CLI):

  ┌─────────────────────────────────────────────────┐
  │  PM2 DAEMON (God Daemon — fon jarayoni, doim ishlaydi) │
  │  - ilovalarni ishga tushiradi va KUZATADI         │
  │  - yiqilsa darrov QAYTARADI (auto-restart)        │
  │  - loglarni yozadi, CPU/RAM o'lchaydi             │
  └──────────────────┬──────────────────────────────┘
       boshqaradi    │
   ┌─────────┬───────┼────────┬─────────┐
 ┌─▼──┐   ┌─▼──┐  ┌─▼──┐   ┌─▼──┐
 │app │   │app │  │app │   │ DB │    har biri alohida jarayon (PID)
 │ #0 │   │ #1 │  │ #2 │   │worker│
 └────┘   └────┘  └────┘   └────┘

  CLI ($ pm2 ...) — daemon'ga BUYRUQ beradi:
  pm2 start / list / logs / restart / reload / stop / delete

   Daemon — PM2'ning "yuragi": u doimo fonda turib ilovalarni kuzatadi

PM2 (Process Manager 2) — Node.js ilovalari uchun eng mashhur production process manager (npm install -g pm2 bilan global o'rnatiladi). Arxitekturasi ikki qismdan iborat: daemon (PM2'ning "God Daemon" — doimiy fonda ishlaydigan asosiy jarayon, ilovalarni ishga tushiradi, kuzatadi, yiqilsa qaytaradi, loglarni yozadi, resurslarni o'lchaydi) va CLI (pm2 ... buyruqlari — daemon'ga ko'rsatma beradi). Siz pm2 start app.js desangiz — CLI daemon'ga "shu ilovani ishga tushir va kuzat" deydi; daemon ilovani alohida jarayon qilib (har biri o'z PID'i bilan) yoqadi va doimo nazorat qiladi. Shuning uchun terminal yopilsa ham ilova ishlayveradi — chunki uni terminal emas, daemon ushlab turibdi. Bu — node main.js dan tub farqi.

2.3. PM2 vs systemd (qachon qaysi)

text
  IKKALASI HAM ilovani doimiy ishlatadi, lekin har xil daraja:

  ┌──────────────────┬─────────────────────┬──────────────────────┐
  │                  │ PM2                 │ systemd (10.1: 2.6)  │
  ├──────────────────┼─────────────────────┼──────────────────────┤
  │ Daraja           │ ilova (Node) uchun  │ butun OS (har xizmat)│
  │ Cluster mode     │  ichida (bir buyruq)│ qo'lda 4 service     │
  │ Zero-downtime    │  pm2 reload        │ yo'q (restart=uzilish)│
  │ Log boshqaruvi   │  ichida (pm2 logs) │ journalctl           │
  │ Monitoring       │  pm2 monit         │ qo'shimcha kerak     │
  │ O'rnatish        │ npm (Node kerak)    │ OS bilan keladi      │
  │ Boot             │ pm2 startup+save    │ systemctl enable     │
  └──────────────────┴─────────────────────┴──────────────────────┘

  QACHON:
  - PM2      Node.js ilova (cluster, reload, log — eng qulay) 
  - systemd  tizim xizmati, Docker'siz universal, yoki PM2'ning O'ZINI boot qilish

   Ko'pincha BIRGA: systemd PM2 daemon'ni boot qiladi, PM2 ilovalarni boshqaradi

PM2 vs systemd — ikkalasi ham ilovani doimiy ishlatadi, lekin har xil darajada. systemd (10.1: 2.6) — butun OS darajasidagi init tizimi (har qanday xizmatni boshqaradi — universal, OS bilan keladi). PM2 — maxsus Node.js ilovalari uchun, ichida cluster mode, zero-downtime reload, log boshqaruvi va monitoring tayyor keladi (systemd'da bularni qo'lda qurish kerak). Qachon qaysi: Node.js ilova uchun PM2 ancha qulay (pm2 start bilan cluster, pm2 reload bilan uzilishsiz yangilash, pm2 logs bilan log); systemd esa tizim xizmatlari uchun yoki Docker konteynerlarsiz universal yechim sifatida. Eng yaxshi amaliyot — ikkalasini birga: systemd PM2 daemon'ni boot vaqtida yoqadi (pm2 startup aynan shu systemd service'ni yaratadi — 2.5), PM2 esa o'z ichida ilovalarni boshqaradi. Docker ishlatsangiz 10.3-bob — konteyner ichida ko'pincha process manager kerak emas (bitta jarayon = bitta konteyner falsafasi), lekin VPS'da to'g'ridan deploy qilsangiz — PM2 standart tanlov.

2.4. PM2 asosiy buyruqlari (start, list, logs, restart, reload)

text
  ISHGA TUSHIRISH:
  pm2 start app.js                ilovani ishga tushirish (daemon kuzatadi)
  pm2 start app.js --name api     nom berish (keyin shu nom bilan boshqarasan)
  pm2 start "npm run start"       npm skripti orqali
  pm2 start ecosystem.config.js   config faylidan (eng yaxshi — 2.6)

  KO'RISH / KUZATISH:
  pm2 list  (yoki pm2 ls)         barcha ilovalar (status, CPU, RAM, restart soni)
  pm2 logs                        barcha loglar (jonli)
  pm2 logs api                    faqat "api" ilova logi
  pm2 monit                       jonli dashboard (CPU/RAM real vaqtda)
  pm2 show api                    bitta ilova haqida batafsil

  BOSHQARISH:
  pm2 restart api                 QAYTA ishga tushirish (uziladi — qisqa downtime)
  pm2 reload api                  UZILISHSIZ qayta yuklash (cluster — 2.7)
  pm2 stop api                    to'xtatish (ro'yxatda qoladi)
  pm2 delete api                  PM2'dan butunlay o'chirish
  pm2 flush                       log fayllarini tozalash

   restart = uziladi (1 nusxa o'ladi-yonadi); reload = uzilishsiz (navbat bilan)

PM2 asosiy buyruqlari. Ishga tushirish: pm2 start app.js (eng oddiy — daemon kuzatadi), --name api bilan nom berish (keyin shu nom orqali boshqarasiz), pm2 start "npm run start" (npm skripti orqali), va eng yaxshisi pm2 start ecosystem.config.js (sozlama faylidan — 2.6). Ko'rish: pm2 list (barcha ilovalar — status, CPU, RAM, restart soni — ko'p restart = ilova beqaror), pm2 logs (jonli loglar), pm2 monit (real vaqtli dashboard), pm2 show <nom> (batafsil). Boshqarish: pm2 restart (qayta ishga tushiradi — jarayon o'ladi va qayta yonadi, qisqa uzilish bo'ladi), pm2 reload (cluster rejimida uzilishsiz — nusxalarni navbat bilan yangilaydi, 2.7), pm2 stop (to'xtatadi, ro'yxatda qoladi), pm2 delete (PM2'dan butunlay olib tashlaydi). Eng muhim farq: restart uziladi, reload uzilishsiz — production'da yangi versiya chiqarishda reload ishlatiladi 2.10-bob.

2.5. PM2 startup va save (server qayta yuklansa avtomatik yonish)

text
  MUAMMO: pm2 start qildim, lekin SERVER QAYTA YUKLANSA — hammasi o'chadi
  (PM2 daemon ham o'chadi  ilovalar ham). Buni qanday hal qilamiz?

  YECHIM — 2 BUYRUQ (tartib MUHIM):

  1) pm2 startup             systemd service GENERATSIYA qiladi (PM2 daemon boot'da yonsin)
      chiqishda "sudo env PATH=... pm2 startup systemd -u deploy --hp /home/deploy"
       degan buyruq beradi — uni COPY-PASTE qilib bajarasan (sudo kerak)

  2) (ilovalarni pm2 start bilan ishga tushir — kerakli hammasini)

  3) pm2 save                hozirgi ro'yxatni FAYLGA saqlaydi (~/.pm2/dump.pm2)
      boot'da PM2 daemon shu fayldan ilovalarni RESURRECT qiladi (tiklaydi)

  TEKSHIRISH (server qayta yuklab):
  sudo reboot                serverni qayta yukla
  pm2 list                   qaytib kirsang — ilovalar O'ZI ishlab turibdi 

  BEKOR QILISH:  pm2 unstartup systemd    boot service'ni o'chiradi
  QO'LDA TIKLASH: pm2 resurrect            saqlangan ro'yxatni qaytaradi

   startup QILMASANG, save QILMASANG — qayta yuklashda hammasi o'chadi (Xato 1)

PM2 startup va save — ilova server qayta yuklansa ham avtomatik yonishi uchun. Muammo: PM2 ilovani daemon orqali ushlab turadi, lekin server reboot bo'lsa — daemon ham o'chadi, demak ilovalar ham. Yechim ikki buyruq (tartibi muhim): (1) pm2 startup — joriy init tizimini (Ubuntu'da systemd) aniqlab, PM2 daemon'ni boot vaqtida yondiradigan systemd service generatsiya qiladi; buyruq chiqishida sudo env PATH=... pm2 startup systemd -u deploy --hp /home/deploy degan satrni beradi — uni copy-paste qilib bajarasiz (sudo huquqi kerak). (2) Kerakli ilovalarni pm2 start bilan ishga tushirgach, pm2 save — joriy jarayon ro'yxatini faylga (~/.pm2/dump.pm2) saqlaydi; boot vaqtida PM2 daemon shu fayldan ilovalarni resurrect (tiklash) qiladi. Bekor qilish — pm2 unstartup systemd; qo'lda tiklash — pm2 resurrect. Eng keng xato: startup/save qilishni unutib, server qayta yuklanganda hamma ilova o'chib qolishi (Xato 1).

2.6. ecosystem.config.js (deploy sozlamasi bitta faylda)

text
  ECOSYSTEM.CONFIG.JS — barcha PM2 sozlamalari BITTA faylda
  (har safar uzun "pm2 start ... --name ... -i ..." yozmaslik uchun):

  module.exports = {
    apps: [{
      name:   "api",                ilova nomi
      script: "dist/main.js",       kirish fayli (NestJS build natijasi)
      instances: "max",             nechta nusxa ("max" = hamma CPU yadro — 2.7)
      exec_mode: "cluster",         cluster rejimi (load balance — 2.7)
      max_memory_restart: "300M",   300MB'dan oshsa — qayta yoq (xotira oqishi himoyasi)
      autorestart: true,            yiqilsa qayta yoq (default — yoqilgan)
      env: {                        oddiy muhit o'zgaruvchilari
        NODE_ENV: "development"
      },
      env_production: {             --env production bilan ishlaydi 10.11-bob
        NODE_ENV: "production",
        PORT: 3000
      }
    }]
  }

  ISHGA TUSHIRISH:
  pm2 start ecosystem.config.js --env production    production env bilan
  pm2 reload ecosystem.config.js --env production   uzilishsiz yangilash

   Config faylni Git'ga qo'shasan (kod bilan birga); SECRET'larni EMAS (10.11)

ecosystem.config.js — barcha PM2 sozlamalarini bitta faylda jamlaydi. Har safar uzun pm2 start dist/main.js --name api -i max ... yozish o'rniga, sozlamalarni faylga yozasiz va pm2 start ecosystem.config.js deysiz. Asosiy maydonlar: name (ilova nomi), script (kirish fayli — NestJS uchun dist/main.js), instances (nechta nusxa — "max" yoki 0 hamma yadroni ishlatadi, 2.7), exec_mode: "cluster" (cluster rejimi — yukni nusxalarga taqsimlaydi, 2.7), max_memory_restart: "300M" (xotira oshsa avtomatik qayta yoqadi — memory leak'ga qarshi himoya), autorestart: true (yiqilsa qaytaradi — default yoqilgan), env va env_production (muhit o'zgaruvchilari — --env production bilan ikkinchisi qo'llanadi, 10.11). Bu faylni kod bilan birga Git'ga qo'shasiz (sozlama versiyalansin), lekin maxfiy ma'lumotlarni (parol, kalit) bu yerga yozma — ular .env faylda yoki secrets boshqaruvida bo'lishi kerak 10.11-bob.

2.7. Cluster mode (ko'p yadro, zero-downtime poydevori)

text
  MUAMMO: Node.js — single-threaded 5.1-bob. Bitta jarayon = FAQAT 1 CPU yadro.
  Serverda 4 yadro bo'lsa — 3 tasi BO'SH turadi (resurs isrof)!

  CLUSTER MODE — PM2 bir necha NUSXA ishga tushiradi (har yadroga bitta):

  ┌──────────────────────────────────────────┐
  │  PM2 (ichki load balancer — round-robin)  │
  └──────┬─────────┬─────────┬─────────┬──────┘
       ┌─▼─┐     ┌─▼─┐     ┌─▼─┐     ┌─▼─┐
       │#0 │     │#1 │     │#2 │     │#3 │    4 nusxa (4 yadro)
       └───┘     └───┘     └───┘     └───┘    bir XIL portni baham ko'radi
       (Node "cluster" moduli — kernel so'rovni taqsimlaydi)

  ISHGA TUSHIRISH:
  pm2 start app.js -i max         max = hamma yadro (yoki -i 4 — aniq son)
  pm2 start app.js -i -1          (hamma yadro minus 1 — bittasini OS'ga qoldir)

  IKKI FOYDA:
  1) MASSHTAB — 4 yadro = ~4x ko'p so'rov ko'taradi (vertikal)
  2) ZERO-DOWNTIME — pm2 reload nusxalarni NAVBAT bilan yangilaydi (2.10)

   Cluster mode'da ilova STATELESS bo'lsin 9.9-bob: session Redis'da, local fayl emas

Cluster mode — PM2'ning eng kuchli imkoniyatlaridan biri. Muammo: Node.js single-threaded 5.1-bob — bitta jarayon faqat bitta CPU yadroni ishlatadi. Serverda 4 yadro bo'lsa, oddiy node app.js ularning 3 tasini bo'sh qoldiradi (resurs isrofi). Cluster mode PM2'ga ilovaning bir necha nusxasini (odatda har yadroga bittadan) ishga tushirishni aytadi — pm2 start app.js -i max (yoki -i 4 aniq son, yoki -i -1 — bitta yadroni OS'ga qoldirib). Nusxalar Node'ning cluster moduli orqali bir xil portni baham ko'radi, operatsion tizim yadrosi kiruvchi so'rovlarni nusxalar orasida taqsimlaydi (ichki load balancer — round-robin, 10.2: 2.5). Ikki foyda: (1) masshtab — 4 yadro taxminan 4 barobar ko'p so'rov ko'taradi; (2) zero-downtimepm2 reload nusxalarni navbat bilan yangilaydi (biri yangilanayotganda qolganlari ishlaydi — uzilish yo'q, 2.10). Muhim shart: cluster mode'da ilova stateless bo'lishi kerak 9.9-bob — session/holatni xotirada emas, Redis'da saqlash lozim 5.21-bob, aks holda har nusxa boshqa holatni ko'radi.

2.8. Domen va DNS (manzilni IP'ga ulash)

text
  MUAMMO: server IP = 203.0.113.5 (raqam — eslab bo'lmaydi, ishonchsiz)
  YECHIM: DOMEN (saytim.uz) — yodda qoladigan nom, IP'ga ulanadi

  DOMEN QAYERDAN: REGISTRAR'dan sotib olasan (Namecheap, GoDaddy, ahost.uz...)
   yiliga ~$10-15 (.uz, .com); ijaraga olasan (egalik emas)

  DNS (Domain Name System) — internetning "telefon kitobi":
  "saytim.uz"  qaysi IP? degan savolga JAVOB beradi

  BRAUZER DOMEN'NI QANDAY TOPADI:
  ┌─────────┐  "saytim.uz?"  ┌──────────┐  "203.0.113.5"  ┌────────┐
  │ Brauzer │ ───────────── │   DNS    │ ────────────── │ Server │
  └─────────┘                └──────────┘                 └────────┘

  DNS RECORD TURLARI (registrar panelida qo'shasan):
  A     saytim.uz       203.0.113.5      domen  IPv4 (ENG ASOSIY)
  A     www             203.0.113.5      www subdomeni  IP
  CNAME blog            saytim.uz        ALIAS (boshqa domenga ishora)
  AAAA  saytim.uz       2001:db8::1       IPv6 (ixtiyoriy)

   A record — domenni TO'G'RIDAN IP'ga ulaydi (asosiy);
     CNAME — bitta domenni BOSHQA domenga (subdomen/3-tomon xizmat uchun)

Domen va DNS — foydalanuvchi raqamli IP (203.0.113.5) emas, yodda qoladigan nom (saytim.uz) yozadi. Domenregistrardan (Namecheap, GoDaddy, mahalliy ahost.uz, uzinfocom.uz uchun) ijaraga olinadigan nom (yiliga ~$10-15; egalik emas — ijara). DNS (Domain Name System) — internetning "telefon kitobi": "saytim.uz qaysi IP?" degan savolga javob beradi. Brauzer domen'ga kirganda, avval DNS'dan IP'ni so'raydi, keyin o'sha IP'ga (serverga) ulanadi. Domenni serverga ulash uchun registrar (yoki DNS provayder — masalan Cloudflare) panelida DNS record qo'shasiz. Asosiy turlari: A — domenni to'g'ridan IPv4'ga ulaydi (eng asosiy: saytim.uz 203.0.113.5); CNAME — bir domenni boshqa domenga ulaydigan alias (blog.saytim.uz saytim.uz yoki 3-tomon xizmatga); AAAA — IPv6 uchun (ixtiyoriy); MX (pochta), TXT (tekshiruv — masalan SSL/domen egaligi). Yodda saqlash: A record domenni IP'ga (asosiy), CNAME domenni boshqa domenga ulaydi.

2.9. DNS propagation va TTL (o'zgarish nega darrov ko'rinmaydi)

text
  PROPAGATION — DNS o'zgarishi BUTUN dunyoga tarqalish vaqti:

  DNS record o'zgartirdim  lekin sayt hali ESKI IP'ga boryapti. Nega?
   DNS javoblari KESH (cache) qilinadi (har so'rovda qidirilmasin — tez bo'lsin)

  TTL (Time To Live) — kesh QANCHA vaqt saqlanishi (sekundlarda):
  TTL 3600   1 soat kesh (o'zgarish ~1 soatdan keyin ko'rinadi)
  TTL 300    5 daqiqa kesh (tez yangilanadi — migratsiya oldidan qo'yiladi)

  AMALIY MASLAHAT (IP o'zgartirishdan oldin):
  1) O'zgartirishdan 24-48 soat OLDIN TTL'ni 300'ga tushir
  2) IP'ni o'zgartir  ~5 daqiqada tarqaladi (eski kesh tugaydi)
  3) Barqarorlashgach TTL'ni qaytar (3600)

  TEKSHIRISH (domen qaysi IP'ga ketyapti):
  dig saytim.uz +short           A record javobini ko'rsatadi
  nslookup saytim.uz             (muqobil) domen  IP
  whatsmydns.net                 dunyo bo'ylab propagation xaritasi

   "Sayt ochilmayapti" — ko'pincha DNS hali TARQALMAGAN (sabr/TTL — Xato 3)

DNS propagation va TTL — DNS record o'zgartirilgach, o'zgarish darrov hamma joyga yetib bormaydi. Sababi: DNS javoblari tezlik uchun keshlanadi (cache) — har so'rovda qaytadan qidirilmasin. TTL (Time To Live) — javob qancha vaqt keshda saqlanishini sekundlarda belgilaydi: TTL 3600 1 soat (o'zgarish 1 soatdan keyin ko'rinadi), TTL 300 5 daqiqa (tez yangilanadi). Propagation — o'zgarishning butun dunyo DNS serverlariga tarqalish jarayoni (eski keshlar tugaguncha). Amaliy maslahat (IP migratsiyasidan oldin): o'zgartirishdan 24-48 soat oldin TTL'ni 300'ga tushiring, keyin IP'ni o'zgartiring (5 daqiqada tarqaladi), barqarorlashgach TTL'ni 3600'ga qaytaring. Tekshirish: dig saytim.uz +short (A record javobi), nslookup saytim.uz, yoki whatsmydns.net (dunyo bo'ylab propagation xaritasi). "Sayt ochilmayapti / SSL olinmayapti" muammosining keng sababi — DNS hali tarqalmagan (yangi A record qo'shilgan, lekin Let's Encrypt eski/yo'q IP'ni ko'ryapti — sabr yoki TTL pasaytirish, Xato 3).

2.10. HTTPS, SSL/TLS va sertifikat (nega va qanday)

text
  HTTP (oddiy) — ma'lumot OCHIQ ketadi (o'rtadagi har kim o'qiy oladi):
  Brauzer ──"parol: 1234"── [Wi-Fi/provayder o'qiydi] ── Server    XAVF

  HTTPS = HTTP + SSL/TLS — ma'lumot SHIFRLANADI:
  Brauzer ──"x8#k2@..."── [hech kim o'qiy olmaydi] ── Server       XAVFSIZ

  HTTPS IKKI narsani beradi:
  1) SHIFRLASH (encryption) — yo'lda o'qib bo'lmaydi (parol/karta himoya)
  2) ISHONCH (authentication) — "bu HAQIQATAN saytim.uz" (soxta emas)

  SSL SERTIFIKAT — saytning "raqamli pasporti":
  - sayt domeni (saytim.uz) uchun berilgan
  - CA (Certificate Authority — ishonchli idora) IMZOLAGAN
  - brauzer CA imzosini tekshiradi  qulf belgisi 

  CA (Certificate Authority) — sertifikat beruvchi ishonchli idora:
  - eski: pullik (yiliga $50-200)
  - LET'S ENCRYPT — BEPUL, avtomatik, ochiq (2026 standarti) 

  TLS — SSL'ning zamonaviy nomi (TLS 1.2/1.3 — "SSL" so'zi qoldi, lekin TLS ishlaydi)

   HTTPS'siz: brauzer "Not secure" deydi, SEO tushadi, parol ochiq (majburiy)

HTTPS, SSL/TLS va sertifikat — bog'lanishni xavfsiz qiladi. HTTP (oddiy) da ma'lumot ochiq uzatiladi — o'rtadagi har kim (Wi-Fi, provayder, hacker) parol/kartani o'qiy oladi. HTTPS = HTTP + SSL/TLS shifrlash — ma'lumot shifrlanadi, yo'lda o'qib bo'lmaydi. HTTPS ikki narsa beradi: (1) shifrlash (encryption — parol/karta himoyalanadi) va (2) ishonch (authentication — "bu haqiqatan saytim.uz, soxta emas"). Buni SSL sertifikat ta'minlaydi — saytning "raqamli pasporti": domen uchun berilgan, CA (Certificate Authority — ishonchli sertifikat beruvchi idora) tomonidan imzolangan; brauzer CA imzosini tekshiradi va qulf belgisini () ko'rsatadi. CA'lar avval pullik edi (yiliga $50-200), lekin Let's Encryptbepul, avtomatik, ochiq CA (2026 standarti). TLS — SSL'ning zamonaviy nomi (amalda TLS 1.2/1.3 ishlaydi, "SSL" so'zi odat bo'lib qolgan). HTTPS'siz: brauzer "Not secure" ogohlantiradi, qidiruv reytingi (SEO) tushadi, parol ochiq ketadi — production'da majburiy.

2.11. Certbot va Let's Encrypt (avtomatik bepul sertifikat)

text
  CERTBOT — Let's Encrypt sertifikatini AVTOMATIK oluvchi vosita (EFF):

  O'RNATISH:  sudo apt install certbot python3-certbot-nginx

  SERTIFIKAT OLISH (--nginx plugin — eng oson):
  sudo certbot --nginx -d saytim.uz -d www.saytim.uz
   1) domen egaligini TEKSHIRADI (ACME challenge — domen senikimi?)
    2) sertifikat OLADI (/etc/letsencrypt/live/saytim.uz/)
    3) Nginx config'ini AVTOMATIK o'zgartiradi (443 ssl + 80443 redirect)
    4) Nginx'ni reload qiladi

  SERTIFIKAT MUDDATI — 90 KUN (qisqa — xavfsizlik uchun ataylab)
   lekin AUTO-RENEW bilan o'zi yangilanadi:

  AUTO-RENEW (avtomatik yangilash):
  - Certbot O'RNATGANDA systemd timer (certbot.timer) qo'shadi
  - kuniga 2 marta tekshiradi  30 kun qolganda yangilaydi
  - yangilangach Nginx'ni AVTOMATIK reload qiladi

  TEKSHIRISH:
  sudo certbot renew --dry-run         yangilashni SINAB ko'r (haqiqiy emas)
  sudo systemctl status certbot.timer  auto-renew timer ishlayaptimi
  sudo certbot certificates            sertifikatlar va muddati

   Faqat OLIB qo'yib unutmaysan — yangilashni TEKSHIR (timer ishlasin — Xato 6)

Certbot — Let's Encrypt sertifikatini avtomatik oluvchi va o'rnatuvchi rasmiy vosita (EFF — Electronic Frontier Foundation). O'rnatish: sudo apt install certbot python3-certbot-nginx (Nginx plugin bilan). Sertifikat olishning eng oson yo'li — sudo certbot --nginx -d saytim.uz -d www.saytim.uz: Certbot (1) domen egaligini tekshiradi (ACME challenge — "bu domen senikimi?" — domen sizga ulanganligini tasdiqlaydi, shuning uchun DNS oldindan to'g'ri bo'lishi shart, 2.9), (2) sertifikatni oladi (/etc/letsencrypt/live/saytim.uz/), (3) Nginx config'ini avtomatik o'zgartiradi (443 ssl blok qo'shadi + 80443 redirect — qo'lda yozish kerak emas, 10.2: 2.4), (4) Nginx'ni reload qiladi. Sertifikat muddati — 90 kun (xavfsizlik uchun ataylab qisqa), lekin auto-renew bilan o'zi yangilanadi: Certbot o'rnatilganda systemd timer (certbot.timer) qo'shadi, u kuniga 2 marta tekshiradi va 30 kun qolganda yangilaydi (so'ng Nginx'ni avtomatik reload qiladi). Sertifikatni olib qo'yib unutmaslik kerak — sudo certbot renew --dry-run bilan yangilashni sinab ko'ring va sudo systemctl status certbot.timer bilan timer ishlayotganini tekshiring (aks holda 90 kundan keyin sertifikat eskirib, sayt yiqiladi — Xato 6).

2.12. Deploy strategiyalari (recreate, rolling, blue-green, canary)

text
  ESKI VERSIYANI YANGISIGA almashtirish usullari (har biri har xil downtime/xavf):

  1) RECREATE (qayta yaratish — eng oddiy):
     [v1 o'chir]  [v2 yoq]     oraliqda DOWNTIME bor (sayt o'lik)
      oddiy, arzon    uzilish bor    kichik loyiha, tungi deploy

  2) ROLLING (bittalab — uzilishsiz):
     [v1 v1 v1 v1]  [v2 v1 v1 v1]  [v2 v2 v1 v1]  ...  [v2 v2 v2 v2]
      uzilishsiz, qo'shimcha server kam    oraliqda 2 versiya BIRGA ishlaydi
      PM2 reload AYNAN shu (cluster nusxalarini bittalab — 2.7, 2.13)

  3) BLUE-GREEN (ikki bir xil muhit):
     BLUE (v1, jonli) + GREEN (v2, tayyorlanyapti)  tayyor bo'lsa TRAFIKNI almashtir
      darrov o'tish, oson ROLLBACK (orqaga qaytar)    2x resurs (2 muhit)
      muhim loyiha, tez rollback kerak bo'lsa

  4) CANARY (kichik qism — "ko'mir konidagi kanareyka"):
     v2'ni AVVAL 5% foydalanuvchiga  kuzat (xato yo'qmi?)  25%  50%  100%
      xavf MINIMAL (xato bo'lsa — 5% ko'radi)    murakkab (trafik bo'lish kerak)
      katta loyiha, yangi/xavfli o'zgarish

   VPS + PM2 uchun amaliy: ROLLING (pm2 reload — uzilishsiz, qo'shimcha server kerak emas)

Deploy strategiyalari — eski versiyani yangisiga almashtirish usullari, har biri har xil downtime va xavf darajasiga ega. (1) Recreate — eng oddiy: eski versiyani o'chirib, yangisini yoqasiz; oraliqda downtime bor (sayt qisqa muddat o'lik); arzon va sodda, lekin uzilishli — kichik loyiha yoki tungi deploy uchun. (2) Rolling (bittalab) — nusxalarni navbat bilan yangilaysiz ([v2 v1 v1 v1] [v2 v2 v1 v1] ...); uzilishsiz, qo'shimcha resurs kam, lekin oraliqda ikki versiya birga ishlaydi (DB migratsiyasi mos bo'lishi kerak); PM2 reload aynan shu strategiya (cluster nusxalarini bittalab yangilaydi, 2.7, 2.13). (3) Blue-greenikki bir xil muhit: BLUE (v1, jonli) ishlab turadi, GREEN (v2) tayyorlanadi; tayyor bo'lgach trafik darrov GREEN'ga o'tkaziladi; tez rollback (xato bo'lsa — qaytib BLUE'ga), lekin 2 barobar resurs kerak. (4) Canary ("ko'mir konidagi kanareyka") — yangi versiyani avval kichik qismga (5% foydalanuvchi) chiqarib, kuzatasiz (xato yo'qmi?), so'ng 25% 50% 100%; xavf minimal (xato bo'lsa faqat 5% ko'radi), lekin trafikni bo'lish murakkab — katta yoki xavfli o'zgarishlar uchun. VPS + PM2 uchun amaliy tanlov — rolling (pm2 reload — uzilishsiz, qo'shimcha server shart emas, 2.13).

2.13. Zero-downtime deploy va graceful shutdown

text
  ZERO-DOWNTIME — yangi versiya chiqarishda sayt YIQILMAYDI (uzilish 0 sek):

  PM2 RELOAD (cluster mode'da — rolling):
  pm2 reload api
   nusxalarni BITTALAB yangilaydi: #0'ga SIGINT yubor  o'chguncha kut 
    yangi #0 yoq  tayyor bo'lsa  keyin #1 ... (qolganlari ISHLAB turadi)
   foydalanuvchi UZILISH sezmaydi

  GRACEFUL SHUTDOWN — jarayon o'chishdan oldin ishni TUGATADI (muloyim o'chish):
  - PM2 to'xtatishda avval SIGINT yuboradi (kill_timeout=1600ms kutadi)
  - ilova buni TUTIB: yangi so'rov qabul qilmaydi, joriylarni TUGATADI, DB yopadi
  - keyin process.exit(0)  toza chiqadi (so'rov o'rtada uzilmaydi)

  // ilovada (NestJS/Express):
  process.on('SIGINT', async () => {
    await server.close();      // yangi ulanishni to'xtat, joriyni tugat
    await db.disconnect();     // DB ulanishni yop
    process.exit(0);           // toza chiqish
  });

  WAIT_READY — yangi nusxa TAYYOR bo'lguncha eskisini o'chirmaslik:
  // ecosystem: wait_ready: true, listen_timeout: 3000
  process.send('ready');       // server tinglashni boshlagach — PM2'ga signal

   Graceful shutdown'siz reload — o'rtadagi so'rovlar UZILADI (xato/yo'qotish)

Zero-downtime deploy — yangi versiya chiqarishda sayt yiqilmaydi (uzilish 0 sekund). pm2 reload cluster mode'da buni rolling tarzda qiladi: nusxalarni bittalab yangilaydi — #0'ga SIGINT yuboradi, o'chguncha kutadi, yangi #0 ni yoqadi, tayyor bo'lgach #1'ga o'tadi; qolgan nusxalar shu vaqtda ishlab turadi, foydalanuvchi uzilish sezmaydi. Buning to'g'ri ishlashi uchun ikki narsa muhim. Graceful shutdown (muloyim o'chish) — jarayon to'xtashdan oldin ishini tugatadi: PM2 SIGINT yuboradi (kill_timeout — default 1600ms kutadi), ilova buni tutib yangi so'rov qabul qilishni to'xtatadi, joriy so'rovlarni tugatadi, DB ulanishini yopadi, keyin process.exit(0) qiladi (so'rov o'rtada uzilmaydi). wait_ready — yangi nusxa tayyor bo'lgunicha eskisini o'chirmaslik: ecosystem'da wait_ready: true qo'yasiz, ilova HTTP server tinglashni boshlagach process.send('ready') yuboradi — shu signaldan keyingina PM2 eskisini o'chiradi (listen_timeout — default 3000ms ichida kutadi). Graceful shutdown'siz reload — o'rtadagi so'rovlar uzilib, foydalanuvchi xato yoki ma'lumot yo'qotishi mumkin.

2.14. Backup va rollback (xato deploy'dan qaytish)

text
  ROLLBACK — yangi versiya XATO chiqsa — TEZ eski versiyaga qaytish:

  DEPLOY (git asosida) — har versiya commit'da:
  cd /home/deploy/app
  git pull                   yangi kod
  npm ci && npm run build    build
  pm2 reload api             uzilishsiz yangilash

  ROLLBACK (xato bo'lsa — oldingi commit'ga):
  git reset --hard HEAD~1    bitta orqaga (yoki aniq commit hash)
  npm ci && npm run build
  pm2 reload api             eski versiya qaytdi

  YOKI BLUE-GREEN: trafikni shunchaki eski muhitga qaytar (sekundlar — 2.12)

  BACKUP (zaxira) — nimani saqlash kerak:
  - DATABASE — eng muhim (har kuni avtomatik dump: pg_dump/mongodump  S3 — 10.6)
  - .env / secrets — xavfsiz joyda 10.11-bob
  - foydalanuvchi yuklamalari (/uploads — agar lokal bo'lsa)
  - kod — Git'da allaqachon bor (versiyalangan)

   DB MIGRATSIYASI ortga qaytmaydi — migratsiyalarni EHTIYOT bilan (5.x), backup AVVAL

Backup va rollback — xato deploy'dan tez qaytish va ma'lumotni yo'qotmaslik. Rollback (orqaga qaytish) — yangi versiya xato chiqsa, eski versiyaga tez qaytish. Git asosidagi deploy'da har versiya commit'da bo'ladi, shuning uchun rollback oson: git reset --hard HEAD~1 (bitta commit orqaga yoki aniq hash'ga), keyin npm ci && npm run build && pm2 reload api — eski versiya qaytadi. Blue-green'da 2.12-bob yanada tez: trafikni shunchaki eski muhitga qaytarasiz (sekundlar). Backup (zaxira) — nimani saqlash kerak: eng muhimi database (har kuni avtomatik dump — pg_dump/mongodump bulutga, masalan S3, 10.6); .env/secrets (xavfsiz joyda, 10.11); foydalanuvchi yuklamalari (/uploads, agar lokal saqlansa); kod esa Git'da allaqachon versiyalangan. Eng nozik nuqta: DB migratsiyasi ortga oson qaytmaydi (ustun o'chirilgan bo'lsa, ma'lumot ketadi) — migratsiyalarni ehtiyot bilan yozing va deploy'dan avval DB backup oling.

2.15. PM2 log boshqaruvi va rotation (pm2-logrotate)

text
  MUAMMO: PM2 loglarni faylga yozadi (~/.pm2/logs/api-out.log, api-error.log),
  lekin ular CHEKSIZ o'sadi  diskni to'ldiradi (bir necha oyda GB'lar)!

  YECHIM: pm2-logrotate — loglarni AVTOMATIK bo'lib, eskilarni o'chiradi:

  pm2 install pm2-logrotate             PM2 moduli sifatida o'rnatiladi

  SOZLASH (asosiy parametrlar):
  pm2 set pm2-logrotate:max_size 10M        fayl 10MB'ga yetsa — yangisiga o'tadi
  pm2 set pm2-logrotate:retain 7            faqat 7 eski fayl saqlanadi (qolgani o'chadi)
  pm2 set pm2-logrotate:compress true       eski loglarni gzip qiladi (joy tejaydi)
  pm2 set pm2-logrotate:rotateInterval '0 0 * * *'   har kecha (cron format)

  KO'RISH / TOZALASH:
  pm2 logs api --lines 100      oxirgi 100 satr
  pm2 flush                     barcha log fayllarni bo'shatadi
  pm2 reloadLogs                log fayllarni qayta ochadi (rotation qo'lda)

   Markazlashtirilgan log kerak bo'lsa — loglarni ELK/Loki/CloudWatch'ga yubor (10.9)

PM2 log boshqaruvi — PM2 har ilovaning stdout va stderr'ini alohida fayllarga yozadi (~/.pm2/logs/<nom>-out.log va -error.log). Muammo: bu fayllar cheksiz o'sadi va oylar davomida diskni to'ldiradi. Yechim — pm2-logrotate moduli (pm2 install pm2-logrotate): loglarni belgilangan hajmda (max_size) yoki vaqtda (rotateInterval — cron formati) avtomatik bo'ladi, eskilarini retain sonidan ortiqchasini o'chiradi va compress bilan gzip qiladi. Sozlamalar pm2 set pm2-logrotate:<kalit> <qiymat> orqali beriladi. Kundalik ish: pm2 logs <nom> (jonli), pm2 logs --lines N (oxirgi N satr), pm2 flush (tozalash). Bitta serverda log rotation yetarli; bir necha server yoki jiddiy tahlil kerak bo'lsa — loglarni markazlashtirilgan tizimga (ELK, Grafana Loki, CloudWatch) yuboriladi 10.9-bob.

2.16. PM2 watch, environment va boshqa muqobillar (forever)

text
  WATCH — fayl o'zgarganda ilovani AVTOMATIK qayta yoqadi (FAQAT development):
  pm2 start app.js --watch           kod o'zgarsa — restart (dev qulay)
  #  PRODUCTION'da watch YOQMA — deploy o'rtasida yarim yangilangan holat xavfli

  ENVIRONMENT (muhit o'zgaruvchilari):
  pm2 start app.js --env production         ecosystem env_production ni qo'llaydi
  pm2 restart app --update-env              yangi env o'zgaruvchilarni qayta o'qiydi
  # .env fayl — dotenv orqali ilova ichida o'qiladi (secret bu yerda, Git'da EMAS — 10.11)

  MUQOBIL PROCESS MANAGER'lar:
  ┌───────────┬──────────────────────────────────────────────┐
  │ systemd   │ OS darajasi, universal 2.3-bob — PM2 daemon'ni boot qiladi │
  │ forever   │ eski, oddiy (faqat auto-restart) — cluster/monit YO'Q     │
  │ nodemon   │ FAQAT development (watch+restart) — production EMAS       │
  │ Docker    │ konteyner: restart policy (always) process manager o'rnini bosadi 10.3-bob │
  └───────────┴──────────────────────────────────────────────┘

   2026'da Node production standarti: PM2 (VPS) yoki Docker+orkestratsiya (klaster)

PM2 watch, env va muqobillar--watch fayl o'zgarishini kuzatib ilovani avtomatik qayta yoqadi, lekin bu faqat development uchun (production'da yoqilsa, deploy paytida yarim yozilgan fayl beqaror restart'larni keltirib chiqaradi — o'chirib qo'yish lozim). Environment: --env production ecosystem'dagi env_production blokini qo'llaydi; env o'zgargach pm2 restart <nom> --update-env bilan qayta o'qitiladi; maxfiy qiymatlar .env faylda (dotenv orqali) bo'lib, Git'ga kirmaydi 10.11-bob. Muqobil process manager'lar: systemd (OS darajasi, universal — 2.3), forever (eski va oddiy — faqat auto-restart, cluster va monitoring yo'q, shuning uchun PM2 uni deyarli butunlay siqib chiqargan), nodemon (faqat development), Docker (konteyner restart: always siyosati process manager o'rnini bosadi — 10.3). 2026 amaliyoti: VPS'da to'g'ridan deploy uchun PM2, klaster miqyosida esa Docker + orkestratsiya (10.8 Kubernetes).

2.17. Health check endpoint (ilova tirikligini tekshirish)

text
  HEALTH CHECK — ilova "SOG'lomligini" bildiradigan maxsus endpoint (/health):
   monitoring, load balancer, orkestrator (K8s) SHU manzilni so'rab turadi

  // ilovada (NestJS/Express) — oddiy tiriklik (liveness):
  app.get('/health', (req, res) => res.status(200).json({ status: 'ok' }));

  // to'liqroq (readiness) — bog'liq xizmatlarni ham tekshiradi:
  app.get('/health', async (req, res) => {
    const db = await checkDb();          // DB ulanish tirikmi?
    const redis = await checkRedis();    // Redis tirikmi?
    const ok = db && redis;
    res.status(ok ? 200 : 503).json({ db, redis });  // 503 = sog'lom emas
  });

  IKKI TUR:
  - LIVENESS  — jarayon tirikmi? (yo'q  qayta yoq)
  - READINESS — so'rov qabul qilishga tayyormi? (DB/Redis ulanganmi?)

  KIM ISHLATADI:
  - PM2 — yiqilgan jarayonni ko'radi (health endpoint shart emas, lekin foydali)
  - Nginx/LB — sog'lom bo'lmagan nusxaga trafik yubormaydi
  - Uptime monitor (UptimeRobot) — /health'ni tekshirib, o'chsa OGOHLANTIRADI
  - K8s 10.8-bob — livenessProbe/readinessProbe SHU endpoint'ni so'raydi

   Health check DB parol/ichki ma'lumot QAYTARMASIN (ochiq endpoint — xavfsizlik)

Health check endpoint — ilova sog'ligini bildiradigan maxsus HTTP manzil (odatda /health yoki /healthz), tashqi tizimlar shuni so'rab ilova tirikligini biladi. Ikki turi bor: liveness (jarayon umuman tirikmi — javob bermasa qayta yoqiladi) va readiness (so'rov qabul qilishga tayyormi — masalan DB va Redis ulanganmi; tayyor bo'lmasa 503 qaytaradi). Uni kim ishlatadi: uptime monitor (UptimeRobot, BetterStack — /health o'chsa ogohlantiradi), Nginx/load balancer (sog'lom bo'lmagan nusxaga trafik yubormaydi), Kubernetes (livenessProbe/readinessProbe shu endpoint'ni tekshiradi — 10.8), hattoki deploy skripti (reload'dan keyin /health 200 qaytarishini kutib, so'ng eski versiyani o'chiradi). Xavfsizlik: health javobi maxfiy ma'lumot (DB parol, ichki IP) qaytarmasligi kerak — ko'pincha ochiq endpoint.

2.18. SSL chuqurroq: HSTS, wildcard va sifat tekshiruvi

text
  HTTPS majburlash TO'LIQ (uch qatlam):
  1) Nginx: 80  443 redirect (Certbot avtomatik qo'shadi — 2.11)
  2) HSTS header — brauzerga "bu saytga DOIM https bilan kir" deydi:
     add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
      brauzer 1 yil davomida http'ni ham o'zi https'ga aylantiradi (redirect ham kutmaydi)
  3) (ilg'or) HSTS preload — brauzerga BUILTIN ro'yxatga qo'shish (hstspreload.org)

  WILDCARD SERTIFIKAT (*.saytim.uz — barcha subdomen bitta sertifikatda):
   --nginx plugin YETMAYDI; DNS-01 challenge kerak (TXT record bilan tasdiq):
  sudo certbot certonly --manual --preferred-challenges dns \
       -d saytim.uz -d "*.saytim.uz"
   Certbot "_acme-challenge TXT record qo'sh" deydi  DNS'da qo'shasiz  tasdiqlaydi
  # DNS provayder API bo'lsa (Cloudflare) — plugin bilan AVTOMATIK bo'ladi

  SIFAT TEKSHIRUVI:
  - ssllabs.com/ssltest — SSL Labs: sertifikat, protokol, shifr (A+ maqsad)
  - eskirgan TLS 1.0/1.1 o'chirilgan, TLS 1.2/1.3 yoqilgan bo'lsin (2.10)

   HSTS'ni faqat HTTPS to'liq ishlaganda yoq — noto'g'ri qo'yilsa sayt kirib bo'lmay qoladi

SSL chuqurroq — HTTPS'ni to'liq majburlash uch qatlamdan iborat: (1) Nginx'da 80443 redirect (Certbot avtomatik qo'shadi, 2.11); (2) HSTS (HTTP Strict Transport Security) header — Strict-Transport-Security: max-age=31536000; includeSubDomains — brauzerga "bu domenga doim HTTPS bilan kir" deb aytadi, shundan keyin brauzer http:// so'rovni serverga bormasdan o'zi https://ga aylantiradi (redirectni ham kutmaydi, downgrade hujumidan himoya); (3) ilg'or holda HSTS preload — domenni brauzerlarga o'rnatilgan ro'yxatga qo'shish (hstspreload.org). Wildcard sertifikat (*.saytim.uz — barcha subdomen bitta sertifikatda) uchun --nginx HTTP challenge yetmaydi, DNS-01 challenge kerak: certbot certonly --manual --preferred-challenges dns -d saytim.uz -d "*.saytim.uz" — Certbot _acme-challenge uchun TXT record qo'shishni so'raydi (DNS provayder API bo'lsa, masalan Cloudflare plugin, bu avtomatlashadi). Sifatni tekshirish: SSL Labs (ssllabs.com/ssltest) sertifikat, protokol va shifrlarni baholaydi (maqsad — A+); eski TLS 1.0/1.1 o'chirilib, TLS 1.2/1.3 yoqilgan bo'lishi kerak. HSTS'ni faqat HTTPS to'liq va barqaror ishlaganda yoqing — aks holda max-age muddati tugaguncha sayt ochilmay qolishi mumkin.

2.19. PaaS muqobili (Railway, Render, Fly.io, Vercel — qachon VPS o'rniga)

text
  PaaS (Platform as a Service) — server BOSHQARMAYSIZ: git push  o'zi deploy:
   PM2/Nginx/SSL/DNS'ni PLATFORMA hal qiladi (siz faqat kod yozasiz)

  ┌──────────┬────────────────────────────────────────────────────┐
  │ Railway  │ git push  o'zi build+deploy; DB qo'shish oson; SSL avtomatik │
  │ Render   │ web service + cron + DB; bepul reja bor; auto SSL          │
  │ Fly.io   │ konteyner (Docker) global, foydalanuvchiga yaqin region    │
  │ Heroku   │ klassik PaaS (endi pullik); "12-factor" namunasi           │
  │ Vercel   │ frontend/serverless (Next.js) — doim ishlaydigan Node uchun EMAS │
  └──────────┴────────────────────────────────────────────────────┘

  PaaS vs VPS:
  PaaS   tez, oson, SSL/deploy avtomatik   qimmatroq (o'sganda), kam nazorat
  VPS    arzon, to'liq nazorat (PM2/Nginx)  o'zing sozlaysan (bu bob)

   Boshlovchi/MVP  PaaS (tez chiqar); o'sgan/nazorat kerak  VPS + PM2 (bu bob)

PaaS muqobiliPaaS (Platform as a Service) da serverni o'zingiz boshqarmaysiz: kodni git push qilasiz, platforma build, deploy, process manager, Nginx, SSL va DNS'ni o'zi hal qiladi (bu bobdagi qo'lda ishlarning ko'pi avtomatlashadi). Asosiy platformalar: Railway (git push avtomatik build/deploy, DB bir tugmada, SSL avtomatik), Render (web service + cron job + boshqariladigan DB, bepul reja bor), Fly.io (Docker konteynerni foydalanuvchiga yaqin regionlarda global joylashtiradi), Heroku (klassik PaaS, "12-factor app" namunasi, endi pullik), Vercel (frontend va serverless — Next.js uchun ideal, lekin doimiy ishlaydigan Node backend uchun mos emas). PaaS vs VPS: PaaS tez, oson va SSL/deploy avtomatik, lekin trafik o'sganda qimmatroq va nazorat kam; VPS (bu bob) arzon va to'liq nazoratli (PM2/Nginx qo'lda), lekin hammasini o'zingiz sozlaysiz. Amaliy tavsiya: boshlovchi yoki MVP tez chiqarish uchun PaaS, loyiha o'sib narx/nazorat muhim bo'lganda VPS + PM2 (bu bobda o'rgangan yo'l).


3. Sintaksis — tez ma'lumotnoma

text
PM2 START 2.4-bob:  pm2 start app.js --name api | pm2 start ecosystem.config.js --env production
PM2 CLUSTER 2.7-bob:pm2 start app.js -i max      hamma yadro (yoki -i 4 / -i -1)
PM2 KO'RISH 2.4-bob:pm2 list | pm2 logs api | pm2 monit | pm2 show api
PM2 BOSHQARISH:   pm2 restart api | pm2 reload api (uzilishsiz) | pm2 stop | pm2 delete
PM2 BOOT 2.5-bob:   pm2 startup  (sudo ...)  pm2 save | pm2 resurrect | pm2 unstartup
DNS (2.8-9):      A saytim.uz203.0.113.5 | CNAME wwwsaytim.uz | dig saytim.uz +short
CERTBOT 2.11-bob:   sudo certbot --nginx -d saytim.uz -d www.saytim.uz
CERTBOT RENEW:    sudo certbot renew --dry-run | sudo systemctl status certbot.timer
CERTBOT KO'RISH:  sudo certbot certificates    sertifikatlar va muddati
NGINX SSL 10.2-bob: listen 443 ssl; ssl_certificate /etc/letsencrypt/live/.../fullchain.pem;
HSTS 2.18-bob:      add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
WILDCARD 2.18-bob:  sudo certbot certonly --manual --preferred-challenges dns -d "*.saytim.uz"
LOGROTATE 2.15-bob: pm2 install pm2-logrotate | pm2 set pm2-logrotate:max_size 10M
LOG 2.15-bob:       pm2 logs api --lines 100 | pm2 flush | pm2 reloadLogs
HEALTH 2.17-bob:    GET /health  200 {status:'ok'} (liveness/readiness)
ZERO-DT 2.13-bob:   pm2 reload + graceful shutdown (SIGINT) + wait_ready

4. Batafsil kod namunalari

Misol 1 — PM2 o'rnatish va birinchi ishga tushirish (2.2, 2.4)

bash
# PM2'ni global o'rnatamiz (Node.js allaqachon bor — 10.1: Misol 10)
sudo npm install -g pm2                  # global (-g) — tizim bo'ylab "pm2" buyrug'i

# Ilovani ishga tushirish (NestJS build — dist/main.js)
cd /home/deploy/app
pm2 start dist/main.js --name api        # nom beramiz (keyin "api" deb boshqaramiz)

# Tekshiramiz
pm2 list                                 # status "online" bo'lishi kerak
pm2 logs api                             # jonli loglar (ilova ko'tarildimi?)
#  Endi terminal yopilsa ham ilova ishlaydi — daemon ushlab turibdi (2.2)

Misol 2 — Cluster mode (ko'p yadro — 2.7)

bash
# Ilovani cluster rejimida — hamma CPU yadroda (4 yadro = 4 nusxa)
pm2 start dist/main.js --name api -i max # -i max = hamma yadro (load balance)

pm2 list                                 # 4 ta "api" nusxa ko'rinadi (#0..#3)
# har biri alohida jarayon, bir XIL portni baham ko'radi (kernel taqsimlaydi)

# Bitta yadroni OS'ga qoldirib (og'ir serverda foydali):
# pm2 start dist/main.js --name api -i -1
#  Cluster'da ilova STATELESS bo'lsin: session Redis'da (5.21, 9.9)

Misol 3 — ecosystem.config.js (deploy sozlamasi — 2.6)

javascript
// ecosystem.config.js — loyiha ildizida (Git'ga qo'shiladi, SECRET'siz)
module.exports = {
  apps: [{
    name: "api",                       // ilova nomi
    script: "dist/main.js",            // kirish fayli (NestJS build)
    instances: "max",                  // hamma yadro (cluster — 2.7)
    exec_mode: "cluster",              // cluster rejimi (zero-downtime poydevori)
    max_memory_restart: "300M",        // 300MB oshsa — qayta yoq (memory leak himoyasi)
    autorestart: true,                 // yiqilsa qaytar (default)
    wait_ready: true,                  // yangi nusxa "ready" bermaguncha eskini o'chirma (2.13)
    listen_timeout: 3000,              // ready'ni 3 sek kut (aks holda davom et)
    kill_timeout: 5000,                // graceful shutdown'ga 5 sek ber (DB yopilsin — 2.13)
    env: {                             // oddiy muhit (development)
      NODE_ENV: "development"
    },
    env_production: {                  // --env production bilan ishlaydi (10.11)
      NODE_ENV: "production",
      PORT: 3000
    }
  }]
};
bash
pm2 start ecosystem.config.js --env production   # production env bilan ishga tushir
pm2 reload ecosystem.config.js --env production  # keyingi deploy — uzilishsiz

Misol 4 — Boot'da avtomatik yonish: startup + save (2.5)

bash
# 1) PM2 daemon'ni boot'da yondiradigan systemd service generatsiya
pm2 startup
#  chiqishda shunday buyruq beradi (NUSXA KO'CHIRIB bajarasan):
#   sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u deploy --hp /home/deploy

# 2) Ilovalar ishga tushgan bo'lsin (Misol 3), keyin ro'yxatni saqlaymiz
pm2 save                                 # ~/.pm2/dump.pm2 ga yozadi

# 3) TEKSHIRISH — serverni qayta yuklab ko'ramiz
sudo reboot                              # server qayta yuklanadi
# ... qayta SSH bilan kirib:
pm2 list                                 # ilovalar O'ZI ishlab turibdi 
#  startup/save unutilsa — qayta yuklashda hammasi o'chadi (Xato 1)

Misol 5 — DNS record sozlash (registrar panelida — 2.8)

text
# Registrar (Namecheap/Cloudflare/ahost.uz) DNS panelida qo'shiladigan yozuvlar:

# TUR     HOST (nom)    QIYMAT (qayerga)       TTL
  A       @             203.0.113.5            300      saytim.uz  server IP (asosiy)
  A       www           203.0.113.5            300      www.saytim.uz  server IP
  CNAME   api           saytim.uz              300      api.saytim.uz  saytim.uz (alias)

# "@" — root domen (saytim.uz ning o'zi)
# TTL 300 (5 daqiqa) — birinchi sozlashda past (tez yangilanadi — 2.9)

# Tarqalganini tekshirish (lokal kompyuterdan):
#   dig saytim.uz +short         203.0.113.5 chiqishi kerak
#   nslookup www.saytim.uz       IP chiqsa — DNS ishlayapti
#  Certbot SSL olishdan OLDIN bu tarqalgan bo'lsin (ACME challenge — 2.11)

Misol 6 — Nginx server bloki domen bilan (SSL'dan oldin — 10.2)

nginx
# /etc/nginx/sites-available/saytim  (Certbot bundan SSL blok yasaydi — Misol 7)
server {
    listen 80;                                # hozircha 80 (HTTP — Certbot keyin o'zgartiradi)
    server_name saytim.uz www.saytim.uz;      # DNS'da ulagan domen (Misol 5)

    location / {
        proxy_pass http://localhost:3000;     # PM2 ilovaga (cluster bir portni baham — 2.7)
        proxy_set_header Host              $host;                       # asl domen (10.2: 2.8)
        proxy_set_header X-Real-IP         $remote_addr;                # mijoz IP
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;  # IP zanjiri
        proxy_set_header X-Forwarded-Proto $scheme;                     # http/https
    }
}
bash
sudo ln -s /etc/nginx/sites-available/saytim /etc/nginx/sites-enabled/  # yoqish
sudo nginx -t                             # config to'g'rimi? (MAJBURIY — 10.2: Xato 4)
sudo systemctl reload nginx               # http://saytim.uz endi ishlaydi (HTTP)

Misol 7 — Certbot bilan SSL olish (--nginx plugin — 2.11)

bash
# Certbot va Nginx plugin'ni o'rnatamiz
sudo apt update
sudo apt install -y certbot python3-certbot-nginx

# Sertifikat olish — Nginx config'ini AVTOMATIK sozlaydi
sudo certbot --nginx -d saytim.uz -d www.saytim.uz
#  email so'raydi (muhim ogohlantirish uchun), shartlarga rozilik
#  ACME challenge: domen senikiligini tekshiradi (DNS to'g'ri bo'lsin — 2.9)
#  sertifikat: /etc/letsencrypt/live/saytim.uz/{fullchain.pem, privkey.pem}
#  Nginx config'ga 443 ssl blok + 80443 redirect QO'SHADI, reload qiladi

# Natijani ko'ramiz (Certbot config'ni shunday o'zgartiradi):
#   server { listen 443 ssl; ssl_certificate .../fullchain.pem; ... }
#   server { listen 80; return 301 https://$host$request_uri; }    redirect
#  Endi https://saytim.uz ishlaydi, qulf belgisi  (10.2: Misol 5)

Misol 8 — Auto-renew tekshirish va sozlash (2.11)

bash
# Avtomatik yangilashni SINAB ko'ramiz (haqiqiy yangilamaydi — quruq mashq)
sudo certbot renew --dry-run             # xatosiz o'tsa — auto-renew ishlaydi 

# Auto-renew timer (Certbot o'rnatganda QO'SHADI — qo'lda cron shart emas)
sudo systemctl status certbot.timer      # "active" bo'lishi kerak (kuniga 2 marta)
sudo systemctl list-timers | grep certbot # keyingi ishga tushish vaqti

# Mavjud sertifikatlar va muddatini ko'rish
sudo certbot certificates                # domen, muddati (90 kun), avto-yangilash holati
#  90 kun — qisqa (ataylab); timer 30 kun qolganda o'zi yangilaydi (Xato 6)

Misol 9 — Graceful shutdown va zero-downtime reload (2.13)

javascript
// main.ts (NestJS) — muloyim o'chish (reload'da so'rov uzilmasin)
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(process.env.PORT || 3000);

  // PM2'ga "tayyorman" signali (wait_ready: true bilan — 2.13)
  if (process.send) process.send('ready');

  // SIGINT'ni tutamiz (PM2 reload/stop shuni yuboradi)
  process.on('SIGINT', async () => {
    console.log('Graceful shutdown boshlandi...');
    await app.close();                   // yangi so'rovni to'xtat, joriylarni tugat, DB yop
    process.exit(0);                     // toza chiqish (so'rov o'rtada uzilmaydi)
  });
}
bootstrap();
bash
# Endi yangi versiyani UZILISHSIZ chiqarish (cluster + graceful + reload):
pm2 reload api                           # nusxalarni bittalab yangilaydi (2.7, 2.13)
#  foydalanuvchi uzilish sezmaydi (qolgan nusxalar ishlab turadi)

Misol 10 — To'liq deploy skript (git pull build reload — 2.14)

bash
#!/bin/bash
# deploy.sh — uzilishsiz deploy (serverda /home/deploy/app da)
set -e                                    # birorta buyruq xato qilsa — to'xta (xavfsiz)

cd /home/deploy/app
echo " Yangi kodni olamiz..."
git pull origin main                      # eng yangi commit (CI/CD ham chaqirishi mumkin — 10.5)

echo " Bog'liqliklar va build..."
npm ci                                    # toza o'rnatish (package-lock aniq versiya)
npm run build                             # dist/ hosil bo'ladi (NestJS)

echo " Uzilishsiz qayta yuklash..."
pm2 reload ecosystem.config.js --env production   # rolling reload (2.13)
pm2 save                                  # yangi holatni saqla (boot uchun — 2.5)

echo " Deploy tugadi. Holat:"
pm2 list                                  # nusxalar "online" ekanini tekshir
#  Xato chiqsa rollback: git reset --hard HEAD~1 && npm ci && npm run build && pm2 reload (2.14)

5. To'g'ri va noto'g'ri holatlar

1) Ilovani doimiy ishlatish

text
 node main.js (terminal yopilsa o'ladi, yiqilsa qaytmaydi — 2.1)
 PM2 (daemon, auto-restart) yoki systemd (10.1: 2.6)

2) Server qayta yuklanishi

text
 Faqat pm2 start (reboot'da hammasi o'chadi — 2.5)
 pm2 startup + pm2 save (boot'da o'zi yonadi — Misol 4)

3) Ko'p yadroni ishlatish

text
 Bitta jarayon (4 yadrodan faqat 1 ishlaydi — 3 bo'sh — 2.7)
 Cluster mode: pm2 start -i max (hamma yadro)

4) Yangi versiya chiqarish

text
 pm2 restart (jarayon o'ladi-yonadi — qisqa uzilish — 2.4)
 pm2 reload (cluster — bittalab, uzilishsiz — 2.13)

5) HTTPS

text
 Faqat HTTP (parol/karta ochiq, "Not secure", SEO tushadi — 2.10)
 Certbot --nginx bilan SSL + 80443 redirect (Misol 7)

6) Sertifikat yangilash

text
 Olib qo'yib unutish (90 kunda eskiradi  sayt yiqiladi — 2.11)
 certbot.timer auto-renew + renew --dry-run bilan tekshirish (Misol 8)

7) Graceful shutdown

text
 SIGINT'ni tutmaslik (reload'da o'rtadagi so'rovlar uziladi — 2.13)
 SIGINT  app.close()  DB yop  exit(0) (Misol 9)

6. Keng tarqalgan xatolar va yechimlari

Xato 1 — Server qayta yuklangach ilova o'chiq (boot'da yonmadi)

Sababi: pm2 startup yoki pm2 save qilinmagan — PM2 daemon boot'da yonmaydi yoki saqlangan ro'yxat yo'q 2.5-bob. Yechimi: pm2 startup (chiqqan sudo buyrug'ini bajaring), ilovalarni ishga tushiring, pm2 save; keyin sudo reboot bilan tekshiring (Misol 4).

Xato 2 — pm2: command not found yoki boot'da topilmaydi

Sababi: PM2 global o'rnatilmagan, yoki boot service'dagi PATH'da Node yo'q (nvm bilan ko'p uchraydi). Yechimi: sudo npm install -g pm2; pm2 startup chiqishidagi PATH=... to'liq bo'lishini ta'minlang (Node yo'lini o'z ichiga olsin); nvm o'rniga tizim Node ishlating (10.1: Misol 10).

Xato 3 — Certbot: DNS hali tarqalmagan / domen topilmadi

Sababi: A record yangi qo'shilgan, propagation tugamagan — Let's Encrypt ACME challenge domenni server'ga ulay olmadi (2.9, 2.11). Yechimi: dig saytim.uz +short bilan IP to'g'ri chiqishini kuting; TTL'ni 300'ga tushiring; tarqalgach certbot --nginx'ni qayta bajaring (Misol 7).

Xato 4 — Certbot: too many certificates (rate limit)

Sababi: Let's Encrypt'da hafta davomida bir domen uchun cheklov bor (production rate limit) — qayta-qayta urinishdan oshib ketgan. Yechimi: sinov uchun --dry-run yoki --staging ishlating (limitga kirmaydi); haqiqiy sertifikatni faqat hammasi tayyor bo'lganda oling; cheklov tugashini kuting (~1 hafta).

Xato 5 — 502 Bad Gateway (Nginx ilovaga yetmadi)

Sababi: PM2 ilova yiqilgan/o'chiq, yoki proxy_pass porti noto'g'ri (10.2: Xato 1). Yechimi: pm2 list (status "online"mi?), pm2 logs api (xato sababi), curl localhost:3000 (lokal javob); port ecosystemdagi PORT bilan Nginx proxy_pass mosligini tekshiring.

Xato 6 — Sertifikat eskirgan (NET::ERR_CERT_DATE_INVALID)

Sababi: auto-renew ishlamagan — certbot.timer o'chiq yoki yangilash xato bergan 2.11-bob. Yechimi: sudo systemctl status certbot.timer (active bo'lsin), sudo certbot renew --dry-run (xatoni ko'rsatadi), kerak bo'lsa sudo certbot renew --force-renewal + sudo systemctl reload nginx (Misol 8).

Xato 7 — Mixed content (https sahifada http resurs)

Sababi: sayt HTTPS'da, lekin ichida http://ga murojaat bor (rasm, skript, API) — brauzer bloklaydi yoki ogohlantiradi. Yechimi: barcha ichki havolalar https:// yoki nisbiy (// / /path) bo'lsin; backend X-Forwarded-Proto (10.2: 2.8) o'qib HTTPS'ni bilsin; frontend API URL'ini https'ga o'zgartiring.


7. Integratsiya — bu mavzu stack'ning qayerida uchraydi

  • Linux server 10.1-bob: PM2 shu serverda ishlaydi; pm2 startup systemd service yaratadi (10.1: 2.6); firewall'da 80/443 ochiq (10.1: 2.7).
  • Nginx 10.2-bob: Certbot Nginx config'iga 443 ssl + 80443 redirect qo'shadi (10.2: Misol 5); Nginx PM2 ilovaga proxy qiladi (10.2: 2.8).
  • Docker (10.3-4): konteynerda ko'pincha PM2 o'rniga bitta jarayon; SSL Nginx/traefik konteynerda; orkestratsiya Compose bilan.
  • CI/CD 10.5-bob: GitHub Actions SSH orqali deploy.sh (git pull build pm2 reload) ni chaqiradi (Misol 10).
  • Cloud 10.6-bob: VPS/EC2'da PM2; DB backup S3'ga; domen Route 53/DNS provayder bilan.
  • Monitoring 10.9-bob: pm2 monit — boshlang'ich; /health endpoint uptime monitor uchun 2.17-bob; log rotation (pm2-logrotate, 2.15) markazlashtirilgan log (ELK/Loki); production'da Prometheus/Grafana/Sentry (restart, CPU, xato).
  • PaaS 2.19-bob: Railway/Render/Fly.io — PM2/Nginx/SSL o'rniga platforma; VPS vs PaaS tanlovi loyiha bosqichiga bog'liq.
  • Secrets 10.11-bob: ecosystemda env_production; maxfiy qiymatlar .env/secrets'da (kodda EMAS).
  • Stateless masshtab 9.9-bob: cluster mode ilova stateless bo'lishini talab qiladi (session Redis'da — 5.21).

8. Eng yaxshi amaliyotlar (best practices)

  • Process manager majburiy (PM2 yoki systemd — node main.js production'da emas — 2.1).
  • ecosystem.config.js (sozlama bitta faylda, Git'da, secret'siz — 2.6, 10.11).
  • Cluster mode (hamma yadro: -i max; ilova stateless bo'lsin — 2.7, 9.9).
  • startup + save (boot'da avtomatik yonsin; reboot bilan tekshirish — 2.5, Misol 4).
  • reload ishlatish (restart emas) (cluster'da uzilishsiz — yangi deploy uchun — 2.13).
  • Graceful shutdown (SIGINT tutish so'rovni tugatish DB yopish exit — 2.13, Misol 9).
  • HTTPS majburiy (Certbot --nginx, 80443 redirect — 2.11, 10.2: 2.4).
  • Auto-renew tekshirish (certbot.timer active, renew --dry-run — unutmaslik — 2.11, Xato 6).
  • DNS oldindan (A record + propagation; Certbot'dan oldin dig bilan tasdiqlash — 2.8-9).
  • Deploy strategiya (VPS'da rolling/pm2 reload; muhim loyihada blue-green/canary — 2.12).
  • Backup + rollback (DB har kuni avtomatik; Git rollback tayyor; migratsiya ehtiyotkorligi — 2.14).
  • max_memory_restart (memory leak'da avtomatik tiklash — 2.6).
  • Log rotation (pm2-logrotate — log disk to'ldirmasin; max_size+retain+compress — 2.15).
  • Health check (/health endpoint — monitor/LB/K8s tekshiradi; maxfiy ma'lumotsiz — 2.17).
  • HSTS + SSL sifat (HSTS header + SSL Labs A+; TLS 1.2/1.3, eskisi o'chiq — 2.18).
  • --watch production'da yo'q (faqat development; deploy'da beqarorlik — 2.16).

9. Amaliy loyiha: "To'liq Production Deploy: PM2 + Domen + SSL"

10.1-10.2'da sozlangan serverga real ilovani PM2 cluster bilan doimiy ishlatib, o'z domeningni ulab, Let's Encrypt SSL bilan HTTPS o'rnatib, uzilishsiz deploy skripti yozish — to'liq production stack.

Maqsad

NestJS/Express ilovani VPS'da PM2 cluster mode'da ishga tushiring, ecosystem.config.js bilan sozlang, boot'da avtomatik yonsin; o'z domeningizni (yoki bepul subdomen) DNS orqali serverga ulang; Certbot bilan HTTPS o'rnatib, 80443 redirect qiling; va git pull build pm2 reload deploy skripti bilan uzilishsiz yangilashni ta'minlang.

Talablar (requirements)

  1. PM2 o'rnatish: global o'rnating, ilovani --name bilan ishga tushiring (Misol 1, 2.4).
  2. Cluster mode: -i max bilan hamma yadroda ishlating, pm2 list da nusxalarni ko'ring (Misol 2, 2.7).
  3. ecosystem.config.js: instances, exec_mode, env_production, wait_ready, kill_timeout bilan (Misol 3, 2.6).
  4. Boot: pm2 startup + pm2 save, sudo reboot bilan tekshiring (Misol 4, 2.5).
  5. Domen + DNS: A record (@ va www) server IP; dig/nslookup bilan tasdiqlang (Misol 5, 2.8-9).
  6. Nginx: domen bilan server bloki, PM2 ilovaga proxy + header'lar (Misol 6, 10.2: 2.8).
  7. SSL: certbot --nginx -d domen bilan sertifikat, 80443 redirect avtomatik (Misol 7, 2.11).
  8. Auto-renew: renew --dry-run toza o'tsin, certbot.timer active (Misol 8, Xato 6).
  9. Graceful shutdown: ilovada SIGINT tuting app.close() exit; pm2 reload uzilishsiz (Misol 9, 2.13).
  10. Deploy skript: deploy.sh (git pull npm ci build pm2 reload save) + rollback rejasi (Misol 10, 2.14).

Maslahatlar (hint)

  • Domen yo'q bo'lsa — bepul subdomen (DuckDNS, *.nip.io) yoki arzon .uz/.com oling (test uchun yetarli).
  • Certbot'dan oldin DNS tarqalganini dig bilan tasdiqlang — aks holda ACME challenge xato beradi (Xato 3).
  • Sinov paytida certbot --dry-run/--staging ishlating — rate limit'ga kirib qolmang (Xato 4).
  • pm2 reload uzilishsizligini sinash uchun — reload paytida curl'ni tsiklda yuboring, 502/uzilish bo'lmasligini kuzating.
  • Boot'ni albatta sudo reboot bilan tekshiring — startup/save unutilsa bilinmaydi (Xato 1).
  • VPS yo'q bo'lsa — WSL2/Multipass'da PM2 va Nginx qismini bajaring (SSL uchun real domen kerak — 10.1).

"Tayyor" mezonlari (acceptance criteria)

  • Ilova PM2 cluster mode'da ishlaydi (pm2 list — bir necha "online" nusxa).
  • ecosystem.config.js bilan --env production ishga tushadi.
  • sudo reboot dan keyin ilova o'zi yonadi (startup + save ishlaydi).
  • https://domen qulf belgisi bilan ochiladi; http:// https:// redirect bo'ladi.
  • certbot renew --dry-run xatosiz o'tadi, certbot.timer active.
  • pm2 reload paytida sayt uzilmaydi (zero-downtime — graceful shutdown ishlaydi).
  • deploy.sh git pull build reload zanjirini bir buyruqda bajaradi.
  • Rollback rejasi bor (Git reset yoki blue-green) va sinalgan.

Yechim kodi ataylab berilmagan — bu loyihani o'zingiz yozib ko'ring.


10. Xulosa va keyingi bobga ko'prik

Bu bobda production deploy'ning uchta ustunini birlashtirib o'rgandik:

  • Process manager (nega kerak, PM2 vs systemd — 2.1-2.3); PM2 (buyruqlar, startup+save, ecosystem.config.js, cluster mode — 2.4-2.7); ilova endi doimiy, ko'p yadroli, boot'da avtomatik.
  • Domen va DNS (registrar, A/CNAME record, propagation, TTL — 2.8-2.9); HTTPS/SSL/TLS (shifrlash va ishonch, CA, Let's Encrypt — 2.10); Certbot (avtomatik sertifikat, --nginx, auto-renew — 2.11); ilova endi o'z domeni va xavfsiz HTTPS bilan.
  • Deploy strategiyalari (recreate/rolling/blue-green/canary — 2.12); zero-downtime (PM2 reload, graceful shutdown, wait_ready — 2.13); backup/rollback 2.14-bob; log rotation (pm2-logrotate — 2.15), health check (/health — 2.17), HSTS/wildcard/SSL sifat 2.18-bob va PaaS muqobili 2.19-bob; yangilash endi uzilishsiz, kuzatiladigan va xavfsiz.

Endi siz ilovani noldan to'liq production'ga chiqara olasiz — u doimiy ishlaydi, o'z domeni bor, HTTPS bilan himoyalangan va uzilishsiz yangilanadi. Bu — "kod yozaman" bilan "real mahsulot chiqaraman" o'rtasidagi chegarani butunlay buzadi.

Keyingi bob — 10.8-bob: Kubernetes asoslari. PM2 bitta serverdagi ilovani boshqaradi, lekin loyiha o'sib, o'nlab konteyner, bir necha server kerak bo'lsa-chi? Yiqilgan konteynerni qaytarish, yukni serverlar bo'ylab taqsimlash, avtomatik masshtablash — bularni qo'lda boshqarib bo'lmaydi. Kubernetes (K8s) — konteynerlarni klaster miqyosida avtomatik orkestratsiya qiluvchi tizim: pod, deployment, service, self-healing, auto-scaling. Bu — PM2'ning butun data-markaz darajasidagi "katta akasi".


Foydalanilgan rasmiy/ishonchli manbalar

  • PM2 rasmiy hujjati — pm2.keymetrics.io/docs: Process Management (start/list/logs/restart/reload), Startup Script (pm2 startup/save/resurrect), Application Declaration (ecosystem.config.js maydonlari), Cluster Mode, Graceful Start/Shutdown (SIGINT, wait_ready, listen_timeout, kill_timeout), pm2-logrotate moduli, watch/env boshqaruvi
  • Node.js rasmiy hujjati — nodejs.org/docs: cluster moduli, process signallari (SIGINT/SIGTERM), NODE_ENV=production, graceful shutdown namunalari
  • Certbot rasmiy hujjati — certbot.eff.org/instructions (Nginx + Ubuntu): certbot --nginx, certonly --manual --preferred-challenges dns (wildcard/DNS-01), renew --dry-run, certbot.timer auto-renew
  • Let's Encrypt hujjati — letsencrypt.org/docs: sertifikat muddati (90 kun), ACME challenge (HTTP-01/DNS-01), rate limit, wildcard sertifikat
  • HTTPS/HSTS — MDN Web Docs "Strict-Transport-Security"; hstspreload.org; Qualys SSL Labs (ssllabs.com/ssltest) — SSL sifat bahosi (A+)
  • DNS asoslari — Cloudflare DNS docs (record turlari: A, AAAA, CNAME, TXT, MX); TTL va propagation best practices (2026)
  • Nginx rasmiy hujjati — nginx.org/en/docs: SSL/TLS termination, 443/redirect, reverse proxy (10.2 bilan)
  • Deploy strategiyalari — zero-downtime deployment (blue-green/canary/rolling) qiyosiy manbalar (HashiCorp Well-Architected, CircleCI, 2026)
  • PaaS platformalari — Railway, Render, Fly.io, Heroku ("12-factor app" — 12factor.net), Vercel rasmiy hujjatlari; VPS vs PaaS qiyosi
  • Health check — Kubernetes hujjati (liveness/readiness probe), uptime monitoring amaliyoti (UptimeRobot/BetterStack)
  • DigitalOcean Community — "How To Secure Nginx with Let's Encrypt on Ubuntu", "PM2 process management" (2026)

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
10.7-bob: Deployment strategiyalari — PM2, domen, SSL — Wisar