Loyihani deploy qilish

VPS serverga deploy qilish

Endi eng amaliy qismga o'tamiz: Node.js ilovasini haqiqiy VPS serverga deploy qilamiz. Bu darsda toza Linux serverdan boshlab, ilovangiz internetda domen orqali ochiladigan holatga qadar barcha bosqichlarni ketma-ket ko'ramiz. Siz SSH, Git va Node.js bilan tanish bo'lganingiz uchun har bir qadam mantiqiy ravishda ulanadi.

Bu darsdagi barcha buyruqlar Linux serverida, terminalda ishlaydi. Ular statik misollar sifatida keltirilgan โ€” siz ularni o'z serveringizda ketma-ket bajarasiz. Serverning IP manzili misollarda 203.0.113.10, foydalanuvchi esa deploy deb olinadi.

1-bosqich: VPS olish

Avvalo VPS provayderdan server ijaraga olasiz. Eng mashhurlari โ€” DigitalOcean (u yerda server "Droplet" deb ataladi) va Hetzner (arzon narxlari bilan mashhur). Ro'yxatdan o'tib, quyidagi tanlovlarni qilasiz:

Server yaratilgach, provayder sizga ommaviy IP manzil beradi โ€” masalan 203.0.113.10. Ana shu manzil orqali serverga ulanamiz.

Agar SSH kalitingiz bo'lmasa, uni lokalxostda yaratasiz: ssh-keygen -t ed25519 -C "email@example.com". Bu ikki fayl hosil qiladi โ€” maxfiy kalit (~/.ssh/id_ed25519) va ommaviy kalit (~/.ssh/id_ed25519.pub). Ommaviy kalitni provayder paneliga qo'shasiz, maxfiysini esa hech kimga bermaysiz.

2-bosqich: SSH bilan ulanish

Serverga SSH (Secure Shell) orqali ulanasiz. Bu โ€” masofadagi serverning terminaliga xavfsiz kirish protokoli. Birinchi ulanish odatda root foydalanuvchi sifatida bo'ladi:

# Lokalxostdan serverga ulanish:
$ ssh root@203.0.113.10

Xavfsizlik uchun root bilan doimiy ishlash tavsiya etilmaydi. Buning o'rniga alohida foydalanuvchi yaratib, unga sudo (administrator) huquqini beramiz:

# Root sifatida yangi foydalanuvchi yaratish:
$ adduser deploy
$ usermod -aG sudo deploy

# Endi shu foydalanuvchi bilan ulanamiz:
$ ssh deploy@203.0.113.10
Serverni olgach, birinchi ishlardan biri โ€” uni yangilash va oddiy xavfsizlik choralari. Kamida sudo apt update && sudo apt upgrade -y bajaring va faqat kerakli portlarni oching (SSH uchun 22, veb uchun 80 va 443). Ochiq qolgan port โ€” xavfsizlik teshigidir.

3-bosqich: Node.js o'rnatish

Yangi serverda Node.js o'rnatilmagan bo'ladi. Uni o'rnatishning ishonchli usuli โ€” NodeSource ombori orqali. Bu sizga kerakli versiyani (masalan, LTS 20 yoki 22) beradi:

# NodeSource ombori orqali Node.js 20 LTS o'rnatish:
$ curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
$ sudo apt install -y nodejs

# O'rnatilganini tekshirish:
$ node -v
v20.11.0
$ npm -v
10.2.4
Bir necha Node.js versiyasini boshqarish kerak bo'lsa, nvm (Node Version Manager) yaxshi vosita. U turli versiyalarni o'rnatib, ular orasida almashish imkonini beradi. Bitta ilova uchun esa NodeSource yondashuvi soddaroq.

4-bosqich: Kodni git clone qilish

Kodni serverga yetkazishning eng qulay yo'li โ€” Git. Kodingiz GitHub yoki boshqa Git xostingida bo'lsa, uni serverga git clone bilan tortib olasiz. Avval Git o'rnatilganiga ishonch hosil qiling:

# Git o'rnatish (ko'pincha oldindan mavjud):
$ sudo apt install -y git

# Kodni klonlash:
$ cd ~
$ git clone https://github.com/foydalanuvchi/mening-loyiham.git
$ cd mening-loyiham

# Bog'liqliklarni o'rnatish (faqat production uchun):
$ npm ci --omit=dev

