AXV

Tayyor loyihani hostingga joylash

Deploy: Gunicorn, Nginx, Docker va VPS

10-sinfAdvanced Python Back-end4-hafta · 11-dars

Dars rejasi

Deploy nima?

Local va Production muhit farqi.

Production sozlamalar

DEBUG, ALLOWED_HOSTS, .env, static.

Gunicorn va Nginx

WSGI server va Reverse Proxy.

Docker va hosting

Dockerfile, compose, VPS, CI/CD.

01

Deploy va muhitlar

Ustaxonadan trassaga

Ustaxona va trassa

Mashina o'xshatishi

Localustaxonakapot ochiq Deployyo'lga chiqishserverga joylash Productiontrassakapot yopiq

Qo'llanma o'xshatishi: mashinani ustaxonada yig'asiz, trassada esa u xavfsiz va chidamli bo'lishi shart. Qismlarga bosing.

Local va Production

Local (Development)Production
XatoDEBUG=True, qizil oynaOddiy 404/500 sahifa
BazaSQLite (yengil)PostgreSQL / MySQL
ServerrunserverGunicorn + Nginx
UstuvorlikQulaylik va tezlikXavfsizlik va barqarorlik
02

Production sozlamalari

settings.py ni tozalash

Nega bular muhim?

DEBUG = False

bosing

Xato sahifasi parol va kalitlarni ochib qo'yishi mumkin. Productionda doim False.

ALLOWED_HOSTS

bosing

Ruxsat etilgan domenlar ro'yxati: Host Header Injection dan himoya.

.env va SECRET_KEY

bosing

Sirlar kodda emas, .env da; .env esa .gitignore da.

PostgreSQL

bosing

SQLite o'rniga: parallel yozuvlarni va katta hajmni ko'taradi.

Kartani bosing: javob orqasida.

prod.py: asosiy sozlamalar

import os
from .base import *  # noqa

DEBUG = False
SECRET_KEY = os.environ["SECRET_KEY"]
ALLOWED_HOSTS = os.environ.get("ALLOWED_HOSTS", "").split(",")

SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

Pastga bosing: static va media

Static va media

STATIC_URL = "/static/"
STATIC_ROOT = BASE_DIR.parent / "staticfiles"

MEDIA_URL = "/media/"
MEDIA_ROOT = BASE_DIR.parent / "media"

# serverda:
# python manage.py collectstatic --noinput

Bulutda media uchun Object Storage (S3) va django-storages ishlatiladi.

03

Gunicorn va Nginx

runserver dan professional serverga

runserver va Gunicorn

runserver

Faqat development uchun.

Xavfsizlik auditidan o'tmagan, yuklamaga mo'ljallanmagan.

VS

Gunicorn (WSGI)

--workers 3: 3 mustaqil jarayon.

Bittasi o'lsa, Gunicorn yangisini yaratadi.

Django hujjati: «Hech qachon runserver ni production da ishlatmang». WebSocket bo'lsa ASGI va Uvicorn.

So'rovning yo'li

Trafik oqimi

Clientbrauzer, ilovaapi.loyiha.uz Nginxqabulxona80 / 443 Gunicorn8000-portworkers Django + DBPostgreSQLJSON javob

Client - Nginx - Gunicorn - Django - PostgreSQL. Bloklarga bosing.

Nginx ichkarida nima qiladi?

1. So'rov keladi

Foydalanuvchi api.loyiha.uz ni ochadi, so'rov avval Nginx ga tushadi.

2. Statik so'rov

/static/logo.png: Nginx papkadan o'zi olib beradi, Python bezovta qilinmaydi.

3. API so'rov

/api/users/: Nginx uni Gunicorn ga uzatadi (Proxy Pass).

4. SSL va himoya

HTTPS ni Nginx boshqaradi; sekin so'rovlarni (Slowloris) o'zi yig'adi.

Statik fayl: Nginx 10 barobar tezroq.

Nginx sozlamasi

