Как правильно запустить Django-проект в продакшене?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Запуск Django-проекта в продакшене
Запуск Django-приложения в продакшене существенно отличается от разработки и требует особого внимания к безопасности, производительности и надежности.
1. Использование WSGI/ASGI сервера
В разработке Django использует встроенный development-сервер, но в продакшене необходимо использовать production-ready WSGI или ASGI сервер:
# gunicorn — самый популярный выбор для WSGI
# Установка: pip install gunicorn
# Запуск: gunicorn config.wsgi:application --workers 4 --bind 0.0.0.0:8000
# Для асинхронных приложений используй Daphne (ASGI):
# pip install daphne
# daphne -b 0.0.0.0 -p 8000 config.asgi:application
2. Конфигурация settings.py
Критические параметры для продакшена:
# DEBUG должен быть False
DEBUG = False
# Указать допустимые хосты
ALLOWED_HOSTS = ["example.com", "www.example.com", "api.example.com"]
# Использовать переменные окружения для секретов
import os
SECRET_KEY = os.environ.get("DJANGO_SECRET_KEY")
# Безопасные настройки HTTPS
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_HSTS_SECONDS = 31536000
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
# Настройка CORS если нужна
CORS_ALLOWED_ORIGINS = ["https://example.com"]
3. Сбор статических файлов
Джанго не сервирует статику автоматически в продакшене:
python manage.py collectstatic --noinput
Учти, что для продакшена лучше использовать Nginx или CDN:
# Nginx конфиг
server {
listen 80;
server_name example.com;
location /static/ {
alias /var/www/staticfiles/;
expires 30d;
}
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
}
}
4. Миграции и инициализация БД
Перед запуском приложения необходимо применить миграции:
python manage.py migrate
Это должно быть частью CI/CD pipeline, обычно в pre-deploy скрипте.
5. Логирование и мониторинг
В продакшене критично настроить логирование:
LOGGING = {
"version": 1,
"disable_existing_loggers": False,
"handlers": {
"file": {
"level": "ERROR",
"class": "logging.handlers.RotatingFileHandler",
"filename": "/var/log/django/error.log",
"maxBytes": 1024 * 1024 * 10, # 10 MB
"backupCount": 5,
},
},
"root": {"level": "INFO", "handlers": ["file"]},
}
6. Процесс управления (Systemd, Supervisor)
Для управления Gunicorn процессом используй Systemd:
# /etc/systemd/system/django.service
[Unit]
Description=Django Application
After=network.target
[Service]
Type=notify
User=www-data
WorkingDirectory=/var/www/myapp
ExecStart=/var/www/myapp/venv/bin/gunicorn config.wsgi:application --workers 4
ExecReload=/bin/kill -s HUP \$MAINPID
KillMode=mixed
[Install]
WantedBy=multi-user.target
Запуск и управление:
sudo systemctl start django
sudo systemctl enable django
sudo systemctl restart django
7. Обратный прокси (Nginx)
Обычно Gunicorn запускается на localhost, а Nginx выступает обратным прокси и обрабатывает SSL:
# Конфиг Gunicorn
gunicorn config.wsgi:application --workers 4 --bind 127.0.0.1:8000 --access-logfile /var/log/gunicorn_access.log --error-logfile /var/log/gunicorn_error.log
8. Переменные окружения
Всегда используй .env файлы (не коммитируй в Git):
# pip install python-dotenv
from dotenv import load_dotenv
load_dotenv()
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": os.environ.get("DB_NAME"),
"USER": os.environ.get("DB_USER"),
"PASSWORD": os.environ.get("DB_PASSWORD"),
"HOST": os.environ.get("DB_HOST"),
"PORT": os.environ.get("DB_PORT"),
}
}
Итоговый checklist
✅ DEBUG = False ✅ SECRET_KEY в переменных окружения ✅ ALLOWED_HOSTS настроены ✅ SSL/HTTPS включен ✅ Статические файлы собраны ✅ БД мигрирована ✅ WSGI сервер (Gunicorn) ✅ Обратный прокси (Nginx) ✅ Логирование настроено ✅ Процесс управления (Systemd) ✅ Мониторинг и алерты
Этот подход обеспечивает безопасное, масштабируемое и надежное развертывание Django-приложения в продакшене.