Bu yerda npm ci โ€” npm installning ishonchli varianti. U package-lock.json asosida aniq versiyalarni o'rnatadi va serverda oldindan mavjud node_modulesni tozalab, toza o'rnatadi. Serverda deploy uchun aynan shu tavsiya etiladi.

Xususiy (private) repozitoriy uchun HTTPS o'rniga SSH kalit yoki deploy token ishlatiladi. GitHub'da "Deploy keys" bo'limi orqali serverning ommaviy kalitini faqat shu repozitoriyaga o'qish huquqi bilan qo'shish mumkin โ€” bu xavfsiz yechim.

5-bosqich: Muhit o'zgaruvchilari (.env)

Ilovaning maxfiy ma'lumotlari โ€” ma'lumotlar bazasi paroli, API kalitlari, sessiya siri โ€” hech qachon kodga yozilmaydi va Git'ga yuklanmaydi. Ular muhit o'zgaruvchilarida saqlanadi. Serverda ular odatda .env faylida bo'ladi:

# Serverda .env faylini yaratish (loyiha papkasida):
$ nano .env
# .env fayli mazmuni (misol):
NODE_ENV=production
PORT=3000
DATABASE_URL=postgres://user:parol@localhost:5432/mydb
JWT_SECRET=juda-maxfiy-tasodifiy-satr
API_KEY=sk_live_1234567890

Node.js'da bu qiymatlarni o'qish uchun dotenv kutubxonasi ishlatiladi. U .env faylini o'qib, qiymatlarni process.envga joylaydi:

// Ilova boshida โ€” eng yuqorida:
require('dotenv').config();

const port = process.env.PORT || 3000;
const dbUrl = process.env.DATABASE_URL;

console.log('Port:', port);
.env faylini doim .gitignorega qo'shing! Aks holda maxfiy parollaringiz GitHub'ga ochiq yuklanadi. Bu eng ko'p uchraydigan va xavfli xatolardan biri โ€” bir marta yuklangan sir butun tarixda qoladi va uni darhol almashtirish kerak bo'ladi.
Repozitoriyaga faqat namuna sifatida .env.example faylini qo'shish odat: unda qiymatlarsiz kalitlar ro'yxati bo'ladi (masalan, DATABASE_URL=). Shunda boshqa dasturchi qaysi o'zgaruvchilar kerakligini biladi, lekin haqiqiy sirlarni ko'rmaydi.

6-bosqich: PM2 bilan doimiy ishga tushirish

Ilovani shunchaki node server.js bilan ishga tushirsangiz, u faqat SSH sessiyasi ochiq turgunicha ishlaydi โ€” siz terminaldan chiqishingiz bilan to'xtaydi. Bundan tashqari, ilova xato bilan qulasa, o'zi qayta ishga tushmaydi. Buni hal qilish uchun PM2 โ€” Node.js jarayon menejeridan foydalanamiz.

PM2 ilovani fonda ishlatadi, qulasa avtomatik qayta ishga tushiradi, loglarni saqlaydi va server qayta yuklanganda ilovani o'zi qayta boshlaydi. Uni global o'rnatamiz:

# PM2'ni global o'rnatish:
$ sudo npm install -g pm2

# Ilovani PM2 bilan ishga tushirish (nom berib):
$ pm2 start server.js --name mening-ilova

# Holatni ko'rish:
$ pm2 list
$ pm2 logs mening-ilova

Server qayta yuklanganda (masalan, tizim yangilanishidan keyin) ilova avtomatik qayta ishga tushishi uchun PM2'ni tizimga bog'laymiz:

# PM2'ni tizim ishga tushishida avtomatik yoqilishini sozlash:
$ pm2 startup
# (chiqqan buyruqni nusxalab bajaring)

# Hozirgi jarayonlar ro'yxatini saqlash:
$ pm2 save

Kodni yangilaganda deploy shunday bo'ladi: yangi kodni tortasiz va PM2'ga ilovani qayta yuklashni buyurasiz:

