Представь, что ты создал отличное Django-приложение. Оно работает локально, все тесты проходят. Но как превратить его в работающий веб-сервис, доступный из любой точки мира? Давай разберем процесс развертывания Django от начала до конца — от выбора сервера до production-готового решения.
Подготовка к развертыванию Django на сервере
Перед тем как начать развертывание Django на сервере, нужно понять архитектуру production-окружения. Типичная схема включает:
- WSGI-сервер (Gunicorn или uWSGI) — запускает твое Django-приложение
- Веб-сервер (Nginx или Apache) — обрабатывает статические файлы и проксирует запросы
- База данных (PostgreSQL, MySQL) — production-ready СУБД
- Кэширование (Redis, Memcached) — для повышения производительности
Настройка Django для production
Первым делом подготовим settings.py. Создадим разделение на локальные и production-настройки:
# 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 сервер. Подключаемся и обновляем систему:
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
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: Развертывание приложения
Клонируем проект и настраиваем виртуальное окружение:
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 сервис для автоматического запуска:
# /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
sudo systemctl daemon-reload
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
sudo systemctl status gunicorn # Проверяем статус
Шаг 5: Настройка Nginx
# /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;
}
}
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
# 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
# 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
# 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;
}
}
}
Запускаем наш стек одной командой:
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 на сервере. Начни с простого варианта, поэкспериментируй, и скоро процесс деплоя станет для тебя рутинной, но важной частью разработки.