server {
    listen 80;
    client_max_body_size 20M;

    location /static/ { alias /staticfiles/; expires 7d; }
    location /media/  { alias /media/; expires 7d; }

    location / {
        proxy_pass http://web:8000;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Static va media: Nginx. Qolgani: Gunicorn.

04

Docker

Hamma joyda bir xil muhit

Dockerfile, Image, Container

Retseptdan konteynergacha

Dockerfileretseptqutini yasash Imagetayyor qutiOS+Python+kod Containerishlayotganquti

«Mening kompyuterimda ishlagandi» muammosi yo'qoladi: muhit konteyner ichida bir xil. Bloklarga bosing.

Dockerfile: asos

FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt /app/

Dockerfile: to'liq

FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt /app/
RUN pip install -r requirements.txt
COPY src /app/src
WORKDIR /app/src
CMD ["gunicorn", "config.wsgi:application", "--bind", "0.0.0.0:8000"]

requirements.txt alohida nusxalanadi: kod o'zgarsa kutubxonalar qayta o'rnatilmaydi.

docker-compose.prod.yml: 3 servis

Bir tugma bilan uch servis

dbpostgres:16volume: postgres_data webDjango + Gunicorn.env.prod nginxnginx:1.2780:80

Volume: konteyner qayta ishga tushsa ham ma'lumot yo'qolmaydi. DB_HOST=db: servis nomi.

docker-compose: web servisi

web:
  build: .
  env_file: [.env.prod]
  depends_on: [db]
  command: >
    sh -c "python manage.py migrate &&
    python manage.py collectstatic --noinput &&
    gunicorn config.wsgi:application
    --bind 0.0.0.0:8000 --workers 3"
  restart: always

Qisqartirilgan namuna.

Ishga tushirish

$ docker compose -f docker-compose.prod.yml --env-file .env.prod up -d --build
$ docker logs -f newsportal_web
# brauzerda:
# http://localhost/api/v1/posts/
# http://localhost/admin/

Natija: API ro'yxati va admin sahifa ochiladi.

05

Hosting va CI/CD

Qayerga joylaymiz?

Hosting turlari

Shared (cPanel)

Arzon, PHP uchun. Root yo'q: Django uchun noqulay.

PaaS

Heroku, Render, Railway. Oson, lekin qimmat va cheklangan.

VPS / VDS

DigitalOcean, Hetzner, AWS EC2. Professional va arzon, hamma narsa o'zingizda.

Mustaqil: cPanel ga Django deploy qilishni o'rganing (uslubiy ko'rsatma topshirig'i).

VPS ga joylash xaritasi

  1. ssh bilan ulanish, apt update
  2. Docker o'rnatish: docker.io docker-compose-plugin
  3. git clone bilan kodni olish
  4. .env.prod ni serverda yaratish
  5. docker compose ... up -d --build
  6. Domen (DNS) va SSL: Let's Encrypt, certbot

CI/CD: robot-konveyer

git push
CI: testlar
CD: serverga
Test yiqilsa robot jarayonni to'xtatadi. Yashil bo'lsa: git pull, migrate, Gunicorn restart. Fayl: .github/workflows/deploy.yml.

Mini-test

Nima uchun statik fayllarni Django emas, Nginx beradi?

Har bir rasmni Python orqali o'tkazish sekin va mantiqsiz; Nginx buni taxminan 10 barobar tezroq qiladi.

Odatiy xatolar

DEBUG = True ni serverda qoldirish; .env ni GitHub ga yuklash.
collectstatic ni unutish; DB_HOST=localhost yozish; baza uchun volume qo'ymaslik.
Checklist: /admin/ ochiladimi, /static/ keladimi, upload /media/ dan ochiladimi, migrate xatosiz o'tdimi, DB paroli kuchlimi, backup reja bormi.

Amaliy topshiriq 20 daqiqa

OsonLocal va Production farqlarini jadvalga yozing.
O'rtaprod.py va .env.prod ni yozib, docker compose ... up bilan ishga tushiring.
QiyinDeploy checklistni to'ldirib, /admin/, /static/, /media/ ni tekshiring.
AXV

Xulosa

Deploy: sozlamalar, Gunicorn, Nginx va Docker bilan trassaga chiqamiz.

ProductionDEBUG=False.envGunicornNginxDockerVPSCI/CD

Uyga vazifa: uyga-vazifa.md. Keyingi dars: FastAPI loyiha yaratish.