Развертывание Django на сервере: Docker, Nginx, Gunicorn | Руководство | AdminWiki

Развертывание Django: Полное руководство от настройки до production

17 декабря 2025 7 мин. чтения #Deployment #Django #Gunicorn #Web Development #devops #docker #nginx #python

Представь, что ты создал отличное Django-приложение. Оно работает локально, все тесты проходят. Но как превратить его в работающий веб-сервис, доступный из любой точки мира? Давай разберем процесс развертывания Django от начала до конца — от выбора сервера до production-готового решения.

Подготовка к развертыванию Django на сервере

Перед тем как начать развертывание Django на сервере, нужно понять архитектуру production-окружения. Типичная схема включает:

  • WSGI-сервер (Gunicorn или uWSGI) — запускает твое Django-приложение
  • Веб-сервер (Nginx или Apache) — обрабатывает статические файлы и проксирует запросы
  • База данных (PostgreSQL, MySQL) — production-ready СУБД
  • Кэширование (Redis, Memcached) — для повышения производительности
Важно: Никогда не используй встроенный сервер Django (runserver) в production! Он не предназначен для этого и небезопасен.

Настройка Django для production

Первым делом подготовим settings.py. Создадим разделение на локальные и production-настройки:

python
# settings/base.py
import os
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY', 'dev-secret-key-change-me')

DEBUG = False

ALLOWED_HOSTS = ['yourdomain.com', 'www.yourdomain.com', 'server_ip']

# Database
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', 'localhost'),
        'PORT': os.environ.get('DB_PORT', '5432'),
    }
}

# Static files
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'staticfiles'
STATICFILES_DIRS = [BASE_DIR / 'static']

MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'

Классическое развертывание: Gunicorn + Nginx

Шаг 1: Подготовка сервера

Допустим, у тебя есть Ubuntu 22.04 сервер. Подключаемся и обновляем систему:

bash
ssh user@your_server_ip
sudo apt update && sudo apt upgrade -y
sudo apt install python3-pip python3-venv nginx postgresql postgresql-contrib

Шаг 2: Настройка PostgreSQL

bash
sudo -u postgres psql
# В интерактивной консоли PostgreSQL:
CREATE DATABASE yourdbname;
CREATE USER youruser WITH PASSWORD 'strongpassword';
ALTER ROLE youruser SET client_encoding TO 'utf8';
ALTER ROLE youruser SET default_transaction_isolation TO 'read committed';
ALTER ROLE youruser SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE yourdbname TO youruser;
\q

Шаг 3: Развертывание приложения

Клонируем проект и настраиваем виртуальное окружение:

bash
cd /var/www
git clone https://github.com/yourusername/yourproject.git
cd yourproject
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

# Применяем миграции
python manage.py migrate

# Собираем статику
python manage.py collectstatic --noinput

# Создаем суперпользователя
python manage.py createsuperuser

Шаг 4: Настройка Gunicorn

Создаем systemd сервис для автоматического запуска:

config
# /etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon for Django
After=network.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/yourproject
ExecStart=/var/www/yourproject/venv/bin/gunicorn \
  --access-logfile - \
  --workers 3 \
  --bind unix:/var/www/yourproject/gunicorn.sock \
  yourproject.wsgi:application

[Install]
WantedBy=multi-user.target
bash
sudo systemctl daemon-reload
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
sudo systemctl status gunicorn  # Проверяем статус

Шаг 5: Настройка Nginx

config
# /etc/nginx/sites-available/yourproject
server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;

    location = /favicon.ico { access_log off; log_not_found off; }
    
    location /static/ {
        root /var/www/yourproject;
    }
    
    location /media/ {
        root /var/www/yourproject;
    }
    
    location / {
        include proxy_params;
        proxy_pass http://unix:/var/www/yourproject/gunicorn.sock;
    }
}
bash
sudo ln -s /etc/nginx/sites-available/yourproject /etc/nginx/sites-enabled/
sudo nginx -t  # Проверяем конфигурацию
sudo systemctl restart nginx
Опасно: Не забудь настроить брандмауэр! sudo ufw allow 'Nginx Full' и sudo ufw enable

Развертывание web приложения Django с помощью Docker

Docker упрощает процесс развертывания web приложения Django, обеспечивая консистентность окружения. Давай создадим полноценный docker-compose стек.

