Django loyihani GitHub dan VPS serverga deploy qilish (HTTPS bilan)
Ko'pchilik yangi dasturchilar loyihani yozishni biladi, lekin uni serverga joylash qismida qiynaladi. Ushbu qo'llanma aynan shu muammoni hal qiladi — har bir buyruqni nima uchun ishlatayotganimizni tushuntirib boraman.
Keling, ishni boshlaymiz! 🚀
Nimalar kerak bo'ladi?
Boshlamasdan oldin, quyidagilar tayyor bo'lishi kerak:
🔹 GitHub dagi tayyor Django loyiha — loyihangiz GitHub repositoriyasida bo'lishi kerak.
🔹 VPS server — Eskiz.uz dan Ubuntu 22.04 yoki 24.04 operatsion tizimli server sotib oling.
🔹 Domen nomi — masalan: mydomain.uz (Ahost, Webhost yoki boshqa provayderdan).
🔹 Kompyuteringizda terminal — Windows da PowerShell, macOS/Linux da Terminal.
🔹 requirements.txt — loyihangizda kerakli kutubxonalar ro'yxati bo'lishi kerak.
Umumiy arxitektura — nima qanday ishlaydi?
Deploy qilishdan oldin, saytimiz qanday ishlashini tushunib olaylik:
Foydalanuvchi (Brauzer)
↓
HTTPS (443-port) — ma'lumotlar shifrlangan
↓
Nginx (Reverse Proxy) — tashqi so'rovlarni qabul qiladi
↓
Gunicorn (WSGI Server) — Python kodini ishga tushiradi
↓
Django Application — bizning loyihamiz
Oddiy qilib aytsak:
🔹 Nginx — eshik qo'riqchisi. Tashqaridan kelgan har bir so'rovni qabul qiladi.
🔹 Gunicorn — tarjimon. Nginx dan kelgan so'rovni Django tushunadigan tilga o'giradi.
🔹 Django — asl ishchi. So'rovga javob tayyorlaydi.
Nega Django ning o'z runserver buyrug'i bilan ishlamaymiz?
Chunki u faqat dasturlash paytida ishlatiladi. Haqiqiy serverda sekin, xavfsiz emas va bir vaqtda ko'p foydalanuvchini ko'tara olmaydi.
1. VPS serverga ulanish (SSH)
VPS sotib olganingizda sizga 3 ta narsa beriladi: IP manzil, login (odatda root) va parol. Endi serverga ulanamiz.
Terminalni oching va quyidagi buyruqni yozing:
ssh root@185.217.131.xx
🔹 ssh — Secure Shell, serverga xavfsiz ulanish protokoli. Barcha ma'lumotlar shifrlangan holda uzatiladi.
🔹 root — serverdagi eng yuqori darajali foydalanuvchi (administrator).
🔹 @ — ajratuvchi belgi ("kimda" degan ma'noda).
🔹 185.217.131.xx — serveringizning IP manzili (o'zingiznikini yozing).
Birinchi marta ulanganda Are you sure you want to continue connecting? deb so'raydi — yes yozing va Enter bosing. Keyin parolni kiriting.
Eslatma: Parolni yozayotganda ekranda hech narsa ko'rinmaydi — bu normal. Yozib bo'lib Enter bosing.
2. Serverni yangilash va kerakli dasturlarni o'rnatish
Serverga ulangandan keyin, birinchi ish — tizimni yangilash. Bu xavfsizlik uchun juda muhim.
Tizimni yangilash
apt update
🔹 apt — Ubuntu ning paket menejeri (dasturlarni o'rnatish/yangilash vositasi).
🔹 update — mavjud dasturlar ro'yxatini yangilaydi. Bu hali hech narsani o'rnatmaydi, faqat "bozordagi narxlar"ni tekshiradi.
apt upgrade -y
🔹 upgrade — eski dasturlarni yangi versiyaga ko'taradi.
🔹 -y — "Hamma savolga ha de" degani. Har bir paket uchun tasdiq so'ramasdan o'rnatadi.
Kerakli dasturlarni o'rnatish
apt install python3 python3-pip python3-venv nginx certbot python3-certbot-nginx git -y
Har bir paketni tushuntiray:
python3 -> |
Python dasturlash tili — Django Python da yozilgan |
python3-pip -> |
pip — Python kutubxonalarini o'rnatish vositasi |
python3-venv -> |
Virtual muhit yaratish uchun — loyihalar bir-biriga aralashmasligi uchun |
nginx -> |
Web server — tashqi so'rovlarni qabul qilib Django ga yo'naltiradi |
certbot -> |
Bepul SSL sertifikat olish vositasi (Let's Encrypt) |
python3-certbot-nginx -> |
Certbot ning Nginx bilan ishlash plagini |
git -> |
GitHub dan loyihani yuklab olish (clone) uchun |
3. Yangi foydalanuvchi yaratish (xavfsizlik)
root bilan doimiy ishlash xavfli — bitta noto'g'ri buyruq butun serverni buzishi mumkin. Shuning uchun alohida foydalanuvchi yaratamiz.
adduser deploy
🔹 adduser — yangi foydalanuvchi yaratish buyrug'i.
🔹 deploy — foydalanuvchi nomi (xohlagan nomingizni yozing).
Parol va ma'lumotlarni so'raydi — parolni kiriting, qolganini Enter bosib o'tkazib yuboring.
usermod -aG sudo deploy
🔹 usermod — foydalanuvchi sozlamalarini o'zgartirish.
🔹 -aG sudo — deploy foydalanuvchini sudo guruhiga qo'shish.
🔹 sudo guruhi — administrator buyruqlarini bajarish huquqini beradi.
su - deploy
🔹 su — foydalanuvchini almashtirish (switch user).
🔹 - — yangi foydalanuvchining muhitini to'liq yuklaydi.
Endi siz deploy foydalanuvchi sifatida ishlaysiz. Bundan keyin administrator buyruqlari uchun oldiga sudo qo'shamiz.
4. GitHub dan loyihani klonlash
Endi GitHub dagi tayyor loyihamizni serverga yuklab olamiz.
cd ~
🔹 cd ~ — uy papkasiga (/home/deploy) o'tish.
git clone https://github.com/username/myproject.git
🔹 git clone — GitHub dagi repositoriyani serverga nusxalab olish.
🔹 https://github.com/username/myproject.git — loyihangizning GitHub manzili.
O'zingiznikini yozing!
Agar repositoriya private (yopiq) bo'lsa, GitHub username va Personal Access Token so'raydi. Token ni GitHub → Settings → Developer settings → Personal access tokens dan olishingiz mumkin.
cd myproject
🔹 Loyiha papkasiga kirish.
5. Virtual environment yaratish
Virtual environment (venv) — bu izolyatsiya qilingan Python muhiti. Har bir loyiha o'zining kutubxonalarini alohida saqlaydi. Masalan, bitta loyihada Django 4.2, boshqasida Django 5.0 ishlatishingiz mumkin — ular bir-biriga xalaqit bermaydi.
python3 -m venv venv
🔹 python3 — Python interpretatori.
🔹 -m venv — venv modulini ishga tushirish.
🔹 venv (oxirgi) — yaratilayotgan muhit papkasining nomi.
Bu buyruq venv/ papkasini yaratadi, ichida alohida Python va pip bo'ladi.
source venv/bin/activate
🔹 source — skriptni joriy terminalda ishga tushirish.
🔹 venv/bin/activate — virtual muhitni faollashtirish skripti.
Aktivlashtirgandan keyin terminal boshida (venv) yozuvi paydo bo'ladi. Endi pip install qilgan kutubxonalar faqat shu muhitga o'rnatiladi.
⚠️ Muhim: Har safar serverga qayta ulanganda, loyiha ustida ishlash uchun avval cd ~/myproject && source venv/bin/activate buyrug'ini bajarishni unutmang!
6. Kutubxonalarni o'rnatish (requirements.txt)
Loyihangizda requirements.txt fayli bo'lishi kerak — unda barcha kerakli kutubxonalar ro'yxati yozilgan.
pip install -r requirements.txt
🔹 pip install — Python kutubxonalarini o'rnatish.
🔹 -r requirements.txt — ro'yxatdagi barcha kutubxonalarni birdan o'rnatish.
Agar requirements.txt da gunicorn yo'q bo'lsa, alohida o'rnatamiz:
pip install gunicorn
🔹 gunicorn — production WSGI server. Django ning runserver o'rniga ishlatiladi.
Maslahat: Lokalda pip freeze > requirements.txt buyrug'i bilan requirements faylni yangilashni unutmang. Unda gunicorn ham bo'lishi kerak.
7. .env faylni serverda yaratish
.env fayl — loyihadagi maxfiy ma'lumotlarni (parollar, API kalitlar, secret key) saqlash uchun ishlatiladi. Bu fayl hech qachon GitHub ga yuklanmaydi (.gitignore da bo'ladi). Shuning uchun serverda qo'lda yaratamiz.
nano .env
🔹 nano — terminal ichidagi matn muharriri.
🔹 .env — yaratilayotgan fayl nomi (nuqta bilan boshlanadi — yashirin fayl).
Fayl ichiga loyihangizga kerakli o'zgaruvchilarni yozing. Masalan:
SECRET_KEY=your-super-secret-key-here
DEBUG=False
ALLOWED_HOSTS=your_domain.uz,www.your_domain.uz,server_IP_manzili
DATABASE_URL=sqlite:///db.sqlite3
Saqlash: Ctrl+O → Enter → Chiqish: Ctrl+X
Har bir o'zgaruvchini tushuntiray:
SECRET_KEY -> |
Django ning maxfiy kaliti — shifrlash uchun ishlatiladi. Uni GitHub ga hech qachon yuklamang |
DEBUG -> |
False — production da albatta o'chiriladi. True bo'lsa xatolikda maxfiy ma'lumotlar ko'rinadi |
ALLOWED_HOSTS -> |
Qaysi domen/IP orqali saytga kirish mumkinligini belgilaydi |
DATABASE_URL -> |
Ma'lumotlar bazasi manzili. PostgreSQL ishlatayotgan bo'lsangiz: postgres://user:pass@localhost:5432/dbname |
⚠️ Muhim: .env fayldagi qiymatlarni tirnoqsiz yozing. Qiymatlar orasida bo'sh joy bo'lmasin (= belgisi atrofida).
settings.py da .env ni o'qish
Loyihangizning settings.py faylida .env dan o'qish sozlangan bo'lishi kerak. Eng mashhur 2 ta usul:
1-usul: python-decouple kutubxonasi bilan:
# settings.py
from decouple import config
SECRET_KEY = config('SECRET_KEY')
DEBUG = config('DEBUG', default=False, cast=bool)
ALLOWED_HOSTS = config('ALLOWED_HOSTS', cast=lambda v: [s.strip() for s in v.split(',')])
2-usul: django-environ kutubxonasi bilan:
# settings.py
import environ
env = environ.Env()
environ.Env.read_env() # .env faylni o'qiydi
SECRET_KEY = env('SECRET_KEY')
DEBUG = env.bool('DEBUG', default=False)
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS')
Eslatma: Bu kutubxonalardan biri requirements.txt da bo'lishi kerak. Agar yo'q bo'lsa: pip install python-decouple yoki pip install django-environ
8. Django sozlamalarini tekshirish
.env faylni yaratgandan keyin, Django buyruqlarini bajaramiz:
python manage.py migrate
🔹 migrate — ma'lumotlar bazasi jadvallarini yaratish/yangilash. Django modellaridagi o'zgarishlarni bazaga qo'llaydi.
python manage.py collectstatic --noinput
🔹 collectstatic — barcha static fayllarni (CSS, JS, rasmlar) bitta papkaga yig'adi.
🔹 --noinput — tasdiqlash so'ramasdan bajaradi.
🔹 Bu Nginx uchun kerak — u static fayllarni shu papkadan tez uzatadi.
Endi sinab ko'ramiz:
python manage.py runserver 0.0.0.0:8000
Brauzerda http://SERVER_IP:8000 oching — saytingiz ko'rinishi kerak. To'xtatish: Ctrl+C.
9. Gunicorn ni sinab ko'rish
Django ning runserver buyrug'i faqat dasturlash paytida ishlatiladi. Haqiqiy serverda Gunicorn ishlatamiz.
gunicorn config.wsgi:application --bind 0.0.0.0:8000
🔹 gunicorn — Gunicorn serverni ishga tushirish.
🔹 config.wsgi — Django loyihamizdagi wsgi.py faylga yo'l. Muhim: config o'rniga sizning loyihangiz nomini yozing. Masalan, loyihangiz mysite bo'lsa: mysite.wsgi:application.
🔹 application — Django ilovasi obyekti (wsgi.py ichida aniqlangan).
🔹 --bind 0.0.0.0:8000 — barcha IP lardan 8000-portda so'rovlarni qabul qilish.
Brauzerda http://SERVER_IP:8000 tekshiring. Ishlayaptimi? Ajoyib! Ctrl+C bosib to'xtating.
Eslatma: Agar config.wsgi ishlamasa, loyiha papkangizda wsgi.py faylni qidiring: find . -name wsgi.py — u qaysi papkada bo'lsa, o'sha nomni yozing.
10. Gunicorn ni systemd service qilish
Hozir Gunicorn ni qo'lda ishga tushiryapmiz. Lekin server qayta yoqilganda nima bo'ladi? Gunicorn o'zi ishga tushmaydi. Shuning uchun systemd service yaratamiz — u Gunicorn ni avtomatik boshqaradi.
sudo nano /etc/systemd/system/gunicorn.service
🔹 sudo — administrator huquqi bilan bajarish.
🔹 /etc/systemd/system/ — tizim servislari saqlanadigan papka.
Quyidagi mazmunni yozing:
[Unit]
Description=Gunicorn daemon for Django
After=network.target
[Service]
User=deploy
Group=www-data
WorkingDirectory=/home/deploy/myproject
ExecStart=/home/deploy/myproject/venv/bin/gunicorn \
--access-logfile - \
--workers 3 \
--bind unix:/home/deploy/myproject/gunicorn.sock \
config.wsgi:application
[Install]
WantedBy=multi-user.target
⚠️ Muhim: config.wsgi:application qismida config o'rniga o'z loyihangiz nomini yozing! WorkingDirectory va yo'llarni ham loyihangiz papkasiga moslashtiring.
Har bir qatorni tushuntiray:
[Unit] -> |
Service haqida umumiy ma'lumot bo'limi |
Description -> |
Service tavsifi — systemctl status da ko'rinadi |
After=network.target -> |
Internet tayyor bo'lgandan keyin ishga tushadi |
[Service] -> |
Service qanday ishlashi haqida |
User=deploy -> |
Qaysi foydalanuvchi nomidan ishlaydi |
Group=www-data -> |
Nginx guruhi — fayllarni o'qiy olishi uchun |
WorkingDirectory -> |
Loyiha papkasi — buyruqlar shu papkadan bajariladi |
ExecStart -> |
Ishga tushirish buyrug'i — venv ichidagi gunicorn |
--workers 3 -> |
3 ta ishchi jarayon — bir vaqtda 3 ta so'rovni qayta ishlaydi |
--bind unix:...sock -> |
TCP port o'rniga Unix socket ishlatadi (tezroq va xavfsizroq) |
[Install] -> |
Service qachon ishga tushishini belgilash |
WantedBy=multi-user.target -> |
Server yuklanganda avtomatik ishga tushadi |
Service ni ishga tushirish
sudo systemctl daemon-reload
🔹 systemd ga "yangi service fayl qo'shildi" deb xabar berish. Har safar service faylini o'zgartirganda shu buyruqni bajarish kerak.
sudo systemctl start gunicorn
🔹 Gunicorn servisini hozir ishga tushirish.
sudo systemctl enable gunicorn
🔹 Server qayta yoqilganda Gunicorn avtomatik ishga tushishini ta'minlash.
sudo systemctl status gunicorn
🔹 Service holatini tekshirish. active (running) yozuvi ko'rinishi kerak. Chiqish uchun q tugmasini bosing.
11. Nginx ni sozlash
Nginx — bu reverse proxy. U tashqi so'rovlarni qabul qilib, Gunicorn ga yo'naltiradi. Bundan tashqari, static fayllarni tez uzatadi va SSL/HTTPS ni boshqaradi.
Konfiguratsiya faylini yaratish
sudo nano /etc/nginx/sites-available/myproject
Quyidagi mazmunni yozing:
server {
listen 80;
server_name your_domain.uz www.your_domain.uz;
location = /favicon.ico {
access_log off;
log_not_found off;
}
location /static/ {
root /home/deploy/myproject;
}
location /media/ {
root /home/deploy/myproject;
}
location / {
include proxy_params;
proxy_pass http://unix:/home/deploy/myproject/gunicorn.sock;
}
}
Har bir qismni tushuntiray:
listen 80 |
80-portni tinglash (HTTP). Keyinchalik certbot buni 443 ga o'zgartiradi |
server_name |
Qaysi domen uchun ishlashini belgilaydi |
location /favicon.ico |
Brauzer tab ikonkasini so'raganda xatolik logga yozilmasin |
location /static/ |
Static fayllarni (CSS, JS) Nginx o'zi tez uzatadi |
location /media/ |
Foydalanuvchi yuklagan fayllar (rasmlar va h.k.) uchun |
location / |
Boshqa barcha so'rovlarni Gunicorn ga yo'naltiradi |
proxy_pass unix:...sock |
So'rovni Gunicorn ning Unix socket iga yo'naltiradi |
Konfiguratsiyani faollashtirish
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
🔹 ln -s — symbolic link (yorliq) yaratish. Nginx faqat sites-enabled papkadagi konfiguratsiyalarni o'qiydi, shuning uchun sites-available dan havola qilamiz.
sudo nginx -t
🔹 Konfiguratsiyada xato bor-yo'qligini tekshirish. syntax is ok va test is successful deb chiqishi kerak.
sudo systemctl restart nginx
🔹 Nginx ni qayta ishga tushirish — yangi konfiguratsiya kuchga kiradi.
Endi brauzerda http://your_domain.uz oching — saytingiz ko'rinishi kerak!
12. Domen ulash (DNS sozlash)
Agar domeningiz hali serverga ulanmagan bo'lsa, domen provayderingiz (Ahost, Webhost, Reg.uz) boshqaruv paneliga kiring va DNS bo'limida quyidagi yozuvlarni qo'shing:
| Turi | Nom | Qiymat | TTL |
|---|---|---|---|
| A | @ | 185.217.131.xx | 3600 |
| A | www | 185.217.131.xx | 3600 |
Tushuntirish:
🔹 A yozuvi — domen nomini IP manzilga bog'laydi. Brauzer "mydomain.uz" desa, internet "185.217.131.xx ga bor" deydi.
🔹 @ — asosiy domen (mydomain.uz) ni bildiradi.
🔹 www — www.mydomain.uz uchun alohida yozuv.
🔹 TTL 3600 — Time To Live, DNS keshning amal qilish muddati (3600 soniya = 1 soat).
⚠️ DNS o'zgarishlari 5 daqiqadan 48 soatgacha kuchga kirishi mumkin. Odatda 10–30 daqiqada tayyor bo'ladi. Tekshirish uchun: ping mydomain.uz
13. SSL sertifikat o'rnatish (HTTPS)
Bu eng muhim qadamlardan biri! HTTPS ma'lumotlarni shifrlaydi. HTTPS siz:
🔹 Brauzerlar "Xavfsiz emas" deb ogohlantirish ko'rsatadi.
🔹 Foydalanuvchilar ma'lumotlari ochiq uzatiladi.
🔹 Google SEO reytingi pastlaydi.
Biz Let's Encrypt — bepul SSL sertifikat beruvchi tashkilotdan foydalanamiz.
sudo certbot --nginx -d your_domain.uz -d www.your_domain.uz
🔹 certbot — SSL sertifikat olish vositasi.
🔹 --nginx — Nginx konfiguratsiyasini avtomatik o'zgartiradi (443-port, SSL sozlamalari, HTTP→HTTPS yo'naltirish).
🔹 -d — qaysi domenlar uchun sertifikat olish.
Certbot sizdan email so'raydi va shartlarni qabul qilishni taklif qiladi. Email ni kiriting va Y bosing.
Certbot avtomatik ravishda:
1. Domeningiz haqiqatan ham shu serverga tegishli ekanini tekshiradi.
2. SSL sertifikat yaratib /etc/letsencrypt/ papkasiga saqlaydi.
3. Nginx konfiguratsiyasiga HTTPS sozlamalarini qo'shadi.
4. HTTP dan HTTPS ga avtomatik yo'naltirish (redirect) qo'shadi.
Avtomatik yangilanishni tekshirish
Let's Encrypt sertifikatlari 90 kunga amal qiladi. Lekin tashvishlanmang — certbot avtomatik yangilaydi:
sudo certbot renew --dry-run
🔹 --dry-run — haqiqiy yangilamasdan, faqat sinab ko'rish.
Congratulations yozuvi chiqsa — hammasi ishlaydi! Certbot har kuni avtomatik tekshiradi va muddati yaqinlashganda yangilaydi.
14. Firewall (UFW) sozlash
Firewall — serverga kirish trafigini nazorat qilish vositasi. Faqat kerakli portlarni ochamiz, qolganini yopamiz.
sudo ufw allow OpenSSH
🔹 Bu birinchi qilinadi! SSH ulanishiga ruxsat berish (22-port). Aks holda serverdan uzilasiz va qayta ulana olmaysiz!
sudo ufw allow 'Nginx Full'
🔹 Nginx uchun 80 (HTTP) va 443 (HTTPS) portlarni ochish.
sudo ufw enable
🔹 Firewall ni yoqish. Command may disrupt existing ssh connections deb ogohlantiradi — y bosing.
sudo ufw status
🔹 Firewall holatini ko'rish — qaysi portlar ochiq ekanini ko'rsatadi.
⚠️ Eslatma: OpenSSH ni ruxsat bermasdan UFW ni yoqsangiz, serverdan butunlay uzilasiz! Har doim avval SSH ga ruxsat bering.
15. Yakuniy tekshirish
Barcha qadamlar tugadi! Endi tekshiramiz:
| Tekshirish | Kutilgan natija |
|---|---|
https://your_domain.uz oching |
Saytingiz ko'rinishi kerak |
| Brauzer manzil satri | Qulf 🔒 belgisi ko'rinishi kerak (HTTPS ishlayapti) |
http://your_domain.uz oching |
Avtomatik HTTPS ga yo'naltirilishi kerak |
sudo reboot qiling |
Server qayta yoqilgandan keyin sayt ishlashini tekshiring |
Ko'p uchraydigan xatolar va yechimlar
❌ 502 Bad Gateway
Sabab: Gunicorn ishlamayapti.
Yechim:
sudo systemctl restart gunicorn
sudo systemctl status gunicorn
sudo journalctl -u gunicorn -n 50 # xatolikni ko'rish
❌ 403 Forbidden
Sabab: Papka huquqlari noto'g'ri.
Yechim:
chmod 755 /home/deploy
❌ ModuleNotFoundError
Sabab: Kutubxonalar o'rnatilmagan yoki venv aktivlanmagan.
Yechim:
cd ~/myproject
source venv/bin/activate
pip install -r requirements.txt
sudo systemctl restart gunicorn
❌ .env o'zgaruvchilari o'qilmayapti
Sabab: .env fayl noto'g'ri joyda yoki formati xato.
Yechim:
# .env faylni tekshiring — manage.py bilan bir papkada bo'lishi kerak
ls -la ~/myproject/.env
# Ichini tekshiring — bo'sh joy va tirnoq bo'lmasligi kerak
cat ~/myproject/.env
❌ "DisallowedHost" xatosi
Sabab: ALLOWED_HOSTS ga domen qo'shilmagan.
Yechim: .env fayldagi ALLOWED_HOSTS ga domenni qo'shing:
nano ~/myproject/.env
# ALLOWED_HOSTS=your_domain.uz,www.your_domain.uz qilib yozing
sudo systemctl restart gunicorn
❌ Static fayllar ko'rinmayapti
Sabab: collectstatic bajarilmagan.
Yechim:
cd ~/myproject
source venv/bin/activate
python manage.py collectstatic --noinput
sudo systemctl restart nginx
Foydali log buyruqlari
Xatolikni topishda loglar eng yaxshi do'stingiz:
# Gunicorn loglari (Python xatoliklar shu yerda)
sudo journalctl -u gunicorn -n 50
# Nginx xatolik logi
sudo tail -f /var/log/nginx/error.log
# Nginx kirish logi (kim, qachon, qaysi sahifani ochgan)
sudo tail -f /var/log/nginx/access.log
Loyihani yangilash (keyinchalik)
Kelajakda kodni yangilaganingizda, serverga quyidagicha yuklaysiz:
cd ~/myproject
source venv/bin/activate
git pull origin main
🔹 git pull — GitHub dagi yangi o'zgarishlarni serverga yuklab olish.
pip install -r requirements.txt
🔹 Yangi kutubxonalar qo'shilgan bo'lsa, ularni o'rnatish.
python manage.py migrate
python manage.py collectstatic --noinput
🔹 Ma'lumotlar bazasi va static fayllarni yangilash.
sudo systemctl restart gunicorn
🔹 Gunicorn ni qayta ishga tushirish — yangi kod kuchga kiradi.
Qisqacha buyruqlar jadvali
Barcha buyruqlar ketma-ketligi bir joyda:
| # | Qadam | Buyruq |
|---|---|---|
| 1 | Ulanish | ssh root@IP_MANZIL |
| 2 | Yangilash | apt update && apt upgrade -y |
| 3 | Paketlar | apt install python3 python3-pip python3-venv nginx certbot python3-certbot-nginx git -y |
| 4 | User yaratish | adduser deploy && usermod -aG sudo deploy |
| 5 | User ga o'tish | su - deploy |
| 6 | Loyihani klonlash | cd ~ && git clone https://github.com/user/repo.git |
| 7 | Papkaga kirish | cd myproject |
| 8 | Venv yaratish | python3 -m venv venv && source venv/bin/activate |
| 9 | Kutubxonalar | pip install -r requirements.txt && pip install gunicorn |
| 10 | .env yaratish | nano .env |
| 11 | Migrate | python manage.py migrate |
| 12 | Static yig'ish | python manage.py collectstatic --noinput |
| 13 | Gunicorn test | gunicorn config.wsgi:application --bind 0.0.0.0:8000 |
| 14 | Service yaratish | sudo nano /etc/systemd/system/gunicorn.service |
| 15 | Service boshlash | sudo systemctl daemon-reload && start && enable gunicorn |
| 16 | Nginx sozlash | sudo nano /etc/nginx/sites-available/myproject |
| 17 | Link yaratish | sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/ |
| 18 | Nginx tekshirish | sudo nginx -t && sudo systemctl restart nginx |
| 19 | DNS sozlash | Domen provayderda A yozuvi qo'shish |
| 20 | SSL o'rnatish | sudo certbot --nginx -d domain.uz -d www.domain.uz |
| 21 | Firewall | sudo ufw allow OpenSSH && sudo ufw allow 'Nginx Full' && sudo ufw enable |
Xulosa
Tabriklayman! 🎉 Siz GitHub dagi Django loyihangizni VPS serverga muvaffaqiyatli joylashtirgansiz. Endi sizda:
🔹 HTTPS bilan himoyalangan professional sayt bor.
🔹 .env orqali maxfiy ma'lumotlar xavfsiz saqlangan.
🔹 Server qayta yoqilganda ham sayt avtomatik ishlaydi.
🔹 SSL sertifikat avtomatik yangilanadi.
🔹 git pull bilan loyihani osongina yangilash mumkin.
Savollar bo'lsa, bemalol yozing! 😊