Deploy: Gunicorn, Nginx, Docker va VPS
10-sinfAdvanced Python Back-end4-hafta · 11-darsLocal va Production muhit farqi.
DEBUG, ALLOWED_HOSTS, .env, static.
WSGI server va Reverse Proxy.
Dockerfile, compose, VPS, CI/CD.
Ustaxonadan trassaga
Mashina o'xshatishi
Qo'llanma o'xshatishi: mashinani ustaxonada yig'asiz, trassada esa u xavfsiz va chidamli bo'lishi shart. Qismlarga bosing.
| Local (Development) | Production | |
|---|---|---|
| Xato | DEBUG=True, qizil oyna | Oddiy 404/500 sahifa |
| Baza | SQLite (yengil) | PostgreSQL / MySQL |
| Server | runserver | Gunicorn + Nginx |
| Ustuvorlik | Qulaylik va tezlik | Xavfsizlik va barqarorlik |
settings.py ni tozalash
Xato sahifasi parol va kalitlarni ochib qo'yishi mumkin. Productionda doim False.
Ruxsat etilgan domenlar ro'yxati: Host Header Injection dan himoya.
Sirlar kodda emas, .env da; .env esa .gitignore da.
SQLite o'rniga: parallel yozuvlarni va katta hajmni ko'taradi.
Kartani bosing: javob orqasida.
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_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.
runserver dan professional serverga
Faqat development uchun.
Xavfsizlik auditidan o'tmagan, yuklamaga mo'ljallanmagan.
--workers 3: 3 mustaqil jarayon.
Bittasi o'lsa, Gunicorn yangisini yaratadi.
Trafik oqimi
Client - Nginx - Gunicorn - Django - PostgreSQL. Bloklarga bosing.
Foydalanuvchi api.loyiha.uz ni ochadi, so'rov avval Nginx ga tushadi.
/static/logo.png: Nginx papkadan o'zi olib beradi, Python bezovta qilinmaydi.
/api/users/: Nginx uni Gunicorn ga uzatadi (Proxy Pass).
HTTPS ni Nginx boshqaradi; sekin so'rovlarni (Slowloris) o'zi yig'adi.
Statik fayl: Nginx 10 barobar tezroq.
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.
Hamma joyda bir xil muhit
Retseptdan konteynergacha
«Mening kompyuterimda ishlagandi» muammosi yo'qoladi: muhit konteyner ichida bir xil. Bloklarga bosing.
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt /app/
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.
Bir tugma bilan uch servis
Volume: konteyner qayta ishga tushsa ham ma'lumot yo'qolmaydi. DB_HOST=db: servis nomi.
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.
$ 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.
Qayerga joylaymiz?
Arzon, PHP uchun. Root yo'q: Django uchun noqulay.
Heroku, Render, Railway. Oson, lekin qimmat va cheklangan.
DigitalOcean, Hetzner, AWS EC2. Professional va arzon, hamma narsa o'zingizda.
ssh bilan ulanish, apt updatedocker.io docker-compose-plugingit clone bilan kodni olish.env.prod ni serverda yaratishdocker compose ... up -d --buildgit pull, migrate, Gunicorn restart. Fayl: .github/workflows/deploy.yml.Nima uchun statik fayllarni Django emas, Nginx beradi?
DEBUG = True ni serverda qoldirish; .env ni GitHub ga yuklash.collectstatic ni unutish; DB_HOST=localhost yozish; baza uchun volume qo'ymaslik./admin/ ochiladimi, /static/ keladimi, upload /media/ dan ochiladimi, migrate xatosiz o'tdimi, DB paroli kuchlimi, backup reja bormi.prod.py va .env.prod ni yozib, docker compose ... up bilan ishga tushiring./admin/, /static/, /media/ ni tekshiring.
Deploy: sozlamalar, Gunicorn, Nginx va Docker bilan trassaga chiqamiz.
Uyga vazifa: uyga-vazifa.md. Keyingi dars: FastAPI loyiha yaratish.