Dockerfile для Django

config
# Dockerfile
FROM python:3.11-slim

ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

WORKDIR /app

RUN apt-get update \
    && apt-get install -y gcc postgresql-client \
    && rm -rf /var/lib/apt/lists/*

COPY requirements.txt .
RUN pip install --upgrade pip \
    && pip install -r requirements.txt

COPY . .

RUN python manage.py collectstatic --noinput

EXPOSE 8000

CMD ["gunicorn", "--bind", "0.0.0.0:8000", "yourproject.wsgi:application"]

docker-compose.yml

config
# docker-compose.yml
version: '3.8'

services:
  db:
    image: postgres:15
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: ${DB_NAME}
      POSTGRES_USER: ${DB_USER}
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    networks:
      - django_network

  redis:
    image: redis:7-alpine
    networks:
      - django_network

  web:
    build: .
    command: >
      sh -c "python manage.py migrate &&
             python manage.py runserver 0.0.0.0:8000"
    volumes:
      - .:/app
      - static_volume:/app/staticfiles
      - media_volume:/app/media
    ports:
      - "8000:8000"
    environment:
      - DB_HOST=db
      - DB_NAME=${DB_NAME}
      - DB_USER=${DB_USER}
      - DB_PASSWORD=${DB_PASSWORD}
      - REDIS_URL=redis://redis:6379/0
    depends_on:
      - db
      - redis
    networks:
      - django_network

  nginx:
    image: nginx:1.25-alpine
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - static_volume:/static
      - media_volume:/media
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - web
    networks:
      - django_network

volumes:
  postgres_data:
  static_volume:
  media_volume:

networks:
  django_network:
    driver: bridge

Nginx конфигурация для Docker

config
# nginx.conf
events {}

http {
    upstream django {
        server web:8000;
    }

    server {
        listen 80;
        server_name localhost;

        location /static/ {
            alias /static/;
        }

        location /media/ {
            alias /media/;
        }

        location / {
            proxy_pass http://django;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

Запускаем наш стек одной командой:

bash
docker-compose up --build -d
docker-compose logs -f  # Смотрим логи

Сравнение методов развертывания

Критерий Классическое (Gunicorn+Nginx) Docker-развертывание
Сложность настройки Средняя/Высокая Низкая/Средняя
Переносимость Низкая Высокая
Масштабируемость Сложная Простая
Производительность Высокая Высокая (минимальные накладные расходы)
Идеально для Дедицированных серверов, production Разработки, микросервисов, CI/CD

Частые вопросы (FAQ)

Какой способ развертывания Django выбрать новичку?

Начни с классического способа (Gunicorn + Nginx) на виртуальном сервере. Это даст понимание, как все работает "под капотом". После освоения переходи к Docker для упрощения процессов.

Нужно ли использовать Docker в production?

Да, Docker отлично подходит для production, особенно с orchestration-системами вроде Kubernetes или Docker Swarm. Он обеспечивает консистентность окружения и упрощает масштабирование.

Как настроить SSL/HTTPS для Django?

Используй Let's Encrypt с Certbot. Для Nginx: sudo apt install certbot python3-certbot-nginx && sudo certbot --nginx. Не забудь обновить ALLOWED_HOSTS и настроить Django для работы через HTTPS.

Как организовать деплой новых версий приложения?

Создай скрипт деплоя или используй CI/CD (GitHub Actions, GitLab CI). Типичный процесс: pull изменений, обновление зависимостей, миграции, сборка статики, перезапуск Gunicorn.

Заключение

Мы рассмотрели два основных подхода к развертыванию Django. Классический метод дает полный контроль и понимание архитектуры, а Docker-подход обеспечивает современный, переносимый и масштабируемый способ деплоя.

Профессиональный совет: Вне зависимости от выбранного метода, всегда:
  • Используйте переменные окружения для секретов
  • Настраивайте мониторинг (Sentry для ошибок, Prometheus для метрик)
  • Регулярно делайте бэкапы базы данных
  • Тестируйте процесс деплоя на staging-окружении

Теперь у тебя есть полное руководство для успешного развертывания Django на сервере. Начни с простого варианта, поэкспериментируй, и скоро процесс деплоя станет для тебя рутинной, но важной частью разработки.

Поделиться:
Сохранить гайд? В закладки браузера