10.1-bob: Linux server asoslari va SSH
10-QISM — DevOps va Deploy · 1-mavzu
1. Kirish va motivatsiya
9-QISM (Arxitektura)da kodni qanday to'g'ri yozish (SOLID, Clean Architecture, mikroservis, CAP) ni o'rgandik. Lekin eng zo'r yozilgan kod ham sizning kompyuteringizda turib qolsa — hech kimga foydasi yo'q. Endi 10-QISM'da boshqa dunyoga o'tamiz: kodni real serverda ishga tushirish va boshqarish — ya'ni DevOps. Bu — "kodni yozaman, lekin deploy qila olmayman" deydigan junior bilan, "loyihani noldan serverga chiqarib, domen ulab, SSL o'rnatib, monitoring qo'yib beraman" deydigan senior o'rtasidagi eng aniq farq. Najot Ta'limda bu qism ko'pincha yetishmaydi — shuning uchun bu QISM sizga alohida ustunlik beradi.
10-QISM'ning birinchi va eng poydevoriy mavzusi — Linux server asoslari va SSH. Dunyodagi web-serverlarning ~95% Linux'da ishlaydi (AWS, DigitalOcean, Google Cloud — hammasi Linux). Sizning Node.js/NestJS ilovangiz ham oxir-oqibat Linux serverga chiqadi. Demak, Linux'da yo'l topa olish — fayllar qayerda, jarayonlarni qanday boshqarish, port nima, ruxsatlar qanday ishlaydi — bu majburiy ko'nikma, tanlov emas. Va o'sha serverga xavfsiz ulanishning standart usuli — SSH (Secure Shell): parol emas, kriptografik kalit orqali.
Bu bob: server nima (va nega Linux), Linux fayl tizimi ierarxiyasi (/etc, /var, /home), foydalanuvchi va ruxsatlar (chmod, chown, sudo, root), paket boshqaruvi (apt), jarayonlar va systemd (xizmatlar, systemctl), tarmoq asoslari (port, ss, firewall ufw), SSH chuqur (asimmetrik kalitlar, ssh-keygen, ~/.ssh/config, root login o'chirish, fail2ban), fayl uzatish (scp/rsync). Bu bob 0.2 (OS/fayl tizimi), 0.3 (terminal/bash), 0.4 (internet/portlar) ni real serverga ko'taradi va keyingi barcha boblar (Nginx — 10.2, Docker — 10.3, deploy — 10.7) uchun poydevor.
O'xshatish: Linux server — uzoqdagi ijaraga olingan ofis xonasi. Siz unga jismonan kira olmaysiz (server boshqa shaharda, data-markazda). SSH — o'sha xonaning maxsus elektron kaliti (oddiy parol emas, nusxa ko'chirib bo'lmaydigan kriptografik kalit). Fayl tizimi — xonaning javon va shkaflari (
/etc— sozlamalar javoni,/var— kundalik hujjatlar,/home— shaxsiy stol). Ruxsatlar (chmod) — kim qaysi javonni ochishi mumkinligi (egasi, guruh, boshqalar).sudo— direktor kaliti (hamma narsani o'zgartira oladi, lekin ehtiyotkorlik talab qiladi).systemd— xona menejeri (ilovangizni doim yoqilgan holatda ushlab turadi, yiqilsa qayta yoqadi). Firewall (ufw) — eshik qorovuli (faqat ruxsat etilgan portlardan kirgizadi). DevOps — shu butun ofisni masofadan, terminal orqali boshqarish san'ati.
Nega muhim?
- Deploy poydevori — har bir keyingi bob (Nginx, Docker, CI/CD) Linux serverda ishlaydi.
- Xavfsizlik — server eng birinchi nishonida (SSH/firewall to'g'ri sozlanmasa — buziladi).
- Mustaqillik — DevOpschisiz ham o'z loyihangizni chiqara olasiz (full-stack — to'liq).
- Intervyu/ish — "serverga deploy qilganmisan?" — eng keng savol (amaliy ko'nikma).
2. Nazariya — chuqur tushuntirish
2.1. Server nima va nega Linux
SERVER — doim yoqilgan, tarmoqqa ulangan kompyuter (so'rovga xizmat qiladi):
- Sizning laptopingiz: yoqib-o'chiriladi, lokal
- Server: 24/7 yoqilgan, internetda IP manzili bor, ko'p so'rovga javob
TURLARI:
- Fizik server (bare metal) — haqiqiy temir (data-markazda)
- VPS / Virtual server — bitta katta serverdan "kesilgan" bo'lak (DigitalOcean, EC2)
- Bulut (cloud) — kerakli paytda olinadigan resurs (AWS, GCP)
NEGA LINUX (~95% serverlar):
Bepul, ochiq kodli (litsenziya to'lovi yo'q)
Yengil (GUI'siz — faqat terminal, RAM tejaydi)
Barqaror (oylar/yillar qayta yuklamay ishlaydi)
Xavfsiz (ruxsatlar tizimi, ko'p ko'z tekshiradi)
Avtomatlashtirish oson (skript, SSH, CLI)Server — doim yoqilgan, internetga ulangan, so'rovlarga xizmat qiladigan kompyuter (sizning laptopingizdan farqi — 24/7 ishlaydi, public IP bor). Turlari: fizik (bare metal — haqiqiy temir), VPS (katta serverdan virtual kesilgan bo'lak — arzon, boshlang'ich uchun), bulut (cloud — kerakli paytda olinadigan resurs — AWS/GCP). Serverlarning ~95% Linux'da: bepul, yengil (GUI'siz — RAM tejaydi), barqaror (oylab qayta yuklamay), xavfsiz, avtomatlashtirish oson (skript/CLI). Sizning NestJS ilovangiz ham Linux VPS'ga chiqadi 10.7-bob. Eng keng tarqalgan distributiv — Ubuntu Server (boshlang'ich uchun eng qulay).
2.2. Linux fayl tizimi ierarxiyasi (FHS)
LINUX — bitta DARAXT (root "/" dan boshlanadi, Windows'dagi C:\ yo'q):
/ ildiz (hammasi shu yerdan)
├── etc/ SOZLAMALAR (configuration) — nginx.conf, ssh sozlamalari
├── var/ O'ZGARUVCHAN ma'lumot — loglar (/var/log), DB, cache
│ └── log/ tizim va ilova loglari (xato qidirishda 1-joy)
├── home/ oddiy foydalanuvchilar uyi (/home/deploy)
├── root/ root (admin) ning uyi (/home'da emas — alohida)
├── usr/ o'rnatilgan dasturlar (/usr/bin — buyruqlar)
├── bin /sbin asosiy buyruqlar (ls, cp; sbin — admin buyruqlari)
├── tmp/ vaqtinchalik fayllar (qayta yuklashda tozalanadi)
├── opt/ qo'shimcha/uchinchi tomon dasturlar
└── proc /sys virtual (yadro/jarayonlar haqida — fayl emas, jonli)
Windows: disklar (C:, D:). Linux: bitta daraxt (disk "/mnt"ga ulanadi)Linux fayl tizimi — bitta daraxt, ildizi
/(Windows'dagiC:\,D:\yo'q — hamma narsa/ostida — 0.2). Muhim papkalar (FHS — Filesystem Hierarchy Standard):/etc— barcha sozlamalar (nginx, ssh — matn fayllar);/var/log— loglar (xato qidirishda birinchi qaraydigan joy);/home/<user>— foydalanuvchi uyi;/root— admin uyi (alohida);/usr/bin,/bin— buyruqlar (ls,cp);/tmp— vaqtinchalik (qayta yuklashda tozalanadi);/proc,/sys— virtual (jonli yadro ma'lumoti, haqiqiy fayl emas). Serverda yo'l topish uchun bu ierarxiyani bilish shart: sozlama buzilsa/etc; ilova yiqilsa/var/log.
2.3. Foydalanuvchi, guruh va ruxsatlar (permissions)
LINUX — ko'p foydalanuvchili (har fayl EGAsi va GURUHi bor):
$ ls -l app.js
-rw-r--r-- 1 deploy www-data 1024 Jun 22 app.js
│└┬┘└┬┘└┬┘ └──┬──┘ └───┬──┘
│ │ │ │ EGA GURUH
│ │ │ └─ boshqalar (others): r-- (faqat o'qish)
│ │ └──── guruh (group): r-- (faqat o'qish)
│ └─────── ega (owner): rw- (o'qish + yozish)
└───────── tur: - fayl, d papka, l havola (symlink)
RUXSAT HARFLARI: r=read(4) w=write(2) x=execute(1)
RAQAM (octal): rwx = 4+2+1 = 7 ; r-x = 5 ; rw- = 6
chmod 755 file rwx r-x r-x (ega to'liq, boshqalar o'qib/bajaradi)
chmod 644 file rw- r-- r-- (oddiy fayl — ega yozadi, boshqalar o'qiydi)
chmod 600 key rw- --- --- (faqat ega — SSH kalit uchun MAJBURIY)Linux — ko'p foydalanuvchili tizim: har faylda ega (owner), guruh (group) va ruxsatlar bor.
ls -lchiqishida-rw-r--r--: birinchi belgi tur (-fayl,dpapka,lsymlink), keyin 3 ta uchlik — ega / guruh / boshqalar uchun rwx (r=o'qish, w=yozish, x=bajarish). Raqamli (octal) shakl:r=4, w=2, x=1rwx=7, rw-=6, r-x=5. Eng muhim:chmod 644(oddiy fayl — ega yozadi, boshqalar o'qiydi),chmod 755(papka/skript — bajariladigan),chmod 600(faqat ega — SSH maxfiy kaliti uchun majburiy, aks holda SSH kalitni rad etadi). Ega/guruhnichowno'zgartiradi. Ruxsatlar — Linux xavfsizligining asosi.
Simvolik chmod va umask. Raqamli shakldan tashqari chmod simvolik yozuvni ham qabul qiladi — u qismiy o'zgartirish uchun qulay: chmod u+x deploy.sh (egaga bajarish huquqini qo'shadi, qolganiga tegmaydi), chmod go-w file (guruh va boshqalardan yozishni olib tashlaydi), chmod a+r file (hammaga o'qish beradi; a = all), chmod u=rw,go=r file (aniq o'rnatadi — 644 ekvivalenti). Bu yerda u=user/ega, g=group, o=others, a=all; + qo'shadi, - olib tashlaydi, = aniq belgilaydi. Papkani rekursiv o'zgartirish — chmod -R 755 /var/www (ehtiyot bo'ling: fayllarga x bermaslik uchun find+-type bilan ajratish yaxshiroq). Yangi yaratilgan fayl qanday ruxsat olishini umask belgilaydi: u standart ruxsatdan ayiriladigan niqob. Odatiy umask 022 — yangi fayl 666-022=644, yangi papka 777-022=755 bo'ladi. umask 077 (ko'proq maxfiy — faqat ega ko'radi) serverda maxfiy fayllar uchun tavsiya etiladi. umask (argumentsiz) joriy qiymatni ko'rsatadi.
Maxsus bitlar — SUID, SGID, sticky. Uch tayanch ruxsatdan tashqari uchta maxsus bit bor: SUID (Set User ID, 4xxx) — bajariladigan fayl egasining huquqi bilan ishlaydi, kim ishga tushirsa ham (ls -lda ega x o'rnida s ko'rinadi). Klassik misol — passwd: oddiy user parolini o'zgartirganda /etc/shadowga yozadi, chunki passwd SUID-root. SGID (Set Group ID, 2xxx) — papkaga qo'yilsa, undagi yangi fayllar papka guruhini meros qiladi (jamoaviy papkalar uchun foydali). Sticky bit (1xxx) — papkaga qo'yilsa, faylni faqat egasi o'chira oladi (boshqa yozish huquqi bo'lsa ham). Klassik misol — /tmp (drwxrwxrwt — oxirdagi t sticky): hamma yozadi, lekin o'zganing faylini o'chira olmaydi. O'rnatish: chmod u+s file (SUID), chmod g+s dir (SGID), chmod +t dir (sticky) yoki raqamli — chmod 4755, chmod 2775, chmod 1777. Xavfsizlik: find / -perm -4000 -type f 2>/dev/null bilan tizimdagi barcha SUID fayllarni topib, notanish/keraksizlarini tekshirish — audit odati.
2.4. root, sudo va eng kam imtiyoz
ROOT — superfoydalanuvchi (Windows "Administrator" + cheksiz):
- UID 0, hamma narsani qila oladi (har faylni o'chirish, har sozlamani)
- XAVFLI: "rm -rf /" — butun tizimni o'chiradi (ortga yo'l yo'q)
SUDO — "superuser do" — vaqtincha root huquqi (bitta buyruq uchun):
$ apt install nginx Permission denied (oddiy user)
$ sudo apt install nginx parol so'raydi, root sifatida bajaradi
ENG YAXSHI AMALIYOT (least privilege — eng kam imtiyoz):
Doim root sifatida ishlash (xato = falokat)
Oddiy user (deploy) yaratish + kerak bo'lganda sudo
Root bilan SSH'ni butunlay O'CHIRISH (2.10, xavfsizlik)root — superfoydalanuvchi (UID 0), hamma narsani qila oladi: har faylni o'chirish, har sozlamani o'zgartirish. Xavfli —
rm -rf /butun tizimni qaytarib bo'lmaydigan tarzda o'chiradi.sudo("superuser do") — oddiy foydalanuvchiga bitta buyruq uchun vaqtincha root huquqi beradi (sudo apt install nginx— parol so'rab, root sifatida bajaradi). Eng kam imtiyoz (least privilege) tamoyili: doim root bo'lib ishlama (bitta xato = falokat); o'rniga oddiy foydalanuvchi (masalandeploy) yarat va kerak bo'lgandasudoishlat. Eng yaxshisi — root bilan to'g'ridan-to'g'ri SSH ulanishni butunlay o'chirish 2.10-bob. Bu — server xavfsizligining 1-qadami.
Foydalanuvchi va guruh boshqaruvi. Foydalanuvchi yaratishning ikki yo'li bor: adduser deploy (Debian/Ubuntu'ning yuqori darajali, interaktiv skripti — parol so'raydi, /home/deploy yaratadi, standart sozlaydi — odam uchun eng qulay) va useradd (past darajali, universal buyruq — skriptda ishlatiladi: useradd -m -s /bin/bash deploy, bunda -m uy papkasini yaratadi, -s login shellni belgilaydi). Parolni alohida passwd deploy o'rnatadi. Foydalanuvchini guruhga qo'shish — usermod -aG sudo deploy (-aG = append to Group; -a shart, aks holda mavjud guruhlar o'chib ketadi!). Foydalanuvchi qaysi guruhlarda ekanini groups deploy yoki id deploy ko'rsatadi. Guruh yaratish — groupadd, o'chirish — userdel -r deploy (-r uy papkasini ham o'chiradi). Har foydalanuvchi /etc/passwdda (UID, uy, shell), parollar /etc/shadowda (hash), guruhlar /etc/groupda yoziladi.
sudo va visudo. sudo huquqi ikki yo'l bilan beriladi: (1) foydalanuvchini sudo guruhiga qo'shish (Ubuntu; RHEL'da wheel guruhi), (2) /etc/sudoers faylini tahrirlash. Bu faylni hech qachon oddiy tahrirlagichda ochmang — sudo visudo ishlating: u saqlashdan oldin sintaksisni tekshiradi (xato bo'lsa saqlamaydi — aks holda sudo butunlay ishlamay qolib, tizimga admin sifatida kira olmay qolish xavfi bor). Sudoers qatori namunasi: deploy ALL=(ALL:ALL) ALL (deploy istalgan buyruqni root sifatida bajaradi, parol so'raladi). Parolsiz sudo (avtomatlashtirish/CI uchun, ehtiyotkorlik bilan): deploy ALL=(ALL) NOPASSWD: /bin/systemctl restart myapp — faqat aniq buyruqqa parolsiz ruxsat. Alohida qoidalarni /etc/sudoers.d/ papkasiga alohida fayl sifatida qo'yish tavsiya etiladi (asosiy faylni buzmaydi).
2.5. Paket boshqaruvi (apt)
PAKET MENEJERI — dasturlarni o'rnatadi/yangilaydi (npm'ga o'xshash, lekin OS uchun):
Ubuntu/Debian apt ; Red Hat/CentOS yum/dnf ; Alpine apk
ASOSIY BUYRUQLAR (apt):
sudo apt update paket ro'yxatini yangilash (eng avval — har doim)
sudo apt upgrade o'rnatilgan paketlarni yangilash
sudo apt install nginx yangi paket o'rnatish
sudo apt remove nginx o'chirish (sozlama qoladi)
sudo apt purge nginx o'chirish + sozlama
apt search node qidirish
"update" = ro'yxat yangilash; "upgrade" = paketlarni yangilash (ikki xil!)
har o'rnatishdan oldin: sudo apt updatePaket menejeri — OS uchun dastur o'rnatuvchi (npm'ning OS'dagi ekvivalenti, lekin tizim darajasida). Ubuntu/Debian'da —
apt. Asosiy buyruqlar:sudo apt update(paket ro'yxatini yangilaydi — har o'rnatishdan oldin bajariladi),sudo apt upgrade(o'rnatilganlarni yangilaydi),sudo apt install <paket>(o'rnatadi),apt remove/purge(o'chiradi — purge sozlama bilan).update≠upgrade: birinchisi ro'yxatni yangilaydi (qaysi versiyalar bor), ikkinchisi paketlarni yangilaydi. Har doim avvalupdate. Boshqa OS: CentOS —yum/dnf, Alpine —apk(Docker'da ko'p ishlatiladi — 10.3).
2.6. Jarayonlar va systemd (xizmatlar)
JARAYON (process) — ishlab turgan dastur (PID — process ID bor):
ps aux barcha jarayonlar
top / htop jonli monitor (CPU/RAM — kim ko'p yeyapti)
kill <PID> jarayonni to'xtatish (SIGTERM — muloyim)
kill -9 <PID> majburan o'ldirish (SIGKILL — oxirgi chora)
SYSTEMD — Linux'ning "boshqaruvchisi" (init tizimi, PID 1):
xizmatlarni (service) ishga tushiradi, kuzatadi, yiqilsa qayta yoqadi
systemctl status nginx holatini ko'rish (ishlayaptimi?)
sudo systemctl start nginx ishga tushirish
sudo systemctl stop nginx to'xtatish
sudo systemctl restart nginx qayta ishga tushirish
sudo systemctl enable nginx AVTOYUK (server qayta yuklansa — o'zi yonadi)
journalctl -u nginx -f xizmat loglari (jonli — xato qidirish)Jarayon (process) — ishlab turgan dastur (har birida PID — process ID). Boshqarish:
ps aux(barcha jarayonlar),htop/top(jonli monitor — kim CPU/RAM yeyapti),kill <PID>(muloyim to'xtatish — SIGTERM),kill -9(majburan — SIGKILL, oxirgi chora).systemd— Linux'ning bosh boshqaruvchisi (init, PID 1): xizmatlarni ishga tushiradi, kuzatadi, yiqilsa qayta yoqadi.systemctlbuyruqlari:status(holat),start/stop/restart, va eng muhimienable(avtoyuk — server qayta yuklansa xizmat o'zi yonadi). Xizmat loglari —journalctl -u <xizmat> -f(jonli). Node.js ilovangizni doimiy ishlatish uchun ham systemd service yoki PM2 ishlatasiz 10.7-bob — terminal yopilsa ham ishlab tursin.
Process signallari. kill aslida jarayonga signal yuboradi (nomi "kill" bo'lsa ham har doim o'ldirmaydi). Muhim signallar: SIGTERM (15, standart — jarayonga "muloyimlik bilan tugat" deydi, u tozalash ishini bajarib chiqishga ulguradi), SIGKILL (9 — yadro darajasida majburan o'ldiradi, jarayon ushlab qololmaydi, oxirgi chora — tozalanmagan holat qoldirishi mumkin), SIGHUP (1 — ko'p demonlar buni "sozlamani qayta o'qi" sifatida qabul qiladi), SIGINT (2 — terminalda Ctrl+C), SIGSTOP/SIGCONT (jarayonni to'xtatib turish/davom ettirish). Yuborish: kill -TERM <PID>, kill -9 <PID>, yoki nom bo'yicha pkill -f node / killall node. Prioritet: nice -n 10 node script.js (past prioritet bilan ishga tushiradi; -20=eng yuqori … 19=eng past), ishlayotgan jarayonni renice -n 5 -p <PID> o'zgartiradi. Fon rejimi: & (fonga yuborish), jobs (fon vazifalari), nohup cmd & (terminal yopilsa ham davom etadi) — lekin production uchun bu emas, systemd ishlatiladi.
systemd unit fayl tuzilishi. Xizmat .service fayli uch bo'limdan iborat: [Unit] (meta — Description, After=network.target bog'liqlik tartibi), [Service] (asosiy — ExecStart ishga tushirish buyrug'i, User/Group kim sifatida, WorkingDirectory, Restart=always|on-failure, RestartSec=5 qayta urinish oralig'i, Environment= yoki EnvironmentFile=/etc/myapp.env env o'zgaruvchilar), [Install] (WantedBy=multi-user.target — enable qilinganda qaysi maqsadga bog'lanadi). Type=simple (standart — ExecStart to'g'ridan asosiy jarayon), Type=forking (demon o'zi fonga o'tsa), Type=notify (jarayon "tayyorman" deb xabar bersa). Fayl /etc/systemd/system/da yaratiladi; o'zgartirgach sudo systemctl daemon-reload shart (systemd yangi konfigni qayta o'qishi uchun). To'liq misol — Misol 7.
2.7. Tarmoq asoslari (port, IP, firewall)
PORT — bitta IP'dagi "eshik raqami" (qaysi xizmat — 0.4):
22 SSH 80 HTTP 443 HTTPS
3000 Node.js 5432 PostgreSQL 6379 Redis 27017 MongoDB
TEKSHIRISH:
ss -tulpn qaysi portlar ochiq + qaysi jarayon eshityapti
curl localhost:3000 lokal port javob beradimi
ping example.com server yetib boryaptimi (tarmoq tirikmi)
FIREWALL (ufw — Uncomplicated Firewall) — qaysi portga ruxsat:
sudo ufw allow 22 SSH (AVVAL bu — aks holda o'zingizni qulflab qo'yasiz!)
sudo ufw allow 80,443 web
sudo ufw enable yoqish (qolgan portlar YOPIQ — default deny)
sudo ufw status qoidalarni ko'rish
Firewall — faqat keraklisi ochiq (3000, 5432 — tashqaridan YOPIQ bo'lsin)Port — bitta IP manzildagi "eshik raqami" — qaysi xizmat ekanini bildiradi 0.4-bob: 22 (SSH), 80 (HTTP), 443 (HTTPS), 3000 (Node default), 5432 (PostgreSQL), 6379 (Redis), 27017 (MongoDB). Tekshirish:
ss -tulpn(qaysi portlar ochiq + qaysi jarayon eshitayapti),curl localhost:3000(lokal javob),ping(tarmoq tirikmi). Firewall (ufw— Uncomplicated Firewall) — qaysi portga tashqaridan ruxsat berishni boshqaradi:sudo ufw allow 22(SSH — eng avval, aks holda enable qilganda o'zingizni serverdan qulflab qo'yasiz!),allow 80,443(web),enable(yoqadi — qolganlari yopiq, default deny). Tamoyil: faqat keraklisi ochiq bo'lsin — DB portlari (5432, 27017) tashqaridan yopiq (faqat lokal/ichki tarmoq).
Tarmoq diagnostikasi. ss (socket statistics) — eski netstatning zamonaviy o'rnini bosuvchisi (tezroq): ss -tulpn — -t TCP, -u UDP, -l faqat tinglayotgan (listening) soketlar, -p jarayon nomi, -n raqamli (nom yechishsiz). ss -tan state established — barcha o'rnatilgan ulanishlar. DNS tekshirish: dig example.com (batafsil DNS javob — A yozuvi, TTL), dig +short example.com (faqat IP), dig example.com MX (pochta yozuvlari), nslookup (soddaroq alternativa), host example.com. curl — HTTP diagnostikasi: curl -I https://sayt.uz (faqat sarlavhalar — status kodi, server), curl -v (batafsil — TLS handshake ko'rinadi), curl -L (redirect'ga ergashadi), curl -o file url (yuklab olish). ping (server tirikmi — ICMP), traceroute/mtr (paket qaysi yo'ldan boradi), telnet host 443 yoki nc -zv host 443 (aniq port ochiqmi). ss -tulpn — deploy'da "port nima uchun band?" yoki "ilovam qaysi portda?" degan savolga birinchi javob beruvchi buyruq.
Disk va tizim monitoringi. Disk: df -h (bo'sh joy fayl tizimlari bo'yicha — -h GB/MB), du -sh /var/log (papka hajmi — -s yig'indi, -h o'qiladigan; du -sh * | sort -h — eng katta papkalarni topish), lsblk (disk qurilmalari va bo'limlar daraxti), ncdu (interaktiv disk tahlilchi — nima joyni yeyayotganini tez topadi). Xotira/CPU: free -h (RAM va swap), uptime (ishlash vaqti + load average — oxirgi 1/5/15 daqiqadagi o'rtacha yuk; qiymat CPU yadrolar sonidan katta bo'lsa — server ortiqcha yuklangan), vmstat 1 (har soniyada tizim statistikasi — CPU, xotira, I/O), top/htop (jonli jarayon monitori), iostat/iotop (disk I/O). Deploy'dagi eng keng muammolar diagnostikasi: df -h (disk to'ldimi?), free -h (RAM tugadimi — OOM killer jarayonni o'ldiradi), uptime (yuk yuqorimi?).
2.8. SSH nima va asimmetrik kriptografiya
SSH (Secure Shell) — uzoq serverga SHIFRLANGAN ulanish (terminal masofadan):
ssh deploy@203.0.113.5 deploy foydalanuvchi sifatida ulanish
IKKI XIL AUTENTIFIKATSIYA:
1. PAROL — zaif (brute-force, o'g'irlanadi)
2. SSH KALIT (asimmetrik) — kuchli
ASIMMETRIK KALIT JUFTI (juft kalit — biri yopiq, biri ochiq):
┌─────────────────────────┐ ┌──────────────────────────┐
│ PRIVATE KEY (maxfiy) │ │ PUBLIC KEY (ochiq) │
│ id_ed25519 │ │ id_ed25519.pub │
│ SIZNING kompyuterda │ │ SERVERga joylanadi │
│ HECH KIMGA berilmaydi│ │ ochiq tarqalsa ham OK │
└─────────────────────────┘ └──────────────────────────┘
│ │
└──── matematik bog'liq (juft) ──────┘
Server "public" bilan tekshiradi; faqat "private" egasi kira oladi
Private kalit hech qachon serverga/tarmoqqa CHIQMAYDI (lokal qoladi)SSH (Secure Shell) — uzoqdagi serverga shifrlangan ulanish (masofadan terminal —
ssh deploy@<IP>). Ikki xil autentifikatsiya: parol (zaif — brute-force bilan topiladi, o'g'irlanadi ) va SSH kalit (kuchli ). Kalit usuli asimmetrik kriptografiyaga asoslanadi: juft kalit — private (maxfiy —id_ed25519, faqat sizning kompyuteringizda, hech kimga berilmaydi) va public (ochiq —id_ed25519.pub, serverga joylanadi, ochiq tarqalsa ham xavfsiz). Ular matematik bog'liq. Server public kalit bilan tekshiradi, lekin faqat private egasi kira oladi. Eng muhim qoida: private kalit hech qachon serverga yoki tarmoqqa chiqmaydi — u faqat lokalda qoladi. Shuning uchun parolga qaraganda ancha xavfsiz.
2.9. SSH kalit yaratish va serverga joylash
1. KALIT YARATISH (lokal kompyuterda — bir marta):
ssh-keygen -t ed25519 -C "email@example.com"
~/.ssh/id_ed25519 (private — maxfiy)
~/.ssh/id_ed25519.pub (public — ulashiladigan)
2. PUBLIC KALITNI SERVERGA JOYLASH:
ssh-copy-id deploy@203.0.113.5 avtomatik (eng oson)
public kalit serverda ~/.ssh/authorized_keys ga qo'shiladi
3. ULANISH (endi parolsiz):
ssh deploy@203.0.113.5 kalit bilan, parol so'ramaydi
ED25519 vs RSA:
- ed25519 zamonaviy, qisqa, tez, xavfsiz (2026 standart)
- rsa 4096 eski, hali keng, lekin uzunSSH kalit jarayoni (3 qadam): (1) yaratish — lokal kompyuterda bir marta
ssh-keygen -t ed25519 -C "email"ikki fayl:~/.ssh/id_ed25519(private — maxfiy) vaid_ed25519.pub(public). (2) joylash —ssh-copy-id deploy@<IP>public kalitni serverda~/.ssh/authorized_keysfaylga qo'shadi (avtomatik, eng oson usul). (3) ulanish —ssh deploy@<IP>endi parolsiz, kalit orqali. Kalit turi:ed25519— zamonaviy, qisqa, tez, xavfsiz (2026 standarti — shuni ishlating);rsa 4096— eski lekin hali keng tarqalgan. Parol o'rnigassh-keygenpaytida passphrase qo'ysangiz — kalit o'g'irlansa ham ochilmaydi (qo'shimcha himoya,ssh-agenteslab qoladi).
2.10. SSH xavfsizligini qattiqlashtirish (hardening)
SSH SERVER SOZLAMASI: /etc/ssh/sshd_config (root tahrirlaydi)
PermitRootLogin no root bilan to'g'ridan ulanishni TAQIQLA
PasswordAuthentication no parolni butunlay O'CHIR (faqat kalit)
Port 2222 (ixtiyoriy) standart 22 ni o'zgartiring (botlar kamayadi)
o'zgartirgach: sudo systemctl restart ssh
FAIL2BAN — brute-force botlarni avtomatik bloklash:
sudo apt install fail2ban
5 marta noto'g'ri urinsa, IP'ni vaqtincha bloklaydi
TARTIB (o'zingizni qulflab qo'ymaslik uchun):
1. AVVAL kalit bilan ulanishni sinab ko'ring (ishlayotganiga ishonch hosil qiling)
2. KEYIN parol autentifikatsiyani o'chiring
3. firewall'da 22 (yoki yangi port) OCHIQ ekanini tekshiringSSH hardening (qattiqlashtirish) — server sozlamasi
/etc/ssh/sshd_configda:PermitRootLogin no(root bilan to'g'ridan ulanishni taqiqlaydi — 2.4),PasswordAuthentication no(parolni butunlay o'chiradi — faqat kalit qoladi, brute-force imkonsiz), ixtiyoriyPort 2222(standart 22'ni o'zgartirsangiz avtomatik botlar kamayadi). O'zgartirgachsudo systemctl restart ssh.fail2ban— noto'g'ri urinishlarni kuzatib, bir necha marta xato kiritgan IP'ni avtomatik bloklaydi (brute-force botlarga qarshi). Xavfsiz tartib (o'zingizni qulflab qo'ymaslik uchun): avval kalit bilan ulanish ishlayotganiga ishonch hosil qiling, keyin parolni o'chiring, va firewall'da SSH porti ochiqligini tekshiring. Aks holda — serverga butunlay kira olmay qolasiz.
2.11. Fayl uzatish (scp, rsync) va best practices
FAYL UZATISH (lokal server):
scp app.zip deploy@IP:/home/deploy/ bitta fayl yuborish
scp deploy@IP:/var/log/app.log ./ serverdan olish
rsync -avz ./dist/ deploy@IP:/var/www/ papka sinxron (faqat o'zgargani — tez)
BEST PRACTICES (server boshqaruvi):
Root SSH o'chirilgan, oddiy user + sudo (2.4, 2.10)
Faqat kalit (parol o'chirilgan), fail2ban 2.10-bob
Firewall: faqat 22/80/443 ochiq 2.7-bob
apt update && upgrade muntazam (xavfsizlik yamoq'lari)
~/.ssh/config bilan qisqa nom (2.12 — Misol)
Loglarni kuzat (/var/log, journalctl — 2.6)
Hech narsani root home'da saqlama, /var/www ishlatib deploy qilFayl uzatish:
scp(secure copy — bitta fayl/papka:scp app.zip deploy@IP:/path/yuborish, teskari yo'nalish — olish);rsync -avz(papkani sinxronlash — faqat o'zgargan qismni uzatadi, shuning uchun tez, deploy uchun ideal);sftp deploy@IP(interaktiv fayl seansi —put/get/ls/cdbuyruqlari bilan,scpga qaraganda ko'proq nazorat, katta hajmda navigatsiya qulay). Uchalasi ham SSH kanali (22-port) orqali shifrlangan ishlaydi — alohida port yoki sozlama shart emas.rsyncmasofadasshtransportidan foydalanadi:rsync -avz -e "ssh -p 2222" ./dist/ deploy@IP:/path/(nostandart port bo'lsa). Server boshqaruvining best practice'lari: root SSH'ni o'chirish + oddiy user/sudo 2.4-bob; faqat kalit + fail2ban 2.10-bob; firewall'da faqat 22/80/443 ochiq 2.7-bob;apt update && upgrademuntazam (xavfsizlik yamoqlari uchun); loglarni kuzatish (/var/log,journalctl); ilovani/var/wwwyoki/home/deploy/appda joylab, systemd/PM2 bilan doimiy ishlatish 10.7-bob. Bularning hammasi — server birinchi sozlanganda (initial setup) bajariladi.
2.12. SSH ilg'or: ~/.ssh/config, ssh-agent va tunneling
~/.ssh/config — takroriy ulanishlarni soddalashtiradi (lokalda):
Host prod
HostName 203.0.113.5
User deploy
Port 22
IdentityFile ~/.ssh/id_ed25519
"ssh prod" yetarli (uzun buyruq o'rniga)
SSH-AGENT — passphrase'ni bir marta so'raydi, seansda eslab qoladi:
eval "$(ssh-agent -s)" agentni ishga tushirish
ssh-add ~/.ssh/id_ed25519 kalitni agentga qo'shish (passphrase 1 marta)
PORT-FORWARDING (tunneling) — shifrlangan kanal orqali port ulash:
ssh -L 5432:localhost:5432 deploy@IP LOKAL: masofadagi DB'ga lokalday ulanish
ssh -R 8080:localhost:3000 deploy@IP REMOTE: serverdan lokal portga
ssh -D 1080 deploy@IP DYNAMIC: SOCKS proksi (barcha trafik server orqali)
~/.ssh/config— lokal kompyuterdagi ulanish sozlamalari fayli: har server uchunHostbloki (taxallus +HostName,User,Port,IdentityFile) yozib qo'yilsa, uzunssh -i ... -p ... user@IPo'rniga shunchakissh prodyetadi (scp,rsync,githam shu taxallusni tanadi). Qo'shimcha foydali sozlamalar:ServerAliveInterval 60(ulanish uzilmasligi uchun),ForwardAgent yes(agent'ni serverga uzatish — zanjirli ulanishda).ssh-agent— passphrase bilan himoyalangan kalitni har ulanishda qayta so'ramaslik uchun:ssh-addbilan kalitni bir marta qulfdan chiqarasiz, agent uni seans davomida xotirada tutadi (ssh-add -lro'yxatni ko'rsatadi). Port-forwarding (tunneling) — SSH'ning kuchli imkoniyati: shifrlangan kanal ichida boshqa portni "o'tkazish". Local (-L) — masofadagi xizmatga (masalan serverdagi PostgreSQL 5432 yoki faqat lokalga bog'langan admin panel) lokal kompyuterdan xavfsiz ulanish, portni tashqariga ochmasdan (DB firewall ortida yopiq qolib, siz tunnel orqali kirasiz). Remote (-R) — teskari: server sizning lokal portingizga kirsin (masalan lokal dev-serverni vaqtincha ko'rsatish). Dynamic (-D) — SOCKS proksi yaratadi, barcha brauzer trafigini server orqali yo'naltiradi (xavfsiz kanal). Tunneling — DB'ni internetga ochmasdan boshqarish (5432 firewall'da yopiq bo'lsa ham,ssh -Lorqali lokalday ishlaysiz) uchun eng xavfsiz usul.
2.13. Bash muhiti: env, PATH, alias, cron
MUHIT O'ZGARUVCHILARI (environment variables):
echo $PATH qayerdan buyruq qidiriladi (":" bilan ajratilgan papkalar)
export NODE_ENV=production o'zgaruvchi o'rnatish (bola jarayonlarga meros)
printenv | grep NODE joriy env'ni ko'rish
~/.bashrc har terminal ochilganda o'qiladi (alias, PATH shu yerda)
ALIAS — qisqa taxallus:
alias ll='ls -la' "ll" endi "ls -la" bo'ladi (~/.bashrc'ga yozing)
CRON — vaqt jadvali bo'yicha avtomatik ish:
crontab -e foydalanuvchi cron jadvalini tahrirlash
0 3 * * * /home/deploy/backup.sh har kuni soat 03:00 da backup
│ │ │ │ │
min soat kun oy hafta-kuniMuhit o'zgaruvchilari (env). Bash jarayoni sozlamalarni env o'zgaruvchilardan oladi. Eng muhimi —
PATH::bilan ajratilgan papkalar ro'yxati, shell buyruqni shu papkalardan tartib bilan qidiradi (which node— qaysi yo'ldan topilishini ko'rsatadi).export VAR=qiymato'zgaruvchini o'rnatadi va uni bola jarayonlarga meros qiladi (exportsiz faqat joriy shellda qoladi).printenvyokienvbarcha o'zgaruvchilarni,echo $VARbittasini ko'rsatadi. IlovaningNODE_ENV,DATABASE_URLkabi sozlamalari — env orqali 10.11-bob. Shell sozlash fayllari:~/.bashrc(har interaktiv terminal ochilganda o'qiladi — alias va PATH shu yerda),~/.profile/~/.bash_profile(login paytida),/etc/environment(tizim bo'yicha).alias— uzun buyruqqa qisqa nom:alias ll='ls -la',alias gs='git status'— doimiy bo'lishi uchun~/.bashrcga yozing.cron— vaqt jadvali bo'yicha avtomatik vazifalar:crontab -ejadvalni tahrirlaydi,crontab -lko'rsatadi. Qator formati — besh maydon (min soat oy-kuni oy hafta-kuni) + buyruq:0 3 * * *(har kuni 03:00),*/15 * * * *(har 15 daqiqada),0 0 * * 0(har yakshanba yarim tunda). Serverda cron — backup, log tozalash, sertifikat yangilash (Certbot — 10.7) kabi takroriy ishlar uchun ishlatiladi.
NAVIGATSIYA 0.3-bob: pwd | ls -la | cd /etc | cat file | nano file
FAYL: cp a b | mv a b | rm file | rm -rf dir | mkdir -p a/b | touch file
RUXSAT 2.3-bob: chmod 644 file | chmod 600 key | chmod u+x sh | chown deploy:deploy file | umask 022
MAXSUS BIT 2.3-bob: chmod 4755 (SUID) | chmod 2775 (SGID) | chmod 1777 (sticky) | find / -perm -4000
USER 2.4-bob: adduser deploy | usermod -aG sudo deploy | id deploy | passwd deploy | visudo
PAKET 2.5-bob: sudo apt update && sudo apt upgrade | sudo apt install nginx | apt search | dpkg -l
JARAYON 2.6-bob: ps aux | htop | kill -TERM PID | kill -9 PID | nice/renice | systemctl status|restart|enable X
LOG 2.6-bob: journalctl -u nginx -f | journalctl -p err -b | tail -f /var/log/syslog
TARMOQ 2.7-bob: ss -tulpn | curl -I url | dig +short host | ping host | ufw allow 22 | ufw status
DISK/TIZIM 2.7-bob: df -h | du -sh * | lsblk | free -h | uptime | vmstat 1
SSH (2.8-9): ssh-keygen -t ed25519 | ssh-copy-id user@IP | ssh user@IP | ssh-add key
TUNNEL 2.12-bob: ssh -L 5432:localhost:5432 IP | ssh -R port:... | ssh -D 1080 IP
UZATISH 2.11-bob: scp file user@IP:/path | rsync -avz ./dist/ user@IP:/var/www/ | sftp user@IP
BASH 2.13-bob: echo $PATH | export VAR=x | alias ll='ls -la' | crontab -e | source ~/.bashrc4. Batafsil kod namunalari
Misol 1 — Yangi serverga birinchi ulanish va tekshirish
# Lokal kompyuterdan serverga ulanish (provayder root parol/kalit beradi)
ssh root@203.0.113.5 # birinchi marta — root bilan (keyin o'chiramiz)
# Server haqida asosiy ma'lumot (qayerga tushdik?)
hostnamectl # OS, yadro versiyasi, hostname
df -h # disk bo'sh joyi (-h = inson o'qiydigan: GB)
free -h # RAM holati
uptime # qancha vaqt yoqilgan, yuk (load average)
whoami # hozir kim sifatida ishlayapmiz (root)Misol 2 — Oddiy foydalanuvchi yaratish (least privilege — 2.4)
# Root sifatida — yangi "deploy" foydalanuvchi yaratamiz (doim root ishlamaymiz)
adduser deploy # parol va ma'lumot so'raydi (interaktiv)
usermod -aG sudo deploy # "sudo" guruhiga qo'shamiz (-aG = append Group)
# endi deploy 'sudo' bilan admin ish qila oladi
# deploy uchun SSH kalitni ko'chiramiz (root'dagi kalit deploy'ga ishlasin)
rsync --archive --chown=deploy:deploy ~/.ssh /home/deploy
# --chown bilan egasini deploy qilamiz (aks holda deploy o'qiy olmaydi — 2.3)
su - deploy # deploy'ga o'tib tekshiramiz (switch user)
sudo whoami # "root" chiqsa, sudo ishlayapti Misol 3 — SSH kalit yaratish va parolsiz ulanish (2.9)
# === LOKAL kompyuterda (server emas!) — kalit juftini yaratamiz ===
ssh-keygen -t ed25519 -C "men@gmail.com"
# Enter (default joy: ~/.ssh/id_ed25519) passphrase (ixtiyoriy, lekin tavsiya)
# Natija: id_ed25519 (private — MAXFIY) + id_ed25519.pub (public)
# Public kalitni serverdagi deploy'ga joylaymiz (avtomatik)
ssh-copy-id deploy@203.0.113.5
# public kalit serverda ~/.ssh/authorized_keys ga qo'shiladi
# Endi parolsiz ulanish (kalit orqali)
ssh deploy@203.0.113.5 # parol so'ramaydi — kalit ishlaydi
# Agar so'rasa: kalit ruxsati noto'g'ri (chmod 600 ~/.ssh/id_ed25519 — 2.3)Misol 4 — SSH config bilan qisqa nom (2.11)
# Lokal: ~/.ssh/config fayliga yozamiz (har safar uzun IP yozmaymiz)
Host myserver # qisqa taxallus
HostName 203.0.113.5 # haqiqiy IP
User deploy # qaysi foydalanuvchi
Port 22 # SSH porti (o'zgartirgan bo'lsangiz — 2222)
IdentityFile ~/.ssh/id_ed25519 # qaysi private kalit
# Endi shunchaki:
# ssh myserver "ssh deploy@203.0.113.5 -i ..." o'rniga
# scp file myserver:/var/www/ scp ham shu nom bilan ishlaydiMisol 5 — Firewall sozlash (ufw — 2.7)
sudo ufw default deny incoming # kiruvchi — hammasi YOPIQ (default)
sudo ufw default allow outgoing # chiquvchi — ochiq (server internetga chiqsin)
sudo ufw allow OpenSSH # SSH (22) — AVVAL bu! (qulflanib qolmaslik)
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw enable # yoqish (tasdiqlash so'raydi)
sudo ufw status verbose # qoidalarni ko'rish
# 3000 (Node), 5432 (DB) ni OCHMAYMIZ — Nginx 10.2-bob orqali 80/443'dan kiradiMisol 6 — SSH hardening (xavfsizlik — 2.10)
# Server sozlamasini tahrirlaymiz (root huquqi bilan)
sudo nano /etc/ssh/sshd_config
# Quyidagilarni topib o'zgartiramiz (yoki qo'shamiz):
# PermitRootLogin no root SSH taqiqlanadi
# PasswordAuthentication no faqat kalit (parol o'chiq)
# PubkeyAuthentication yes kalit autentifikatsiya yoqilgan
sudo systemctl restart ssh # sozlama kuchga kirsin
# AVVAL yangi terminalda "ssh deploy@IP" ishlayotganini tekshiring,
# KEYIN eski terminalni yoping (aks holda qulflanib qolasiz!)
# fail2ban — brute-force botlarni bloklash
sudo apt update && sudo apt install -y fail2ban
sudo systemctl enable --now fail2ban # yoqish + avtoyuk (2.6)
sudo fail2ban-client status sshd # bloklangan IP'larMisol 7 — Node.js ilovani systemd xizmati qilish (2.6)
# /etc/systemd/system/myapp.service (sudo nano bilan yaratamiz)
[Unit]
Description=My NestJS App # tavsif
After=network.target # tarmoq tayyor bo'lgach ishga tushsin
[Service]
Type=simple
User=deploy # deploy sifatida (root EMAS — 2.4)
WorkingDirectory=/home/deploy/app # ilova papkasi
ExecStart=/usr/bin/node dist/main.js # ishga tushirish buyrug'i
Restart=always # yiqilsa — QAYTA yoq (doimiy ishlasin)
Environment=NODE_ENV=production # env o'zgaruvchi (5.8)
[Install]
WantedBy=multi-user.target # boot'da yoqilsinsudo systemctl daemon-reload # systemd yangi faylni o'qisin
sudo systemctl enable --now myapp # yoqish + avtoyuk
sudo systemctl status myapp # ishlayaptimi?
journalctl -u myapp -f # jonli loglar (xato qidirish)Misol 8 — Loyihani serverga deploy qilish (rsync — 2.11)
# === LOKAL: ilovani build qilamiz ===
npm run build # dist/ papka hosil bo'ladi
# Faqat o'zgargan fayllarni serverga sinxron (tez — rsync)
rsync -avz --delete ./dist/ myserver:/home/deploy/app/dist/
# │ │ │ └─ manbada yo'q fayllarni serverdan o'chiradi (toza nusxa)
# │ │ └─ siqib uzat (tezroq)
# │ └─ batafsil chiqish
# └─ archive (ruxsat/vaqt saqlanadi)
# Serverda ilovani qayta ishga tushirish
ssh myserver "sudo systemctl restart myapp"
ssh myserver "journalctl -u myapp -n 30 --no-pager" # oxirgi 30 logMisol 9 — Log va muammoni tekshirish (debugging)
# Ilova ishlamayapti — qayerdan boshlash kerak?
sudo systemctl status myapp # 1. xizmat holati (faol? yiqilgan?)
journalctl -u myapp -n 50 --no-pager # 2. oxirgi 50 log (xato xabari)
ss -tulpn | grep 3000 # 3. port eshityaptimi?
curl -I localhost:3000 # 4. lokal javob beradimi?
df -h # 5. disk to'lib qolmadimi? (tez-tez sabab)
free -h # 6. RAM tugamadimi? (OOM — process o'ladi)
sudo journalctl -p err -b # 7. tizimdagi barcha xatolar (bu yuklash)Misol 10 — Yangi server uchun to'liq setup skripti (umumlashma)
#!/bin/bash
# initial-setup.sh — yangi Ubuntu serverni deploy uchun tayyorlash (root bilan)
set -e # birorta buyruq xato qilsa — to'xta
apt update && apt upgrade -y # tizimni yangilash (2.5)
adduser --gecos "" deploy # foydalanuvchi (interaktivsiz)
usermod -aG sudo deploy # sudo huquqi (2.4)
rsync --archive --chown=deploy:deploy ~/.ssh /home/deploy # kalit ko'chirish
# Firewall (2.7)
ufw allow OpenSSH && ufw allow 80/tcp && ufw allow 443/tcp
ufw --force enable
# Node.js o'rnatish (NodeSource — 5.1)
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
apt install -y nodejs
# Xavfsizlik (2.10)
apt install -y fail2ban
systemctl enable --now fail2ban
# Avtomatik xavfsizlik yangilanishlari (unattended-upgrades — 2.5)
apt install -y unattended-upgrades
dpkg-reconfigure -f noninteractive unattended-upgrades # avtomatik xavfsizlik yamoqlari
echo " Server tayyor. Endi SSH hardening (Misol 6) va deploy (Misol 8)."Misol 11 — SSH tunnel orqali masofadagi bazaga xavfsiz ulanish (2.12)
# Muammo: serverdagi PostgreSQL (5432) firewall'da YOPIQ (tashqaridan ko'rinmasin — 2.7),
# lekin lokal kompyuterdan DB'ni ko'rish/boshqarish kerak (masalan pgAdmin bilan).
# === LOKAL kompyuterda: local port-forwarding tunneli ochamiz ===
ssh -L 5432:localhost:5432 deploy@203.0.113.5
# │ │ │
# │ │ └─ serverdagi maqsad port (u yerdagi localhost:5432)
# │ └─ serverdan qaraganda manzil (server o'ziga: localhost)
# └─ lokal port (bizning kompyuterda ochiladi)
# Endi lokal 5432 SSH shifrlangan kanal serverdagi PostgreSQL
# Boshqa terminalda: lokal 5432 orqali ulanamiz (tunnel ochiq turishi kerak)
psql -h localhost -p 5432 -U appuser mydb
# aslida masofadagi DB, lekin lokalday. DB porti internetga OCHILMADI.
# Fon rejimida tunnel (terminalni band qilmasdan):
ssh -fN -L 5432:localhost:5432 deploy@203.0.113.5
# │└─ buyruq bajarmasdan faqat tunnel (No command)
# └─ fonga o'tkaz (background)
# SOCKS proksi (dynamic) — brauzer trafigini server orqali:
ssh -fND 1080 deploy@203.0.113.5 # localhost:1080 SOCKS5 proksi
# brauzer proksisini localhost:1080 qilib, server IP'sidan chiqasiz5. To'g'ri va noto'g'ri holatlar
1) Server boshqaruvi — kim sifatida
Doim root bilan ishlash (bitta xato = falokat — 2.4)
Oddiy user (deploy) + kerak bo'lganda sudo2) SSH autentifikatsiya
Parol bilan ulanish (brute-force, o'g'irlanadi — 2.8)
SSH kalit (ed25519) + parolni butunlay o'chirish (2.10)3) Firewall
Hamma port ochiq (DB ham tashqaridan ko'rinadi — xavf)
Faqat 22/80/443 ochiq; DB/Node portlari yopiq (2.7)4) SSH kalit ruxsati
chmod 644 ~/.ssh/id_ed25519 (SSH rad etadi: "too open")
chmod 600 (faqat ega o'qiydi — 2.3)5) Ilovani doimiy ishlatish
"node main.js" — terminal yopilsa o'ladi, yiqilsa qaytmaydi
systemd service (Restart=always) yoki PM2 (2.6, 10.7)6) Hardening tartibi
Avval parolni o'chirib, keyin kalitni sinash (qulflanib qolasiz)
Avval kalit ishlashini tasdiqlang, KEYIN parolni o'chiring (2.10)6. Keng tarqalgan xatolar va yechimlari
Xato 1 — Permission denied (publickey)
Sababi: public kalit serverda yo'q, yoki noto'g'ri foydalanuvchi/port. Yechimi: ssh-copy-id user@IP qayta bajaring; ~/.ssh/configda User/Port to'g'rimi tekshiring; serverda ~/.ssh/authorized_keys borligiga ishonch hosil qiling 2.9-bob.
Xato 2 — WARNING: UNPROTECTED PRIVATE KEY FILE!
Sababi: private kalit ruxsati juda ochiq (644). Yechimi: chmod 600 ~/.ssh/id_ed25519 (faqat ega — 2.3).
Xato 3 — Connection refused (port 22)
Sababi: SSH xizmati o'chiq, yoki firewall portni bloklagan, yoki noto'g'ri port. Yechimi: serverda sudo systemctl status ssh; sudo ufw allow OpenSSH; SSH portini tekshiring (2.7, 2.10).
Xato 4 — Hardeningdan keyin serverga kira olmay qolish (lockout)
Sababi: parol o'chirilgan, lekin kalit ishlamayapti (yoki firewall 22'ni bloklagan). Yechimi: provayder konsoli (VNC/recovery) orqali kiring, sozlamani qaytaring. Oldini olish: doim avval kalit ulanishini sinab ko'ring 2.10-bob.
Xato 5 — Disk to'lib ilova ishlamay qolishi
Sababi: loglar/cache /varni to'ldirgan (No space left on device). Yechimi: df -h bilan tekshiring; journalctl --vacuum-time=7d (eski loglarni tozalaydi); log rotatsiyani sozlang (logrotate).
Xato 6 — sudo: command not found yoki sudo so'ramasligi
Sababi: foydalanuvchi sudo guruhida emas. Yechimi: root'dan usermod -aG sudo deploy, keyin qayta login 2.4-bob.
Xato 7 — Ilova EADDRINUSE (port band)
Sababi: eski jarayon hali portni ushlab turibdi. Yechimi: ss -tulpn | grep 3000 bilan PID toping, kill <PID>; systemd ishlatsangiz systemctl restart 2.6-bob.
7. Integratsiya — bu mavzu stack'ning qayerida uchraydi
- OS/fayl tizimi 0.2-bob: bu bob uni real serverga ko'taradi.
- Terminal/bash 0.3-bob: server boshqaruvi to'liq terminal orqali.
- Internet/portlar 0.4-bob: port, IP, HTTP/HTTPS server kontekstida.
- Nginx 10.2-bob: Linux serverda ishlaydi, 80/443 portda.
- Docker 10.3-bob: konteyner ham Linux ustida (apt, port, foydalanuvchi).
- CI/CD 10.5-bob: GitHub Actions SSH orqali serverga deploy qiladi.
- Deploy/SSL 10.7-bob: systemd/PM2, domen, Certbot — shu serverda.
- Env/secrets 10.11-bob:
.env, kalitlar server fayl tizimida.
8. Eng yaxshi amaliyotlar (best practices)
- Oddiy user + sudo (root bilan doimiy ishlamaslik — least privilege;
visudobilan huquq — 2.4). - Faqat SSH kalit (parol o'chirilgan, ed25519, passphrase +
ssh-agent— 2.8, 2.10, 2.12). - SSH hardening (root login off, fail2ban — to'g'ri tartibda — 2.10).
- Firewall minimal (faqat 22/80/443 ochiq; DB yopiq — tunnel bilan kiring — 2.7, 2.12).
- DB'ni tunnel orqali boshqaring (5432 internetga ochilmaydi;
ssh -L— 2.12). - systemd/PM2 (ilova doimiy +
Restart=always+enable; unit fayl — 2.6). ~/.ssh/config(qisqa nom, kalit yo'li — qulay va xatosiz — 2.11, 2.12).- Muntazam yangilash (
apt update && upgrade; unattended-upgrades avtomatik — xavfsizlik yamoqlari — 2.5). - Loglarni kuzat (
/var/log,journalctl— muammo 1-joyda topiladi — 2.6). - Diskni nazorat (
df -h,du -sh, logrotate — to'lib qolmasin — 2.7, Xato 5). - Cron bilan avtomatlashtiring (backup, log tozalash — muntazam ishlar — 2.13).
- Setup'ni skriptlash (qayta tiklash oson — Infrastructure as Code yo'li — 10.10).
umaskva SUID audit (yangi fayl ruxsati, notanish SUID fayllarni tekshiring — 2.3).
9. Amaliy loyiha: "Noldan Production Server"
Yangi VPS olib, uni xavfsiz, deploy'ga tayyor serverga aylantirish — real DevOps ko'nikmasi.
Maqsad
Bo'sh Ubuntu serverni (DigitalOcean/AWS Lightsail $5 VPS yoki lokal VM/WSL2) noldan sozlab, unga oddiy Node.js ilovani SSH kalit orqali xavfsiz deploy qilish va systemd bilan doimiy ishlatish.
Talablar (requirements)
- Server: Ubuntu 22.04+ VPS (yoki Multipass/WSL2/VirtualBox bilan lokal).
- Foydalanuvchi: root o'rniga
deployuser + sudo (Misol 2, 2.4). - SSH kalit: ed25519 yarating, parolsiz ulaning,
~/.ssh/configqo'shing (Misol 3, 4). - Firewall:
ufwbilan faqat 22/80/443 ochiq (Misol 5, 2.7). - Hardening: root login off, parol auth off, fail2ban (Misol 6, 2.10).
- Node.js: o'rnatib, kichik Express/Nest "Salom" ilovasini joylashtiring.
- systemd: ilovani service qiling —
Restart=always+enable(Misol 7, 2.6). - Deploy:
rsyncbilan yangilab,restartqiling (Misol 8, 2.11). - Tekshirish: brauzerda
http://SERVER_IP:3000(yoki firewall ortidan curl) javob bersin. - Setup skript: butun jarayonni
setup.shga yozing (qayta tiklanadigan — Misol 10).
Maslahatlar (hint)
- Hardeningdan oldin albatta yangi terminalda kalit ulanishini sinab ko'ring (2.10 — lockout xavfi).
chmod 600private kalitga — aks holda SSH ishlamaydi (Xato 2).- Firewall'da avval SSH'ni ruxsat eting, keyin
enable(Misol 5). - Log bilan ishlang: ilova ko'tarilmasa
journalctl -u myapp -f(Misol 9). - VPS yo'q bo'lsa — WSL2 yoki Multipass'da xuddi shu mashqni bajaring (bepul).
"Tayyor" mezonlari (acceptance criteria)
-
deployuser yaratilgan, root bilan doimiy ishlanmaydi. - SSH kalit bilan parolsiz ulanish ishlaydi (
ssh myserver). - Parol autentifikatsiya va root login o'chirilgan.
- Firewall faol, faqat kerakli portlar ochiq (
ufw status). - fail2ban ishlaydi (
fail2ban-client status sshd). - Ilova systemd service sifatida ishlaydi va qayta yuklashda o'zi yonadi.
-
rsyncbilan deploy +restartishlaydi. -
setup.shskripti butun jarayonni avtomatlashtiradi.
Bu loyiha amaliy mashq — yuqoridagi misollar (Misol 1–10) to'liq yo'l-yo'riq beradi; ularni birlashtirib, o'z serveringizni noldan sozlab chiqing.
10. Xulosa va keyingi bobga ko'prik
Bu bobda Linux server va SSH'ni chuqur o'rgandik:
- Server (nima, nega Linux — 2.1); fayl tizimi ierarxiyasi (
/etc,/var/log— 2.2); ruxsatlar (chmodraqamli/simvolik,umask, SUID/SGID/sticky,chown— 2.3); root/sudo (least privilege,adduser/usermod/visudo— 2.4). - Paket (
apt/dpkg— 2.5); jarayon/systemd (systemctl, signallar,nice, unit fayl,journalctl— 2.6); tarmoq/firewall (port,ss,dig,curl, disk/monitoringdf/du/free/uptime,ufw— 2.7). - SSH (asimmetrik kalitlar — 2.8; yaratish/joylash — 2.9; hardening — 2.10); fayl uzatish (
scp/rsync/sftp— 2.11); SSH ilg'or (~/.ssh/config,ssh-agent, tunneling-L/-R/-D— 2.12); bash muhiti (env/PATH, alias,cron— 2.13).
Endi siz bo'sh serverni xavfsiz, deploy'ga tayyor holatga keltira olasiz — DevOps poydevorining eng birinchi va eng muhim qismi. Bu — "kod yozaman, lekin serverni bilmayman" degan chegarani buzadi.
Keyingi bob — 10.2-bob: Nginx (reverse proxy, load balancer). Endi ilovamiz serverda ishlayapti (port 3000da), lekin foydalanuvchilar uni to'g'ridan-to'g'ri 3000 portda ochmaydi — ular https://saytim.uz (80/443) ga kiradi. O'rtada Nginx turadi: so'rovni qabul qiladi, ilovaga uzatadi (reverse proxy), statik fayllarni beradi, SSL'ni hal qiladi va yukni bir necha nusxaga taqsimlaydi (load balancer). Bu — har bir production deploy'ning markaziy bo'lagi.
Foydalanilgan rasmiy/ishonchli manbalar
- Ubuntu Server Documentation; Debian Administrator's Handbook;
apt/dpkgqo'llanmasi (man apt,man apt-get) - OpenSSH manual (
man ssh,man sshd_config,man ssh_config);ssh-keygen,ssh-copy-id,scp,rsyncman-page'lari - Filesystem Hierarchy Standard (FHS 3.0); Linux
mansahifalari:chmod(1),chown(1),umask,useradd(8),usermod(8),sudoers(5),visudo(8) systemd/systemctl/journalctlrasmiy hujjati (man systemd.service,man systemctl);crontab(5)ufw(Uncomplicated Firewall) vaiptablesman-page'lari;fail2banrasmiy hujjati
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!