Rehberler Uzun Okuma Deployment

Django'yu uWSGI ile yayına alın

Tam üretim deployment adımları.

2 Mart 2026 21 dk okuma
Paylaş
X in

Giriş

Django uygulamasını geliştirme ortamından üretime taşımak birden fazla bileşenin koordinasyonunu gerektirir: WSGI entry point, uWSGI ini, systemd service, Nginx, static dosyalar ve ortam değişkenleri.

Bu rehber uçtan uca bir deployment akışı sunar: sunucu hazırlığından ilk deploy'a, güncelleme stratejisine kadar. Gunicorn yerine uWSGI tercih eden ekipler için optimize edilmiştir.

Örnekler Django 5.x, Python 3.12 ve Debian/Ubuntu tabanlı sunucular için yazılmıştır.

Sunucu Hazırlığı

Python 3.12, nginx, uwsgi-plugin-python3 paketlerini kurun. deploy kullanıcısı oluşturun; root ile uWSGI çalıştırmayın. /var/www/myproject ve /run/uwsgi dizinlerini hazırlayın.

PostgreSQL veya tercih edilen veritabanını yapılandırın. .env dosyasında DJANGO_SECRET_KEY, DATABASE_URL ve ALLOWED_HOSTS tanımlayın; asla repoya commit etmeyin.

sudo apt install python3.12-venv nginx uwsgi uwsgi-plugin-python3
sudo useradd -m -s /bin/bash deploy
sudo mkdir -p /run/uwsgi /var/log/uwsgi
sudo chown deploy:www-data /run/uwsgi

Django WSGI ve Ortam

myproject/wsgi.py Django'nun varsayılan WSGI entry point'idir. DJANGO_SETTINGS_MODULE=myproject.settings üretim ayarlarını yükler.

settings/production.py DEBUG=False, güvenli cookie ayarları ve logging konfigürasyonu içerir. django-environ ile .env okunur.

  • DEBUG=False zorunlu
  • ALLOWED_HOSTS domain listesi
  • STATIC_ROOT collectstatic hedefi
  • SECURE_PROXY_SSL_HEADER nginx için
# myproject/wsgi.py
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings.production')
application = get_wsgi_application()

uWSGI ini ve systemd

ini dosyası chdir, virtualenv, module ve socket tanımlar. env = DJANGO_SETTINGS_MODULE=myproject.settings.production ortam değişkenini geçirir.

systemd unit Type=notify veya simple; Restart=always ile otomatik kurtarma sağlar.

[Unit]
Description=uWSGI Django myproject
After=network.target

[Service]
User=deploy
Group=www-data
ExecStart=/var/www/myproject/venv/bin/uwsgi --ini /etc/uwsgi/apps-enabled/myproject.ini
Restart=always
KillSignal=SIGQUIT

[Install]
WantedBy=multi-user.target

Static Dosyalar ve Migrate

python manage.py collectstatic --noinput STATIC_ROOT'a dosyaları toplar. Nginx /static/ location'ı bu dizine alias eder.

Deploy script'inde python manage.py migrate --noinput çalıştırın. Migration'ları uygulama başlamadan önce tamamlayın; sıra kritiktir.

#!/bin/bash
set -e
cd /var/www/myproject
source venv/bin/activate
pip install -r requirements.txt
python manage.py migrate --noinput
python manage.py collectstatic --noinput
touch reload.touch

Zero-Downtime Deploy

touch-reload = /var/www/myproject/reload.touch ile kod güncellemesi graceful reload tetikler. chain-reload worker'ları tek tek yeniler.

Mavi-yeşil deploy için iki socket ve Nginx upstream switch kullanılabilir; çoğu proje touch-reload ile yeterlidir.

[uwsgi]
touch-reload = /var/www/myproject/reload.touch
chain-reload = true
lazy-apps = true
need-app = true
Deploy script'inizde migrate → collectstatic → touch-reload sırasını asla bozmayın.

Güvenlik ve Hardening

uid/gid drop, harakiri, limit-as ve disable-logging=false ile temel hardening yapın. Firewall'da yalnızca 80/443 açık olsun; stats portunu internal ağa kısıtlayın.

Django security middleware, CSRF, HSTS ve SECURE_SSL_REDIRECT üretimde etkin olmalıdır.

  1. DEBUG kapalı
  2. Güçlü SECRET_KEY
  3. HTTPS zorunlu
  4. Veritabanı şifreleri .env'de
  5. Düzenli güvenlik güncellemeleri

Sonuç

Django + uWSGI + systemd + Nginx yığını onlarca yıldır kanıtlanmış bir üretim mimarisidir. Otomatik deploy script'i, touch-reload ve log izleme ile güvenilir operasyon sağlanır.

İlk kurulumdan sonra Emperor modu veya containerization değerlendirin; ancak temel akışı sağlam oturtmadan karmaşıklık eklemeyin.