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/uwsgiDjango 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.targetStatic 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.touchZero-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 = trueDeploy 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.
- DEBUG kapalı
- Güçlü SECRET_KEY
- HTTPS zorunlu
- Veritabanı şifreleri .env'de
- 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.