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.jsqiladi (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
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.jsni 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
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 kuzatadiPM2 (Process Manager 2) — Node.js ilovalari uchun eng mashhur production process manager (
npm install -g pm2bilan 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). Sizpm2 start app.jsdesangiz — 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.jsdan tub farqi.
2.3. PM2 vs systemd (qachon qaysi)
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 boshqaradiPM2 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 startbilan cluster,pm2 reloadbilan uzilishsiz yangilash,pm2 logsbilan 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 startupaynan 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)
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 apibilan nom berish (keyin shu nom orqali boshqarasiz),pm2 start "npm run start"(npm skripti orqali), va eng yaxshisipm2 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:restartuziladi,reloaduzilishsiz — production'da yangi versiya chiqarishdareloadishlatiladi 2.10-bob.
2.5. PM2 startup va save (server qayta yuklansa avtomatik yonish)
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
rebootbo'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 chiqishidasudo env PATH=... pm2 startup systemd -u deploy --hp /home/deploydegan satrni beradi — uni copy-paste qilib bajarasiz (sudo huquqi kerak). (2) Kerakli ilovalarnipm2 startbilan 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/saveqilishni unutib, server qayta yuklanganda hamma ilova o'chib qolishi (Xato 1).
2.6. ecosystem.config.js (deploy sozlamasi bitta faylda)
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 uzunpm2 start dist/main.js --name api -i max ...yozish o'rniga, sozlamalarni faylga yozasiz vapm2 start ecosystem.config.jsdeysiz. Asosiy maydonlar:name(ilova nomi),script(kirish fayli — NestJS uchundist/main.js),instances(nechta nusxa —"max"yoki0hamma 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),envvaenv_production(muhit o'zgaruvchilari —--env productionbilan 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.envfaylda yoki secrets boshqaruvida bo'lishi kerak 10.11-bob.
2.7. Cluster mode (ko'p yadro, zero-downtime poydevori)
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 emasCluster 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.jsularning 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 4aniq son, yoki-i -1— bitta yadroni OS'ga qoldirib). Nusxalar Node'ningclustermoduli 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-downtime —pm2 reloadnusxalarni 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)
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. Domen — registrardan (Namecheap, GoDaddy, mahalliyahost.uz,uzinfocom—.uzuchun) ijaraga olinadigan nom (yiliga ~$10-15; egalik emas — ijara). DNS (Domain Name System) — internetning "telefon kitobi": "saytim.uzqaysi 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.uzyoki 3-tomon xizmatga);AAAA— IPv6 uchun (ixtiyoriy);MX(pochta),TXT(tekshiruv — masalan SSL/domen egaligi). Yodda saqlash:Arecord domenni IP'ga (asosiy),CNAMEdomenni boshqa domenga ulaydi.
2.9. DNS propagation va TTL (o'zgarish nega darrov ko'rinmaydi)
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 36001 soat (o'zgarish1 soatdan keyin ko'rinadi),5 daqiqada tarqaladi), barqarorlashgach TTL'ni 3600'ga qaytaring. Tekshirish:TTL 3005 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 (dig saytim.uz +short(A record javobi),nslookup saytim.uz, yokiwhatsmydns.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)
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 Encrypt — bepul, 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)
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-runbilan yangilashni sinab ko'ring vasudo systemctl status certbot.timerbilan timer ishlayotganini tekshiring (aks holda 90 kundan keyin sertifikat eskirib, sayt yiqiladi — Xato 6).
2.12. Deploy strategiyalari (recreate, rolling, blue-green, canary)
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-green — ikki 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
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 reloadcluster mode'da buni rolling tarzda qiladi: nusxalarni bittalab yangilaydi — #0'gaSIGINTyuboradi, 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: PM2SIGINTyuboradi (kill_timeout— default 1600ms kutadi), ilova buni tutib yangi so'rov qabul qilishni to'xtatadi, joriy so'rovlarni tugatadi, DB ulanishini yopadi, keyinprocess.exit(0)qiladi (so'rov o'rtada uzilmaydi).wait_ready— yangi nusxa tayyor bo'lgunicha eskisini o'chirmaslik: ecosystem'dawait_ready: trueqo'yasiz, ilova HTTP server tinglashni boshlagachprocess.send('ready')yuboradi — shu signaldan keyingina PM2 eskisini o'chiradi (listen_timeout— default 3000ms ichida kutadi). Graceful shutdown'sizreload— o'rtadagi so'rovlar uzilib, foydalanuvchi xato yoki ma'lumot yo'qotishi mumkin.
2.14. Backup va rollback (xato deploy'dan qaytish)
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 AVVALBackup 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), keyinnpm 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/mongodumpbulutga, 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)
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.logva-error.log). Muammo: bu fayllar cheksiz o'sadi va oylar davomida diskni to'ldiradi. Yechim —pm2-logrotatemoduli (pm2 install pm2-logrotate): loglarni belgilangan hajmda (max_size) yoki vaqtda (rotateInterval— cron formati) avtomatik bo'ladi, eskilariniretainsonidan ortiqchasini o'chiradi vacompressbilan gzip qiladi. Sozlamalarpm2 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)
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 —
--watchfayl 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 productionecosystem'dagienv_productionblokini qo'llaydi; env o'zgargachpm2 restart <nom> --update-envbilan qayta o'qitiladi; maxfiy qiymatlar.envfaylda (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 (konteynerrestart: alwayssiyosati 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)
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
/healthyoki/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'lmasa503qaytaradi). Uni kim ishlatadi: uptime monitor (UptimeRobot, BetterStack —/healtho'chsa ogohlantiradi), Nginx/load balancer (sog'lom bo'lmagan nusxaga trafik yubormaydi), Kubernetes (livenessProbe/readinessProbeshu endpoint'ni tekshiradi — 10.8), hattoki deploy skripti (reload'dan keyin/health200qaytarishini 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
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 qoladiSSL 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 brauzerhttp://so'rovni serverga bormasdan o'zihttps://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--nginxHTTP challenge yetmaydi, DNS-01 challenge kerak:certbot certonly --manual --preferred-challenges dns -d saytim.uz -d "*.saytim.uz"— Certbot_acme-challengeuchun 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 holdamax-agemuddati tugaguncha sayt ochilmay qolishi mumkin.
2.19. PaaS muqobili (Railway, Render, Fly.io, Vercel — qachon VPS o'rniga)
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 muqobili — PaaS (Platform as a Service) da serverni o'zingiz boshqarmaysiz: kodni
git pushqilasiz, 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 pushavtomatik 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
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_ready4. Batafsil kod namunalari
Misol 1 — PM2 o'rnatish va birinchi ishga tushirish (2.2, 2.4)
# 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)
# 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)
// 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
}
}]
};pm2 start ecosystem.config.js --env production # production env bilan ishga tushir
pm2 reload ecosystem.config.js --env production # keyingi deploy — uzilishsizMisol 4 — Boot'da avtomatik yonish: startup + save (2.5)
# 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)
# 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)
# /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
}
}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)
# 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)
# 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)
// 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();# 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)
#!/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
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
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
Bitta jarayon (4 yadrodan faqat 1 ishlaydi — 3 bo'sh — 2.7)
Cluster mode: pm2 start -i max (hamma yadro)4) Yangi versiya chiqarish
pm2 restart (jarayon o'ladi-yonadi — qisqa uzilish — 2.4)
pm2 reload (cluster — bittalab, uzilishsiz — 2.13)5) HTTPS
Faqat HTTP (parol/karta ochiq, "Not secure", SEO tushadi — 2.10)
Certbot --nginx bilan SSL + 80443 redirect (Misol 7)6) Sertifikat yangilash
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
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 startupsystemd 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;/healthendpoint 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:
ecosystemdaenv_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.jsproduction'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).
reloadishlatish (restartemas) (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.timeractive,renew --dry-run— unutmaslik — 2.11, Xato 6). - DNS oldindan (A record + propagation; Certbot'dan oldin
digbilan 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 (
/healthendpoint — 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).
--watchproduction'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)
- PM2 o'rnatish: global o'rnating, ilovani
--namebilan ishga tushiring (Misol 1, 2.4). - Cluster mode:
-i maxbilan hamma yadroda ishlating,pm2 listda nusxalarni ko'ring (Misol 2, 2.7). - ecosystem.config.js:
instances,exec_mode,env_production,wait_ready,kill_timeoutbilan (Misol 3, 2.6). - Boot:
pm2 startup+pm2 save,sudo rebootbilan tekshiring (Misol 4, 2.5). - Domen + DNS: A record (
@vawww) server IP;dig/nslookupbilan tasdiqlang (Misol 5, 2.8-9). - Nginx: domen bilan server bloki, PM2 ilovaga proxy + header'lar (Misol 6, 10.2: 2.8).
- SSL:
certbot --nginx -d domenbilan sertifikat, 80443 redirect avtomatik (Misol 7, 2.11). - Auto-renew:
renew --dry-runtoza o'tsin,certbot.timeractive (Misol 8, Xato 6). - Graceful shutdown: ilovada SIGINT tuting
app.close()exit;pm2 reloaduzilishsiz (Misol 9, 2.13). - 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/.comoling (test uchun yetarli). - Certbot'dan oldin DNS tarqalganini
digbilan tasdiqlang — aks holda ACME challenge xato beradi (Xato 3). - Sinov paytida
certbot --dry-run/--stagingishlating — rate limit'ga kirib qolmang (Xato 4). pm2 reloaduzilishsizligini sinash uchun — reload paytidacurl'ni tsiklda yuboring, 502/uzilish bo'lmasligini kuzating.- Boot'ni albatta
sudo rebootbilan tekshiring —startup/saveunutilsa 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.jsbilan--env productionishga tushadi. -
sudo rebootdan keyin ilova o'zi yonadi (startup + save ishlaydi). -
https://domenqulf belgisi bilan ochiladi;http://https://redirect bo'ladi. -
certbot renew --dry-runxatosiz o'tadi,certbot.timeractive. -
pm2 reloadpaytida sayt uzilmaydi (zero-downtime — graceful shutdown ishlaydi). -
deploy.shgit 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.jsmaydonlari), 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:clustermoduli,processsignallari (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.timerauto-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!