# Kodni yangilash va qayta yuklash:
$ cd ~/mening-loyiham
$ git pull
$ npm ci --omit=dev
$ pm2 reload mening-ilova
pm2 reload โ€” pm2 restartdan yaxshiroq: u ilovani "nol vaqt uzilishi" (zero-downtime) bilan yangilashga harakat qiladi, ya'ni foydalanuvchilar uchun uzilish sezilmaydi. Katta trafikli loyihalarda bu muhim.
PM2 ilovani bir necha nusxada (cluster rejimida) ham ishga tushira oladi โ€” bu Node.js'ning bir oqimli tabiatini yengib, serverdagi barcha yadrolardan foydalanish imkonini beradi: pm2 start server.js -i max.

7-bosqich: Nginx reverse proxy

Hozir ilovangiz localhost:3000da ishlayapti, lekin foydalanuvchilar odatiy 80 (HTTP) va 443 (HTTPS) portlariga kirishadi. Node.js ilovasini to'g'ridan-to'g'ri 80-portga qo'yish yaxshi amaliyot emas. Buning o'rniga Nginxni reverse proxy sifatida oldinga qo'yamiz.

Nginx darsidan eslasangiz, reverse proxy brauzerdan kelgan so'rovni qabul qilib, uni orqadagi ilovaga (bizning holatda localhost:3000ga) uzatadi. Bu bizga statik fayllarni tez uzatish, HTTPS'ni bir joyda boshqarish va ilovani tashqi dunyodan yashirish imkonini beradi.

# Nginx o'rnatish:
$ sudo apt install -y nginx

# Sayt uchun config yaratish:
$ sudo nano /etc/nginx/sites-available/mening-ilova
# /etc/nginx/sites-available/mening-ilova
server {
    listen 80;
    server_name mening-saytim.uz www.mening-saytim.uz;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }
}

Bu config'da proxy_pass โ€” barcha so'rovlarni localhost:3000dagi Node.js ilovasiga uzatadi. proxy_set_header qatorlari esa ilovaga foydalanuvchining haqiqiy IP'si va boshqa muhim ma'lumotlarni yetkazadi (aks holda ilova hamma so'rovni Nginx'dan kelayotgandek ko'radi).

Config'ni faollashtiramiz va Nginx'ni qayta yuklaymiz:

# Config'ni yoqish (symbolic link):
$ sudo ln -s /etc/nginx/sites-available/mening-ilova /etc/nginx/sites-enabled/

# Config sintaksisini tekshirish (MUHIM!):
$ sudo nginx -t
nginx: configuration file /etc/nginx/nginx.conf test is successful

# Nginx'ni qayta yuklash:
$ sudo systemctl reload nginx
Nginx'ni qayta yuklashdan oldin doimo sudo nginx -t bilan config'ni tekshiring. Xato config bilan qayta yuklasangiz, Nginx ishga tushmay qolishi va butun saytingiz o'chib qolishi mumkin. nginx -t muvaffaqiyatli bo'lsagina qayta yuklang.

Endi proxy_pass qatoridagi $http_upgrade va Connection 'upgrade' sarlavhalari WebSocket ulanishlarini ham qo'llab-quvvatlaydi โ€” agar ilovangizda real vaqtli aloqa (chat, bildirishnomalar) bo'lsa, bu kerak bo'ladi.

Hozircha bu HTTP (80-port) orqali ishlaydi. HTTPS (443-port) va domen ulashni oxirgi darsda ko'ramiz โ€” u yerda aynan shu config'ni Let's Encrypt sertifikati bilan kengaytiramiz.

To'liq deploy zanjiri

Barcha bosqichlarni bir joyga jamlaymiz. Toza Ubuntu serverdan ishlaydigan ilovagacha bo'lgan yo'l:

  1. VPS olish va SSH kalit sozlash;
  2. ssh deploy@203.0.113.10 bilan ulanish, tizimni yangilash;
  3. Node.js, Git, Nginx o'rnatish;
  4. git clone va npm ci --omit=dev;
  5. .env faylini yaratish (Git'ga qo'shmasdan);
  6. pm2 start va pm2 startup + pm2 save;
  7. Nginx reverse proxy config'ini yozib, nginx -t va reload;
  8. (Keyingi dars) domen va HTTPS.
Bu bosqichlarni har safar qo'lda takrorlash zerikarli. Ularni bitta deploy skriptiga (masalan, deploy.sh) yig'ib qo'yish yoki keyinchalik GitHub Actions orqali avtomatlashtirish mumkin. Lekin avtomatlashtirishdan oldin har bir bosqichni qo'lda tushunib chiqish shart.

Xulosa