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.
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:
- Operatsion tizim: Ubuntu (masalan, 22.04 LTS yoki 24.04 LTS) โ eng keng tarqalgan va hujjatlari ko'p;
- Resurs: boshlang'ich loyiha uchun 1 GB RAM, 1 CPU yetarli (eng arzon tarif);
- Hudud (region): foydalanuvchilaringizga eng yaqin joy โ masalan, Yevropa (Germaniya) O'zbekiston uchun yaxshi variant;
- Autentifikatsiya: parol o'rniga SSH kalit tanlash tavsiya etiladi (ancha xavfsizroq).
Server yaratilgach, provayder sizga ommaviy IP manzil beradi โ masalan 203.0.113.10. Ana shu manzil orqali serverga ulanamiz.
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
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
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.
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..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 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
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.
To'liq deploy zanjiri
Barcha bosqichlarni bir joyga jamlaymiz. Toza Ubuntu serverdan ishlaydigan ilovagacha bo'lgan yo'l:
- VPS olish va SSH kalit sozlash;
ssh deploy@203.0.113.10bilan ulanish, tizimni yangilash;- Node.js, Git, Nginx o'rnatish;
git clonevanpm ci --omit=dev;.envfaylini yaratish (Git'ga qo'shmasdan);pm2 startvapm2 startup+pm2 save;- Nginx reverse proxy config'ini yozib,
nginx -tvareload; - (Keyingi dars) domen va HTTPS.
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
- VPS olib, unga SSH orqali ulaniladi; root o'rniga
sudoli alohida foydalanuvchi yaxshi amaliyot; - Node.js NodeSource orqali, kod esa
git clonebilan serverga yetkaziladi;npm ci --omit=devishlatiladi; - Maxfiy sozlamalar
.envfaylida saqlanadi va hech qachon Git'ga yuklanmaydi (.gitignorega qo'shiladi); - PM2 ilovani fonda, doimiy va avtomatik qayta ishga tushiriladigan qiladi;
pm2 startup+saveserverni qayta yuklashda tiklaydi; - Nginx reverse proxy 80/443 portidan
localhost:3000dagi Node.js ilovasiga trafikni uzatadi; - Har bir Nginx o'zgarishidan keyin
nginx -tbilan tekshirib, keyinreloadqilinadi.